Remove the JacobRunnable class and use java.lang.Runnable instead
diff --git a/src/main/java/org/apache/ode/jacob/JacobObject.java b/src/main/java/org/apache/ode/jacob/JacobObject.java
index bc0eb61..73505d7 100644
--- a/src/main/java/org/apache/ode/jacob/JacobObject.java
+++ b/src/main/java/org/apache/ode/jacob/JacobObject.java
@@ -24,6 +24,7 @@
 
 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.vpu.JacobVPU;
 
 /**
@@ -32,7 +33,9 @@
  */
 @SuppressWarnings("serial")
 public abstract class JacobObject implements Serializable {
-    public abstract Set<Method> getImplementedMethods();
+    public Set<Method> getImplementedMethods() {
+    	return null;
+    }
 
     /**
      * Get the unadorned (no package) name of this class.
@@ -56,7 +59,7 @@
      *
      * @param concretion the concretion of a process template
      */
-    protected static void instance(JacobRunnable concretion) {
+    protected static void instance(Runnable concretion) {
         JacobVPU.activeJacobThread().instance(concretion);
     }
 
@@ -111,6 +114,7 @@
 
     public Method getMethod(String methodName) {
         Set<Method> implementedMethods = getImplementedMethods();
+        implementedMethods = implementedMethods == null ? ClassUtil.runMethodSet() : implementedMethods;
         for (Method m : implementedMethods) {
             if (m.getName().equals(methodName)) {
                 return m;
diff --git a/src/main/java/org/apache/ode/jacob/JacobRunnable.java b/src/main/java/org/apache/ode/jacob/JacobRunnable.java
deleted file mode 100644
index 7cf6a05..0000000
--- a/src/main/java/org/apache/ode/jacob/JacobRunnable.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.ode.jacob;
-
-import java.lang.reflect.Method;
-import java.util.Collections;
-import java.util.Set;
-
-
-/**
- * Base class for process abstractions. An abstraction is a parameterized
- * process template, whose instantiation is termed a <em>concretion</em>.
- * Abstractions may define a set of bound channel names or other parameters
- * which are resolved at the time of the concretion. For example the process
- * term abstraction of a memory cell:
- * <code>Cell(s,v) := s ? { read(...) = ... & write(...) = ... }</code> would
- * be represented by the following Java class: <code>
- * <pre>
- * public class CellProcess extends JacobRunnable {
- *     private Cell s;
- *
- *     private Object v;
- *
- *     public CellProcess(Cell s, Object v) {
- *         this.s = s;
- *         this.v = v;
- *     }
- *
- *     public void run() {
- *      object(new ReceiveProcess { read(...) {...}
- *                             write(...) {...} } );
- *    }
- * }
- * </pre>
- * </code> An example of the Java expression representing the concretion of this
- * abstraction would look like: <code>
- * <pre>
- *    .
- *    .
- *    // (new c) CellProcess(c,v)
- *    Integer v = Integer.valueOf(0);
- *    Cell c = (Cell)newChannel(Cell.class);
- *    instance(new Cell(c, v));
- *    .
- *    .
- * </pre>
- * </code>
- *
- * @author Maciej Szefler <a href="mailto:mbs@fivesight.com" />
- */
-@SuppressWarnings("serial")
-public abstract class JacobRunnable extends JacobObject {
-    private static final Set<Method> IMPLEMENTED_METHODS;
-
-    static {
-        try {
-            Method m = JacobRunnable.class.getMethod("run", new Class[]{});
-            IMPLEMENTED_METHODS = Collections.singleton(m);
-        } catch (NoSuchMethodException e) {
-            throw new AssertionError(e);
-        }
-    }
-
-    public Set<Method> getImplementedMethods() {
-        return IMPLEMENTED_METHODS;
-    }
-
-    /**
-     * Peform the template reduction, i.e. do whatever it is that the
-     * templetized process does. This method may do some combination of in-line
-     * Java, and JACOB operations.
-     * <p>
-     * <em>Note that JACOB operations are performed in parallel, so the
-     * sequencing of JACOB operations is irrelevant</em>
-     */
-    public abstract void run();
-
-    public String toString() {
-        return getClassName() + "(...)";
-    }
-
-}
diff --git a/src/main/java/org/apache/ode/jacob/JacobThread.java b/src/main/java/org/apache/ode/jacob/JacobThread.java
index a33f5dc..0c1d1c2 100644
--- a/src/main/java/org/apache/ode/jacob/JacobThread.java
+++ b/src/main/java/org/apache/ode/jacob/JacobThread.java
@@ -42,7 +42,7 @@
     /**
      * Create a process instance i.e. a concretion of a process abstraction.
      */
-    public void instance(JacobRunnable concretion);
+    public void instance(Runnable concretion);
 
     /**
      * Send a message (object invocation). This method shouldn't really be used
diff --git a/src/main/java/org/apache/ode/jacob/oo/ClassUtil.java b/src/main/java/org/apache/ode/jacob/oo/ClassUtil.java
index 992d123..a7bbd03 100644
--- a/src/main/java/org/apache/ode/jacob/oo/ClassUtil.java
+++ b/src/main/java/org/apache/ode/jacob/oo/ClassUtil.java
@@ -19,14 +19,32 @@
 package org.apache.ode.jacob.oo;
 
 import java.lang.reflect.Method;
+import java.util.HashSet;
 import java.util.Set;
 
 
 public final class ClassUtil {
+    public static final Method RUN_METHOD;
+    private static final Set<Method> RUN_METHOD_SET = new HashSet<Method>();
+
+    static {
+        try {
+            // Resolve the {@link Runnable#run} method once statically
+            RUN_METHOD = Runnable.class.getMethod("run", new Class[]{});
+            RUN_METHOD_SET.add(RUN_METHOD);
+        } catch (Exception e) {
+            throw new Error("Cannot resolve 'run()' method", e);
+        }
+    }
+
     private ClassUtil() {
         // Utility class
     }
 
+    public static Set<Method> runMethodSet() {
+    	return RUN_METHOD_SET;
+    }
+
     public static Set<Method> getImplementedMethods(Set<Method> methods, Class<?> clazz) {
         // TODO: this can be optimized (some 20 times faster in my tests) by keeping a private 
         //  map of interfaces to methods: Map<Class<?>, Method[]> and just do lookups
diff --git a/src/main/java/org/apache/ode/jacob/vpu/JacobVPU.java b/src/main/java/org/apache/ode/jacob/vpu/JacobVPU.java
index 985a402..f9eddf8 100644
--- a/src/main/java/org/apache/ode/jacob/vpu/JacobVPU.java
+++ b/src/main/java/org/apache/ode/jacob/vpu/JacobVPU.java
@@ -25,10 +25,10 @@
 import java.util.Stack;
 
 import org.apache.ode.jacob.JacobObject;
-import org.apache.ode.jacob.JacobRunnable;
 import org.apache.ode.jacob.JacobThread;
 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.oo.CompositeProcess;
 import org.apache.ode.jacob.oo.ReceiveProcess;
 import org.apache.ode.jacob.oo.Synch;
@@ -51,16 +51,6 @@
 
     // Thread-local for associating a thread with a VPU. Needs to be stored in a stack to allow reentrance.
     private static final ThreadLocal<Stack<JacobThread>> ACTIVE_THREAD = new ThreadLocal<Stack<JacobThread>>();
-    private static final Method REDUCE_METHOD;
-
-    static {
-        try {
-            // Resolve the {@link JacobRunnable#run} method once statically
-            REDUCE_METHOD = JacobRunnable.class.getMethod("run", new Class[]{});
-        } catch (Exception e) {
-            throw new Error("Cannot resolve 'run()' method", e);
-        }
-    }
 
     /**
      * Persisted cross-VPU state (state of the channels)
@@ -176,9 +166,9 @@
      * the injected process. This method is equivalent to the parallel operator,
      * but is intended to be used from outside of an active {@link JacobThread}.
      */
-    public void inject(JacobRunnable concretion) {
+    public void inject(Runnable concretion) {
         LOG.debug("injecting {}", concretion);
-        addReaction(concretion, REDUCE_METHOD, new Class[]{},
+        addReaction((JacobObject)concretion, ClassUtil.RUN_METHOD, new Class[]{},
             (LOG.isInfoEnabled() ? concretion.toString() : null));
     }
 
@@ -270,11 +260,11 @@
             }
         }
 
-        public void instance(JacobRunnable template) {
+        public void instance(Runnable template) {
             LOG.trace(">> [{}] : {}", _cycle, template);
 
             _statistics.numReductionsStruct++;
-            addReaction(template, REDUCE_METHOD, new Class[]{}, 
+            addReaction((JacobObject)template, ClassUtil.RUN_METHOD, new Class[]{}, 
                 LOG.isInfoEnabled() ? template.toString() : null);
         }
 
diff --git a/src/test/java/org/apache/ode/jacob/examples/cell/CELL_.java b/src/test/java/org/apache/ode/jacob/examples/cell/CELL_.java
index e320085..35917b7 100644
--- a/src/test/java/org/apache/ode/jacob/examples/cell/CELL_.java
+++ b/src/test/java/org/apache/ode/jacob/examples/cell/CELL_.java
@@ -18,7 +18,7 @@
  */
 package org.apache.ode.jacob.examples.cell;
 
-import org.apache.ode.jacob.JacobRunnable;
+import org.apache.ode.jacob.JacobObject;
 import org.apache.ode.jacob.oo.ReceiveProcess;
 import org.apache.ode.jacob.oo.Val;
 
@@ -29,7 +29,7 @@
  * Cell(self, val) = self ? [ read(r) = { Cell(self, val) | r ! val(val) } & write(newVal) = { Cell(self, newVal) } ]
  * </code>
  */
-public class CELL_<T> extends JacobRunnable {
+public class CELL_<T> extends JacobObject implements Runnable {
     private static final long serialVersionUID = 1550566086202728251L;
 
     private Cell _self;
diff --git a/src/test/java/org/apache/ode/jacob/examples/cell/JacobCellTest.java b/src/test/java/org/apache/ode/jacob/examples/cell/JacobCellTest.java
index 5215b1a..5ab4015 100644
--- a/src/test/java/org/apache/ode/jacob/examples/cell/JacobCellTest.java
+++ b/src/test/java/org/apache/ode/jacob/examples/cell/JacobCellTest.java
@@ -25,7 +25,7 @@
 
 import junit.framework.TestCase;
 
-import org.apache.ode.jacob.JacobRunnable;
+import org.apache.ode.jacob.JacobObject;
 import org.apache.ode.jacob.oo.Val;
 import org.apache.ode.jacob.vpu.ExecutionQueueImpl;
 import org.apache.ode.jacob.vpu.JacobVPU;
@@ -58,7 +58,7 @@
     }
 
     @SuppressWarnings("serial")
-    static class CellTest1 extends JacobRunnable {
+    static class CellTest1 extends JacobObject implements Runnable {
         public void run() {
             Cell cell = newChannel(Cell.class, "cell");
             Val ret = newChannel(Val.class, "val");
diff --git a/src/test/java/org/apache/ode/jacob/examples/eratosthenes/Sieve.java b/src/test/java/org/apache/ode/jacob/examples/eratosthenes/Sieve.java
index 201fac6..ae55528 100644
--- a/src/test/java/org/apache/ode/jacob/examples/eratosthenes/Sieve.java
+++ b/src/test/java/org/apache/ode/jacob/examples/eratosthenes/Sieve.java
@@ -18,7 +18,7 @@
  */
 package org.apache.ode.jacob.examples.eratosthenes;
 
-import org.apache.ode.jacob.JacobRunnable;
+import org.apache.ode.jacob.JacobObject;
 import org.apache.ode.jacob.oo.ReceiveProcess;
 import org.apache.ode.jacob.oo.Synch;
 import org.apache.ode.jacob.vpu.ExecutionQueueImpl;
@@ -36,7 +36,7 @@
  *
  * @author Maciej Szefler <a href="mailto:mbs@fivesight.com">mbs</a>
  */
-public class Sieve extends JacobRunnable {
+public class Sieve extends JacobObject implements Runnable {
   private static final long serialVersionUID = -1303509567096202776L;
 
   private static int _cnt = 0;
@@ -58,7 +58,7 @@
    *  Counter(out, n) := out.val(n) | Counter(out, n+1)
    * </em></pre>
    */
-  private static class Counter extends JacobRunnable {
+  private static class Counter extends JacobObject implements Runnable {
     private static final long serialVersionUID = 4739323750438991003L;
 
     private NaturalNumberStream _out;
@@ -92,7 +92,7 @@
    *
    *
    */
-  private static final class Head extends JacobRunnable {
+  private static final class Head extends JacobObject implements Runnable {
     private static final long serialVersionUID = 1791641314141082728L;
 
     NaturalNumberStream _in;
@@ -125,7 +125,7 @@
     }
   }
 
-  private static final class Print extends JacobRunnable {
+  private static final class Print extends JacobObject implements Runnable {
     private static final long serialVersionUID = -3134193737519487672L;
 
     private NaturalNumberStream _in;
@@ -154,7 +154,7 @@
    *     ! in ? [val(n)={ if(n mod prime <> 0) out.val(n) }
    * </em></prime>
    */
-  private static class PrimeFilter extends JacobRunnable {
+  private static class PrimeFilter extends JacobObject implements Runnable {
     private static final long serialVersionUID = 1569523200422202448L;
 
     private int _prime;
diff --git a/src/test/java/org/apache/ode/jacob/examples/helloworld/HelloWorld.java b/src/test/java/org/apache/ode/jacob/examples/helloworld/HelloWorld.java
index 705e2e6..92dc03c 100644
--- a/src/test/java/org/apache/ode/jacob/examples/helloworld/HelloWorld.java
+++ b/src/test/java/org/apache/ode/jacob/examples/helloworld/HelloWorld.java
@@ -18,7 +18,7 @@
  */
 package org.apache.ode.jacob.examples.helloworld;
 
-import org.apache.ode.jacob.JacobRunnable;
+import org.apache.ode.jacob.JacobObject;
 import org.apache.ode.jacob.examples.sequence.Sequence;
 import org.apache.ode.jacob.oo.Channel;
 import org.apache.ode.jacob.oo.ReceiveProcess;
@@ -44,13 +44,13 @@
  * 
  */
 @SuppressWarnings("serial")
-public class HelloWorld extends JacobRunnable {
+public class HelloWorld extends JacobObject implements Runnable {
 
     public static interface Callback<T, R extends Channel> extends Channel {
         public void invoke(T value, R callback);
     }
 
-    static class ReliablePrinterProcess extends JacobRunnable {
+    static class ReliablePrinterProcess extends JacobObject implements Runnable {
         private Callback<String, Synch> in;
 
         @JsonCreator
@@ -71,7 +71,7 @@
         }
     }
 
-    static class ReliableStringEmitterProcess extends JacobRunnable {
+    static class ReliableStringEmitterProcess extends JacobObject implements Runnable {
         private String str;
         private Callback<String, Synch> to;
 
@@ -102,7 +102,7 @@
         }
     }
 
-    static class PrinterProcess extends JacobRunnable {
+    static class PrinterProcess extends JacobObject implements Runnable {
         private Val _in;
 
         @JsonCreator
@@ -122,7 +122,7 @@
         }
     }
 
-    static class StringEmitterProcess extends JacobRunnable {
+    static class StringEmitterProcess extends JacobObject implements Runnable {
         private String str;
         private Val to;
 
@@ -137,7 +137,7 @@
         }
     }
 
-    static class ForwarderProcess extends JacobRunnable {
+    static class ForwarderProcess extends JacobObject implements Runnable {
         private Val in;
         private Val out;
 
@@ -224,11 +224,11 @@
 		}
 
 		@Override
-		protected JacobRunnable doStep(int step, Synch done) {
+		protected Runnable doStep(int step, Synch done) {
 			return new SequenceItemEmitter(greetings[step], done, out);
         }
 
-		static class SequenceItemEmitter extends JacobRunnable {
+		static class SequenceItemEmitter extends JacobObject implements Runnable {
 			private final String string;
 			private final Synch done;
 			private final Val out;
diff --git a/src/test/java/org/apache/ode/jacob/examples/sequence/Sequence.java b/src/test/java/org/apache/ode/jacob/examples/sequence/Sequence.java
index d137501..aa7ae05 100644
--- a/src/test/java/org/apache/ode/jacob/examples/sequence/Sequence.java
+++ b/src/test/java/org/apache/ode/jacob/examples/sequence/Sequence.java
@@ -18,7 +18,7 @@
  */
 package org.apache.ode.jacob.examples.sequence;
 
-import org.apache.ode.jacob.JacobRunnable;
+import org.apache.ode.jacob.JacobObject;
 import org.apache.ode.jacob.oo.ReceiveProcess;
 import org.apache.ode.jacob.oo.Synch;
 
@@ -29,7 +29,7 @@
  * Abstract process that executes a number of steps sequentially.
  */
 @SuppressWarnings("serial")
-public abstract class Sequence extends JacobRunnable {
+public abstract class Sequence extends JacobObject implements Runnable {
     private final SequenceData data = new SequenceData();
 
     /**
@@ -62,7 +62,7 @@
      * @param done notification after step completion
      * @return runnable process
      */
-    protected abstract JacobRunnable doStep(int step, Synch done);
+    protected abstract Runnable doStep(int step, Synch done);
 
     public static class SequenceData {
         public int _steps;
diff --git a/src/test/java/org/apache/ode/jacob/examples/synch/SynchPrinter.java b/src/test/java/org/apache/ode/jacob/examples/synch/SynchPrinter.java
index 41e095b..22a82f6 100644
--- a/src/test/java/org/apache/ode/jacob/examples/synch/SynchPrinter.java
+++ b/src/test/java/org/apache/ode/jacob/examples/synch/SynchPrinter.java
@@ -18,14 +18,14 @@
  */
 package org.apache.ode.jacob.examples.synch;
 
-import org.apache.ode.jacob.JacobRunnable;
+import static org.apache.ode.jacob.oo.ProcessUtil.receive;
+
+import org.apache.ode.jacob.JacobObject;
 import org.apache.ode.jacob.oo.ReceiveProcess;
 import org.apache.ode.jacob.oo.Synch;
 import org.apache.ode.jacob.vpu.ExecutionQueueImpl;
 import org.apache.ode.jacob.vpu.JacobVPU;
 
-import static org.apache.ode.jacob.oo.ProcessUtil.receive;
-
 /**
  * Example JACOB process illustrating the use of {@link SynchPrint}
  *
@@ -33,7 +33,7 @@
  */
 public class SynchPrinter {
 
-    public static final class SystemPrinter extends JacobRunnable {
+    public static final class SystemPrinter extends JacobObject implements Runnable {
         private static final long serialVersionUID = -8516348116865575605L;
 
         private SynchPrint _self;
@@ -55,7 +55,7 @@
         }
     }
 
-    public static final class Tester extends JacobRunnable {
+    public static final class Tester extends JacobObject implements Runnable {
         private static final long serialVersionUID = 7899682832271627464L;
 
         public void run() {