diff --git a/build.gradle b/build.gradle
index 9bdec6da4a5e897a2547432830df98da8b2c9612..5ef1f5ce28289fbad648173fd639bbe9b02dafae 100644
--- a/build.gradle
+++ b/build.gradle
@@ -100,6 +100,7 @@ dependencies {
 
     // ros java messages
     compile fileTree(include: ['std_msgs-0.5.11.jar'], dir: './libs')
+    compile fileTree(include: ['rosjava_srv-0.1.0.jar'], dir: './libs')
     compile fileTree(include: ['rosgraph_msgs-1.10.12.jar'], dir: './libs')
 
     // testing
diff --git a/libs/rosjava_srv-0.1.0.jar b/libs/rosjava_srv-0.1.0.jar
new file mode 100644
index 0000000000000000000000000000000000000000..bcbab7745004a18c14f524861dd1c343be0ec1ff
Binary files /dev/null and b/libs/rosjava_srv-0.1.0.jar differ
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 d09927445ad0a1a926b97275f46571f92e3c1028..68b915fec1f361c19006276fea8a43f5bf4efd3d 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
@@ -2,12 +2,18 @@ package de.tudresden.inf.st.pnml.engine.ros;
 
 import de.tudresden.inf.st.pnml.base.constants.PnmlConstants;
 import de.tudresden.inf.st.pnml.jastadd.model.*;
+import org.ros.concurrent.CancellableLoop;
 import org.ros.namespace.GraphName;
 import org.ros.node.AbstractNodeMain;
 import org.ros.node.ConnectedNode;
+import org.ros.node.service.ServiceResponseBuilder;
+import org.ros.node.service.ServiceServer;
 import org.ros.node.topic.Publisher;
 import org.ros.node.topic.Subscriber;
 import org.xml.sax.SAXException;
+import rosjava_srv.StringService;
+import rosjava_srv.StringServiceRequest;
+import rosjava_srv.StringServiceResponse;
 import std_msgs.String;
 
 import javax.xml.parsers.ParserConfigurationException;
@@ -25,6 +31,8 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
     private BalloonCallbackStorage callbackStorage;
     private final Map<java.lang.String, DiNeRosSubscriber> dinerosSubscribers = new HashMap<>();
     private final Map<InputSignalTransition, Publisher<std_msgs.String>> dinerosPublishers = new HashMap<>();
+    private final Map<InputSignalTransition, ServiceServer<StringServiceRequest, StringServiceResponse>> dinerosServiceServers = new HashMap<>();
+    private ConnectedNode connectedNode;
 
     public DiNeRosNode(java.lang.String nodeName, PetriNet petriNet){
         this.nodeName = nodeName;
@@ -44,6 +52,19 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
         this.callbackStorage = callbackStorage;
     }
 
+    protected void nodeLoop(){
+
+        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);
+            }
+        });
+    }
+
     @Override
     public GraphName getDefaultNodeName() {
         return GraphName.of(nodeName);
@@ -64,6 +85,8 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
     @Override
     public void onStart(final ConnectedNode connectedNode) {
 
+        this.connectedNode = connectedNode;
+
         System.out.println("Initializing node: " + nodeName);
 
         // setup publishers
@@ -89,7 +112,7 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
 
                 subscriber.addMessageListener(message -> {
 
-                    System.out.println("I heard: \"" + message.getData() + "\"");
+                    System.out.println("Subscriber Input: \"" + message.getData() + "\"");
 
                     for (Map.Entry<java.lang.String, DiNeRosSubscriber> entry : getDinerosSubscribers().entrySet()) {
                         if(entry.getKey().equals(t.asInputSignalTransition().getStaticTransitionInformation().getSubNet())){
@@ -115,6 +138,25 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
                 }, t.asInputSignalTransition().getStaticTransitionInformation().getInputLimit());
             }
         }
+
+        // setup services
+        for(Transition t : petriNet.allTransitions()){
+
+            if(t.asInputSignalTransition().getStaticTransitionInformation().getType().equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_IN)){
+
+                connectedNode.newServiceServer(t.asInputSignalTransition().getStaticTransitionInformation().asServiceTransitionInformation().getServiceName(), StringService._TYPE,
+                        (ServiceResponseBuilder<StringServiceRequest, StringServiceResponse>) (request, response) -> {
+
+                            System.out.println("Service Input: \"" + request.getInput() + "\"");
+                            response.setOutput("...");
+
+                        });
+
+            }
+
+        }
+
+        this.nodeLoop();
     }
 
     public List<Transition> getSubnetTransitionsByIds(List<java.lang.String> ids, PetriNet petriNet){
@@ -140,6 +182,10 @@ public abstract class DiNeRosNode extends AbstractNodeMain {
         return dinerosPublishers;
     }
 
+    public Map<InputSignalTransition, ServiceServer<StringServiceRequest, StringServiceResponse>> getDinerosServiceServers() {
+        return dinerosServiceServers;
+    }
+
     public BalloonMarking firePublisherTransition(InputSignalTransition transition){
 
         java.lang.String msgString = this.marking.fireTopicPublisherTransition(transition, this.callbackStorage, true);