diff --git a/build.gradle b/build.gradle
index f794746784b7cdd9b8ba3b80e026f737a690210e..70547ab248b0540b13acbf8aca8ce87d0eb902bf 100644
--- a/build.gradle
+++ b/build.gradle
@@ -27,6 +27,14 @@ repositories {
         name 'gitlab-maven'
         url 'https://git-st.inf.tu-dresden.de/api/v4/groups/jastadd/-/packages/maven'
     }
+    maven {
+        name 'rosjava-maven'
+        url "https://git-st.inf.tu-dresden.de/api/v4/projects/1106/packages/maven"
+    }
+    maven {
+        name 'rosjava-msg-maven'
+        url 'https://git-st.inf.tu-dresden.de/api/v4/projects/1108/packages/maven'
+    }
 }
 
 configurations {
@@ -56,8 +64,7 @@ dependencies {
     api group: 'fr.lip6.pnml', name: 'fr.lip6.pnml.framework.utils', version: '2.2.12'
     implementation group: 'org.apache.ws.commons.axiom', name: 'axiom-api', version: '1.2.22'
     implementation group: 'org.apache.ws.commons.axiom', name: 'axiom-impl', version: '1.2.22'
-    implementation group: 'com.thaiopensourc' +
-            'e', name: 'jing', version: '20091111'
+    implementation group: 'com.thaiopensource', name: 'jing', version: '20091111'
     implementation 'org.jetbrains:annotations:19.0.0'
     // https://mvnrepository.com/artifact/xalan/xalan
     implementation group: 'xalan', name: 'xalan', version: '2.7.2'
@@ -71,8 +78,31 @@ dependencies {
     jastadd2 "org.jastadd:jastadd:2.3.4"
     relast group: 'org.jastadd', name: 'relast', version: "${relast_version}"
     ecore files("libs/ecore2relast-0.1.jar")
- //   relast files("libs/relast.jar")
 
+    // ros java
+    compile 'org.ros.rosjava_core:rosjava:0.3.9'
+
+    // ros java subpackages
+    implementation 'org.ros.rosjava_core:apache_xmlrpc_server:0.3.8'
+    implementation 'org.ros.rosjava_core:apache_xmlrpc_common:0.3.8'
+    implementation 'org.ros.rosjava_core:apache_xmlrpc_client:0.3.8'
+    implementation 'org.ros.rosjava_core:rosjava_helpers:0.3.8'
+    implementation 'org.ros.rosjava_bootstrap:message_generation:0.3.3'
+
+    // ros java dependencies
+    implementation("com.google.guava:guava:31.0.1-jre")
+    implementation group: 'org.jboss.netty', name: 'netty', version: '3.2.10.Final'
+    implementation group: 'commons-codec', name: 'commons-codec', version: '1.15'
+    implementation group: 'commons-pool', name: 'commons-pool', version: '1.6'
+    implementation group: 'commons-httpclient', name: 'commons-httpclient', version: '3.1'
+    implementation group: 'org.apache.ws.commons.util', name: 'ws-commons-util', version: '1.0.2'
+    implementation group: 'dnsjava', name: 'dnsjava', version: '2.1.1'
+
+    // ros java messages
+    compile fileTree(include: ['std_msgs-0.5.11.jar'], dir: './libs')
+    compile fileTree(include: ['rosgraph_msgs-1.10.12.jar'], dir: './libs')
+
+    // testing
     testImplementation('org.junit.jupiter:junit-jupiter:5.8.2')
 
 }
diff --git a/libs/rosgraph_msgs-1.10.12.jar b/libs/rosgraph_msgs-1.10.12.jar
new file mode 100644
index 0000000000000000000000000000000000000000..ea7ed16a55770077b4d494727875d40ca725e33b
Binary files /dev/null and b/libs/rosgraph_msgs-1.10.12.jar differ
diff --git a/libs/std_msgs-0.5.11.jar b/libs/std_msgs-0.5.11.jar
new file mode 100644
index 0000000000000000000000000000000000000000..f4bda8eda378e01d97a29456929286d14e04f73e
Binary files /dev/null and b/libs/std_msgs-0.5.11.jar differ
diff --git a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
index 89db56086b409145c440ce24c5687c29cc988a2a..b081078a564a77fe3d1e7c8ccc70a9da50c43b4b 100644
--- a/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
+++ b/src/main/jastadd/engine/balloonMarking/BalloonExecution.jadd
@@ -2,36 +2,42 @@ aspect BalloonExecution {
 
     public Optional<BalloonMarking> BalloonMarking.fireTransition(Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
 
-        if(enabledBalloonTransitions().isEmpty()) return Optional.empty();
+        if(!transition.asInputSignalTransition().getStaticTransitionInformation().isDefaultTransitionInformation()) return Optional.empty();
 
-        List<BalloonToken> inToken = new ArrayList<>();
+        // synchronize marking modification to prevent concurrent modifications
+        synchronized(this){
 
-        // take a token from each incoming place
-        for(Place place : transition.incomingPlaces()){
+            if(!this.isBalloonEnabled(transition)) return Optional.empty();
 
-            BalloonMarkedPlace bmp = this.resolveBalloonPlace(place);
+            List<BalloonToken> inToken=new ArrayList<>();
 
-            Random rand = new Random();
-            int randVal = rand.nextInt(bmp.getNumBalloonMarking());
-            BalloonToken bt = bmp.getBalloonMarking(randVal);
+            // take a token from each incoming place
+            for(Place place:transition.incomingPlaces()){
 
-            inToken.add(bt);
-            bmp.getBalloonMarking(randVal).removeSelf();
-        }
+                BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
+
+                Random rand=new Random();
+                int randVal=rand.nextInt(bmp.getNumBalloonMarking());
+                BalloonToken bt=bmp.getBalloonMarking(randVal);
 
-        BalloonTransition balloonTransition = callbackStorage.resolveBalloonTransition(transition);
+                inToken.add(bt);
+                bmp.getBalloonMarking(randVal).removeSelf();
+            }
 
-        BalloonToken result = de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackExecutor.execute(inToken, balloonTransition.getBalloonCallbacks());
+            BalloonTransition balloonTransition=callbackStorage.resolveBalloonTransition(transition);
 
-        // place a token in each outgoing place
-        for(Place place : transition.outgoingPlaces()){
-            BalloonMarkedPlace bmp = this.resolveBalloonPlace(place);
-            bmp.getBalloonMarkingList().add(result);
-        }
+            BalloonToken result=de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackExecutor.execute(inToken,balloonTransition.getBalloonCallbacks());
 
-        if (requireFlush) {
-            // flush the entire marking tree
-            this.flushTreeCache();
+            // place a token in each outgoing place
+            for(Place place:transition.outgoingPlaces()){
+                BalloonMarkedPlace bmp=this.resolveBalloonPlace(place);
+                bmp.getBalloonMarkingList().add(result);
+            }
+
+            if(requireFlush){
+                // flush the entire marking tree
+                this.flushTreeCache();
+            }
         }
 
         return Optional.of(this);
@@ -45,6 +51,14 @@ aspect BalloonExecution {
         return null;
     }
 
+    public Optional<BalloonMarking> BalloonMarking.fireTopicPublisherTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
+        return null;
+    }
+
+    public Optional<BalloonMarking> BalloonMarking.fireServiceServerTransition(java.util.Random random, Transition transition, BalloonCallbackStorage callbackStorage, boolean requireFlush) {
+        return null;
+    }
+
     public BalloonCallbackStorage PetriNet.initializeCallbackStorage() {
 
         BalloonCallbackStorage storage = new BalloonCallbackStorage();
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 4856622d850b83324cd489f22891a58535927ad0..fe60b58b63785f36b177a019ca60faed8c4c9ef2 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
@@ -14,7 +14,7 @@ public class Main {
 
     public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
 
-        String pnmlPath = "../pnml-relast-nets/src/main/resources/balloonTestNets/balloon-correct-2.pnml";
+        String pnmlPath = "../pnml-relast-nets/src/main/resources/balloonTestNets/balloon-correct-3.pnml";
         PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0);
 
         BalloonMarking bm = petriNet.initializeBalloonMarking();
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/TransitionCallback.java
index cce1f5d05969ad74808e8b12baeb16d464268341..cac9b55f6b30da2a80f29084782cedcbbecc78e6 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/TransitionCallback.java
@@ -4,6 +4,7 @@ import de.tudresden.inf.st.pnml.jastadd.model.BalloonToken;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public abstract class TransitionCallback {
@@ -12,6 +13,13 @@ public abstract class TransitionCallback {
 
     private String id;
     private int priority;
+    private List<String> params = new ArrayList<>();
+
+    public TransitionCallback(String id, int priority, List<String> params) {
+        this.id = id;
+        this.priority = priority;
+        this.params.addAll(params);
+    }
 
     public TransitionCallback(String id, int priority) {
         this.id = id;
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
new file mode 100644
index 0000000000000000000000000000000000000000..d694532525f5ee82579b571e336c14fc3ad206a9
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosDefaultNode.java
@@ -0,0 +1,10 @@
+package de.tudresden.inf.st.pnml.engine.ros;
+
+import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
+
+public class DiNeRosDefaultNode extends DiNeRosNode{
+
+    public DiNeRosDefaultNode(String nodeName, PetriNet petriNet) {
+        super(nodeName, petriNet);
+    }
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..54890c64840fa25508d96f647ca598df99324f43
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosNode.java
@@ -0,0 +1,85 @@
+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.BalloonCallbackStorage;
+import de.tudresden.inf.st.pnml.jastadd.model.BalloonMarking;
+import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
+import de.tudresden.inf.st.pnml.jastadd.model.Transition;
+import org.ros.namespace.GraphName;
+import org.ros.node.AbstractNodeMain;
+import org.ros.node.ConnectedNode;
+import org.ros.node.topic.Subscriber;
+import org.xml.sax.SAXException;
+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;
+
+public abstract class DiNeRosNode extends AbstractNodeMain {
+
+    public final java.lang.String nodeName;
+    public final PetriNet petriNet;
+    private BalloonMarking marking;
+    private BalloonCallbackStorage callbackStorage;
+    private final Map<java.lang.String, DiNeRosSubscriber> dinerosSubscribers = new HashMap<>();
+
+    public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet){
+        this.nodeName = nodeName;
+        this.petriNet = petriNet;
+        try {
+            marking = petriNet.initializeBalloonMarking();
+            callbackStorage = petriNet.initializeCallbackStorage();
+        } catch (IOException | SAXException | ParserConfigurationException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public GraphName getDefaultNodeName() {
+        return GraphName.of(nodeName);
+    }
+
+    @Override
+    public void onStart(final ConnectedNode connectedNode) {
+
+        int inCount = 0;
+
+        for(Transition t : petriNet.allTransitions()){
+            if(t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TOPIC_SUBSCRIBER)
+                    || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_OUT)
+                    || t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_OUT)){
+
+                Subscriber<String> subscriber = connectedNode.newSubscriber(t.asInputSignalTransition()
+                        .getStaticTransitionInformation().asTopicTransitionInformation().getTopic(), std_msgs.String._TYPE);
+
+                int finalInCount = inCount;
+                subscriber.addMessageListener(message -> {
+
+                    List<java.lang.String> addedElementIds = new ArrayList<>();
+                    TopicTransformer.includeSubscriberInstance(petriNet, t.asInputSignalTransition()
+                            .getStaticTransitionInformation().getSubNet(), java.lang.String.valueOf(finalInCount), addedElementIds);
+
+                    for (Map.Entry<java.lang.String, DiNeRosSubscriber> entry : dinerosSubscribers.entrySet()) {
+                        if(entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())){
+                            entry.getValue().execute(marking, callbackStorage, petriNet, t.asInputSignalTransition().getStaticTransitionInformation().getSubNet());
+                            TopicTransformer.removeSubscriberInstance(petriNet, addedElementIds);
+                            break;
+                        }
+                    }
+                });
+
+                inCount++;
+            }
+        }
+
+    }
+
+    public Map<java.lang.String, DiNeRosSubscriber> getDinerosSubscribers() {
+        return dinerosSubscribers;
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosSubscriber.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosSubscriber.java
new file mode 100644
index 0000000000000000000000000000000000000000..f93a6cc4928ab321905f6a573e8c19b6c1998c1c
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/DiNeRosSubscriber.java
@@ -0,0 +1,10 @@
+package de.tudresden.inf.st.pnml.engine.ros;
+
+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.PetriNet;
+
+public interface DiNeRosSubscriber {
+
+    public boolean execute(BalloonMarking balloonMarking, BalloonCallbackStorage balloonCallbackStorage, PetriNet petriNet, String subnet);
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/ros/RosCommunicationUtil.java b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/RosCommunicationUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..a75a2cdcb19c744ea2e1bfae2299aa68cdc20bad
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/ros/RosCommunicationUtil.java
@@ -0,0 +1,54 @@
+package de.tudresden.inf.st.pnml.engine.ros;
+
+import de.tudresden.inf.st.pnml.jastadd.model.BalloonMarking;
+import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
+import de.tudresden.inf.st.pnml.jastadd.model.Transition;
+import org.ros.node.ConnectedNode;
+import org.ros.node.topic.Publisher;
+import org.ros.node.topic.Subscriber;
+import std_msgs.String;
+
+import java.nio.charset.StandardCharsets;
+import java.util.function.BiConsumer;
+
+import org.ros.message.MessageListener;
+
+public class RosCommunicationUtil {
+
+    public static boolean publish(java.lang.String topic, byte[] msgContent, ConnectedNode node){
+
+        System.out.println("Publishing new message to " + topic);
+        Publisher<std_msgs.String> pub = node.newPublisher(topic, std_msgs.String._TYPE);
+
+        if(pub == null){
+            while(true){
+                if(node != null){
+                    break;
+                }
+            }
+
+            std_msgs.String msg = pub.newMessage();
+            java.lang.String s = new java.lang.String(msgContent, StandardCharsets.UTF_8);
+            msg.setData(s);
+            pub.publish(msg);
+
+            return true;
+        }
+        return false;
+    }
+
+    public static Subscriber listen(java.lang.String topic, ConnectedNode node, Transition t, PetriNet pn, BalloonMarking bm){
+
+        Subscriber<String> subscriber = node.newSubscriber(topic, std_msgs.String._TYPE);
+  //      subscriber.addMessageListener(message -> callback.accept(topic, message.getData().getBytes()));
+
+        subscriber.addMessageListener(message -> {
+
+
+
+        });
+
+        return subscriber;
+
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceTransformer.java b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceTransformer.java
new file mode 100644
index 0000000000000000000000000000000000000000..ff94618789534925b65d3e1c874e714701b9f0c3
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/ServiceTransformer.java
@@ -0,0 +1,4 @@
+package de.tudresden.inf.st.pnml.engine.transform;
+
+public class ServiceTransformer {
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/transform/TopicTransformer.java b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/TopicTransformer.java
new file mode 100644
index 0000000000000000000000000000000000000000..efb009ecb0d679836ffabbade4d4bcc356b8744a
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/transform/TopicTransformer.java
@@ -0,0 +1,221 @@
+package de.tudresden.inf.st.pnml.engine.transform;
+
+import de.tudresden.inf.st.pnml.base.constants.PnmlConstants;
+import de.tudresden.inf.st.pnml.jastadd.model.*;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class TopicTransformer {
+
+    public static PetriNet includeSubscriberInstance(PetriNet petriNet, String subnet, String suffix, List<String> addedElementIds){
+
+        Page topPage = petriNet.getPage(0);
+
+        // Elements
+        for (Place p : getPlacesBySubnet(petriNet, subnet)) {
+
+            OutputSignalPlace copy = getOutputSignalPlace();
+            copy.setId(p.getId() + "-" + suffix);
+            copy.setToolspecificList(p.getToolspecificList().treeCopy());
+            copy.getName().setText(p.getName().getText());
+            copy.setNodeGraphics(p.getNodeGraphics().treeCopy());
+
+            // copy initial marking of places
+            PTMarking m = new PTMarking();
+            m.setText(p.getInitialMarking().getText());
+
+            PlaceInformation pi = new PlaceInformation();
+            pi.setSubNet(p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet() + "-" + suffix);
+            pi.setLocation(p.asOutputSignalPlace().getStaticPlaceInformation().getLocation());
+            pi.setInstance(p.asOutputSignalPlace().getStaticPlaceInformation().getInstance());
+            pi.setType(p.asOutputSignalPlace().getStaticPlaceInformation().getType());
+
+            copy.setMutualPlaceInformation(pi);
+
+            topPage.addObject(copy);
+            addedElementIds.add(copy.getId());
+        }
+
+        petriNet.flushTreeCache();
+
+        for (Transition t : getTransitionsBySubnet(petriNet, subnet)) {
+            InputSignalTransition copy = getInputSignalTransition();
+            copy.setId(t.getId() + "-" + suffix);
+            copy.getName().setText(t.getName().getText());
+            copy.setMutualInputSignalBindingList(t.asInputSignalTransition().getMutualInputSignalBindingList().treeCopy());
+            copy.getName().setText(t.getName().getText());
+            copy.setToolspecificList(t.getToolspecificList().treeCopy());
+            copy.setNodeGraphics(t.getNodeGraphics().treeCopy());
+
+            TransitionInformation ti = new DefaultTransitionInformation();
+            ti.setType(t.asInputSignalTransition().getStaticTransitionInformation().getType());
+            ti.setSubNet(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet() + "-" + suffix);
+            ti.setLocation(t.asInputSignalTransition().getStaticTransitionInformation().getLocation());
+            ti.setInstance(t.asInputSignalTransition().getStaticTransitionInformation().getInstance());
+            copy.setMutualTransitionInformation(ti);
+
+            topPage.addObject(copy);
+            addedElementIds.add(copy.getId());
+        }
+
+        petriNet.flushTreeCache();
+
+        // Arcs
+        for (Arc a : getInnerAndBorderSubnetArcs(petriNet, subnet)) {
+
+            Arc newArc = a.treeCopy();
+
+            String sourceId = a.getSource().getId() + "-" + suffix;
+            newArc.setSource((Node) getPnObjectByID(petriNet, sourceId));
+
+            String targetId = a.getTarget().getId() + "-" + suffix;
+
+            if(a.getTarget().isTransitionNode()){
+                if(!a.getTarget().asTransitionNode().asTransition().asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(subnet)){
+                    targetId = a.getTarget().getId();
+                }
+            }
+
+            if(a.getTarget().isPlaceNode()){
+                if(!a.getTarget().asPlaceNode().asPlace().asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(subnet)){
+                    targetId = a.getTarget().getId();
+                }
+            }
+
+            newArc.setTarget((Node) getPnObjectByID(petriNet, targetId));
+            newArc.setId(sourceId + "-to-" + targetId);
+
+            topPage.addObject(newArc);
+            addedElementIds.add(newArc.getId());
+        }
+
+        // TODO: references
+
+        petriNet.flushTreeCache();
+
+        return petriNet;
+    }
+
+    public static PetriNet removeSubscriberInstance(PetriNet petriNet, List<String> addedElementIds){
+
+        for(String id : addedElementIds){
+            getPnObjectByID(petriNet, id).removeSelf();
+        }
+
+        petriNet.flushTreeCache();
+        return petriNet;
+    }
+
+    private static Set<Arc> getInnerAndBorderSubnetArcs(PetriNet petriNet, String subnet) {
+
+        Set<Arc> arcs = new HashSet<>();
+
+        for (Arc a : petriNet.allArcs()) {
+
+            if(a.getTarget().isTransitionNode() && a.getSource().isPlaceNode()){
+
+                if(a.getSource().asPlaceNode().asPlace().asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(subnet)){
+                    arcs.add(a);
+                }
+
+            } else {
+                if(a.getSource().asTransitionNode().asTransition().asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(subnet)){
+                    arcs.add(a);
+                }
+            }
+        }
+
+        return arcs;
+    }
+
+    private static InputSignalTransition getInputSignalTransition(){
+
+        PetriNet templateNet = PnmlParser.parsePnml(System.getProperty("user.dir") + "/src/main/resources/elements/InputSignalTransition.pnml").get(0);
+
+        for(Transition t : templateNet.allTransitions()){
+            if(t.getId().equals("InputSignalTransition")){
+                return t.asInputSignalTransition();
+            }
+        }
+
+        return null;
+    }
+
+    private static OutputSignalPlace getOutputSignalPlace(){
+
+        PetriNet templateNet = PnmlParser.parsePnml(System.getProperty("user.dir") + "/src/main/resources/elements/OutputSignalPlace.pnml").get(0);
+
+        for(Place p : templateNet.allPlaces()){
+            if(p.getId().equals("OutputSignalPlace")){
+                return p.asOutputSignalPlace();
+            }
+        }
+
+        return null;
+    }
+
+    private static PnObject getPnObjectByID(PetriNet petriNet, String Id) {
+
+        for (PnObject po : petriNet.allObjects()) {
+            if (po.getId().equals(Id)) {
+                return po;
+            }
+        }
+
+        return null;
+    }
+
+    private static Set<Place> getPlacesBySubnet(PetriNet petriNet, String subnet) {
+
+        Set<Place> places = new HashSet<>();
+
+        for (Place p : petriNet.allPlaces()) {
+            if (p.asOutputSignalPlace().getStaticPlaceInformation().getSubNet().equals(subnet)) {
+                places.add(p);
+            }
+        }
+
+        return places;
+    }
+
+    private static Set<Transition> getTransitionsBySubnet(PetriNet petriNet, String subnet) {
+
+        Set<Transition> transitions = new HashSet<>();
+
+        for (Transition t : petriNet.allTransitions()) {
+            if (t.asInputSignalTransition().getStaticTransitionInformation().getSubNet().equals(subnet)) {
+                transitions.add(t);
+            }
+        }
+
+        return transitions;
+    }
+
+    private static Set<RefPlace> getRefPlaceBySubnet(PetriNet petriNet, String subnet) {
+
+        Set<RefPlace> places = new HashSet<>();
+
+        for (RefPlace rp : petriNet.allRefPlaces()) {
+            if (rp.getSubNet().equals(subnet)) {
+                places.add(rp);
+            }
+        }
+
+        return places;
+    }
+
+    private static Set<RefTransition> getRefTransitionBySubnet(PetriNet petriNet, String subnet) {
+
+        Set<RefTransition> transitions = new HashSet<>();
+
+        for (RefTransition rt : petriNet.allRefTransitions()) {
+            if (rt.getSubNet().equals(subnet)) {
+                transitions.add(rt);
+            }
+        }
+
+        return transitions;
+    }
+}
diff --git a/src/main/resources/elements/InputSignalTransition.pnml b/src/main/resources/elements/InputSignalTransition.pnml
new file mode 100644
index 0000000000000000000000000000000000000000..a94aa6357fc39220731bd5c0bf20164f8ec48496
--- /dev/null
+++ b/src/main/resources/elements/InputSignalTransition.pnml
@@ -0,0 +1,29 @@
+<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
+    <net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet">
+        <name>
+            <text>InputSignalTransitionNet</text>
+        </name>
+        <page id="InputSignalTransitionPage">
+            <transition id="InputSignalTransition">
+                <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                    <location>none</location>
+                    <subnet>none</subnet>
+                    <type>discreteTransitionType</type>
+                    <inputsignalbindings>
+                    </inputsignalbindings>
+                    <inputsignalclause></inputsignalclause>
+                </toolspecific>
+                <name>
+                    <text>ServiceClientOutputTransition</text>
+                    <graphics>
+                        <offset x="0" y="0" />
+                    </graphics>
+                </name>
+                <graphics>
+                    <position x="0" y="0"/>
+                </graphics>
+            </transition>
+
+        </page>
+    </net>
+</pnml>
\ No newline at end of file
diff --git a/src/main/resources/elements/OutputSignalPlace.pnml b/src/main/resources/elements/OutputSignalPlace.pnml
new file mode 100644
index 0000000000000000000000000000000000000000..a9ab44b794d7a959f97094d05d6d1cfab5c60e95
--- /dev/null
+++ b/src/main/resources/elements/OutputSignalPlace.pnml
@@ -0,0 +1,30 @@
+<pnml xmlns="http://www.pnml.org/version-2009/grammar/pnml">
+    <net id="TopicPublisherTemplate" type ="http://www.pnml.org/version-2009/grammar/ptnet">
+        <name>
+            <text>OutputSignalPlaceNet</text>
+        </name>
+        <page id="OutputSignalPlacePage">
+            <place id="OutputSignalPlace">
+                <toolspecific tool="de.tudresden.inf.st.pnml.distributedPN" version="0.1">
+                    <location>none</location>
+                    <subnet>none</subnet>
+                    <type>discretePlaceType</type>
+                    <outputsignalbindings>
+                    </outputsignalbindings>
+                </toolspecific>
+                <name>
+                    <text>ServiceTogglePlace</text>
+                    <graphics>
+                        <offset x="0" y="0" />
+                    </graphics>
+                </name>
+                <initialMarking>
+                    <text>0</text>
+                </initialMarking>
+                <graphics>
+                    <position x="0" y="0"/>
+                </graphics>
+            </place>
+        </page>
+    </net>
+</pnml>
\ No newline at end of file