Index: src/main/java/org/drools/common/Scheduler.java
===================================================================
--- src/main/java/org/drools/common/Scheduler.java	(revision 29805)
+++ src/main/java/org/drools/common/Scheduler.java	(working copy)
@@ -50,10 +50,10 @@
     public static void scheduleAgendaItem(final ScheduledAgendaItem item, InternalAgenda agenda) {
         DuractionJob job = new DuractionJob();        
         DuractionJobContext ctx = new DuractionJobContext( item, agenda );
-        Trigger trigger = new PointInTimeTrigger( item.getRule().getDuration().getDuration( item.getTuple() ) +
-                                                       ((InternalWorkingMemory)agenda.getWorkingMemory()).getTimerService().getCurrentTime());
-        
-        
+        long activationDate = item.getRule().getDuration().getDuration( item.getTuple() ) +
+        ((InternalWorkingMemory)agenda.getWorkingMemory()).getTimerService().getCurrentTime();
+        Trigger trigger = new PointInTimeTrigger(activationDate);
+        item.setActivationDate(activationDate);
         JobHandle jobHandle = ((InternalWorkingMemory)agenda.getWorkingMemory()).getTimerService().scheduleJob( job, ctx, trigger );
         item.setJobHandle( jobHandle );
     }
Index: src/main/java/org/drools/common/ScheduledAgendaItem.java
===================================================================
--- src/main/java/org/drools/common/ScheduledAgendaItem.java	(revision 29805)
+++ src/main/java/org/drools/common/ScheduledAgendaItem.java	(working copy)
@@ -51,6 +51,9 @@
     private LinkedListNode           previous;
 
     private LinkedListNode           next;
+
+    private long activationDate;
+    
 //
 //    /** The tuple. */
 //    private Tuple              tuple;
@@ -110,7 +113,7 @@
 //    // ------------------------------------------------------------
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
         super.readExternal( in );
-        
+        activationDate = in.readLong();
         previous    = (LinkedListNode)in.readObject();
         next    = (LinkedListNode)in.readObject();
 //        tuple    = (Tuple)in.readObject();
@@ -126,8 +129,9 @@
 
     public void writeExternal(ObjectOutput out) throws IOException {
         super.writeExternal( out );
+        out.writeLong(activationDate);
         out.writeObject(previous);
-//        out.writeObject(next);
+        out.writeObject(next);
 //        out.writeObject(tuple);
 //        out.writeObject(rule);
 //        out.writeObject(subrule);
@@ -285,4 +289,11 @@
     public void setJobHandle(JobHandle jobHandle) {
         this.jobHandle = jobHandle;
     }      
+	public long getActivationDate() {
+		return activationDate;
 }
+	public void setActivationDate(long activationDate) {
+		this.activationDate = activationDate;
+	}      
+
+}
Index: src/main/java/org/drools/marshalling/impl/InputMarshaller.java
===================================================================
--- src/main/java/org/drools/marshalling/impl/InputMarshaller.java	(revision 29805)
+++ src/main/java/org/drools/marshalling/impl/InputMarshaller.java	(working copy)
@@ -19,6 +19,8 @@
 import org.drools.common.DefaultAgenda;
 import org.drools.common.DefaultFactHandle;
 import org.drools.common.EqualityKey;
+import org.drools.common.EventFactHandle;
+import org.drools.common.InternalAgenda;
 import org.drools.common.InternalAgendaGroup;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalRuleBase;
@@ -27,6 +29,7 @@
 import org.drools.common.NodeMemory;
 import org.drools.common.PropagationContextImpl;
 import org.drools.common.RuleFlowGroupImpl;
+import org.drools.common.ScheduledAgendaItem;
 import org.drools.common.TruthMaintenanceSystem;
 import org.drools.concurrent.ExecutorService;
 import org.drools.impl.EnvironmentFactory;
@@ -225,6 +228,9 @@
         if( multithread ) {
             session.startPartitionManagers();
         }
+        for (ScheduledAgendaItem item : context.scheduledAgendaItems) {
+        	agenda.scheduleItem(item);
+        }
 
         return session;
     }    
@@ -364,9 +370,19 @@
         ObjectMarshallingStrategy strategy = context.resolverStrategyFactory.getStrategy( strategyIndex );
         Object object = strategy.read( context.stream );
 
-        InternalFactHandle handle = new DefaultFactHandle( id,
+        boolean isFactHandle = context.stream.readBoolean();
+        InternalFactHandle handle;
+        if (isFactHandle) {
+        	long timeStamp = context.stream.readLong();
+        	long duration = context.stream.readLong();
+        	handle = new EventFactHandle( id,
                                                            object,
+                    recency, timeStamp, duration);
+        } else {
+        	handle = new DefaultFactHandle( id,
+                    object,
                                                            recency );
+        }
         if(context.readBoolean()){
             String  entryPoint = context.readUTF();
             if(entryPoint != null && !entryPoint.equals("")){
@@ -687,13 +703,25 @@
 
         PropagationContext pc = context.propagationContexts.get( stream.readLong() );
 
-        AgendaItem activation = new AgendaItem( activationNumber,
+        boolean isScheduledAgendaItem = stream.readBoolean();
+        AgendaItem activation = null;
+        InternalAgenda agenda = (InternalAgenda) context.wm.getAgenda();
+        if (isScheduledAgendaItem) {
+          activation = new ScheduledAgendaItem( activationNumber,
                                                 leftTuple,
+                     agenda,
+                     pc,
+                     rule,
+                     subRule );
+          ((ScheduledAgendaItem) activation).setActivationDate(stream.readLong());
+        } else {
+           activation = new AgendaItem( activationNumber,
+                                                leftTuple,
                                                 salience,
                                                 pc,
                                                 rule,
                                                 subRule );
-
+        }
         leftTuple.setActivation( activation );
 
         if ( stream.readBoolean() ) {
@@ -719,7 +747,11 @@
 
         if ( activated ) {
             if ( rule.getRuleFlowGroup() == null ) {
+            	if (isScheduledAgendaItem) {
+            		context.scheduledAgendaItems.add((ScheduledAgendaItem) activation);
+            	} else {
                 agendaGroup.add( activation );
+            	}
             } else {
                 InternalRuleFlowGroup rfg = (InternalRuleFlowGroup) ((DefaultAgenda) wm.getAgenda()).getRuleFlowGroup( rule.getRuleFlowGroup() );
                 rfg.addActivation( activation );
Index: src/main/java/org/drools/marshalling/impl/OutputMarshaller.java
===================================================================
--- src/main/java/org/drools/marshalling/impl/OutputMarshaller.java	(revision 29805)
+++ src/main/java/org/drools/marshalling/impl/OutputMarshaller.java	(working copy)
@@ -19,6 +19,7 @@
 import org.drools.common.AgendaItem;
 import org.drools.common.DefaultAgenda;
 import org.drools.common.EqualityKey;
+import org.drools.common.EventFactHandle;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
@@ -27,6 +28,7 @@
 import org.drools.common.NodeMemory;
 import org.drools.common.ObjectStore;
 import org.drools.common.RuleFlowGroupImpl;
+import org.drools.common.ScheduledAgendaItem;
 import org.drools.common.WorkingMemoryAction;
 import org.drools.marshalling.ObjectMarshallingStrategy;
 import org.drools.process.instance.WorkItemManager;
@@ -56,6 +58,7 @@
 import org.drools.util.ObjectHashSet;
 
 public class OutputMarshaller {
+	
     public static void writeSession(MarshallerWriteContext context) throws IOException {
         ReteooWorkingMemory wm = (ReteooWorkingMemory) context.wm;
         
@@ -277,6 +280,14 @@
 
         strategy.write( stream,
                         object );
+        
+        boolean isEventHandle = handle instanceof EventFactHandle;
+        stream.writeBoolean(isEventHandle);
+        if (isEventHandle) {
+        	stream.writeLong(((EventFactHandle) handle).getStartTimestamp());
+        	stream.writeLong(((EventFactHandle) handle).getDuration());
+        }
+        
         if( handle.getEntryPoint() instanceof InternalWorkingMemoryEntryPoint ){
             String entryPoint = ((InternalWorkingMemoryEntryPoint)handle.getEntryPoint()).getEntryPoint().getEntryPointId();
             if(entryPoint!=null && !entryPoint.equals("")){
@@ -395,7 +406,6 @@
 //        context.out.println( "LeftTuples Start" );
         for ( InternalFactHandle handle : orderFacts( wm.getObjectStore() ) ) {
             //InternalFactHandle handle = (InternalFactHandle) it.next();
-
             for ( LeftTuple leftTuple = getLeftTuple( handle.getLeftTuple() ); leftTuple != null; leftTuple = (LeftTuple) leftTuple.getLeftParentPrevious() ) {
                 stream.writeShort( PersisterEnums.LEFT_TUPLE );
 
@@ -455,7 +465,7 @@
                     // is not blocked so has children
                     stream.writeShort( PersisterEnums.LEFT_TUPLE_NOT_BLOCKED );
 
-                    for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) leftTuple.getLeftParentPrevious() ) {
+                    for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) childLeftTuple.getLeftParentPrevious() ) {
                         stream.writeShort( PersisterEnums.LEFT_TUPLE );
                         stream.writeInt( childLeftTuple.getLeftTupleSink().getId() );
                         writeLeftTuple( childLeftTuple,
@@ -478,7 +488,7 @@
                     stream.writeShort( PersisterEnums.LEFT_TUPLE_BLOCKED );
                     stream.writeInt( leftTuple.getBlocker().getFactHandle().getId() );
 
-                    for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) leftTuple.getLeftParentPrevious() ) {
+                    for ( LeftTuple childLeftTuple = getLeftTuple( leftTuple.getBetaChildren() ); childLeftTuple != null; childLeftTuple = (LeftTuple) childLeftTuple.getLeftParentPrevious() ) {
                         stream.writeShort( PersisterEnums.LEFT_TUPLE );
                         stream.writeInt( childLeftTuple.getLeftTupleSink().getId() );
                         writeLeftTuple( childLeftTuple,
@@ -646,6 +656,14 @@
 //        context.out.println( "AgendaItem long:" + agendaItem.getPropagationContext().getPropagationNumber() );
         stream.writeLong( agendaItem.getPropagationContext().getPropagationNumber() );
 
+        if (agendaItem instanceof ScheduledAgendaItem) {
+       	 stream.writeBoolean(true);
+			 ScheduledAgendaItem scheduledAgendaItem = (ScheduledAgendaItem) agendaItem;
+			 stream.writeLong(scheduledAgendaItem.getActivationDate());
+		} else {
+			stream.writeBoolean(false);
+		}
+        
         if ( agendaItem.getActivationGroupNode() != null ) {
             stream.writeBoolean( true );
 //            context.out.println( "ActivationGroup bool:" + true );
Index: src/main/java/org/drools/marshalling/impl/MarshallerReaderContext.java
===================================================================
--- src/main/java/org/drools/marshalling/impl/MarshallerReaderContext.java	(revision 29805)
+++ src/main/java/org/drools/marshalling/impl/MarshallerReaderContext.java	(working copy)
@@ -8,12 +8,15 @@
 import java.io.ObjectInputStream;
 import java.io.ObjectStreamClass;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 import org.drools.common.BaseNode;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalRuleBase;
 import org.drools.common.InternalWorkingMemory;
+import org.drools.common.ScheduledAgendaItem;
 import org.drools.reteoo.LeftTuple;
 import org.drools.reteoo.RightTuple;
 import org.drools.rule.EntryPoint;
@@ -38,6 +41,8 @@
     public final boolean                            marshalProcessInstances;
     public final boolean                            marshalWorkItems;
 
+    public final Set<ScheduledAgendaItem> 			scheduledAgendaItems;
+
     public MarshallerReaderContext(InputStream stream,
                                    InternalRuleBase ruleBase,
                                    Map<Integer, BaseNode> sinks,
@@ -68,6 +73,7 @@
         this.resolverStrategyFactory = resolverStrategyFactory;
         this.marshalProcessInstances = marshalProcessInstances;
         this.marshalWorkItems = marshalWorkItems;
+        this.scheduledAgendaItems = new HashSet<ScheduledAgendaItem>();
     }
     
     @Override
