diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/example/DinerosTestNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/example/DinerosTestNode.java
index 266a0f3d7cbe0c65b6fcc1bf337e47e9cc41a51d..0d269d85256d54eea944069c2e8cff8b2f22638d 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/example/DinerosTestNode.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/example/DinerosTestNode.java
@@ -16,7 +16,8 @@ public class DinerosTestNode extends DiNeRosNode {
         super(nodeName, petriNet, "localhost", "mqtt");
     }
 
-    public DinerosTestNode(String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage) {
+    public DinerosTestNode(String nodeName, PetriNet petriNet, BalloonMarking marking,
+                           BalloonCallbackStorage callbackStorage) {
         super(nodeName, petriNet, "localhost", "mqtt");
         this.marking = marking;
         this.callbackStorage = callbackStorage;
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java
index 5e4ecf9fd8febab2dfec9d8dbdd15aa4daa4b344..8f32ae7e01cfd09e034ff70253c0b6c2128e58f1 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java
@@ -38,7 +38,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
     protected BalloonMarking marking;
     public BalloonCallbackStorage callbackStorage;
     protected ConnectedNode connectedNode;
-    protected InputSignalConnector inputSignalConnector = new InputSignalConnector();
+    protected InputSignalConnector inputSignalConnector;
     private boolean stopNode = false;
 
     private final Map<DinerosPlace, Publisher<String>> dinerosPublishers = new HashMap<>();
@@ -52,6 +52,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
         try {
             marking = petriNet.initializeBalloonMarking();
             callbackStorage = petriNet.initializeCallbackStorage();
+            inputSignalConnector = new InputSignalConnector();
             PetriNetInitializer.initInputSignalConnections(petriNet, rcHost, gcProtocol, inputSignalConnector, this);
         } catch (IOException | SAXException | ParserConfigurationException e) {
             e.printStackTrace();
@@ -63,14 +64,22 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
                                         List<Map<java.lang.String, Object>>> processTokenFunction) {
 
         TransitionHandler transitionHandler = new TransitionHandler(priority, processTokenFunction);
+        integrateHandler(transitionId, transitionHandler);
+    }
+
+    public void registerHandler(java.lang.String transitionId, TransitionHandler transitionHandler) {
 
-        if(petriNet.getTransitionById(transitionId) == null){
+        integrateHandler(transitionId, transitionHandler);
+    }
+
+    private void integrateHandler(java.lang.String transitionId, TransitionHandler transitionHandler) {
+        if (petriNet.getTransitionById(transitionId) == null) {
             return;
         }
 
         BalloonTransition balloonTransition = callbackStorage.resolveBalloonTransition(petriNet.getTransitionById(transitionId));
 
-        if(balloonTransition == null){
+        if (balloonTransition == null) {
             return;
         }
 
@@ -315,6 +324,12 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
                 = petriNet.getChannelElemensByKey(PnmlConstants.CHANNEL_PLACE_TYPE_SERVER_REQ_KEY);
 
         for (java.lang.String key : channelServerReqElementMap.keySet()) {
+
+            if(petriNet.getPlaceById(channelServerReqElementMap.get(key).get(0)) == null){
+                System.out.println("Skipping service request place: " + channelServerReqElementMap.get(key).get(0));
+                continue;
+            }
+
             for (Page p : petriNet.allPages()) {
                 if (p.getServiceName() != null && p.getServiceName().equals(key)) {
                     // service names are unique so we basically have a 1:1 mapping
@@ -414,9 +429,11 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
 
         for (java.lang.String key : channelPubElementMap.keySet()) {
             for (java.lang.String placeId : channelPubElementMap.get(key)) {
-                System.out.println("[" + nodeName + "] Initializing publisher on " + placeId);
-                final Publisher<String> publisher = connectedNode.newPublisher(key, String._TYPE);
-                dinerosPublishers.put(petriNet.getPlaceById(placeId).asDinerosPlace(), publisher);
+                if(petriNet.getPlaceById(placeId) != null) {
+                    System.out.println("[" + nodeName + "] Initializing publisher on " + placeId);
+                    final Publisher<String> publisher = connectedNode.newPublisher(key, String._TYPE);
+                    dinerosPublishers.put(petriNet.getPlaceById(placeId).asDinerosPlace(), publisher);
+                }
             }
         }
 
@@ -427,22 +444,24 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
 
         for (java.lang.String key : channelSubElementMap.keySet()) {
             for (java.lang.String placeId : channelSubElementMap.get(key)) {
+                if(petriNet.getPlaceById(placeId) != null) {
 
-                DinerosPlace targetPlace = petriNet.getPlaceById(placeId).asDinerosPlace();
-                Subscriber<String> subscriber = connectedNode.newSubscriber(key, String._TYPE);
+                    DinerosPlace targetPlace = petriNet.getPlaceById(placeId).asDinerosPlace();
+                    Subscriber<String> subscriber = connectedNode.newSubscriber(key, String._TYPE);
 
-                subscriber.addMessageListener(message -> {
+                    subscriber.addMessageListener(message -> {
 
-                    BalloonToken bt = new BalloonToken();
-                    bt.setValue(message.getData());
-                    bt.setCreationTime(System.currentTimeMillis());
+                        BalloonToken bt = new BalloonToken();
+                        bt.setValue(message.getData());
+                        bt.setCreationTime(System.currentTimeMillis());
 
-                    BalloonMarkedPlace bmp = marking.resolveBalloonPlace(targetPlace);
-                    bmp.getBalloonMarkingList().add(bt);
-                    petriNet.flushTreeCache();
-                    this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE));
+                        BalloonMarkedPlace bmp = marking.resolveBalloonPlace(targetPlace);
+                        bmp.getBalloonMarkingList().add(bt);
+                        petriNet.flushTreeCache();
+                        this.notify(new DiNeRosEvent(DiNeRosEventTypes.NOTIFICATION_MARKING_CHANGE));
 
-                }, petriNet.getChannelElementLimitById(placeId));
+                    }, petriNet.getChannelElementLimitById(placeId));
+                }
             }
         }
 
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/PetriNetInitializer.java b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/PetriNetInitializer.java
index f36c3af5abc05a497082356e0c76d8c771c8d293..319861167dc8c19e5bedec4c0e1c25d86a82741a 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/PetriNetInitializer.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/PetriNetInitializer.java
@@ -78,25 +78,37 @@ public class PetriNetInitializer {
         target.setMutableTransitionInformation(tri);
     }
 
+    private static boolean signalIsUsed(PetriNet petriNet, String signalId){
+        for(DinerosTransition t : petriNet.allDinerosTransitions()){
+            if(t.getStaticTransitionInformation().
+                    asSignalTransitionInformation().getClause().hasLiteral(signalId)){
+                return true;
+            }
+        }
+        return false;
+    }
+
     public static void initInputSignalConnections(PetriNet petriNet, String host, String protocol,
                                                   InputSignalConnector inputSignalConnector, DiNeRosNode node) throws IOException {
 
-
         for(String signalId : petriNet.getInputSignalDefinition().keySet()){
-
-            // mqtt connections
-            SignalConnection sc = new SignalConnection();
-            sc.setCurrentValue(Boolean.parseBoolean(petriNet.getInputSignalDefinition().get(signalId)));
-            sc.setId(signalId);
-            inputSignalConnector.addSignalConnection(sc);
-            sc.connectCurrentValue(protocol + "://" + host + "/" + signalId);
-
-            // internal java connections
-            sc.connectCurrentValue("java://localhost:00/" + signalId, false);
-            //inputSignalConnector.ragconnectJavaRegisterConsumer("java://localhost:00/" + signalId,
-                  //  bytes -> node.notify(DiNeRosNode.NOTIFICATION_SIGNAL_CHANGE));
-
-            inputSignalConnector.ragconnectJavaRegisterConsumer(signalId, bytes -> notifyOnSignalChange(node));
+            if(signalIsUsed(petriNet, signalId)) {
+                // mqtt connections
+                SignalConnection sc = new SignalConnection();
+                sc.setCurrentValue(Boolean.parseBoolean(petriNet.getInputSignalDefinition().get(signalId)));
+                sc.setId(signalId);
+                inputSignalConnector.addSignalConnection(sc);
+                sc.connectCurrentValue(protocol + "://" + host + "/" + signalId);
+
+                // internal java connections
+                sc.connectCurrentValue("java://localhost:00/" + signalId, false);
+                //inputSignalConnector.ragconnectJavaRegisterConsumer("java://localhost:00/" + signalId,
+                //  bytes -> node.notify(DiNeRosNode.NOTIFICATION_SIGNAL_CHANGE));
+
+                inputSignalConnector.ragconnectJavaRegisterConsumer(signalId, bytes -> notifyOnSignalChange(node));
+            } else {
+                System.out.println("Skipping unused signal: " + signalId);
+            }
         }
     }