diff --git a/src/main/java/org/apache/ode/jacob/vpu/ExecutionQueueImpl.java b/src/main/java/org/apache/ode/jacob/vpu/ExecutionQueueImpl.java
index 6f64bbb..3384f71 100644
--- a/src/main/java/org/apache/ode/jacob/vpu/ExecutionQueueImpl.java
+++ b/src/main/java/org/apache/ode/jacob/vpu/ExecutionQueueImpl.java
@@ -29,7 +29,6 @@
 import java.io.OutputStream;
 import java.io.PrintStream;
 import java.io.Serializable;
-import java.lang.reflect.Method;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
@@ -42,11 +41,9 @@
 import java.util.zip.GZIPOutputStream;
 
 import org.apache.ode.jacob.IndexedObject;
-import org.apache.ode.jacob.JacobObject;
 import org.apache.ode.jacob.Message;
 import org.apache.ode.jacob.oo.Channel;
 import org.apache.ode.jacob.oo.ChannelListener;
-import org.apache.ode.jacob.oo.ClassUtil;
 import org.apache.ode.jacob.soup.Comm;
 import org.apache.ode.jacob.soup.CommChannel;
 import org.apache.ode.jacob.soup.CommGroup;
@@ -239,16 +236,7 @@
         _currentCycle = sis.readInt();
         int reactions = sis.readInt();
         for (int i = 0; i < reactions; ++i) {
-            JacobObject closure = (JacobObject) sis.readObject();
-            String methodName = sis.readUTF();
-            Method method = closure.getMethod(methodName);
-            int numArgs = sis.readInt();
-            Object[] args = new Object[numArgs];
-            for (int j = 0; j < numArgs; ++j) {
-                args[j] = sis.readObject();
-            }
-            Channel replyTo = (Channel) sis.readObject();
-            _messages.add(ClassUtil.createMessage(closure, ClassUtil.getActionForMethod(method), args, replyTo));
+            _messages.add((Message)sis.readObject());
         }
 
         int numChannels = sis.readInt();
@@ -293,14 +281,7 @@
         // Write out the reactions.
         sos.writeInt(_messages.size());
         for (Message m : _messages) {
-            sos.writeObject(m.getTo().getEndpoint(JacobObject.class));
-            // TODO: we need to write the replyTo object too
-            sos.writeUTF(m.getAction());
-            Object[] args = (Object[])m.getBody();
-            sos.writeInt(args == null ? 0 : args.length);
-            for (Object a : args) {
-                sos.writeObject(a);
-            }
+            sos.writeObject(m);
         }
 
         sos.writeInt(_channels.values().size());
