diff --git a/src/main/jastadd/flatter/transforms/SignalTransforms.jadd b/src/main/jastadd/flatter/transforms/SignalTransforms.jadd
index fc91a03ac5222925a18cf825a9a600c6b3a6fb28..e1cdcb51d5c02d797c1d565f02a9237f1d772cdb 100644
--- a/src/main/jastadd/flatter/transforms/SignalTransforms.jadd
+++ b/src/main/jastadd/flatter/transforms/SignalTransforms.jadd
@@ -1,6 +1,6 @@
 aspect SignalTransforms {
 
-    syn PetriNet PetriNet.transformSingleUseSignals(){
+    syn PetriNet PetriNet.transformSingleUseSignals(boolean withOutPlaces){
 
       Map<String, List<DinerosTransition>> signalMapping = TransformationUtils.getSignalToUsageMapping(this);
 
@@ -11,69 +11,22 @@ aspect SignalTransforms {
         Place placeTrue = this.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_TRUE + "-" + entry.getKey());
         Place placeFalse = this.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_FALSE + "-" + entry.getKey());
 
-        int usageCount = 0;
+        int inUsageCount = 0;
         for (DinerosTransition dt : entry.getValue()) {
           for (Place p : dt.incomingPlaces()) {
-            if (!p.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) {
-              if (usageCount == 0) {
-                System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + toTrue.getId());
-                TransformationUtils.createAndIncludeBidirectionalArc(this.getPage(0), p, toTrue);
-
-                System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + toFalse.getId());
-                TransformationUtils.createAndIncludeBidirectionalArc(this.getPage(0), p, toFalse);
-              } else {
-                DinerosTransition newToTrue = PrimitiveTemplates.getDinerosTransition();
-                long millis = System.currentTimeMillis();
-                newToTrue.setId(toTrue.getId() + "-" + usageCount + "-" + millis);
-                newToTrue.getName().setText(newToTrue.getId());
-                DinerosTransition newToFalse = PrimitiveTemplates.getDinerosTransition();
-                newToFalse.setId(toFalse.getId() + "-" + usageCount + "-" + millis);
-                newToFalse.getName().setText(newToFalse.getId());
-                this.getPage(0).addObject(newToTrue);
-                this.getPage(0).addObject(newToFalse);
-
-                for(Place tip : toTrue.incomingPlaces()){
-                    if (tip.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) {
-                        System.out.println("Relink 1: " + newToTrue.getId());
-                        TransformationUtils.createAndIncludeArc(this.getPage(0), tip, newToTrue);
-                    }
-                }
-
-                for(Place top : toTrue.outgoingPlaces()){
-                    if (top.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) {
-                        System.out.println("Relink 2: " + newToTrue.getId());
-                        TransformationUtils.createAndIncludeArc(this.getPage(0), newToTrue, top);
-                    }
-                }
-
-                for(Place tip : toFalse.incomingPlaces()){
-                    if (tip.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) {
-                        System.out.println("Relink 3: " + newToFalse.getId());
-                        TransformationUtils.createAndIncludeArc(this.getPage(0), tip, newToFalse);
-                    }
-                }
+              TransformationUtils.createNewSignalLinkage(this.getPage(0), toTrue, toFalse, placeTrue, placeFalse, inUsageCount, p, "-IN", true);
+          }
+          inUsageCount++;
+        }
 
-                for(Place top : toFalse.outgoingPlaces()){
-                    if (top.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) {
-                        System.out.println("Relink 4: " + newToFalse.getId());
-                        TransformationUtils.createAndIncludeArc(this.getPage(0), newToFalse, top);
-                    }
+        if(withOutPlaces){
+            int outUsageCount=0;
+            for(DinerosTransition dt:entry.getValue()){
+                for(Place p:dt.outgoingPlaces()){
+                    TransformationUtils.createNewSignalLinkage(this.getPage(0),toTrue,toFalse,placeTrue,placeFalse,outUsageCount,p,"-OUT", false);
                 }
-
-                TransformationUtils.createAndIncludeArc(this.getPage(0), placeTrue, newToFalse);
-                TransformationUtils.createAndIncludeArc(this.getPage(0), newToFalse, placeFalse);
-                TransformationUtils.createAndIncludeArc(this.getPage(0), placeFalse, newToTrue);
-                TransformationUtils.createAndIncludeArc(this.getPage(0), newToTrue, placeTrue);
-
-                System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + newToTrue.getId());
-                TransformationUtils.createAndIncludeBidirectionalArc(this.getPage(0), p, newToTrue);
-
-                System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + newToFalse.getId());
-                TransformationUtils.createAndIncludeBidirectionalArc(this.getPage(0), p, newToFalse);
-              }
+                outUsageCount++;
             }
-          }
-          usageCount++;
         }
       }
       return this;
diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java
index 1a3dfcc65da017526470c2fe967cf565ca3e8c80..0e5c0b3f31ada5aaf0665f7eb7264c0c894a6e0e 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/Main.java
@@ -25,19 +25,23 @@ public class Main {
 
     public static void main(String[] args) throws InvalidIDException, InterruptedException, IOException, Parser.Exception {
 
-        String configPath = (args.length > 1) ? args[1] : null;
-        String pnmlPath = (args.length > 0) ? args[0] : null;
-        // "/home/sebastian/git/dineros-public/dineros/pnml-relast-apps/robotic-sorting/rpn-models/full-models" +
-        //                "/sorting-wf-synced-safe-sensor-grpn.pnml"; //
+        String configPath = (args.length > 1) ? args[5] : null;
+        String pnmlPath =  (args.length > 0) ? args[4] : null;
 
-        boolean flagInhibitor = Boolean.parseBoolean(args[2]);
-        boolean flagSignal =  Boolean.parseBoolean(args[3]);
-        boolean flagPurge =  Boolean.parseBoolean(args[4]);
-        doFlattening(configPath, pnmlPath, flagInhibitor, flagSignal, flagPurge);
+        boolean flagInhibitor =  Boolean.parseBoolean(args[0]);
+        boolean flagSignal =  Boolean.parseBoolean(args[1]);
+        boolean flagPurge =   Boolean.parseBoolean(args[2]);
+        boolean flagOverrideInstanceCount =  Boolean.parseBoolean(args[3]);
+        boolean flagOutArcs = false;
+        boolean flagNoSignal = false;
+
+        doFlattening(configPath, pnmlPath, flagInhibitor, flagSignal, flagPurge, flagOverrideInstanceCount, flagOutArcs, flagNoSignal, null);
 
     }
 
-    private static void doFlattening(String configPath, String pnmlPath, boolean flagInhibitor, boolean flagSignal, boolean flagPurge)
+    private static void doFlattening(String configPath, String pnmlPath, boolean flagInhibitor,
+                                     boolean flagSignal, boolean flagPurge, boolean flagOverrideInstanceCount,
+                                     boolean flagOutArcs, boolean flagNoSignal, String outputPath)
             throws InvalidIDException, IOException, InterruptedException, Parser.Exception {
 
         if (pnmlPath == null) {
@@ -61,11 +65,11 @@ public class Main {
         serviceGraph.init(petriNet);
 
         Map<String, PnObject> addedInstanceObjects = new HashMap<>();
-        TransformationUtils.transformPrototypePagesRecursive(petriNet.getPage(0), null, petriNet, serviceGraph, addedInstanceObjects);
+        TransformationUtils.transformPrototypePagesRecursive(petriNet.getPage(0), null,
+                petriNet, serviceGraph, addedInstanceObjects, flagOverrideInstanceCount);
         petriNet.flushAttrAndCollectionCache();
 
         // [STAGE 2] Transform topic transitions
-
         for(DinerosTransition dt : petriNet.allDinerosTransitions()){
             if(dt.canTransformTopicTransition()){
                 Page topicTransformedPage = dt.transformTopicElement(bounds, flagInhibitor, flagPurge);
@@ -93,21 +97,23 @@ public class Main {
             }
         }
 
-        // [STAGE 4] Transform signals
-        Page signalValuePage = new Page();
-        signalValuePage.setId(PnmlConstants.SIGNAL_VALUE_PAGE_ID);
-        petriNet.addPage(signalValuePage);
-        petriNet.transformSignalElements(signalValuePage);
-        petriNet.flushTreeCache();
-        petriNet.flushAttrAndCollectionCache();
+        if(!flagNoSignal) {
+            // [STAGE 4] Transform signals
+            Page signalValuePage = new Page();
+            signalValuePage.setId(PnmlConstants.SIGNAL_VALUE_PAGE_ID);
+            petriNet.addPage(signalValuePage);
+            petriNet.transformSignalElements(signalValuePage);
+            petriNet.flushTreeCache();
+            petriNet.flushAttrAndCollectionCache();
 
-        for(DinerosTransition dt : petriNet.allDinerosTransitions()){
-            Page dtClausePage = dt.getStaticTransitionInformation().asSignalTransitionInformation()
-                    .getClause().transformClauseElement(dt, petriNet);
-            petriNet.addPage(dtClausePage);
-        }
+            for (DinerosTransition dt : petriNet.allDinerosTransitions()) {
+                Page dtClausePage = dt.getStaticTransitionInformation().asSignalTransitionInformation()
+                        .getClause().transformClauseElement(dt, petriNet);
+                petriNet.addPage(dtClausePage);
+            }
 
-        petriNet.flushTreeCache();
+            petriNet.flushTreeCache();
+        }
 
         // [STAGE 5] make sure that we have a valid marking
         System.out.println("[FLATTENER] Checking marking.");
@@ -120,8 +126,6 @@ public class Main {
             }
         }
 
-        // printNet(petriNet, true, false);
-
         // [STAGE 6] remove references / pages
         System.out.println("[FLATTENER] Breaking references and pages.");
         for(Page p : petriNet.allPages()){
@@ -134,11 +138,13 @@ public class Main {
         // [STAGE 7] Postprocessing
         System.out.println("[FLATTENER] Running postprocessing.");
         if(flagSignal) {
-            petriNet.transformSingleUseSignals();
+            petriNet.transformSingleUseSignals(flagOutArcs);
             petriNet.flushAttrAndCollectionCache();
             petriNet.flushTreeCache();
         }
 
+        printNet(petriNet, false, false);
+
         // [STAGE 8] export flatted net to pnml
         System.out.println("[FLATTENER] Exporting to pnml.");
         String exportId = UUID.randomUUID().toString();
@@ -153,7 +159,14 @@ public class Main {
 
         // resolve inhibitor arcs
         System.out.println("[FLATTENER] Including inhibitor arcs into net format.");
-        String inhibitorTargetPath = homeDirectory + "/temp/net/" + fid + "-flatted-inh-" + exportId + ".net";
+        String inhibitorTargetPath;
+
+        if(outputPath != null){
+            inhibitorTargetPath = outputPath;
+        } else {
+            inhibitorTargetPath = homeDirectory + "/temp/net/" + fid + "-flatted-inh-" + exportId + ".net";
+        }
+
         ndrioProxy.pnml2net(pnmlExportPath, ndrioTargetPath);
         ndrioProxy.includeInhibitorArcs(petriNet, ndrioTargetPath, inhibitorTargetPath);
 
diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/TransformationUtils.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/TransformationUtils.java
index 67f7f675d71ee0ac2ff10ad4e0b9639fdcda2bef..633146dcced072ac4691e2761a3855205f704d1d 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/TransformationUtils.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/TransformationUtils.java
@@ -3,6 +3,8 @@ package de.tudresden.inf.st.pnml.flatter.transform;
 import beaver.Parser;
 import de.tudresden.inf.st.pnml.flatter.analysis.TinaUtils;
 import de.tudresden.inf.st.pnml.flatter.graph.ServiceGraph;
+import de.tudresden.inf.st.pnml.flatter.template.PrimitiveTemplates;
+import de.tudresden.inf.st.pnml.flatter.template.TemplateConstants;
 import de.tudresden.inf.st.pnml.flatter.tina.NdrioProxy;
 import de.tudresden.inf.st.pnml.jastadd.model.*;
 import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException;
@@ -250,24 +252,28 @@ public class TransformationUtils {
         return null;
     }
 
-    public static void transformPrototypePagesRecursive(Page page, Page parentPage, PetriNet petriNet, ServiceGraph serviceGraph, Map<String, PnObject> addedObjects){
+    public static void transformPrototypePagesRecursive(Page page, Page parentPage,
+                                                        PetriNet petriNet, ServiceGraph serviceGraph,
+                                                        Map<String, PnObject> addedObjects, boolean flagOverrideInstanceCount){
 
         if(page.canTransformPrototypePage()){
             System.out.println("[INFO] Transforming page: " + page.getId());
 
             Page transformedPage;
 
-            if(serviceGraph.isPotentiallyCyclic(page.getServiceName())){
+            if(serviceGraph.isPotentiallyCyclic(page.getServiceName()) && !flagOverrideInstanceCount){
                 System.out.println("[WARNING] Detected potentially cyclic service call on: " + page.getServiceName());
                 System.out.println("[WARNING] Falling back to user defined thread number for: " + page.getServiceName());
-                System.out.println("#Objects before: " + addedObjects.size());
                 transformedPage = page.transformPrototypePage(petriNet,-1, addedObjects);
-                System.out.println("#Objects after: " + addedObjects.size());
-            } else {
+            } else if(!serviceGraph.isPotentiallyCyclic(page.getServiceName()) && !flagOverrideInstanceCount) {
                 int numInstances = getTransitionByServiceName(petriNet,
                         page.getServiceName()).getStaticTransitionInformation().asServiceTransitionInformation().getNumClientChannel();
                 transformedPage = page.transformPrototypePage(petriNet, numInstances, addedObjects);
                 System.out.println("[INFO] Transforming prototype page: " + page.getServiceName() + " to " + numInstances + " instances.");
+            } else {
+                System.out.println("[WARNING] OverrideInstanceCount flag is used: " + page.getServiceName());
+                System.out.println("[WARNING] Falling back to user defined thread number for: " + page.getServiceName());
+                transformedPage = page.transformPrototypePage(petriNet,-1, addedObjects);
             }
 
             if(parentPage == null){
@@ -297,7 +303,7 @@ public class TransformationUtils {
         }
 
         for(Page iterPage : subPages){
-            transformPrototypePagesRecursive(iterPage, page, petriNet, serviceGraph, addedObjects);
+            transformPrototypePagesRecursive(iterPage, page, petriNet, serviceGraph, addedObjects, flagOverrideInstanceCount);
         }
     }
 
@@ -463,4 +469,69 @@ public class TransformationUtils {
             }
         }
     }
+
+    public static void createNewSignalLinkage(Page page, Transition toTrue, Transition toFalse,
+                                              Place placeTrue, Place placeFalse, int usageCount,
+                                              Place p, String suffix, boolean usageCountFlag) {
+        if (!p.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) {
+            if (usageCount == 0 && usageCountFlag) {
+                System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + toTrue.getId());
+                TransformationUtils.createAndIncludeBidirectionalArc(page, p, toTrue);
+
+                System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + toFalse.getId());
+                TransformationUtils.createAndIncludeBidirectionalArc(page, p, toFalse);
+            }
+
+            if(usageCount > 0 || !usageCountFlag){
+                DinerosTransition newToTrue = PrimitiveTemplates.getDinerosTransition();
+                long millis = System.currentTimeMillis();
+                newToTrue.setId(toTrue.getId() + "-" + usageCount + "-" + millis + suffix);
+                newToTrue.getName().setText(newToTrue.getId());
+                DinerosTransition newToFalse = PrimitiveTemplates.getDinerosTransition();
+                newToFalse.setId(toFalse.getId() + "-" + usageCount + "-" + millis + suffix);
+                newToFalse.getName().setText(newToFalse.getId());
+                page.addObject(newToTrue);
+                page.addObject(newToFalse);
+
+                for(Place tip : toTrue.incomingPlaces()){
+                    if (tip.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) {
+                        System.out.println("Relink 1: " + newToTrue.getId());
+                        TransformationUtils.createAndIncludeArc(page, tip, newToTrue);
+                    }
+                }
+
+                for(Place top : toTrue.outgoingPlaces()){
+                    if (top.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) {
+                        System.out.println("Relink 2: " + newToTrue.getId());
+                        TransformationUtils.createAndIncludeArc(page, newToTrue, top);
+                    }
+                }
+
+                for(Place tip : toFalse.incomingPlaces()){
+                    if (tip.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) {
+                        System.out.println("Relink 3: " + newToFalse.getId());
+                        TransformationUtils.createAndIncludeArc(page, tip, newToFalse);
+                    }
+                }
+
+                for(Place top : toFalse.outgoingPlaces()){
+                    if (top.getId().startsWith(TemplateConstants.PD_PLACE_PREFIX)) {
+                        System.out.println("Relink 4: " + newToFalse.getId());
+                        TransformationUtils.createAndIncludeArc(page, newToFalse, top);
+                    }
+                }
+
+                TransformationUtils.createAndIncludeArc(page, placeTrue, newToFalse);
+                TransformationUtils.createAndIncludeArc(page, newToFalse, placeFalse);
+                TransformationUtils.createAndIncludeArc(page, placeFalse, newToTrue);
+                TransformationUtils.createAndIncludeArc(page, newToTrue, placeTrue);
+
+                System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + newToTrue.getId());
+                TransformationUtils.createAndIncludeBidirectionalArc(page, p, newToTrue);
+
+                System.out.println("[SignalPostProcessing] Creating new linkage between " + p.getId() + " and " + newToFalse.getId());
+                TransformationUtils.createAndIncludeBidirectionalArc(page, p, newToFalse);
+            }
+        }
+    }
 }