diff --git a/build.gradle b/build.gradle
index 70547ab248b0540b13acbf8aca8ce87d0eb902bf..9bdec6da4a5e897a2547432830df98da8b2c9612 100644
--- a/build.gradle
+++ b/build.gradle
@@ -107,10 +107,10 @@ dependencies {
 
 }
 
-/* run {
+ run {
     mainClassName = 'de.tudresden.inf.st.pnml.engine.Main'
     standardInput = System.in
-} */
+}
 
 jar {
     manifest {
diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
index 205d5e84b3c290cac6ed4bccb30bd3e4bedb0c6a..213e45dcddbc39ba01b26b5b67cc35d78b6812f5 100644
--- a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
+++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
@@ -75,8 +75,34 @@ aspect BalloonExecution {
         return null;
     }
 
-    public Optional<BalloonMarking> BalloonMarking.fireTopicPublisherTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
-        return null;
+    public java.lang.String BalloonMarking.fireTopicPublisherTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
+
+        synchronized(this){
+
+            BalloonToken inToken = null;
+
+            // build set of direct / indirect outgoing places and remove from them
+            Set<Place> incomming = transition.resolveInputPlaces();
+
+            // place a token in each outgoing place
+            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();
+            }
+
+            return inToken.getValue();
+        }
     }
 
     public Optional<BalloonMarking> BalloonMarking.fireServiceServerTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
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 23369cc0a42f6730fc245f98422fc8fc07fc8794..4550063df32d0fa90b789ef99de875aef1db5465 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
@@ -9,7 +9,9 @@ import de.tudresden.inf.st.pnml.jastadd.model.*;
 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 std_msgs.String;
 
 import javax.xml.parsers.ParserConfigurationException;
 import java.io.IOException;
@@ -17,18 +19,24 @@ import java.util.ArrayList;
 import java.util.List;
 
 import java.net.URI;
+import java.util.Map;
 
 public class Main {
 
     private static NodeMainExecutor nodeMainExecutor = DefaultNodeMainExecutor.newDefault();
     private static NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic("localhost");
 
-    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
+    public static void main(java.lang.String[] args) {
 
-        String pnmlPath = "../pnml-relast-engine/src/main/resources/nets/subscriber-test-1.pnml";
+        java.lang.String pnmlPath = "../pnml-relast-engine/src/main/resources/nets/publisher-test-1.pnml";
         PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0);
 
-        BalloonMarking bm = petriNet.initializeBalloonMarking();
+        BalloonMarking bm = null;
+        try {
+            bm = petriNet.initializeBalloonMarking();
+        } catch (IOException | SAXException | ParserConfigurationException e) {
+            e.printStackTrace();
+        }
         BalloonCallbackStorage bcs = petriNet.initializeCallbackStorage();
 
         TransitionCallback tc = new DefaultFinalTransitionCallback("default_final_cb", 1);
@@ -37,7 +45,6 @@ public class Main {
 
         System.out.println("----- BEFORE -----");
         System.out.println(bm.print());
-
         for(Transition t : petriNet.allTransitions()){
             if(t.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) {
                 bcs.resolveBalloonTransition(t).setBalloonCallbacks(tcl);
@@ -55,6 +62,21 @@ public class Main {
             start();
         }};
 
+        try {
+            Thread.sleep(1000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+
+        for (Map.Entry<InputSignalTransition, Publisher<String>> entry : diNeRosNode.getDinerosPublishers().entrySet()) {
+            System.out.println("Firing publisher of:" + entry.getKey().getId());
+            diNeRosNode.firePublisherTransition(entry.getKey());
+        }
+
+        System.out.println("----- AFTER -----");
+        System.out.println(bm.print());
+
+
 /*
         String pnmlPath = "../pnml-relast-nets/src/main/resources/balloonTestNets/balloon-correct-4.pnml";
         PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0);
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 c6da92890f194d39142af7a572463fc4522330d7..d09927445ad0a1a926b97275f46571f92e3c1028 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
@@ -1,12 +1,11 @@
 package de.tudresden.inf.st.pnml.engine.ros;
 
 import de.tudresden.inf.st.pnml.base.constants.PnmlConstants;
-import de.tudresden.inf.st.pnml.engine.transform.TopicTransformer;
 import de.tudresden.inf.st.pnml.jastadd.model.*;
-import org.ros.message.MessageListener;
 import org.ros.namespace.GraphName;
 import org.ros.node.AbstractNodeMain;
 import org.ros.node.ConnectedNode;
+import org.ros.node.topic.Publisher;
 import org.ros.node.topic.Subscriber;
 import org.xml.sax.SAXException;
 import std_msgs.String;
@@ -25,6 +24,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
     private BalloonMarking marking;
     private BalloonCallbackStorage callbackStorage;
     private final Map<java.lang.String, DiNeRosSubscriber> dinerosSubscribers = new HashMap<>();
+    private final Map<InputSignalTransition, Publisher<std_msgs.String>> dinerosPublishers = new HashMap<>();
 
     public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet){
         this.nodeName = nodeName;
@@ -64,32 +64,33 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
     @Override
     public void onStart(final ConnectedNode connectedNode) {
 
-        int inCount = 0;
+        System.out.println("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<std_msgs.String> publisher = connectedNode.newPublisher(t.asInputSignalTransition().
+                        getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), std_msgs.String._TYPE);
+
+                dinerosPublishers.put(t.asInputSignalTransition(), publisher);
+
+            }
+        }
+
+        // setup subscribers
         for(Transition t : petriNet.allTransitions()){
-            if(t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TOPIC_SUBSCRIBER)
-                    || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_IN)
+            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(), std_msgs.String._TYPE);
 
-                int finalInCount = inCount;
                 subscriber.addMessageListener(message -> {
 
                     System.out.println("I heard: \"" + message.getData() + "\"");
 
-                    List<java.lang.String> addedElementIds = new ArrayList<>();
-                    TopicTransformer.includeSubscriberInstance(petriNet, t.asInputSignalTransition()
-                            .getStaticTransitionInformation().getSubNet(), java.lang.String.valueOf(finalInCount), addedElementIds);
-
-                    try {
-                        marking.initializeSubnetBalloonMarking(getSubnetPlacesByIds(addedElementIds, petriNet));
-                        callbackStorage.initializeSubnetCallbackStorage(getSubnetTransitionsByIds(addedElementIds, petriNet), petriNet);
-                    } catch (IOException | ParserConfigurationException | SAXException e) {
-                        e.printStackTrace();
-                    }
-
                     for (Map.Entry<java.lang.String, DiNeRosSubscriber> entry : getDinerosSubscribers().entrySet()) {
                         if(entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())){
 
@@ -102,41 +103,18 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
                             // execute
                             entry.getValue().execute(marking, callbackStorage, petriNet, t.asInputSignalTransition().getStaticTransitionInformation().getSubNet());
 
-                            // clean
-                            try {
-                                marking.deinitializeSubnet(getSubnetPlacesByIds(addedElementIds, petriNet), getSubnetTransitionsByIds(addedElementIds, petriNet), callbackStorage);
-                                TopicTransformer.removeSubscriberInstance(petriNet, addedElementIds);
-                            } catch (IOException | ParserConfigurationException | SAXException e) {
-                                e.printStackTrace();
-                            }
-
                             // flush
                             petriNet.flushTreeCache();
                             marking.flushTreeCache();
                             callbackStorage.flushTreeCache();
+
+                            System.out.println(marking.print());
                             break;
                         }
                     }
-                });
-
-                inCount++;
-            }
-        }
-    }
-
-    public List<Place> getSubnetPlacesByIds(List<java.lang.String> ids, PetriNet petriNet){
-
-        List<Place> places = new ArrayList<>();
-
-        for(java.lang.String id : ids){
-            for(Place p : petriNet.allPlaces()){
-                if(p.getId().equals(id)){
-                    places.add(p);
-                }
+                }, t.asInputSignalTransition().getStaticTransitionInformation().getInputLimit());
             }
         }
-
-        return places;
     }
 
     public List<Transition> getSubnetTransitionsByIds(List<java.lang.String> ids, PetriNet petriNet){
@@ -157,4 +135,25 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
     public Map<java.lang.String, DiNeRosSubscriber> getDinerosSubscribers() {
         return dinerosSubscribers;
     }
+
+    public Map<InputSignalTransition, Publisher<std_msgs.String>> getDinerosPublishers() {
+        return dinerosPublishers;
+    }
+
+    public BalloonMarking firePublisherTransition(InputSignalTransition transition){
+
+        java.lang.String msgString = this.marking.fireTopicPublisherTransition(transition, this.callbackStorage, true);
+
+        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;
+    }
 }
diff --git a/src/main/resources/nets/publisher-test-1.pnml b/src/main/resources/nets/publisher-test-1.pnml
index 466379c32325e9a84767a0a20c996772d7aef52c..f6a47db5639e3a16a9f57a543444b67f4a94b65f 100644
--- a/src/main/resources/nets/publisher-test-1.pnml
+++ b/src/main/resources/nets/publisher-test-1.pnml
@@ -1,85 +1,95 @@
 <pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
-  <net id="n-E2D0-BCF46-0" type="http://www.pnml.org/version-2009/grammar/ptnet">
-    <page id="top">
-      <page id="sourcePage">
-        <referencePlace id="rp1" ref="channelInPlace">
-          <name>
-            <text>rp1</text>
-          </name>
-          <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+    <net id="n-E2D0-BCF46-0" type="http://www.pnml.org/version-2009/grammar/ptnet">
+        <page id="top">
+            <page id="sourcePage">
+                <referencePlace id="rp1" ref="channelInPlace">
+                    <name>
+                        <text>rp1</text>
+                    </name>
+                    <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
 
 
                         <location>loc2</location>
                         <subnet>locA</subnet>
-                                        </toolspecific>
-        </referencePlace>
-      </page>
-      <page id="targetPage">
-        <transition id="t1">
-          <name>
-            <text>t1</text>
-          </name>
-          <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                    </toolspecific>
+                </referencePlace>
+            </page>
+            <page id="targetPage">
+                <transition id="t1">
+                    <name>
+                        <text>t1</text>
+                    </name>
+                    <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
 
 
                         <location>loc3</location>
                         <subnet>locB</subnet>
-                                        </toolspecific>
-        </transition>
-        <transition id="t3">
-          <name>
-            <text>t3</text>
-          </name>
-          <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                    </toolspecific>
+                </transition>
+                <transition id="t3">
+                    <name>
+                        <text>t3</text>
+                    </name>
+                    <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
 
 
                         <location>loc3</location>
                         <subnet>locB</subnet>
-                                        </toolspecific>
-        </transition>
-        <transition id="t2">
-          <name>
-            <text>t2</text>
-          </name>
-          <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                    </toolspecific>
+                </transition>
+                <transition id="t2">
+                    <name>
+                        <text>t2</text>
+                    </name>
+                    <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
 
 
                         <location>loc3</location>
                         <subnet>locB</subnet>
-                                        </toolspecific>
-        </transition>
-      </page>
-      <page id="channelPage">
-        <place id="channelInPlace">
-          <name>
-            <text>channelInPlace</text>
-          </name>
-          <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
-
-
+                    </toolspecific>
+                </transition>
+            </page>
+            <page id="channelPage">
+                <place id="channelInPlace">
+                    <name>
+                        <text>channelInPlace</text>
+                    </name>
+                    <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
                         <location>loc2</location>
                         <subnet>locA</subnet>
-                                        </toolspecific>
-          <initialMarking>
-            <text>0</text>
-          </initialMarking>
-        </place>
-        <transition id="channelTransition-publisher-0">
-          <name>
-            <text>channelTransition-publisher-0</text>
-          </name>
-          <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
+                        <balloonMarking>
+                            <tokens>
+                                <token> {"samplefield1": "data", "samplefield2": "more data"} </token>
+                            </tokens>
+                        </balloonMarking>
+                    </toolspecific>
+                    <initialMarking>
+                        <text>0</text>
+                    </initialMarking>
+                </place>
+                <transition id="channelTransition-publisher-0">
+                    <name>
+                        <text>channelTransition-publisher-0</text>
+                    </name>
+                    <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.0.1">
 
-<location>loc2</location><type>limitedChannelOutType</type><subnet>locA</subnet><topic>sampleTopic</topic><inputlimit>10</inputlimit><outputlimit>10</outputlimit><inputsignalbindings/>                    </toolspecific>
-        </transition>
-        <arc id="a1" source="channelInPlace" target="channelTransition-publisher-0">
-        </arc>
-      </page>
-    </page>
-    <name>
-      <text>topicTest2</text>
-    </name>
-    <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                        <location>loc2</location>
+                        <type>limitedChannelOutType</type>
+                        <subnet>locA</subnet>
+                        <topic>sampleTopic</topic>
+                        <inputlimit>10</inputlimit>
+                        <outputlimit>10</outputlimit>
+                        <inputsignalbindings/>
+                    </toolspecific>
+                </transition>
+                <arc id="a1" source="channelInPlace" target="channelTransition-publisher-0">
+                </arc>
+            </page>
+        </page>
+        <name>
+            <text>topicTest2</text>
+        </name>
+        <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
 
 
             <communicators>
@@ -88,6 +98,6 @@
                     <cSubnet>locB</cSubnet>
                 </communicator>
             </communicators>
-                </toolspecific>
-  </net>
+        </toolspecific>
+    </net>
 </pnml>