diff --git a/build.gradle b/build.gradle
index 4cc2a5e10639453219127b35508f02ffc6866f85..a416f7a0e9b4af47e2e8a618d24f076d709f32f7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -134,19 +134,8 @@ dependencies {
 
 jar {
     manifest {
-        // attributes "Main-Class": "de.tudresden.inf.st.pnml.engine.Main"
+         attributes "Main-Class": "de.tudresden.inf.st.pnml.engine.Main"
     }
-
-    from {
-        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
-    }
-
-    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
-
-    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
-
-    archiveBaseName = 'pnml-engine'
-
 }
 
 task fatJar(type: Jar) {
@@ -159,7 +148,13 @@ task fatJar(type: Jar) {
         configurations.runtimeClasspath.collect {it.isDirectory() ? it : zipTree(it) }
     }
 
-    manifest.attributes "Main-Class": "${mainClassName}"
+    manifest.attributes "Main-Class": "de.tudresden.inf.st.sample.Main"
+
+    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
+
+    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+
+    archiveBaseName = 'pnml-relast-engine'
 }
 
 // Generated files
diff --git a/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag b/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag
index 6e8dd4e46376055a25e00f4771c212aabdb984d7..3e251d12d6f7c6025c17884addf408510c187d30 100644
--- a/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag
+++ b/src/main/jastadd/engine/balloonMarking/BalloonMarking.jrag
@@ -1,9 +1,65 @@
 aspect BalloonMarking {
 
+    inh BalloonMarking OutputSignalPlace.balloonMarking();
+
+    eq PetriNetDoc.getChild().balloonMarking() = null;
+
+    eq BalloonMarking.getPetriNet().balloonMarking() = this;
+
     eq BalloonCallbackStorage.getPetriNet().marking() = null;
 
     eq BalloonMarking.getPetriNet().marking() = null;
 
+    // updates automatically based on dependencies to the corresponding place
+    syn String OutputSignalBinding.outputSignalValue(){
+
+        OutputSignalPlace osp = this.containingPlace().asOutputSignalPlace();
+        BalloonMarking marking = osp.balloonMarking();
+        BalloonMarkedPlace markedPlace = marking.resolveBalloonPlaceById(this.getPlaceID());
+
+        JastAddList<EqualityOutputMapping> eomList = this.getEqualityOMListNoTransform();
+        JastAddList<ThresholdOutputMapping> tomList = this.getThresholdOMListNoTransform();
+        JastAddList<RangeOutputMapping> romList = this.getRangeOMListNoTransform();
+
+        // eom
+        int result = -1;
+            for (EqualityOutputMapping eom : eomList) {
+                if ((eom.getValue() == markedPlace.getNumBalloonMarking()) && result == -1) {
+                    result = eom.getResult();
+                break;
+            }
+        }
+
+        // tom
+        //  if (result > -1) {
+        for (ThresholdOutputMapping tom : tomList) {
+            if (tom.getValue() <= markedPlace.getNumBalloonMarking()) {
+                result = tom.getResult();
+                break;
+            }
+        }
+        //     }
+
+        // rom
+        //      if (result > -1) {
+        for (RangeOutputMapping rom : romList) {
+            if ((rom.getLowerBound() <= markedPlace.getNumBalloonMarking()) && (rom.getUpperBound() >= markedPlace.getNumBalloonMarking())) {
+                result = rom.getResult();
+                break;
+            }
+        }
+        //       }
+
+        // 0 (disabled Signal) is default
+        if (result == -1) {
+            result = 0;
+        }
+
+        String output = String.valueOf(result) + "-" + this.getOutputSignalID();
+
+        return output;
+    }
+
     public BalloonMarking PetriNet.initializeBalloonMarking() throws IOException, SAXException, ParserConfigurationException {
 
         BalloonMarking marking = new BalloonMarking();
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 b81634a2807531cc1a5d281be34156ed5d49edb3..06bd21be0568b07eff9bac656678bc6a88662acf 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
@@ -43,7 +43,7 @@ public class Main {
 
         // isTest();
 
-        //osTest();
+        // osTest();
     }
 
     @SuppressWarnings("unused")
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/TransitionCallbackService.java
index a68f3a7427bb81f235a178eff1685f6905d70cec..74897fe4dc6ac9b0cbc3dd91de7f01f4c6ef4b81 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/TransitionCallbackService.java
@@ -5,13 +5,15 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonTransition;
 import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public class TransitionCallbackService {
 
     public static TransitionCallbackService INSTANCE = null;
 
-    private BalloonCallbackStorage balloonCallbackStorage = null;
+    private Map<String, BalloonCallbackStorage> balloonCallbackStorages = new HashMap<>();
 
     private TransitionCallbackService() {}
 
@@ -23,17 +25,16 @@ public class TransitionCallbackService {
         return INSTANCE;
     }
 
-    public void init(BalloonCallbackStorage balloonCallbackStorage) {
-        this.balloonCallbackStorage = balloonCallbackStorage;
+    public void init(String petriNetId, BalloonCallbackStorage balloonCallbackStorage) {
+        balloonCallbackStorages.put(petriNetId, balloonCallbackStorage);
     }
 
     public void registerCallback(PetriNet petriNet, String transitionId, TransitionCallback transitionCallback){
 
-        if(balloonCallbackStorage == null){
+        if(balloonCallbackStorages.get(petriNet.getId()) == null){
             return;
         }
 
-        BalloonTransition balloonTransition = balloonCallbackStorage.resolveBalloonTransition(petriNet.getTransitionById(transitionId));
         List<TransitionCallback> transitionCallbacks = new ArrayList<>();
         transitionCallbacks.add(transitionCallback);
         registerCallback(petriNet, transitionId, transitionCallbacks);
@@ -42,11 +43,11 @@ public class TransitionCallbackService {
 
     public void registerCallback(PetriNet petriNet, String transitionId, List<TransitionCallback> transitionCallbacks){
 
-        if(balloonCallbackStorage == null){
+        if(balloonCallbackStorages.get(petriNet.getId()) == null){
             return;
         }
 
-        BalloonTransition balloonTransition = balloonCallbackStorage.resolveBalloonTransition(petriNet.getTransitionById(transitionId));
+        BalloonTransition balloonTransition = balloonCallbackStorages.get(petriNet.getId()).resolveBalloonTransition(petriNet.getTransitionById(transitionId));
         balloonTransition.setBalloonCallbacks(transitionCallbacks);
 
     }
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java
index 74e5c9ad2ed26dda51fcd637e42dab27110eb35e..865fe6bfab2fe2f10e5e5c1b2db929a12df6a4f5 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java
@@ -14,4 +14,11 @@ public class DiNeRosDefaultNode extends DiNeRosNode{
     public DiNeRosDefaultNode(String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage) {
         super(nodeName, petriNet, marking, callbackStorage);
     }
+
+    @Override
+    protected void nodeLoop() {
+
+        System.out.println("No node loop implemented ..");
+
+    }
 }
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 60dfa570349856eb88f91aac32ba97895d97d9e3..746925ef3463fa58cf5a4ec5d8a509795249c23d 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
@@ -33,12 +33,13 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
     public final java.lang.String nodeName;
     public final PetriNet petriNet;
     protected BalloonMarking marking;
-    private BalloonCallbackStorage callbackStorage;
+    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<InputSignalTransition, Publisher<std_msgs.String>> dinerosPublishers = new HashMap<>();
     private final Map<InputSignalTransition, ServiceClient<StringServiceRequest, StringServiceResponse>> dinerosServiceClients = new HashMap<>();
     protected ConnectedNode connectedNode;
+    private boolean stopNode = false;
 
     public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet) {
         this.nodeName = nodeName;
@@ -58,50 +59,31 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
         this.callbackStorage = callbackStorage;
     }
 
-    protected void nodeLoop() {
+    private final void internalNodeLoop() {
 
         this.connectedNode.executeCancellableLoop(new CancellableLoop() {
 
             @Override
-            protected void loop() throws InterruptedException {
-
-                System.out.println("No main loop specified for node " + nodeName + " Executing default...");
-                Thread.sleep(1000);
+            protected void loop() {
+                if(!stopNode) {
+                    nodeLoop();
+                }
             }
         });
     }
 
+    protected abstract void nodeLoop();
+
+    protected final void stop(){
+        stopNode = true;
+        this.connectedNode.shutdown();
+    }
+
     @Override
     public GraphName getDefaultNodeName() {
         return GraphName.of(nodeName);
     }
 
-      /*   @Override
-    public void onStart(ConnectedNode connectedNode) {
-
-   Subscriber<std_msgs.String> subscriber = connectedNode.newSubscriber("chatter", std_msgs.String._TYPE);
-        subscriber.addMessageListener(new MessageListener<String>() {
-            @Override
-            public void onNewMessage(std_msgs.String message) {
-                System.out.println("I heard: \"" + message.getData() + "\"");
-            }
-        });
-
-        connectedNode.newServiceServer("sampleService", StringService._TYPE,
-                (ServiceResponseBuilder<StringServiceRequest, StringServiceResponse>) (request, response) -> {
-
-                    System.out.println("Service Input: \"" + request.getInput() + "\"");
-                    try {
-                        Thread.sleep(2000);
-                    } catch (InterruptedException e) {
-                        e.printStackTrace();
-                    }
-                    System.out.println("Finished sleep.");
-                    response.setOutput("...");
-
-                });
-    }*/
-
     @Override
     public void onStart(final ConnectedNode connectedNode) {
 
@@ -114,8 +96,8 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
             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<std_msgs.String> publisher = connectedNode.newPublisher(t.asInputSignalTransition().
-                        getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), std_msgs.String._TYPE);
+                final Publisher<String> publisher = connectedNode.newPublisher(t.asInputSignalTransition().
+                        getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), String._TYPE);
 
                 dinerosPublishers.put(t.asInputSignalTransition(), publisher);
 
@@ -128,7 +110,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
                     || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_IN)) {
 
                 Subscriber<String> subscriber = connectedNode.newSubscriber(t.asInputSignalTransition()
-                        .getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), std_msgs.String._TYPE);
+                        .getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), String._TYPE);
 
                 subscriber.addMessageListener(message -> {
 
@@ -258,7 +240,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
             }
         }
 
-        this.nodeLoop();
+        this.internalNodeLoop();
     }
 
     public List<Transition> getSubnetTransitionsByIds(List<java.lang.String> ids, PetriNet petriNet) {
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNodeUtil.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNodeUtil.java
index e4b8b3f8fa4cfe83093340c4af9ebec27688b12e..80b5f95900920086a3e902a5d30b41bd042e9f80 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNodeUtil.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNodeUtil.java
@@ -27,7 +27,7 @@ public class DiNeRosNodeUtil {
         return hasFired;
     }
 
-    private static boolean hasEnabledTransition(PetriNet petriNet, String subnet, BalloonMarking balloonMarking){
+    public static boolean hasEnabledTransition(PetriNet petriNet, String subnet, BalloonMarking balloonMarking){
 
         for(Transition transition : petriNet.allTransitions()) {
             if (transition.asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(subnet)) {