diff --git a/src/main/jastadd/flatter/transforms/ServiceChannelTransforms.jadd b/src/main/jastadd/flatter/transforms/ServiceChannelTransforms.jadd
index 10253045a9b3bba5e52a4b28e56d500a5b6ca25a..9e877c6b270122dd15195414dc340524ad1acc64 100644
--- a/src/main/jastadd/flatter/transforms/ServiceChannelTransforms.jadd
+++ b/src/main/jastadd/flatter/transforms/ServiceChannelTransforms.jadd
@@ -7,6 +7,7 @@ aspect ServiceChannelTransforms {
     syn Page DinerosTransition.transformServiceElement() {
 
         Page res = new Page();
+        Map<String, PnObject> addedObjects = new HashMap<>();
         System.out.println("Transforming service transition: " + this.getId());
         ServiceTransitionInformation sti = this.getStaticTransitionInformation().asServiceTransitionInformation();
         res.setId(TemplateConstants.CHANNEL_SERVICE_PAGE_PREFIX + "-" + sti.getServiceName());
@@ -18,34 +19,35 @@ aspect ServiceChannelTransforms {
             clientMap.put(TemplateConstants.SERVICE_CAN_CALL_REF_PLACE + "-" + sti.getServiceName() + "-" + sc, petriNet().getPlaceById(clientChannel.getRequestPlaceId()));
             clientMap.put(TemplateConstants.SERVICE_CAN_RESP_REF_PLACE + "-" + sti.getServiceName() + "-" + sc, petriNet().getPlaceById(clientChannel.getRequestPlaceId()));
             PetriNet clientNet = ServiceTemplates.getServiceConnectionTemplate(sti.getServiceName() + "-" + sc);
-            TransformationUtils.includeTemplateInstance(res, petriNet(), clientNet, clientMap);
+            TransformationUtils.includeTemplateInstance(res, petriNet(), clientNet, clientMap, addedObjects);
             sc++;
         }
 
+        petriNet().flushAttrAndCollectionCache();
+
         // apply rule S3
         for(int i = 0; i < sti.getServerChannel().getCapacity(); i++){
-            Page instancePage = petriNet().getPlaceById(sti.getServerChannel().getRequestPlaceId()).ContainingPage();
             PetriNet serviceInterfaceNet = ServiceTemplates.getServiceServerInterfaceTemplate(sti.getServiceName() + "-" + i);
-            TransformationUtils.includeTemplateInstance(instancePage, petriNet(), serviceInterfaceNet);
+            TransformationUtils.includeTemplateInstance(res, petriNet(), serviceInterfaceNet, addedObjects);
 
             // apply rule S2
             int sc2 = 0;
             for(ServiceChannel clientChannel: sti.getClientChannels()){
                 Map<String, Node> multiplexerMap = new HashMap<>();
                 multiplexerMap.put(TemplateConstants.SERVICE_CALL_M_REF_PLACE +
-                "-" + sti.getServiceName() + "-" + sc2, petriNet().getPlaceById(TemplateConstants.SERVICE_CON_CLIENT_CALL_PLACE + "-" + sc2));
+                "-" + sti.getServiceName() + "-" + i + "-" + sc2, addedObjects.get(TemplateConstants.SERVICE_CON_CLIENT_CALL_PLACE + "-" + sti.getServiceName() + "-" + sc2).asNode());
                 multiplexerMap.put(TemplateConstants.SERVICE_RESP_M_REF_PLACE +
-                "-" + sti.getServiceName() + "-" + sc2, petriNet().getPlaceById(TemplateConstants.SERVICE_CON_CLIENT_RESP_PLACE + "-" + sc2));
+                "-" + sti.getServiceName() + "-" + i + "-" + sc2, addedObjects.get(TemplateConstants.SERVICE_CON_CLIENT_RESP_PLACE + "-" + sti.getServiceName() + "-" + sc2).asNode());
                 multiplexerMap.put(TemplateConstants.SERVICE_ACTIVE_M_REF_PLACE +
-                "-" + sti.getServiceName() + "-" + sc2, petriNet().getPlaceById(TemplateConstants.SERVICE_ACTIVE_PLACE + "-" + i));
+                "-" + sti.getServiceName() + "-" + i + "-" + sc2, addedObjects.get(TemplateConstants.SERVICE_ACTIVE_PLACE + "-" + sti.getServiceName() + "-" + i).asNode());
                 multiplexerMap.put(TemplateConstants.SERVICE_INACTIVE_M_REF_PLACE +
-                "-" + sti.getServiceName() + "-" + sc2, petriNet().getPlaceById(TemplateConstants.SERVICE_INACTIVE_PLACE + "-" + i));
+                "-" + sti.getServiceName() + "-" + i + "-" + sc2, addedObjects.get(TemplateConstants.SERVICE_INACTIVE_PLACE + "-" + sti.getServiceName() + "-" + i).asNode());
                 multiplexerMap.put(TemplateConstants.SERVICE_ENTRY_M_REF_PLACE +
-                "-" + sti.getServiceName() + "-" + sc2, petriNet().getPlaceById(sti.getServerChannel().getRequestPlaceId()));
+                "-" + sti.getServiceName() + "-" + i + "-" + sc2, petriNet().getPlaceById(sti.getServerChannel().getRequestPlaceId() + "-" + i + "-" + PnmlConstants.PAGE_SERVER_INSTANCE_SUFFIX));
                 multiplexerMap.put(TemplateConstants.SERVICE_EXIT_M_REF_PLACE +
-                "-" + sti.getServiceName() + "-" + sc2, petriNet().getPlaceById(sti.getServerChannel().getResponsePlaceId()));
+                "-" + sti.getServiceName() + "-" + i + "-" + sc2, petriNet().getPlaceById(sti.getServerChannel().getResponsePlaceId() + "-" + i + "-" + PnmlConstants.PAGE_SERVER_INSTANCE_SUFFIX));
                 PetriNet multiplexerNet = ServiceTemplates.getServiceMultiplexerTemplate(sti.getServiceName() + "-" + i + "-" + sc2);
-                TransformationUtils.includeTemplateInstance(res, petriNet(), multiplexerNet, multiplexerMap);
+                TransformationUtils.includeTemplateInstance(res, petriNet(), multiplexerNet, multiplexerMap, null);
                 sc2++;
             }
         }
diff --git a/src/main/jastadd/flatter/transforms/SignalTransforms.jadd b/src/main/jastadd/flatter/transforms/SignalTransforms.jadd
index 65f7f930f0ac6ea24331945e47e77e95f3f254ec..f5d7fe3f8590f920e75b3c7e26383f1333041f04 100644
--- a/src/main/jastadd/flatter/transforms/SignalTransforms.jadd
+++ b/src/main/jastadd/flatter/transforms/SignalTransforms.jadd
@@ -11,14 +11,14 @@ aspect SignalTransforms {
             PetriNet pubNet = SignalTemplates.getInputSignalTemplate(entry.getKey());
 
             if(Boolean.parseBoolean(entry.getValue())){
-                pubNet.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_TRUE + entry.getKey()).getInitialMarking().setText(1);
-                pubNet.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_FALSE + entry.getKey()).getInitialMarking().setText(0);
+                pubNet.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_TRUE + "-" + entry.getKey()).getInitialMarking().setText(1);
+                pubNet.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_FALSE + "-" + entry.getKey()).getInitialMarking().setText(0);
             } else {
-                pubNet.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_TRUE + entry.getKey()).getInitialMarking().setText(0);
-                pubNet.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_FALSE + entry.getKey()).getInitialMarking().setText(1);
+                pubNet.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_TRUE + "-" + entry.getKey()).getInitialMarking().setText(0);
+                pubNet.getPlaceById(TemplateConstants.INPUT_SIGNAL_PLACE_FALSE + "-" + entry.getKey()).getInitialMarking().setText(1);
             }
 
-            TransformationUtils.includeTemplateInstance(signalValuePage, this, pubNet, "signal", "signal");
+            TransformationUtils.includeTemplateInstance(signalValuePage, this, pubNet, "signal", "signal", null);
         }
         return this;
     }
@@ -36,7 +36,12 @@ aspect SignalTransforms {
             pdi.getName().setText(pdi.getId());
             RefTransition rt = PrimitiveTemplates.getReferenceTransition(t);
             rt.setId("PD-REF-" + i + "-" + t.getId());
-            rt.getName().setText(rt.getId());
+            rt.setRef(t);
+            res.addObject(pdi);
+            res.addObject(rt);
+
+            TransformationUtils.createAndIncludeArc(res, pdi.getId() + "-to-" + rt.getId(), pdi, rt);
+            TransformationUtils.createAndIncludeArc(res, rt.getId() + "-to-" + pdi.getId(), rt, pdi);
 
             int j = 0;
             for(Literal l : dj.getLiterals()){
@@ -47,17 +52,18 @@ aspect SignalTransforms {
                 // create elements for rule I2 & I3
                 RefTransition toTrueRt = PrimitiveTemplates.getReferenceTransition(toTrue);
                 toTrueRt.setId(toTrue.getId() + "REF-" + i + "-" + j);
-                toTrueRt.getName().setText(toTrueRt.getId());
                 res.addObject(toTrueRt);
                 RefTransition toFalseRt = PrimitiveTemplates.getReferenceTransition(toFalse);
                 toFalseRt.setId(toFalse.getId() + "REF-" + i + "-" + j);
-                toFalseRt.getName().setText(toFalseRt.getId());
                 res.addObject(toFalseRt);
                 RefPlace djRefPlace = PrimitiveTemplates.getReferencePlace(pdi);
+                djRefPlace.setId("DJREF-" + i + "-" + j);
+                djRefPlace.getName().setText(djRefPlace.getId());
+                res.addObject(djRefPlace);
 
                 // apply rule I2
                 if(l.isPositiveLiteral()){
-                    TransformationUtils.createAndIncludeArc(res, toFalse.getId() + "-to-" + djRefPlace.getId(), toFalseRt, djRefPlace);
+                    TransformationUtils.createAndIncludeArc(res, toFalseRt.getId() + "-to-" + djRefPlace.getId(), toFalseRt, djRefPlace);
                     TransformationUtils.createAndIncludeArc(res, djRefPlace.getId() + "-to-" + toTrueRt.getId(), djRefPlace, toTrueRt);
 
                     if(Boolean.parseBoolean(net.getInputSignalDefinition().get(l.getName()))){
diff --git a/src/main/jastadd/flatter/transforms/TopicTransforms.jadd b/src/main/jastadd/flatter/transforms/TopicTransforms.jadd
index 7fad60e2b29f92d81b6a4c74bab6af4ef86a2a3b..e1750d19df52d93342a0b013a46409e67ad3a021 100644
--- a/src/main/jastadd/flatter/transforms/TopicTransforms.jadd
+++ b/src/main/jastadd/flatter/transforms/TopicTransforms.jadd
@@ -49,7 +49,7 @@ aspect TopicTransforms {
                 pubMap.put(TemplateConstants.PLACE_TOPIC_PUBLISHER_REF + "-" + tti.getTopic() + "-" + i, petriNet().getPlaceById(pp.getPlaceId()));
                 pubMap.put(TemplateConstants.PLACE_TOPIC_PUBLISHER_CHANNEL_REF + "-" + tti.getTopic() + "-" + i, pTopic);
                 PetriNet pubNet = TopicTemplates.getTopicPublisherPetriNet(tti.getTopic() + "-" + i, pp.getLimit());
-                TransformationUtils.includeTemplateInstance(res, petriNet(), pubNet, pubMap);
+                TransformationUtils.includeTemplateInstance(res, petriNet(), pubNet, pubMap, null);
                 i++;
             }
 
@@ -73,7 +73,7 @@ aspect TopicTransforms {
                 dispatchMap.put(TemplateConstants.TRANSITION_TOPIC_DISPATCHER_CHANNEL_REF + "-" + tti.getTopic() + "-" + j, tTopic);
                 // TODO: make capacity configurable
                 PetriNet dispatchNet = TopicTemplates.getTopicDispatcherPetriNet(tti.getTopic() + "-" + j, 16);
-                Map<String, PnObject> addedObjects = TransformationUtils.includeTemplateInstance(res, petriNet(), dispatchNet, dispatchMap);
+                Map<String, PnObject> addedObjects = TransformationUtils.includeTemplateInstance(res, petriNet(), dispatchNet, dispatchMap, null);
 
                 // apply rule T4
                 int k = 0;
@@ -83,7 +83,7 @@ aspect TopicTransforms {
                     subMap.put(TemplateConstants.TRANSITION_TOPIC_CALLBACK_INPUT_REF + "-" + tti.getTopic() + "-" + j + "-" + k,
                             addedObjects.get(TemplateConstants.DISPATCHER_OUTPUT_TRANSITION + "-" + tti.getTopic() + "-" + j).asNode());
                     PetriNet callbackNet = TopicTemplates.getTopicCallbackQueuePetriNet(tti.getTopic() + "-" + j + "-" + k, sp.getLimit());
-                    TransformationUtils.includeTemplateInstance(res, petriNet(), callbackNet, subMap);
+                    TransformationUtils.includeTemplateInstance(res, petriNet(), callbackNet, subMap, null);
                     k++;
                 }
                 j++;
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 644805e618a8cb4ef04afc3df4c29cb63cb79997..c3dd544ba76edc84ec1107e6638e953d73db6369 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
@@ -1,13 +1,11 @@
 package de.tudresden.inf.st.pnml.flatter;
 
-import de.tudresden.inf.st.jastadd.dumpAst.ast.DumpBuilder;
-import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper;
-import de.tudresden.inf.st.jastadd.dumpAst.ast.SkinParamBooleanSetting;
 import de.tudresden.inf.st.pnml.base.constants.PnmlConstants;
 import de.tudresden.inf.st.pnml.flatter.config.ConfigReader;
 import de.tudresden.inf.st.pnml.flatter.tina.KtzioProxy;
 import de.tudresden.inf.st.pnml.flatter.tina.SiftProxy;
 import de.tudresden.inf.st.pnml.flatter.tina.TinaProxy;
+import de.tudresden.inf.st.pnml.flatter.transform.ReferenceFlatter;
 import de.tudresden.inf.st.pnml.flatter.transform.TransformationUtils;
 import de.tudresden.inf.st.pnml.jastadd.model.*;
 import de.tudresden.inf.st.pnml.jastadd.model.PnmlParser;
@@ -16,33 +14,29 @@ import fr.lip6.move.pnml.framework.utils.exception.InvalidIDException;
 import de.tudresden.inf.st.pnml.flatter.tina.NdrioProxy;
 import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
 
-import java.awt.*;
 import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.file.Paths;
-import java.util.HashSet;
 import java.util.UUID;
 
 public class Main {
 
-    public static void main(String[] args) throws InvalidIDException {
+    public static void main(String[] args) throws InvalidIDException, IOException, InterruptedException {
 
         String configPath = (args.length > 1) ? args[1] : null;
         String pnmlPath = (args.length > 0) ? args[0] : null;
-/*
+
         if (pnmlPath == null || configPath == null) {
             System.out.println("No model found on given input path.");
             return;
-        }*/
+        }
 
         // parse the global not flatted petri net
-        pnmlPath = "/home/sebastian/git/dineros/dineros-v2/dineros/pnml-relast-base/src/main/resources/nets/TestNet1.pnml";
-        configPath = "src/main/config/siftConfig.json";
+        //pnmlPath = "/home/sebastian/git/dineros/dineros-v2/dineros/pnml-relast-base/src/main/resources/nets/TestNet3.pnml";
+        //configPath = "src/main/config/siftConfig.json";
         PetriNet petriNet = PnmlParser.parsePnml(pnmlPath).get(0);
 
         // [STAGE 1] Resolve service prototype pages
         TransformationUtils.transformPrototypePagesRecursive(petriNet.getPage(0), null, petriNet);
-        petriNet.flushTreeCache();
+        petriNet.flushAttrAndCollectionCache();
 
         // [STAGE 2] Transform topic transitions
         for(DinerosTransition dt : petriNet.allDinerosTransitions()){
@@ -57,6 +51,8 @@ public class Main {
             }
         }
 
+        petriNet.flushTreeCache();
+
         // [STAGE 3] Transform service transitions
         for(DinerosTransition dt : petriNet.allDinerosTransitions()){
             if(dt.canTransformServiceTransition()){
@@ -85,17 +81,8 @@ public class Main {
 
         petriNet.flushTreeCache();
 
-     //   DumpBuilder builder = Dumper.read(petriNet).skinParam(SkinParamBooleanSetting.Shadowing, false);
-     //   builder.dumpAsPNG(Paths.get("net.png"));
-     //   builder.dumpAsSVG(Paths.get("net.svg"));
-
-        // read config for analyzer from file
-    /*  ConfigReader cr = new ConfigReader(configPath);
-        String[] tinaConfig = cr.getTinaConfigParams();
-        String[] siftConfig = cr.getSiftConfigParams();*/
-
-        // make sure that we have a valid marking
-        System.out.println("[FLATTER] Checking marking.");
+        // [STAGE 5] make sure that we have a valid marking
+        System.out.println("[FLATTENER] Checking marking.");
         for (Place p : petriNet.allPlaces()) {
             if (p.getInitialMarking() == null) {
                 System.out.println("[FLATTER] Found NULL-marking. Falling back to 0 ...");
@@ -105,52 +92,62 @@ public class Main {
             }
         }
 
-        /*
-        // remove references / pages
-        System.out.println("[FLATTER] Breaking references and pages.");
-        ReferenceFlatter.flatReferencesAndPages(petriNet);
-*/
-        // export flatted net to pnml
-        printNet(petriNet, true, false);
-        System.out.println("[FLATTER] Exporting to pnml.");
+        // [STAGE 6] remove references / pages
+        System.out.println("[FLATTENER] Breaking references and pages.");
+        for(Page p : petriNet.allPages()){
+            if(p.getId().equals("top")){
+                ReferenceFlatter.flatReferencesAndPages(petriNet,p);
+                break;
+            }
+        }
+
+        // [STAGE 7] export flatted net to pnml
+        // printNet(petriNet, true, false);
+        System.out.println("[FLATTENER] Exporting to pnml.");
         String exportId = UUID.randomUUID().toString();
         String pnmlExportPath = PnmlExporter.serializeToPnmlFile(petriNet, "flatted-" + exportId);
 
         //  convert and add inhibitor arcs
-      /*  System.out.println("[FLATTER] Converting to net format.");
+        System.out.println("[FLATTENER] Converting to net format.");
         NdrioProxy ndrioProxy = new NdrioProxy();
         String homeDirectory = System.getProperty("user.dir");
         String fid = UUID.randomUUID().toString();
-        String ndrioTargetPath = homeDirectory + "/temp/net/" + fid + "flatted-" + exportId + ".net";*/
+        String ndrioTargetPath = homeDirectory + "/temp/net/" + fid + "flatted-" + exportId + ".net";
 
         // resolve inhibitor arcs
-    /*    System.out.println("[FLATTER] Including inhibitor arcs into net format.");
+        System.out.println("[FLATTENER] Including inhibitor arcs into net format.");
         String inhibitorTargetPath = homeDirectory + "/temp/net/" + fid + "flatted-inh-" + exportId + ".net";
         ndrioProxy.pnml2net(pnmlExportPath, ndrioTargetPath);
-        ndrioProxy.includeInhibitorArcs(petriNet, ndrioTargetPath, inhibitorTargetPath);*/
+        ndrioProxy.includeInhibitorArcs(petriNet, ndrioTargetPath, inhibitorTargetPath);
+
+        // [STAGE 8] Analyze
+        // read config for analyzer from file
+        ConfigReader cr = new ConfigReader(configPath);
+        String[] tinaConfig = cr.getTinaConfigParams();
+        String[] siftConfig = cr.getSiftConfigParams();
 
         // insert into tina
-      /*  if (tinaConfig.length > 1) {
-            System.out.println("[FLATTER] Inserting into tina.");
+        if (tinaConfig.length > 1) {
+            System.out.println("[FLATTENER] Inserting into tina.");
             TinaProxy tinaProxy = new TinaProxy();
             String tinaTargetPath = homeDirectory + "/temp/tina/" + "tina-result-" + exportId + ".txt";
             tinaProxy.analyzePetriNet(inhibitorTargetPath, tinaTargetPath, tinaConfig);
-        }*/
+        }
 
         // insert into sift
-     /*   if (siftConfig.length > 1) {
-            System.out.println("[FLATTER] Inserting into sift.");
+        if (siftConfig.length > 1) {
+            System.out.println("[FLATTENER] Inserting into sift.");
             SiftProxy siftProxy = new SiftProxy();
             String siftTargetPath = homeDirectory + "/temp/sift/" + "sift-result-" + exportId + ".ktz";
             siftProxy.analyzePetriNet(inhibitorTargetPath, siftTargetPath, siftConfig);
 
-            System.out.println("[FLATTER] Converting with ktzio.");
+            System.out.println("[FLATTENER] Converting with ktzio.");
             KtzioProxy ktzioProxy = new KtzioProxy();
             String ktzioPath = homeDirectory + "/temp/sift/" + "sift-result-converted-" + exportId + ".txt";
             ktzioProxy.convertBinaryToText(siftTargetPath, ktzioPath);
-        }*/
+        }
 
-        System.out.println("Finished.");
+        System.out.println("[FLATTENER] Finished.");
 
     }
 
@@ -202,13 +199,13 @@ public class Main {
         System.out.println("----------------- REF PLACES -----------------");
 
         for (RefPlace rp : petriNet.allRefPlaces()) {
-            System.out.println("--- RefPlace: " + rp.getId());
+            System.out.println("--- RefPlace: " + rp.getId() + " >> " + rp.getRef().getId());
         }
 
         System.out.println("----------------- REF TRANSITIONS -----------------");
 
         for (RefTransition rt : petriNet.allRefTransitions()) {
-            System.out.println("--- RefTransition: " + rt.getId());
+            System.out.println("--- RefTransition: " + rt.getId() + " >> " + rt.getRef().getId());
         }
 
         if (withArcs) {
diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TemplateConstants.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TemplateConstants.java
index 707903472508fca53ad0afc1cdda90318af8b2fc..ebe22c908839622b3362a69f6d3117c9345ae45d 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TemplateConstants.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/template/TemplateConstants.java
@@ -38,14 +38,14 @@ public final class TemplateConstants {
     public static final String CHANNEL_TOPIC_PLACE = "ChannelConnectorPlace";
     public static final String CHANNEL_TOPIC_TRANSITION = "ChannelConnectorTransition";
     public static final String CHANNEL_TOPIC_PAGE_PREFIX = "ChannelTopicPage";
-    public static final String CHANNEL_SERVICE_PAGE_PREFIX = "SIGNAL-PAGE-";
+    public static final String CHANNEL_SERVICE_PAGE_PREFIX = "CHANNEL-SERVICE-PAGE-";
 
     // signal elements
     public static final String INPUT_SIGNAL_PLACE_TRUE = "InputSignalTruePlace";
     public static final String INPUT_SIGNAL_PLACE_FALSE = "InputSignalFalsePlace";
     public static final String INPUT_SIGNAL_TRANSITION_TO_TRUE = "InputSignalToTrueTransition";
     public static final String INPUT_SIGNAL_TRANSITION_TO_FALSE = "InputSignalToFalseTransition";
-    public static final String INPUT_SIGNAL_PAGE_PREFIX = "InputSignalTruePlace";
+    public static final String INPUT_SIGNAL_PAGE_PREFIX = "InputSignalPage";
 
     // services
     // S3
diff --git a/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ReferenceFlatter.java b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ReferenceFlatter.java
index 4539aadebf850e725b2590e8936d9fcbfc3a5527..297b7b857d8663619ed0f2b20779db17b8c2ab64 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ReferenceFlatter.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/flatter/transform/ReferenceFlatter.java
@@ -25,12 +25,13 @@ public class ReferenceFlatter {
         }
     }
 
-    public static void flatReferencesAndPages(PetriNet petriNet){
+    public static void flatReferencesAndPages(PetriNet petriNet, Page page){
 
-        excludeAllPages(petriNet);
+        excludeAllPages(petriNet, page);
         resolvePlaceReferences(petriNet);
         resolveTransitionReferences(petriNet);
         petriNet.flushTreeCache();
+        petriNet.flushAttrAndCollectionCache();
     }
 
     private static void resolvePlaceReferences(PetriNet petriNet){
@@ -66,7 +67,6 @@ public class ReferenceFlatter {
         for(PlaceNode placeNode : nodesToDelete){
             placeNode.removeSelf();
         }
-        // petriNet.flushTreeCache();
     }
 
     private static void resolveTransitionReferences(PetriNet petriNet){
@@ -102,14 +102,13 @@ public class ReferenceFlatter {
         for(TransitionNode transitionNode : nodesToDelete){
             transitionNode.removeSelf();
         }
-        //  petriNet.flushTreeCache();
     }
 
     /**
      * Excludes all but the top level page.
      * @param petriNet
      */
-    private static void excludeAllPages(PetriNet petriNet){
+    private static void excludeAllPages(PetriNet petriNet, Page targetPage){
 
         Page topLevelPage = null;
 
@@ -122,17 +121,14 @@ public class ReferenceFlatter {
         for (PnObject pnObject : petriNet.allObjects()){
             assert topLevelPage != null;
             if(pnObject.ContainingPage() != null && !pnObject.isPageNode()){
-                // System.out.println("Moving: " + pnObject.getId());
                 topLevelPage.addObject(pnObject);
             }
         }
 
         for (Page p : petriNet.allPages()){
-            if(p.ContainingPage() != null){
+            if(!p.getId().equals(targetPage.getId())){
                 p.removeSelf();
             }
         }
-
-        //      petriNet.flushTreeCache();
     }
 }
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 ca234416f4238a69371498a1034c501dff0e845e..9effaf336c68a1d9db1e0cd1d5a9b61606901537 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
@@ -40,23 +40,25 @@ public class TransformationUtils {
         return a;
     }
 
-    public static Map<String, PnObject> includeTemplateInstance(Page page, PetriNet petriNet, PetriNet templateInstance, Map<String, Node> refs) {
-        return includeTemplateInstance(page, petriNet, templateInstance, "channel", "channel", refs);
+    public static Map<String, PnObject> includeTemplateInstance(Page page, PetriNet petriNet, PetriNet templateInstance, Map<String, Node> refs, Map<String, PnObject> addedObjects) {
+        return includeTemplateInstance(page, petriNet, templateInstance, "channel", "channel", refs, addedObjects);
     }
 
-    public static Map<String, PnObject> includeTemplateInstance(Page page, PetriNet petriNet, PetriNet templateInstance) {
+    public static Map<String, PnObject> includeTemplateInstance(Page page, PetriNet petriNet, PetriNet templateInstance, Map<String, PnObject> addedObjects) {
         Map<String, Node> refs = new HashMap<>();
-        return includeTemplateInstance(page, petriNet, templateInstance, "channel", "channel", refs);
+        return includeTemplateInstance(page, petriNet, templateInstance, "channel", "channel", refs, addedObjects);
     }
 
-    public static Map<String, PnObject> includeTemplateInstance(Page page, PetriNet petriNet, PetriNet templateInstance, String subnet, String node) {
+    public static Map<String, PnObject> includeTemplateInstance(Page page, PetriNet petriNet, PetriNet templateInstance, String subnet, String node, Map<String, PnObject> addedObjects) {
         Map<String, Node> refs = new HashMap<>();
-        return includeTemplateInstance(page, petriNet, templateInstance, subnet, node, refs);
+        return includeTemplateInstance(page, petriNet, templateInstance, subnet, node, refs, addedObjects);
     }
 
-    public static Map<String, PnObject> includeTemplateInstance(Page page, PetriNet petriNet, PetriNet templateInstance, String subnet, String node, Map<String, Node> refs) {
+    public static Map<String, PnObject> includeTemplateInstance(Page page, PetriNet petriNet, PetriNet templateInstance, String subnet, String node, Map<String, Node> refs, Map<String, PnObject> addedObjects) {
 
-        Map<String, PnObject> addedObjects = new HashMap<>();
+        if(addedObjects == null){
+            addedObjects = new HashMap<>();
+        }
 
         for(RefTransition rt : templateInstance.allRefTransitions()){
             if(refs.containsKey(rt.getId())){
diff --git a/src/main/resources/templates/ServiceMultiPlexerTemplate.pnml b/src/main/resources/templates/ServiceMultiplexerTemplate.pnml
similarity index 98%
rename from src/main/resources/templates/ServiceMultiPlexerTemplate.pnml
rename to src/main/resources/templates/ServiceMultiplexerTemplate.pnml
index b928541abb666078c711004c923a2628ed624234..48a7de52e0125f3f330410e6d32655b518877cae 100644
--- a/src/main/resources/templates/ServiceMultiPlexerTemplate.pnml
+++ b/src/main/resources/templates/ServiceMultiplexerTemplate.pnml
@@ -162,13 +162,13 @@
                 </graphics>
             </referencePlace>
 
-            <arc id="arc-1" source="ServiceCallMultiCallRefPlace" target="ServiceCallMultiInTransition">
+            <arc id="arc-1" source="ServiceCallMultiCallRefPlace" target="ServiceCallMultiEntryTransition">
             </arc>
             <arc id="arc-2" source="ServiceCallMultiEntryTransition" target="ServiceCallMultiActiveRefPlace">
             </arc>
-            <arc id="arc-3" source="ServiceCallMultiActiveRefPlace" target="ServiceCallMultiExitTransition">
+            <arc id="arc-3" source="ServiceCallMultiEntryTransition" target="ServiceCallMultiFlagPlace">
             </arc>
-            <arc id="arc-4" source="ServiceCallMultiEntryTransition" target="ServiceCallMultiFlagPlace">
+            <arc id="arc-4" source="ServiceCallMultiActiveRefPlace" target="ServiceCallMultiExitTransition">
             </arc>
             <arc id="arc-5" source="ServiceCallMultiFlagPlace" target="ServiceCallMultiExitTransition">
             </arc>