diff --git a/libs/pnml-relast-engine-fatjar-0.1.jar b/libs/pnml-relast-engine-fatjar-0.1.jar
index 235fc3c8eb382be6f18abe5d3db24622c46233bc..962eac47cbea654f89f42dfb0775e21f7ec936ba 100644
Binary files a/libs/pnml-relast-engine-fatjar-0.1.jar and b/libs/pnml-relast-engine-fatjar-0.1.jar differ
diff --git a/src/main/java/de/tudresden/inf/st/sample/Main.java b/src/main/java/de/tudresden/inf/st/sample/Main.java
index 0dc5012513e17edfb62b52242081ea7cffc76a3e..740e6c056a3a3a36983c4306c0dec6481710a42d 100644
--- a/src/main/java/de/tudresden/inf/st/sample/Main.java
+++ b/src/main/java/de/tudresden/inf/st/sample/Main.java
@@ -1,21 +1,20 @@
 package de.tudresden.inf.st.sample;
 
 import de.tudresden.inf.st.pnml.engine.execution.TransitionHandlerService;
-import de.tudresden.inf.st.pnml.engine.ros.DiNeRosDefaultNode;
 import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode;
 import de.tudresden.inf.st.pnml.jastadd.model.*;
+import de.tudresden.inf.st.sample.handling.HandlingBinder;
+import de.tudresden.inf.st.sample.nodes.ClientNode;
+import de.tudresden.inf.st.sample.nodes.PublisherNode;
+import de.tudresden.inf.st.sample.nodes.ServerNode;
+import de.tudresden.inf.st.sample.nodes.SubscriberNode;
 import org.ros.node.DefaultNodeMainExecutor;
 import org.ros.node.NodeConfiguration;
 import org.ros.node.NodeMainExecutor;
-import org.xml.sax.SAXException;
 
-import javax.xml.parsers.ParserConfigurationException;
-import java.io.IOException;
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 /**
  * <Generated>
@@ -30,61 +29,48 @@ public class Main {
     private static final NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic(ROS_HOST);
     private static final NodeMainExecutor nodeMainExecutor = DefaultNodeMainExecutor.newDefault();
 
-    public static void main(java.lang.String[] args) throws IOException, ParserConfigurationException, SAXException {
+    public static void main(java.lang.String[] args) {
 
-        /*
-         * <Generated>
-         * Petri Net base data initialization
-         */
+        // Setup ROS Master
+        nodeConfiguration.setMasterUri(URI.create(ROS_MASTER_URI));
 
-        // actual petri net paths are generated
+        // Petri Net base data initialization
         List<String> petriNetPaths = new ArrayList<>();
         petriNetPaths.add("src/main/resources/nets/publisher-net.pnml");
         petriNetPaths.add("src/main/resources/nets/subscriber-net.pnml");
         petriNetPaths.add("src/main/resources/nets/client-net.pnml");
         petriNetPaths.add("src/main/resources/nets/server-net.pnml");
 
+        // Parse the PNML files
         List<PetriNet> petriNets = new ArrayList<>();
-        Map<String, BalloonMarking> markings = new HashMap<>();
-        Map<String, BalloonCallbackStorage> callbackStorages = new HashMap<>();
-
         for(String petriNetPath : petriNetPaths){
             petriNets.add(PnmlParser.parsePnml(petriNetPath).get(0));
         }
 
+        // Initialize the Handling
         TransitionHandlerService transitionHandlerService = TransitionHandlerService.getInstance();
-
         for(PetriNet petriNet : petriNets){
-            markings.put(petriNet.getId(), petriNet.initializeBalloonMarking());
             BalloonCallbackStorage storage = petriNet.initializeCallbackStorage();
             transitionHandlerService.init(petriNet.getId(), storage);
-            callbackStorages.put(petriNet.getId(), storage);
         }
 
-        /*
-         * <Generated>
-         * Start of the Dineros NodescallbackMap1
-         */
-
-        nodeConfiguration.setMasterUri(URI.create(ROS_MASTER_URI));
-
-        // generated
-        DiNeRosNode node1 = new Node1("node1", petriNets.get(0),
-                markings.get(petriNets.get(0).getId()), callbackStorages.get(petriNets.get(0).getId()));
-        DiNeRosNode node2 = new Node2("node2", petriNets.get(1),
-                markings.get(petriNets.get(1).getId()), callbackStorages.get(petriNets.get(1).getId()));
-
+        // Create the ROS nodes
+        DiNeRosNode node0 = new PublisherNode("PublisherNode", petriNets.get(0), MQTT_HOST, "mqtt");
+        DiNeRosNode node1 = new SubscriberNode("SubscriberNode", petriNets.get(1), MQTT_HOST, "mqtt");
+        DiNeRosNode node2 = new ClientNode("ClientNode", petriNets.get(2), MQTT_HOST, "mqtt");
+        DiNeRosNode node3 = new ServerNode("ServerNode", petriNets.get(3), MQTT_HOST, "mqtt");
 
-        DiNeRosNode diNeRosNode = new DiNeRosDefaultNode("TestNode", petriNets.get(0),
-                markings.get(petriNets.get(0).getId()), callbackStorages.get(petriNets.get(0).getId()));
-        diNeRosNode.getDinerosServiceServers().put("locB", new DiNeRosDefaultServer());
+        // Setup handlers of the ROS nodes
+        HandlingBinder.bindHandlersToPublisherNode(petriNets.get(0));
+        HandlingBinder.bindHandlersToSubscriberNode(petriNets.get(0));
+        HandlingBinder.bindHandlersToClientNode(petriNets.get(0));
+        HandlingBinder.bindHandlersToServerNode(petriNets.get(0));
 
-        new Thread(() -> nodeMainExecutor.execute(node1, nodeConfiguration)) {{
-            start();
-        }};
+        // Start the ROS nodes
+        new Thread(() -> nodeMainExecutor.execute(node0, nodeConfiguration)) {{start();}};
+        new Thread(() -> nodeMainExecutor.execute(node1, nodeConfiguration)) {{start();}};
+        new Thread(() -> nodeMainExecutor.execute(node2, nodeConfiguration)) {{start();}};
+        new Thread(() -> nodeMainExecutor.execute(node3, nodeConfiguration)) {{start();}};
 
-        new Thread(() -> nodeMainExecutor.execute(node2, nodeConfiguration)) {{
-            start();
-        }};
     }
 }
diff --git a/src/main/java/de/tudresden/inf/st/sample/handling/Handlers.java b/src/main/java/de/tudresden/inf/st/sample/handling/HandlerFunctions.java
similarity index 55%
rename from src/main/java/de/tudresden/inf/st/sample/handling/Handlers.java
rename to src/main/java/de/tudresden/inf/st/sample/handling/HandlerFunctions.java
index ecec498cda0a617a0dbd6d86b4b35ead9a1b8852..79a90fd5e9fd52ec4550137bae51679acf6175c6 100644
--- a/src/main/java/de/tudresden/inf/st/sample/handling/Handlers.java
+++ b/src/main/java/de/tudresden/inf/st/sample/handling/HandlerFunctions.java
@@ -1,31 +1,30 @@
 package de.tudresden.inf.st.sample.handling;
 
-import de.tudresden.inf.st.pnml.engine.execution.TransitionHandler;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
 
-public final class Handlers {
+public final class HandlerFunctions {
 
-    TransitionHandler sampleHandlerColor = new TransitionHandler(1, maps -> {
+    final static Function<List<Map<String, Object>>, List<Map<String, Object>>> SAMPLE_COLOR_HANDLING_FUNCTION =  maps -> {
         for(Map<String, Object> m : maps){
             m.keySet().stream().filter(s -> false).forEach(s -> m.replace("color", "light-red"));
         }
         return maps;
-    });
+    };
 
-    TransitionHandler sampleHandlerStatus = new TransitionHandler(1, maps -> {
+    final static Function<List<Map<String, Object>>, List<Map<String, Object>>> SAMPLE_SUCCESS_HANDLING_FUNCTION =  maps -> {
         for(Map<String, Object> m : maps){
             m.keySet().stream().filter(s -> false).forEach(s -> m.replace("pickPlaceSuccess", true));
         }
         return maps;
-    });
+    };
 
-    TransitionHandler sampleFinalHandler = new TransitionHandler(1, maps -> {
+    final static Function<List<Map<String, Object>>, List<Map<String, Object>>> SAMPLE_FINAL_HANDLING_FUNCTION = maps -> {
 
         List<Map<String, Object>> sList = new ArrayList<>();
         sList.add(maps.get(0));
         return sList;
-    });
+    };
 }
diff --git a/src/main/java/de/tudresden/inf/st/sample/handling/HandlingBinder.java b/src/main/java/de/tudresden/inf/st/sample/handling/HandlingBinder.java
index d1073d8338776c6628317b783cc1eb95e2d87970..522fdb87a35362452386dc4fefbca0f2c02d9d3f 100644
--- a/src/main/java/de/tudresden/inf/st/sample/handling/HandlingBinder.java
+++ b/src/main/java/de/tudresden/inf/st/sample/handling/HandlingBinder.java
@@ -1,48 +1,28 @@
 package de.tudresden.inf.st.sample.handling;
 
 
+import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
+
 /**
  * <Generated>
  */
 public class HandlingBinder {
 
-    // methods generated for each petri net
- /*   public static final Map<String, List<AbstractNetCallback>> initCallbacksForNode1(PetriNet petriNet){
-
-        Map<String, List<AbstractNetCallback>> callbackMap = new HashMap<>();
-
-        // TODO: implementation by user
+   public static void bindHandlersToClientNode(PetriNet petriNet){
+       petriNet.registerHandler("ClientTransition1", 1, HandlerFunctions.SAMPLE_FINAL_HANDLING_FUNCTION);
+   }
 
-        SampleNetCallback callback = new SampleNetCallback("default_cb", 1, new ArrayList<>());
-
-        for(Transition t : petriNet.allTransitions()){
-            if(t.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()){
-                List<AbstractNetCallback> cbList = new ArrayList<>();
-                cbList.add(callback);
-                callbackMap.put(t.getId(), cbList);
-            }
-        }
-
-        return callbackMap;
+    public static void bindHandlersToServerNode(PetriNet petriNet){
+       petriNet.registerHandler("ConnectorTransition", 1, HandlerFunctions.SAMPLE_SUCCESS_HANDLING_FUNCTION);
+       petriNet.registerHandler("ConnectorTransition", 2, HandlerFunctions.SAMPLE_FINAL_HANDLING_FUNCTION);
     }
 
-    // methods generated for each petri net
-    public static final Map<String, List<AbstractNetCallback>> initCallbacksForNode2(PetriNet petriNet){
-
-        Map<String, List<AbstractNetCallback>> callbackMap = new HashMap<>();
-
-        // TODO: implementation by user
-
-        SampleNetCallback callback = new SampleNetCallback("default_cb", 1, new ArrayList<>());
-
-        for(Transition t : petriNet.allTransitions()){
-            if(t.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()){
-                List<AbstractNetCallback> cbList = new ArrayList<>();
-                cbList.add(callback);
-                callbackMap.put(t.getId(), cbList);
-            }
-        }
+    public static void bindHandlersToPublisherNode(PetriNet petriNet){
+        petriNet.registerHandler("SortRed", 1, HandlerFunctions.SAMPLE_COLOR_HANDLING_FUNCTION);
+        petriNet.registerHandler("SortRed", 2, HandlerFunctions.SAMPLE_FINAL_HANDLING_FUNCTION);
+    }
 
-        return callbackMap;
-    }*/
+    public static void bindHandlersToSubscriberNode(PetriNet petriNet){
+        petriNet.registerHandler("SubTransition", 1, HandlerFunctions.SAMPLE_FINAL_HANDLING_FUNCTION);
+    }
 }
diff --git a/src/main/java/de/tudresden/inf/st/sample/nodes/ClientNode.java b/src/main/java/de/tudresden/inf/st/sample/nodes/ClientNode.java
index df1dc7c20517755718cc2af3ba8353d5eec0aab6..d199e5221c0a6753f7457c398a555a70d8410235 100644
--- a/src/main/java/de/tudresden/inf/st/sample/nodes/ClientNode.java
+++ b/src/main/java/de/tudresden/inf/st/sample/nodes/ClientNode.java
@@ -11,22 +11,15 @@ public class ClientNode extends DiNeRosNode {
         super(nodeName, petriNet, rcHost, gcProtocol);
     }
 
-    public ClientNode(String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage, InputSignalConnector inputSignalConnector) {
-        super(nodeName, petriNet, marking, callbackStorage, inputSignalConnector);
-    }
-
-    @Override
-    protected void nodeLoop() {
-
-    }
-
     @Override
     protected TransitionSelectionResult onChange(List<Transition> list) {
-        return null;
+        return list.size() == 0 ?
+                new FiringSelectionNone() : fireRandomEnabledTransition(list);
     }
 
     @Override
     protected TransitionSelectionResult onStartupEnded(List<Transition> list) {
-        return null;
+        return list.size() == 0 ?
+                new FiringSelectionNone() : fireRandomEnabledTransition(list);
     }
 }
diff --git a/src/main/java/de/tudresden/inf/st/sample/nodes/PublisherNode.java b/src/main/java/de/tudresden/inf/st/sample/nodes/PublisherNode.java
index 1c0a36500cd8c6fb7e4756bf22e802b92c47f3f1..3bac0bea18a0329f264641e78caf06a6ff8a28ce 100644
--- a/src/main/java/de/tudresden/inf/st/sample/nodes/PublisherNode.java
+++ b/src/main/java/de/tudresden/inf/st/sample/nodes/PublisherNode.java
@@ -11,22 +11,15 @@ public class PublisherNode extends DiNeRosNode {
         super(nodeName, petriNet, rcHost, gcProtocol);
     }
 
-    public PublisherNode(String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage, InputSignalConnector inputSignalConnector) {
-        super(nodeName, petriNet, marking, callbackStorage, inputSignalConnector);
-    }
-
-    @Override
-    protected void nodeLoop() {
-
-    }
-
     @Override
     protected TransitionSelectionResult onChange(List<Transition> list) {
-        return null;
+        return list.size() == 0 ?
+                new FiringSelectionNone() : fireRandomEnabledTransition(list);
     }
 
     @Override
     protected TransitionSelectionResult onStartupEnded(List<Transition> list) {
-        return null;
+        return list.size() == 0 ?
+                new FiringSelectionNone() : fireRandomEnabledTransition(list);
     }
 }
diff --git a/src/main/java/de/tudresden/inf/st/sample/nodes/ServerNode.java b/src/main/java/de/tudresden/inf/st/sample/nodes/ServerNode.java
index 108821b062dab681275854e9538b9048f62372a6..858c20d0497b6d9caa19555d4f00ecc776ee901d 100644
--- a/src/main/java/de/tudresden/inf/st/sample/nodes/ServerNode.java
+++ b/src/main/java/de/tudresden/inf/st/sample/nodes/ServerNode.java
@@ -11,22 +11,15 @@ public class ServerNode extends DiNeRosNode {
         super(nodeName, petriNet, rcHost, gcProtocol);
     }
 
-    public ServerNode(String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage, InputSignalConnector inputSignalConnector) {
-        super(nodeName, petriNet, marking, callbackStorage, inputSignalConnector);
-    }
-
-    @Override
-    protected void nodeLoop() {
-
-    }
-
     @Override
     protected TransitionSelectionResult onChange(List<Transition> list) {
-        return null;
+        return list.size() == 0 ?
+                new FiringSelectionNone() : fireRandomEnabledTransition(list);
     }
 
     @Override
     protected TransitionSelectionResult onStartupEnded(List<Transition> list) {
-        return null;
+        return list.size() == 0 ?
+                new FiringSelectionNone() : fireRandomEnabledTransition(list);
     }
 }
diff --git a/src/main/java/de/tudresden/inf/st/sample/nodes/SubscriberNode.java b/src/main/java/de/tudresden/inf/st/sample/nodes/SubscriberNode.java
index 7ab01781376d5b27644067961c9c24262b9974da..8baa58e23397520306bdc60e70c0b806410fdea8 100644
--- a/src/main/java/de/tudresden/inf/st/sample/nodes/SubscriberNode.java
+++ b/src/main/java/de/tudresden/inf/st/sample/nodes/SubscriberNode.java
@@ -11,22 +11,15 @@ public class SubscriberNode extends DiNeRosNode {
         super(nodeName, petriNet, rcHost, gcProtocol);
     }
 
-    public SubscriberNode(String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage, InputSignalConnector inputSignalConnector) {
-        super(nodeName, petriNet, marking, callbackStorage, inputSignalConnector);
-    }
-
-    @Override
-    protected void nodeLoop() {
-
-    }
-
     @Override
     protected TransitionSelectionResult onChange(List<Transition> list) {
-        return null;
+        return list.size() == 0 ?
+                new FiringSelectionNone() : fireRandomEnabledTransition(list);
     }
 
     @Override
     protected TransitionSelectionResult onStartupEnded(List<Transition> list) {
-        return null;
+        return list.size() == 0 ?
+                new FiringSelectionNone() : fireRandomEnabledTransition(list);
     }
 }
diff --git a/src/main/resources/nets/subscriber-net.pnml b/src/main/resources/nets/subscriber-net.pnml
index 94a161aed23eaf57a807fbb7a9560b2f904811be..0b951970011d061ed03b9be6962939f68f7af74e 100644
--- a/src/main/resources/nets/subscriber-net.pnml
+++ b/src/main/resources/nets/subscriber-net.pnml
@@ -17,6 +17,29 @@
                         <text>0</text>
                     </initialMarking>
                 </place>
+                <transition id="SubTransition">
+                    <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                        <node>n3</node>
+                        <subnet>s3</subnet>
+                        <type>discreteTransitionType</type>
+                        <inputsignalclause></inputsignalclause>
+                    </toolspecific>
+                    <name>
+                        <text>SubTransition</text>
+                    </name>
+                </transition>
+                <place id="sub2">
+                    <name>
+                        <text>sub2</text>
+                    </name>
+                    <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                        <node>n3</node>
+                        <subnet>s3</subnet>
+                    </toolspecific>
+                    <initialMarking>
+                        <text>0</text>
+                    </initialMarking>
+                </place>
             </page>
         </page>
         <name>