diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
index 0df16394b46f04e0db5f6015536cf3d234382595..f160349ca553b8062d4e8e825a7d91f8ae93f9ce 100644
--- a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
+++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
@@ -1,293 +1,146 @@
-aspect BalloonExecution {
+aspect BalloonExecution{
 
-    public Optional<BalloonMarking> BalloonMarking.fireTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
+        syn FiringSelectionSuccess TransitionSelectionResult.asFiringSelectionSuccess()=null;
+        eq FiringSelectionSuccess.asFiringSelectionSuccess()=this;
 
-        if(!transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) return Optional.empty();
+        syn FiringSelectionWait TransitionSelectionResult.asFiringSelectionWait()=null;
+        eq FiringSelectionWait.asFiringSelectionWait()=this;
 
-        // synchronize marking modification to prevent concurrent modifications
-        synchronized(this){
+        syn FiringSelectionFail TransitionSelectionResult.asFiringSelectionFail()=null;
+        eq FiringSelectionFail.asFiringSelectionFail()=this;
 
-            if(!this.isBalloonEnabled(transition)) return Optional.empty();
+        syn boolean TransitionSelectionResult.isFiringSelectionSuccess()=false;
+        eq FiringSelectionSuccess.isFiringSelectionSuccess()=true;
 
-            ClauseValuesDefinition clauseValuesDefinition = new ClauseValuesDefinition();
+        syn boolean TransitionSelectionResult.isFiringSelectionWait()=false;
+        eq FiringSelectionWait.isFiringSelectionWait()=true;
 
-            for(InputSignalBinding inputSignalBinding : transition.asInputSignalTransition().getMutualInputSignalBindingList()){
+        syn boolean TransitionSelectionResult.isFiringSelectionFail()=false;
+        eq FiringSelectionFail.isFiringSelectionFail()=true;
 
-                boolean inputVal = inputSignalBinding.getInputSignalValue() == 1 ? true : false;
-                clauseValuesDefinition.addDef(inputSignalBinding.getInputSignalID(), inputVal);
-            }
+        public Optional<BalloonMarking> BalloonMarking.fireTransition(Transition transition, BalloonCallbackStorage callbackStorage,
+            InputSignalConnector inputSignalConnector,de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode node, boolean requireFlush) {
 
-            if((clauseValuesDefinition.getDefs().size() > 0) &&
-                (!transition.asInputSignalTransition().getInputSignalClause().getExp().eval(clauseValuesDefinition))){
-                return Optional.of(this);
-            }
+              if(!transition.asDinerosTransition().getStaticTransitionInformation().isSignalTransitionInformation()) return Optional.empty();
 
-            List<BalloonToken> inToken=new ArrayList<>();
+              // synchronize marking modification to prevent concurrent modifications
+              synchronized(this){
 
-            // build set of direct / indirect incoming places and remove from them
-            Set<Place> incomingPlaces = transition.resolveInputPlaces();
+                  if(!this.isBalloonEnabled(transition)) return Optional.empty();
 
-            // take a token from each incoming place
-            for(Place place:incomingPlaces){
+                  ClauseValuesDefinition clauseValuesDefinition = new ClauseValuesDefinition();
 
-                BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
+                  for(String signalId : transition.asDinerosTransition().getStaticTransitionInformation()
+                          .asSignalTransitionInformation().getClause().signals()){
+                      for(SignalConnection sc : inputSignalConnector.getSignalConnections()){
+                          if(signalId.equals(sc.getId())){
+                              clauseValuesDefinition.addDef(sc.getId(), sc.getCurrentValue());
+                              break;
+                          }
+                      }
+                  }
 
-                Random rand=new Random();
-                int randVal=rand.nextInt(bmp.getNumBalloonMarking());
-                BalloonToken bt=bmp.getBalloonMarking(randVal);
+                  if((clauseValuesDefinition.getDefs().size() > 0) &&
+                          (!transition.asDinerosTransition().getStaticTransitionInformation().
+                                  asSignalTransitionInformation().getClause().evalClause(clauseValuesDefinition))){
+                      return Optional.of(this);
+                  }
 
-                inToken.add(bt);
-                bmp.getBalloonMarking(randVal).removeSelf();
-            }
+                  List<BalloonToken> inToken=new ArrayList<>();
 
-            BalloonTransition balloonTransition=callbackStorage.resolveBalloonTransition(transition);
+                  // build set of direct / indirect incoming places and remove from them
+                  Set<Place> incomingPlaces = transition.resolveInputPlaces();
 
-            BalloonToken result=de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackExecutor.execute(inToken,balloonTransition.getBalloonCallbacks());
+                  // take a token from each incoming place
+                  for(Place place:incomingPlaces){
 
-            // build set of direct / indirect outgoing places and remove from them
-            Set<Place> outgoingPlaces = transition.resolveOutputPlaces();
+                      BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
 
-            // place a token in each outgoing place
-            for(Place place:outgoingPlaces){
-                BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
-                bmp.getBalloonMarkingList().add(result);
-            }
+                      Random rand=new Random();
+                      int randVal=rand.nextInt(bmp.getNumBalloonMarking());
+                      BalloonToken bt=bmp.getBalloonMarking(randVal);
 
-            if(requireFlush){
-                // flush the entire marking tree
-                this.flushTreeCache();
-            }
-        }
+                      inToken.add(bt);
+                      bmp.getBalloonMarking(randVal).removeSelf();
+                  }
 
-        return Optional.of(this);
-    }
+                  BalloonTransition balloonTransition=callbackStorage.resolveBalloonTransition(transition);
 
-    public Optional<BalloonMarking> BalloonMarking.fireTopicSubscriberTransition(Transition transition, BalloonToken bt, boolean requireFlush) {
+                  BalloonToken result=de.tudresden.inf.st.pnml.engine.execution.TransitionHandlerExecutor.execute(inToken,balloonTransition.getBalloonCallbacks());
 
-        synchronized(this){
+                  // build set of direct / indirect outgoing places and remove from them
+                  Set<Place> outgoingPlaces = transition.resolveOutputPlaces();
 
-            // build set of direct / indirect outgoing places and remove from them
-            Set<Place> outgoingPlaces = transition.resolveOutputPlaces();
+                  // place a token in each outgoing place
+                  for(Place place:outgoingPlaces){
+                      BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
+                      bmp.getBalloonMarkingList().add(result);
+                  }
 
-            // place a token in each outgoing place
-            for(Place place : outgoingPlaces){
-                BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
-                bmp.getBalloonMarkingList().add(bt);
-            }
+                  if(requireFlush){
+                      // flush the entire marking tree
+                      this.flushTreeCache();
+                  }
 
-            if(requireFlush){
-                // flush the entire marking tree
-                this.flushTreeCache();
-            }
-        }
-
-        return Optional.of(this);
-    }
-
-    public java.lang.String BalloonMarking.fireServiceClientInputTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
-
-        synchronized(this){
-
-            if(!isBalloonEnabled(transition)){
-                System.out.println("Cannon fire service client input transition" + transition.getId() + " because it is not enabled.");
-                return null;
-            }
+                  node.notify(node.NOTIFICATION_MARKING_CHANGE);
+              }
 
-            BalloonToken inToken = null;
+              return Optional.of(this);
+          }
 
-            // build set of direct / indirect outgoing places and remove from them
-            Set<Place> incomming = transition.resolveInputPlaces();
 
-            for(Place place : incomming){
 
-                BalloonMarkedPlace bmp = this.resolveBalloonPlace(place);
+        public BalloonCallbackStorage PetriNet.initializeCallbackStorage(){
 
-                Random rand = new Random();
-                int randVal = rand.nextInt(bmp.getNumBalloonMarking());
-                inToken = bmp.getBalloonMarking(randVal);
+            BalloonCallbackStorage storage=new BalloonCallbackStorage();
+            storage.setPetriNet(this);
 
-                bmp.getBalloonMarking(randVal).removeSelf();
-            }
-
-            if(requireFlush){
-                // flush the entire marking tree
-                this.flushTreeCache();
-            }
-
-            return inToken.getValue();
-        }
-    }
-
-    public Optional<BalloonMarking> BalloonMarking.fireServiceClientOutputTransition(Transition transition, BalloonCallbackStorage callbackStorage, BalloonToken bt, boolean requireFlush) {
-
-        synchronized(this){
-
-            // build set of direct / indirect outgoing places and remove from them
-            Set<Place> outgoingPlaces = transition.resolveOutputPlaces();
-
-            // place a token in each outgoing place
-            for(Place place : outgoingPlaces){
-                BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
-                bmp.getBalloonMarkingList().add(bt);
+            for(Transition transition:allTransitions()){
+                if(transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()){
+                    BalloonTransition balloonTransition=new BalloonTransition();
+                    balloonTransition.setTransition(transition);
+                    storage.addTransition(balloonTransition);
+                }
             }
 
-            if(requireFlush){
-                // flush the entire marking tree
-                this.flushTreeCache();
-            }
+            return storage;
         }
 
-        return Optional.of(this);
-    }
-
-    public java.lang.String BalloonMarking.fireTopicPublisherTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
-
-        synchronized(this){
-
-            if(!isBalloonEnabled(transition)){
-                System.out.println("Cannon fire publisher transition" + transition.getId() + " because it is not enabled.");
-                return null;
-            }
-
-            BalloonToken inToken = null;
-
-            // build set of direct / indirect outgoing places and remove from them
-            Set<Place> incomming = transition.resolveInputPlaces();
-
-            for(Place place : incomming){
-
-                BalloonMarkedPlace bmp = this.resolveBalloonPlace(place);
-
-                Random rand = new Random();
-                int randVal = rand.nextInt(bmp.getNumBalloonMarking());
-                inToken = bmp.getBalloonMarking(randVal);
-
-                bmp.getBalloonMarking(randVal).removeSelf();
-            }
-
-            if(requireFlush){
-                // flush the entire marking tree
-                this.flushTreeCache();
-            }
+        public BalloonCallbackStorage BalloonCallbackStorage.initializeSubnetCallbackStorage(List<Transition> transitions,PetriNet petriNet,boolean requireFlush){
 
-            return inToken.getValue();
-        }
-    }
-
-    public Optional<BalloonMarking> BalloonMarking.fireServiceServerInputTransition(Transition transition, BalloonToken bt, boolean requireFlush) {
+            for(Transition newT:transitions){
 
-        synchronized(this){
+                if(newT.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()){
 
-            // build set of direct / indirect outgoing places and remove from them
-            Set<Place> outgoingPlaces = transition.resolveOutputPlaces();
+                    BalloonTransition balloonTransition=new BalloonTransition();
+                    balloonTransition.setTransition(newT);
+                    this.addTransition(balloonTransition);
 
-            // place a token in each outgoing place
-            for(Place place : outgoingPlaces){
-                BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
-                bmp.getBalloonMarkingList().add(bt);
+                    for(Transition t:petriNet.allTransitions()){
+                        int splitIdx=newT.getId().lastIndexOf("-");
+                        if(t.getId().equals(newT.getId().substring(0,splitIdx))){
+                            balloonTransition.setBalloonCallbacks(resolveBalloonTransition(t).getBalloonCallbacks());
+                        }
+                    }
+                }
             }
 
             if(requireFlush){
-                // flush the entire marking tree
                 this.flushTreeCache();
             }
-        }
-
-        return Optional.of(this);
-    }
-
-        public java.lang.String BalloonMarking.fireServiceServerOutputTransition(Transition transition, boolean requireFlush) {
-
-            String output = null;
-
-            synchronized(this){
 
-                // build set of direct / indirect outgoing places and remove from them
-                Set<Place> incommingPlaces = transition.resolveInputPlaces();
-
-                if(incommingPlaces.size() != 1){
-                    System.out.println("Warning: Not exactly one input place for server output transition. Choosing first input.");
-                }
-
-
-                // place a token in each outgoing place
-                for(Place place : incommingPlaces){
-
-                    BalloonMarkedPlace bmp = this.resolveBalloonPlace(place);
-
-                    Random rand = new Random();
-                    int randVal = rand.nextInt(bmp.getNumBalloonMarking());
-                    BalloonToken bt = bmp.getBalloonMarking(randVal);
-
-                    output = bt.getValue();
-                    bmp.getBalloonMarking(randVal).removeSelf();
-                    break;
-                }
-
-                if(requireFlush){
-                    // flush the entire marking tree
-                    this.flushTreeCache();
-                }
-            }
-
-            return output;
+            return this;
         }
 
-    public BalloonCallbackStorage PetriNet.initializeCallbackStorage() {
-
-        BalloonCallbackStorage storage = new BalloonCallbackStorage();
-        storage.setPetriNet(this);
-
-        for (Transition transition : allTransitions()){
-
-            if(transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) {
-
-                BalloonTransition balloonTransition = new BalloonTransition();
-                balloonTransition.setTransition(transition);
-                storage.addTransition(balloonTransition);
-            }
-        }
-
-        return storage;
-    }
-
-    public BalloonCallbackStorage BalloonCallbackStorage.initializeSubnetCallbackStorage(List<Transition> transitions, PetriNet petriNet, boolean requireFlush) {
-
-        for (Transition newT : transitions){
-
-            if(newT.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) {
+        syn BalloonTransition BalloonCallbackStorage.resolveBalloonTransition(Transition transition)=execMap().get(transition);
 
-                BalloonTransition balloonTransition = new BalloonTransition();
-                balloonTransition.setTransition(newT);
-                this.addTransition(balloonTransition);
+        syn java.util.Map<Transition, BalloonTransition> BalloonCallbackStorage.execMap(){
 
-                for(Transition t : petriNet.allTransitions()){
+            java.util.Map<Transition, BalloonTransition> map=new java.util.HashMap<>();
 
-                    int splitIdx = newT.getId().lastIndexOf("-");
-
-                    if(t.getId().equals(newT.getId().substring(0, splitIdx))){
-                        balloonTransition.setBalloonCallbacks(resolveBalloonTransition(t).getBalloonCallbacks());
-                    }
-                }
+            for(BalloonTransition balloonTransition:getTransitionList()){
+                map.put(balloonTransition.getTransition(),balloonTransition);
             }
+            return map;
         }
-
-        if(requireFlush){
-            this.flushTreeCache();
-        }
-
-        return this;
-    }
-
-    syn BalloonTransition BalloonCallbackStorage.resolveBalloonTransition(Transition transition) = execMap().get(transition);
-
-    syn java.util.Map<Transition, BalloonTransition> BalloonCallbackStorage.execMap() {
-
-        java.util.Map<Transition, BalloonTransition> map = new java.util.HashMap<>();
-
-        for (BalloonTransition balloonTransition : getTransitionList()) {
-            map.put(balloonTransition.getTransition(), balloonTransition);
-        }
-        return map;
-    }
 }
\ No newline at end of file
diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast b/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast
index 43915b349ed48beeb0dada40e1891ff743fdf4b5..7d51582b9ac026e48897e8ba46f1b70228bbb1d3 100644
--- a/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast
+++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.relast
@@ -1,4 +1,9 @@
 BalloonCallbackStorage ::= PetriNet:PetriNet Transition:BalloonTransition*;
-BalloonTransition ::= <BalloonCallbacks:java.util.List<de.tudresden.inf.st.pnml.engine.execution.TransitionCallback>>;
+BalloonTransition ::= <BalloonCallbacks:java.util.List<de.tudresden.inf.st.pnml.engine.execution.TransitionHandler>>;
 
-rel BalloonTransition.Transition -> Transition;
\ No newline at end of file
+rel BalloonTransition.Transition -> Transition;
+
+abstract TransitionSelectionResult;
+FiringSelectionSuccess : TransitionSelectionResult ::= Transition:Transition;
+FiringSelectionWait : TransitionSelectionResult ::= <WaitingTime:int>;
+FiringSelectionFail : TransitionSelectionResult;
\ No newline at end of file
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java b/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java
index f7377927a7beb0e4bd29446cea7b967fb5e18937..f87b465f16f628d60461f16d7c5e31a67a3f5030 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java
@@ -1,29 +1,8 @@
 package de.tudresden.inf.st.pnml.engine;
 
-import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper;
-import de.tudresden.inf.st.pnml.engine.execution.DefaultFinalTransitionCallback;
-import de.tudresden.inf.st.pnml.engine.execution.TransitionCallback;
-import de.tudresden.inf.st.pnml.engine.ros.DiNeRosDefaultNode;
-import de.tudresden.inf.st.pnml.engine.ros.DiNeRosDefaultServer;
-import de.tudresden.inf.st.pnml.engine.ros.DiNeRosDefaultSubscriber;
-import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode;
-import de.tudresden.inf.st.pnml.engine.testNodes.DinerosTestClientNode;
-import de.tudresden.inf.st.pnml.engine.transform.PetriNetInitializer;
 import org.ros.node.DefaultNodeMainExecutor;
 import org.ros.node.NodeConfiguration;
 import org.ros.node.NodeMainExecutor;
-import org.ros.node.topic.Publisher;
-import org.xml.sax.SAXException;
-
-import javax.xml.parsers.ParserConfigurationException;
-import java.io.IOException;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.List;
-
-import java.net.URI;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
 
 public class Main {
 
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionCallback.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java
similarity index 77%
rename from src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionCallback.java
rename to src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java
index a1d04143afc166af8d440e899bd0d5f7412753b1..672f1cd1be7a0e83a1f04eee162a57d236464097 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionCallback.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultFinalTransitionHandler.java
@@ -5,9 +5,9 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
 import java.util.ArrayList;
 import java.util.List;
 
-public class DefaultFinalTransitionCallback extends TransitionCallback{
+public class DefaultFinalTransitionHandler extends TransitionCallback{
 
-    public DefaultFinalTransitionCallback(String id, int priority) {
+    public DefaultFinalTransitionHandler(String id, int priority) {
         super(id, priority);
     }
 
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionCallback.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java
similarity index 68%
rename from src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionCallback.java
rename to src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java
index 0a321751e107967041f66849a8c60cf6bfa4d9c5..4288a2fd9d034813b0c085be80d60597ff434529 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionCallback.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/DefaultTransitionHandler.java
@@ -4,9 +4,9 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
 
 import java.util.List;
 
-public class DefaultTransitionCallback extends TransitionCallback{
+public class DefaultTransitionHandler extends TransitionCallback{
 
-    public DefaultTransitionCallback(String id, int priority) {
+    public DefaultTransitionHandler(String id, int priority) {
         super(id, priority);
     }
 
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java
similarity index 79%
rename from src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java
rename to src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java
index 55e1fcfc4f46cf06915b85068bfac8b09fadf3af..321f8e8349bf7a621b2f6c2185c1c57aec628eae 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallback.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandler.java
@@ -8,21 +8,21 @@ import org.slf4j.LoggerFactory;
 import java.util.ArrayList;
 import java.util.List;
 
-public abstract class TransitionCallback{
+public abstract class TransitionHandler{
 
-    protected static final Logger logger = LoggerFactory.getLogger(TransitionCallback.class);
+    protected static final Logger logger = LoggerFactory.getLogger(TransitionHandler.class);
 
     private String id;
     private int priority;
     private List<String> params = new ArrayList<>();
 
-    public TransitionCallback(String id, int priority, List<String> params) {
+    public TransitionHandler(String id, int priority, List<String> params) {
         this.id = id;
         this.priority = priority;
         this.params.addAll(params);
     }
 
-    public TransitionCallback(String id, int priority) {
+    public TransitionHandler(String id, int priority) {
         this.id = id;
         this.priority = priority;
     }
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackExecutor.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java
similarity index 84%
rename from src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackExecutor.java
rename to src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java
index 79a026b5eb4081a4a3ead051cf5c47dd180915d3..4769836f0c53fd34df1d5f97fe93aa4affe1ca13 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackExecutor.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerExecutor.java
@@ -12,18 +12,18 @@ import java.util.List;
 /**
  * Automatically sort and call the callbacks.
  */
-public class TransitionCallbackExecutor {
+public class TransitionHandlerExecutor {
 
-    protected static final Logger logger = LoggerFactory.getLogger(TransitionCallbackExecutor.class);
+    protected static final Logger logger = LoggerFactory.getLogger(TransitionHandlerExecutor.class);
 
-    public static final BalloonToken execute(List<BalloonToken> inTokens, List<TransitionCallback> callbacks){
+    public static final BalloonToken execute(List<BalloonToken> inTokens, List<TransitionHandler> callbacks){
 
-        List<TransitionCallback> callbacksSorted = new ArrayList<>();
+        List<TransitionHandler> callbacksSorted = new ArrayList<>();
         List<BalloonToken> outTokens = new ArrayList<>();
         outTokens.addAll(inTokens);
         callbacksSorted.addAll(callbacks);
 
-        Collections.sort(callbacksSorted, Comparator.comparingInt(TransitionCallback::getPriority));
+        Collections.sort(callbacksSorted, Comparator.comparingInt(TransitionHandler::getPriority));
 
         for(int i = 0; i < callbacksSorted.size(); i++){
             if(i < callbacksSorted.size() - 1){
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackService.java b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java
similarity index 73%
rename from src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackService.java
rename to src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java
index 74897fe4dc6ac9b0cbc3dd91de7f01f4c6ef4b81..ab4c5f5c1b07e7aaa17d570b444e3b48db22866c 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionCallbackService.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/execution/TransitionHandlerService.java
@@ -3,23 +3,24 @@ package de.tudresden.inf.st.pnml.engine.execution;
 import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage;
 import de.tudresden.inf.st.pnml.jastadd.model.BalloonTransition;
 import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
+import fr.lip6.move.pnml.ptnet.hlapi.TransitionHLAPI;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public class TransitionCallbackService {
+public class TransitionHandlerService {
 
-    public static TransitionCallbackService INSTANCE = null;
+    public static TransitionHandlerService INSTANCE = null;
 
     private Map<String, BalloonCallbackStorage> balloonCallbackStorages = new HashMap<>();
 
-    private TransitionCallbackService() {}
+    private TransitionHandlerService() {}
 
-    public static TransitionCallbackService getInstance() {
+    public static TransitionHandlerService getInstance() {
         if(INSTANCE == null) {
-            INSTANCE = new TransitionCallbackService();
+            INSTANCE = new TransitionHandlerService();
         }
 
         return INSTANCE;
@@ -29,19 +30,19 @@ public class TransitionCallbackService {
         balloonCallbackStorages.put(petriNetId, balloonCallbackStorage);
     }
 
-    public void registerCallback(PetriNet petriNet, String transitionId, TransitionCallback transitionCallback){
+    public void registerCallback(PetriNet petriNet, String transitionId, TransitionHandler transitionCallback){
 
         if(balloonCallbackStorages.get(petriNet.getId()) == null){
             return;
         }
 
-        List<TransitionCallback> transitionCallbacks = new ArrayList<>();
+        List<TransitionHandler> transitionCallbacks = new ArrayList<>();
         transitionCallbacks.add(transitionCallback);
         registerCallback(petriNet, transitionId, transitionCallbacks);
 
     }
 
-    public void registerCallback(PetriNet petriNet, String transitionId, List<TransitionCallback> transitionCallbacks){
+    public void registerCallback(PetriNet petriNet, String transitionId, List<TransitionHandler> transitionCallbacks){
 
         if(balloonCallbackStorages.get(petriNet.getId()) == null){
             return;
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 3143ae50ade7d51743cb28a86c673fbc20264c0b..0ec7efec19f8fb1cbb7a37b76bfe7c3c516be7c4 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
@@ -23,22 +23,20 @@ import std_msgs.String;
 
 import javax.xml.parsers.ParserConfigurationException;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 public abstract class DiNeRosNode extends AbstractNodeMain {
 
+    public static final java.lang.String NOTIFICATION_MARKING_CHANGE = "markingChange";
+    public static final java.lang.String NOTIFICATION_SIGNAL_CHANGE = "signalChange";
+    public static final java.lang.String NOTIFICATION_WAIT_ENDED = "waitEnded";
+
     public final java.lang.String nodeName;
     public final PetriNet petriNet;
     protected BalloonMarking marking;
     protected BalloonCallbackStorage callbackStorage;
-    private final Map<java.lang.String, DiNeRosSubscriber> dinerosSubscribers = new HashMap<>();
-    private final Map<java.lang.String, DiNeRosServer> dinerosServiceServers = new HashMap<>();
-    private final Map<DinerosTransition, Publisher<std_msgs.String>> dinerosPublishers = new HashMap<>();
-    private final Map<DinerosTransition, ServiceClient<StringServiceRequest, StringServiceResponse>> dinerosServiceClients = new HashMap<>();
     protected ConnectedNode connectedNode;
+    protected InputSignalConnector inputSignalConnector;
     private boolean stopNode = false;
 
     public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet) {
@@ -52,11 +50,13 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
         }
     }
 
-    public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage) {
+    public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet, BalloonMarking marking,
+                       BalloonCallbackStorage callbackStorage, InputSignalConnector inputSignalConnector) {
         this.nodeName = nodeName;
         this.petriNet = petriNet;
         this.marking = marking;
         this.callbackStorage = callbackStorage;
+        this.inputSignalConnector = inputSignalConnector;
     }
 
     private final void internalNodeLoop() {
@@ -79,6 +79,26 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
         this.connectedNode.shutdown();
     }
 
+    public void notify(java.lang.String notificationType){
+
+        if (notificationType.equals(NOTIFICATION_MARKING_CHANGE)) {
+            onMarkingChange(marking.enabledBalloonTransitions());
+        } else if (notificationType.equals(NOTIFICATION_SIGNAL_CHANGE)) {
+            onSignalChange(marking.enabledBalloonTransitions());
+        } else if (notificationType.equals(NOTIFICATION_WAIT_ENDED)) {
+            onWaitEnded(marking.enabledBalloonTransitions());
+        }
+
+    }
+
+    protected abstract TransitionSelectionResult onMarkingChange(Set<Transition> enabledTransitions);
+
+    protected abstract TransitionSelectionResult onSignalChange(Set<Transition> enabledTransitions);
+
+    protected abstract TransitionSelectionResult onWaitEnded(Set<Transition> enabledTransitions);
+
+    protected abstract TransitionSelectionResult onStartupEnded(Set<Transition> enabledTransitions);
+
     @Override
     public GraphName getDefaultNodeName() {
         return GraphName.of(nodeName);
@@ -91,158 +111,30 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
 
         System.out.println("[INIT NODE] Initializing node: " + nodeName);
 
-        // setup publishers
-        for (Transition t : petriNet.allTransitions()) {
-            if (t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_OUT)
-                    || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_OUT)) {
-
-                final Publisher<String> publisher = connectedNode.newPublisher(t.asInputSignalTransition().
-                        getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), String._TYPE);
-
-                dinerosPublishers.put(t.asInputSignalTransition(), publisher);
-
-            }
-        }
-
-        // setup subscribers
-        for (Transition t : petriNet.allTransitions()) {
-            if (t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_IN)
-                    || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_IN)) {
-
-                Subscriber<String> subscriber = connectedNode.newSubscriber(t.asInputSignalTransition()
-                        .getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), String._TYPE);
-
-                subscriber.addMessageListener(message -> {
+        // init service clients
+        // TODO
 
-                    System.out.println("Subscriber Input: \"" + message.getData() + "\"");
+        // init service servers (deep copies)
+        // TODO
 
-                    for (Map.Entry<java.lang.String, DiNeRosSubscriber> entry : getDinerosSubscribers().entrySet()) {
-                        if (entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())) {
+        // init publishers
+        // TODO
 
-                            // fire input
-                            BalloonToken bt = new BalloonToken();
-                            bt.setValue(message.getData());
-                            System.out.println("Firing topic subscriber transition.");
-                            marking.fireTopicSubscriberTransition(t, bt, true);
+        // init subscribers
+        // TODO
 
-                            // execute
-                            entry.getValue().execute(marking, callbackStorage, petriNet, t.asInputSignalTransition().getStaticTransitionInformation().getSubNet());
+        System.out.println("[INIT NODE] Executing first marking query.");
+        TransitionSelectionResult firstFiringResult = onStartupEnded(marking.enabledBalloonTransitions());
 
-                            // flush
-                            petriNet.flushTreeCache();
-                            marking.flushTreeCache();
-                            callbackStorage.flushTreeCache();
-
-                            System.out.println(marking.print());
-                            break;
-                        }
-                    }
-                }, t.asInputSignalTransition().getStaticTransitionInformation().getInputLimit());
-            }
-        }
-
-        // setup service clients
-        for (Transition t : petriNet.allTransitions()) {
-            if (t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_IN)){
-
-                ServiceClient<StringServiceRequest, StringServiceResponse> serviceClient;
-                try {
-                    serviceClient = connectedNode.newServiceClient(t.asInputSignalTransition().
-                            getStaticTransitionInformation().asServiceTransitionInformation().getServiceName(), StringService._TYPE);
-                } catch (ServiceNotFoundException e) {
-                    throw new RosRuntimeException(e);
-                }
-
-                System.out.println("Adding new service client to " + nodeName);
-                getDinerosServiceClients().put(t.asInputSignalTransition(), serviceClient);
-            }
-        }
-
-        // setup service servers
-        int baseInCount = 0;
-
-        for (Transition t : petriNet.allTransitions()) {
-
-            if (t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_OUT)) {
-
-                int inCount = baseInCount;
-
-                System.out.println("Adding new Service Server");
-
-                connectedNode.newServiceServer(t.asInputSignalTransition().getStaticTransitionInformation().asServiceTransitionInformation().getServiceName(), StringService._TYPE,
-                        (ServiceResponseBuilder<StringServiceRequest, StringServiceResponse>) (request, response) -> {
-
-                            // clone base server net
-                            List<java.lang.String> addedElementIds = new ArrayList<>();
-                            InputSignalTransition serverInstanceInputTransition = ServiceTransformer.includeServerInstance(petriNet, t.asInputSignalTransition()
-                                    .getStaticTransitionInformation().getSubNet(), java.lang.String.valueOf(inCount), addedElementIds);
-
-                            // init marking and callback storage
-                            try {
-                                marking.initializeSubnetBalloonMarking(getSubnetPlacesByIds(addedElementIds, petriNet), true);
-                                callbackStorage.initializeSubnetCallbackStorage(getSubnetTransitionsByIds(addedElementIds, petriNet), petriNet, true);
-                            } catch (IOException | ParserConfigurationException | SAXException e) {
-                                e.printStackTrace();
-                            }
-
-                            // call bound dineros server and clean up after execution
-                            for (Map.Entry<java.lang.String, DiNeRosServer> entry : getDinerosServiceServers().entrySet()) {
-                                if (entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())) {
-
-                                    // fire input
-                                    BalloonToken bt = new BalloonToken();
-                                    bt.setValue(request.getInput());
-                                    System.out.println("Firing service server input transition: " + serverInstanceInputTransition.getId());
-                                    marking.fireServiceServerInputTransition(serverInstanceInputTransition, bt, true);
-
-                                    // execute
-                                    entry.getValue().execute(marking, callbackStorage, petriNet, serverInstanceInputTransition.getStaticTransitionInformation().getSubNet());
-
-                                    // server transitions
-                                    try {
-                                        // fire response transition
-                                        for(java.lang.String id : addedElementIds){
-                                            for(Transition tById : petriNet.allTransitions()){
-                                                if(id.equals(tById.getId()) && tById.asInputSignalTransition().getStaticTransitionInformation().isServiceTransitionInformation()
-                                                    && tById.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_RESPONSE_IN)){
-                                                    System.out.println("Firing service server output transition: " + id);
-                                                    response.setOutput(marking.fireServiceServerOutputTransition(tById, true));
-                                                }
-                                            }
-                                        }
-
-                                        System.out.println(" -- BEFORE DEINIT --");
-                                        System.out.println(marking.print());
-
-                                        // deinit
-                                        marking.deinitializeSubnet(getSubnetPlacesByIds(addedElementIds, petriNet), getSubnetTransitionsByIds(addedElementIds, petriNet), callbackStorage);
-                                        ServiceTransformer.removeServiceServerInstance(petriNet, addedElementIds);
-
-                                    } catch (IOException | ParserConfigurationException | SAXException e) {
-                                        e.printStackTrace();
-                                    }
-
-                                    // flush
-                                    petriNet.flushTreeCache();
-                                    marking.flushTreeCache();
-                                    callbackStorage.flushTreeCache();
-                                    break;
-                                }
-                            }
-
-                            // send error if no subnet for service
-                            if(response.getOutput().equals("") || response.getOutput() == null) {
-                                System.out.println("Error: No returning transition.");
-                                response.setOutput(null);
-                            }
-                        });
-                baseInCount++;
-            }
+        if(firstFiringResult.isFiringSelectionSuccess()){
+            marking.fireTransition(firstFiringResult.asFiringSelectionSuccess()
+                    .getTransition(), callbackStorage, inputSignalConnector, this,false);
         }
 
         this.internalNodeLoop();
     }
 
+
     public List<Transition> getSubnetTransitionsByIds(List<java.lang.String> ids, PetriNet petriNet) {
 
         List<Transition> transitions = new ArrayList<>();
@@ -258,22 +150,6 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
         return transitions;
     }
 
-    public Map<java.lang.String, DiNeRosSubscriber> getDinerosSubscribers() {
-        return dinerosSubscribers;
-    }
-
-    public Map<InputSignalTransition, Publisher<std_msgs.String>> getDinerosPublishers() {
-        return dinerosPublishers;
-    }
-
-    public Map<java.lang.String, DiNeRosServer> getDinerosServiceServers() {
-        return dinerosServiceServers;
-    }
-
-    public Map<InputSignalTransition, ServiceClient<StringServiceRequest, StringServiceResponse>> getDinerosServiceClients() {
-        return dinerosServiceClients;
-    }
-
     public List<Place> getSubnetPlacesByIds(List<java.lang.String> ids, PetriNet petriNet) {
 
         List<Place> places = new ArrayList<>();
@@ -288,88 +164,4 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
 
         return places;
     }
-
-
-    public BalloonMarking firePublisherTransition(InputSignalTransition transition) {
-
-        java.lang.String msgString = this.marking.fireTopicPublisherTransition(transition, this.callbackStorage, true);
-
-        if(msgString == null){
-            return this.marking;
-        }
-
-        for (Map.Entry<InputSignalTransition, Publisher<std_msgs.String>> entry : getDinerosPublishers().entrySet()) {
-
-            if (transition.getId().equals(entry.getKey().getId())) {
-
-                std_msgs.String msg = entry.getValue().newMessage();
-                msg.setData(msgString);
-                entry.getValue().publish(msg);
-            }
-        }
-
-        return this.marking;
-    }
-
-    public BalloonMarking fireServiceClientTransition(InputSignalTransition transition){
-
-        java.lang.String msgString = this.marking.fireServiceClientInputTransition(transition, this.callbackStorage, true);
-
-        if(msgString == null){
-            return this.marking;
-        }
-
-        for (Map.Entry<InputSignalTransition, ServiceClient<StringServiceRequest, StringServiceResponse>> entry : getDinerosServiceClients().entrySet()) {
-
-            if (transition.getId().equals(entry.getKey().getId())) {
-
-                final StringServiceRequest request = entry.getValue().newMessage();
-                request.setInput(msgString);
-
-                entry.getValue().call(request, new ServiceResponseListener<StringServiceResponse>() {
-
-                    @Override
-                    public void onSuccess(StringServiceResponse response) {
-
-                        // get corresponding response transition
-                        Page channelPage = null;
-
-                        for(Page p : petriNet.allPages()){
-                            for(PnObject po : p.getObjectList()){
-                                if(po.getId().equals(transition.getId())){
-                                    channelPage = p;
-                                    break ;
-                                }
-                            }
-
-                            if(channelPage != null){
-                                break;
-                            }
-                        }
-
-                        for(PnObject po : channelPage.getObjectList()){
-                            Transition tr = petriNet.getTransitionById(po.getId());
-                            if(tr != null && tr.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_RESPONSE_OUT)){
-
-                                // now we have the response transition, which ist the only other transition in the
-                                // channel on client side
-                                BalloonToken btOut = new BalloonToken();
-                                btOut.setValue(response.getOutput());
-                                System.out.println("Firing client service response transition: " + tr.getId());
-                                marking.fireServiceClientOutputTransition(tr, callbackStorage, btOut, true);
-
-                            }
-                        }
-                    }
-
-                    @Override
-                    public void onFailure(RemoteException e) {
-                        throw new RosRuntimeException(e);
-                    }
-                });
-            }
-        }
-
-        return this.marking;
-    }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/testNodes/DinerosTestClientNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/testNodes/DinerosTestClientNode.java
index fefdd606dadebff7d4293d2cdbe50587cd10646b..7542000fb166c60e6c8e51656b6d47e91f174bf9 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/testNodes/DinerosTestClientNode.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/testNodes/DinerosTestClientNode.java
@@ -3,7 +3,7 @@ package de.tudresden.inf.st.pnml.engine.testNodes;
 import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode;
 import de.tudresden.inf.st.pnml.jastadd.model.BalloonCallbackStorage;
 import de.tudresden.inf.st.pnml.jastadd.model.BalloonMarking;
-import de.tudresden.inf.st.pnml.jastadd.model.InputSignalTransition;
+import de.tudresden.inf.st.pnml.jastadd.model.DinerosTransition;
 import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
 import org.ros.concurrent.CancellableLoop;
 import org.ros.node.service.ServiceClient;
@@ -39,11 +39,11 @@ public class DinerosTestClientNode extends DiNeRosNode {
                     System.out.println("----- BEFORE (C) -----");
                     System.out.println(marking.print());
 
-                    for (Map.Entry<InputSignalTransition, ServiceClient<StringServiceRequest, StringServiceResponse>>
+                    for (Map.Entry<DinerosTransition, ServiceClient<StringServiceRequest, StringServiceResponse>>
                             entry : getDinerosServiceClients().entrySet()) {
 
                         System.out.println("Firing service client of:" + entry.getKey().getId());
-                        fireServiceClientTransition(entry.getKey());
+                       // fireServiceClientTransition(entry.getKey());
                     }
 
                     execOnce = true;