diff --git a/src/main/jastadd/gen/Package.jadd b/src/main/jastadd/gen/Package.jadd
index 25c6841c07db435a4f6ea113c0eb932d09926843..d67a552c8c5d5d474f775a59d50c24f278f1dd7b 100644
--- a/src/main/jastadd/gen/Package.jadd
+++ b/src/main/jastadd/gen/Package.jadd
@@ -2,37 +2,51 @@ aspect PackageGen {
 
     syn String GradleFile.generateSettingsGradle(String rootProjectName){
 
-        return de.tudresden.inf.st.pnml.gen.generators.GradleGenUtil.generateGradleSettings(rootProjectName);
+        String res = de.tudresden.inf.st.pnml.gen.generators.GradleGenUtil.generateGradleSettings(rootProjectName);
+        this.setFileContent(res);
+        return res;
     }
 
     syn String GradleFile.generateBuildGradle(String mainClass, String archiveBaseName, String version, String pnmlRelastersion){
 
-        return de.tudresden.inf.st.pnml.gen.generators.GradleGenUtil.generateBuildGradle(mainClass, archiveBaseName, version, pnmlRelastersion);
+        String res = de.tudresden.inf.st.pnml.gen.generators.GradleGenUtil.generateBuildGradle(mainClass, archiveBaseName, version, pnmlRelastersion);
+        this.setFileContent(res);
+        return res;
     }
 
     syn String MainFile.generate(List<PetriNet> petriNetList, List<String> petriNetFiles, String rosHost, String rosMasterUri, String mqttHost){
 
-        return de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateMain(petriNetList, petriNetFiles, rosHost, rosMasterUri, mqttHost, dinerosPackage().getNamespace());
+        String res = de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateMain(petriNetList, petriNetFiles, rosHost, rosMasterUri, mqttHost, dinerosPackage().getNamespace());
+        this.setFileContent(res);
+        return res;
     }
 
     syn String SubscriberFile.generate(){
 
-        return de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateSubscriberClass(dinerosPackage().getNamespace(), getName());
+        String res = de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateSubscriberClass(dinerosPackage().getNamespace(), getName());
+        this.setFileContent(res);
+        return res;
     }
 
     syn String NodeFile.generate(){
 
-        return de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateNodeClass(dinerosPackage().getNamespace(), getName());
+        String res = de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateNodeClass(dinerosPackage().getNamespace(), getName());
+        this.setFileContent(res);
+        return res;
     }
 
     syn String ServerFile.generate(){
 
-        return de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateServerClass(dinerosPackage().getNamespace(), getName());
+        String res = de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateServerClass(dinerosPackage().getNamespace(), getName());
+        this.setFileContent(res);
+        return res;
     }
 
     syn String MapperFile.generate(List<PetriNet> petriNets){
 
-        return de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateMapperClass(dinerosPackage().getNamespace(), petriNets);
+        String res = de.tudresden.inf.st.pnml.gen.generators.JavaClassGenUtil.generateMapperClass(dinerosPackage().getNamespace(), petriNets);
+        this.setFileContent(res);
+        return res;
     }
 
     syn String DinerosPackage.generateTokenClass(){
diff --git a/src/main/jastadd/gen/Package.relast b/src/main/jastadd/gen/Package.relast
index 8f04aff91d9052601cdaf8172f09a09efb6b2f68..824b85cf43ef192b6d9986bf86a71010cf7bc387 100644
--- a/src/main/jastadd/gen/Package.relast
+++ b/src/main/jastadd/gen/Package.relast
@@ -4,8 +4,9 @@ abstract PackageElement;
 
 abstract PackageFile:PackageElement ::= <Name:String> <FileID:String> ;
 StaticFile:PackageFile ;
+PnmlFile:StaticFile;
 
-abstract TemplateFile:PackageFile ;
+abstract TemplateFile:PackageFile ::= <FileContent:String> ;
 GradleFile:TemplateFile ;
 
 abstract JavaFile:TemplateFile ;
diff --git a/src/main/jastadd/gen/PackageNav.jadd b/src/main/jastadd/gen/PackageNav.jadd
index 7fadba9f2b31f7ce57a48f2218fe9e56dfad8268..7df5ef1b52b75237474e8e6fb2ba5aa414d0b30d 100644
--- a/src/main/jastadd/gen/PackageNav.jadd
+++ b/src/main/jastadd/gen/PackageNav.jadd
@@ -11,6 +11,15 @@ aspect PackageNav {
 
         // -----
 
+        syn boolean PackageFile.isPnmlFile() = false;
+        eq PnmlFile.isPnmlFile() = true;
+
+        syn boolean PackageFile.isTemplateFile() = false;
+        eq TemplateFile.isTemplateFile() = true;
+
+        syn TemplateFile PackageFile.asTemplateFile() = null;
+        eq TemplateFile.asTemplateFile() = this;
+
         syn boolean PackageFile.isNodeFile() = false;
         eq NodeFile.isNodeFile() = true;
 
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/Main.java b/src/main/java/de/tudresden/inf/st/pnml/gen/Main.java
index fc87537452a89cbd7637ff1383d319d70216f14e..7887153754029648b7aca7a75c1e9a4a2623f0fc 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/gen/Main.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/Main.java
@@ -10,7 +10,6 @@ import de.tudresden.inf.st.pnml.jastadd.model.PackageDirectory;
 
 import java.io.IOException;
 import java.nio.file.Files;
-import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
 
@@ -18,6 +17,8 @@ public class Main {
 
     public static void main(java.lang.String[] args) throws IOException {
 
+        // TODO: Configuration
+
         // PackageStructureBuilder.build("/home/sebastian/Desktop", "test", "test", null);
         // GradleFile gf = new GradleFile();
         // gf.setName("TestFile");
@@ -43,7 +44,6 @@ public class Main {
         String engineVersion = "0.1";
         String configFile = "/home/sebastian/Desktop/EngineConfig.json";
 
-
         DinerosPackage dp = new DinerosPackage();
         dp.setName(packageName);
         dp.setRootName(rootName);
@@ -55,7 +55,8 @@ public class Main {
         ObjectMapper objectMapper = new ObjectMapper();
         List<NetInfo> petriNetFilePaths = objectMapper.readValue(configString, new TypeReference<List<NetInfo>>(){});
 
-        PackageStructureBuilder.build("/home/sebastian/Desktop", dp, "sample-pkg", petriNetFilePaths, engineVersion);
+        PackageStructureBuilder.build("/home/sebastian/Desktop", dp, petriNetFilePaths, engineVersion
+                , "localhost", "http://localhost:11311", "localhost");
 
     }
 }
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/builders/PackageStructureBuilder.java b/src/main/java/de/tudresden/inf/st/pnml/gen/builders/PackageStructureBuilder.java
index a1cb13846ff8e2c7dad5d120e3f6c43073f07ddf..1b2d8d860cffa8edbc76b91324fd5d3116c01b55 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/gen/builders/PackageStructureBuilder.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/builders/PackageStructureBuilder.java
@@ -4,7 +4,8 @@ import de.tudresden.inf.st.pnml.base.constants.PnmlConstants;
 import de.tudresden.inf.st.pnml.gen.json.NetInfo;
 import de.tudresden.inf.st.pnml.jastadd.model.*;
 
-import java.io.IOException;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -15,7 +16,8 @@ public class PackageStructureBuilder {
 
     private static final String FILE_PATH = "../pnml-relast-pkg-gen/src/main/resources/static/";
 
-    public static boolean build(String targetPath, DinerosPackage dinerosPackage, String javaBasePackageName, List<NetInfo> petriNetFilePaths, String engineVersion) {
+    public static boolean build(String targetPath, DinerosPackage dinerosPackage, List<NetInfo> petriNetFilePaths, String engineVersion
+                               , String rosHost, String rosMasterUri, String mqttHost) {
 
         String packagePath = targetPath + "/" + dinerosPackage.getRootName();
 
@@ -25,6 +27,12 @@ public class PackageStructureBuilder {
             nets.add(PnmlParser.parsePnml(n.getNet()).get(0));
         }
 
+        List<String> stringNetPaths = new ArrayList<>();
+
+        for(NetInfo n : petriNetFilePaths){
+            stringNetPaths.add(n.getNet());
+        }
+
         try {
             Files.createDirectories(Paths.get(packagePath));
 
@@ -33,18 +41,46 @@ public class PackageStructureBuilder {
             buildStaticFilesIntoDinerosPackage(dinerosPackage, engineVersion);
 
             includeDirectoriesRecursive(dinerosPackage.getDir(0), packagePath);
-            includeTemplateFiles(dinerosPackage, nets, javaBasePackageName, engineVersion);
+            includeTemplateFiles(dinerosPackage, nets, engineVersion, stringNetPaths, rosHost, rosMasterUri, mqttHost);
             includeFilesInPackageRecursive(dinerosPackage.getDir(0), packagePath);
+            includePnmlFiles(dinerosPackage, petriNetFilePaths, packagePath);
+            includeTokenClass(dinerosPackage, packagePath);
 
-            // TODO: include pnml files
-
-            // TODO: include token class
+            insertStringsAsFilesRecursive(dinerosPackage.getDir(0), packagePath);
 
         } catch (IOException e) {
             System.out.println(e.getMessage() + " caused by: " + e.getCause());
+            return false;
+        }
+
+        return true;
+    }
+
+    /////////////////////////////////////
+    // STRING TO FILE ///////////////////
+    /////////////////////////////////////
+
+    private static void insertStringsAsFilesRecursive(PackageDirectory packageDirectory, String packagePath) {
+
+        for (PackageFile pf : packageDirectory.getFileList()){
+            if(pf.isTemplateFile()) {
+                writeToFile(packagePath + "/" + pf.getName(), pf.asTemplateFile().getFileContent());
+            }
+        }
+
+        for (PackageDirectory d : packageDirectory.getDirList()) {
+            insertStringsAsFilesRecursive(d, packagePath + "/" + packageDirectory.getName());
         }
+    }
+
+    private static void writeToFile(String path, String content){
 
-        return false;
+        try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), StandardCharsets.UTF_8))) {
+            writer.write(content);
+        }
+        catch (IOException ex) {
+            System.out.println("ERROR: " + ex.getMessage());
+        }
     }
 
     /////////////////////////////////////
@@ -122,6 +158,15 @@ public class PackageStructureBuilder {
                 tokenFile.setFileID(UUID.randomUUID().toString());
                 pd.addFile(tokenFile);
             }
+
+            if(pd.getName().equals("nets")){
+                for(int i = 0; i < nets.size(); i++){
+                    PnmlFile pnmlFile = new PnmlFile();
+                    pnmlFile.setName("PetriNet-" + i + ".pnml");
+                    pnmlFile.setFileID(UUID.randomUUID().toString());
+                    pd.addFile(pnmlFile);
+                }
+            }
         }
     }
 
@@ -259,8 +304,44 @@ public class PackageStructureBuilder {
     // TREE TO FILE TREE ////////////////
     /////////////////////////////////////
 
-    // TODO: javaBasePackageName
-    private static void includeTemplateFiles(DinerosPackage dinerosPackage, List<PetriNet> nets, String javaBasePackageName, String engineVersion) {
+    private static void includeTokenClass(DinerosPackage dinerosPackage, String packagePath){
+
+        for (PackageFile pf : dinerosPackage.allPackageFiles()) {
+            if(pf.isTokenFile()){
+                String tokenClass = dinerosPackage.generateTokenClass();
+
+                try (Writer writer = new BufferedWriter(new OutputStreamWriter(
+                        new FileOutputStream(packagePath + "/src/main/java/tudresden/inf/st/pnml/" +
+                                dinerosPackage.getNamespace()), StandardCharsets.UTF_8))) {
+                    writer.write(tokenClass);
+                }
+                catch (IOException ex) {
+                    System.out.println("ERROR: " + ex.getMessage());
+                }
+            }
+        }
+    }
+
+    private static void includePnmlFiles(DinerosPackage dinerosPackage, List<NetInfo>netPaths, String packagePath) throws IOException {
+
+        Set<String> visitedPackageFileIDs = new HashSet<>();
+
+        for (int i = 0; i < netPaths.size(); i++) {
+            for (PackageFile pf : dinerosPackage.allPackageFiles()) {
+                if (pf.isPnmlFile() && !visitedPackageFileIDs.contains(pf.getFileID())) {
+                    visitedPackageFileIDs.add(pf.getFileID());
+                    pf.setName("PetriNet-" + i + ".pnml");
+                    Path copied = Paths.get(packagePath + "/src/main/resources/nets/" + pf.getName());
+                    Path originalPath = Paths.get(netPaths.get(i).getNet());
+                    Files.copy(originalPath, copied, StandardCopyOption.REPLACE_EXISTING);
+                    System.out.println("Copy PNML:" + originalPath + " --> " + copied);
+                }
+            }
+        }
+    }
+
+    private static void includeTemplateFiles(DinerosPackage dinerosPackage, List<PetriNet> nets, String engineVersion,
+                                             List<String> petriNetFiles, String rosHost, String rosMasterUri, String mqttHost) {
 
         Set<String> visitedPackageFileIDs = new HashSet<>();
         Map<String, Integer> subscriberCountMap = initSubscriberCountMap(nets);
@@ -270,6 +351,10 @@ public class PackageStructureBuilder {
             if (pf.isMapperFile()) {
                 pf.asMapperFile().generate(nets);
             }
+
+            if(pf.isMainFile()){
+                pf.asMainFile().generate(nets, petriNetFiles, rosHost, rosMasterUri, mqttHost);
+            }
         }
 
         for (int i = 0; i < nets.size(); i++) {
@@ -329,13 +414,13 @@ public class PackageStructureBuilder {
 
         Map<String, Integer> countMap = new HashMap<>();
 
-        for (int i = 0; i < nets.size(); i++) {
-            for (Transition t : nets.get(i).allTransitions()) {
+        for (PetriNet net : nets) {
+            for (Transition t : net.allTransitions()) {
 
                 String transitionType = t.asInputSignalTransition().getStaticTransitionInformation().getType();
 
                 if (transitionType.equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_OUT)) {
-                    countMap.put(nets.get(i).getId(), 1);
+                    countMap.put(net.getId(), 1);
                 }
             }
         }
@@ -346,14 +431,14 @@ public class PackageStructureBuilder {
 
         Map<String, Integer> countMap = new HashMap<>();
 
-        for (int i = 0; i < nets.size(); i++) {
-            for (Transition t : nets.get(i).allTransitions()) {
+        for (PetriNet net : nets) {
+            for (Transition t : net.allTransitions()) {
 
                 String transitionType = t.asInputSignalTransition().getStaticTransitionInformation().getType();
 
                 if (transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_IN)
                         || transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_IN)) {
-                    countMap.put(nets.get(i).getId(), 1);
+                    countMap.put(net.getId(), 1);
                 }
             }
         }
@@ -368,7 +453,6 @@ public class PackageStructureBuilder {
 
         if (packageDirectory.getNumDir() == 0) {
             Files.createDirectories(Paths.get(packagePath + "/" + packageDirectory.getName()));
-            return;
         }
     }
 
@@ -383,7 +467,7 @@ public class PackageStructureBuilder {
                 if (pf.isStaticFile()) {
 
                     Path copied = Paths.get(packagePath + "/" + packageDirectory.getName() + "/" + pf.getName());
-                    Path originalPath = null;
+                    Path originalPath;
 
                     if (pf.getName().contains(".java")) {
                         originalPath = Paths.get(FILE_PATH + "/" + pf.getName().split("\\.")[0]);
@@ -395,7 +479,6 @@ public class PackageStructureBuilder {
                     System.out.println("Copy:" + originalPath + " --> " + copied);
                 }
             }
-            return;
         }
     }
 }