diff --git a/src/main/jastadd/gen/Package.jadd b/src/main/jastadd/gen/Package.jadd
new file mode 100644
index 0000000000000000000000000000000000000000..0da8e36a3a8130d2a12d8677c71728d1cfa9b52d
--- /dev/null
+++ b/src/main/jastadd/gen/Package.jadd
@@ -0,0 +1,13 @@
+aspect PackageGen {
+
+    syn String GradleFile.generateSettingsGradle(String rootProjectName){
+
+        return de.tudresden.inf.st.pnml.gen.generators.GradleGenUtil.generateGradleSettings(rootProjectName);
+    }
+
+    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);
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/jastadd/gen/Package.relast b/src/main/jastadd/gen/Package.relast
index 8752bd8520b316c6336a2062708bcf2e9da33edb..b592026175921df9b45aa506c14f2d760c11abd7 100644
--- a/src/main/jastadd/gen/Package.relast
+++ b/src/main/jastadd/gen/Package.relast
@@ -2,12 +2,14 @@ DinerosPackage ::= Dir:PackageDirectory* File:PackageFile* <Name:String> <TokenC
 
 abstract PackageFile ::= <Name:String>  ;
 
-TemplateFile:PackageFile ;
+abstract TemplateFile:PackageFile ;
 StaticFile:PackageFile ;
 
 NodeFile:TemplateFile ;
 SubscriberFile:TemplateFile ;
 ServerFile:TemplateFile ;
 MapperFile:TemplateFile;
+GradleFile:TemplateFile ;
+MainFile:TemplateFile ;
 
 PackageDirectory ::= <Name:String> ;
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 affb607b44f0e1d14486439cd60357b2861f84f3..e95c6f08f8b66f7bef7097bf72a8f843f011b42c 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
@@ -1,10 +1,14 @@
 package de.tudresden.inf.st.pnml.gen;
 
+import de.tudresden.inf.st.pnml.jastadd.model.GradleFile;
+
 public class Main {
 
     public static void main(java.lang.String[] args){
 
-        // TODO
+        GradleFile gf = new GradleFile();
+        gf.setName("TestFile");
+        System.out.println(gf.generateSettingsGradle("test-project-name"));
 
     }
 }
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/data/MainExecutionContext.java b/src/main/java/de/tudresden/inf/st/pnml/gen/data/MainExecutionContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4322c60e5ed6613525806603de62f086c62ef8c
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/data/MainExecutionContext.java
@@ -0,0 +1,48 @@
+package de.tudresden.inf.st.pnml.gen.data;
+
+public class MainExecutionContext {
+
+    private String rosHost;
+    private String rostMasterUri;
+    private String mqttHost;
+    private String packageNamespace;
+
+    public MainExecutionContext(String rosHost, String rostMasterUri, String mqttHost, String packageNamespace) {
+        this.rosHost = rosHost;
+        this.rostMasterUri = rostMasterUri;
+        this.mqttHost = mqttHost;
+        this.packageNamespace = packageNamespace;
+    }
+
+    public String getRosHost() {
+        return rosHost;
+    }
+
+    public void setRosHost(String rosHost) {
+        this.rosHost = rosHost;
+    }
+
+    public String getRostMasterUri() {
+        return rostMasterUri;
+    }
+
+    public void setRostMasterUri(String rostMasterUri) {
+        this.rostMasterUri = rostMasterUri;
+    }
+
+    public String getMqttHost() {
+        return mqttHost;
+    }
+
+    public void setMqttHost(String mqttHost) {
+        this.mqttHost = mqttHost;
+    }
+
+    public String getPackageNamespace() {
+        return packageNamespace;
+    }
+
+    public void setPackageNamespace(String packageNamespace) {
+        this.packageNamespace = packageNamespace;
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/data/MapperContext.java b/src/main/java/de/tudresden/inf/st/pnml/gen/data/MapperContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..b158191875d68a33b0af6b73d1fb201573774b9a
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/data/MapperContext.java
@@ -0,0 +1,18 @@
+package de.tudresden.inf.st.pnml.gen.data;
+
+public class MapperContext {
+
+    private String packageNamespace;
+
+    public MapperContext(String packageNamespace) {
+        this.packageNamespace = packageNamespace;
+    }
+
+    public String getPackageNamespace() {
+        return packageNamespace;
+    }
+
+    public void setPackageNamespace(String packageNamespace) {
+        this.packageNamespace = packageNamespace;
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/data/MapperInfo.java b/src/main/java/de/tudresden/inf/st/pnml/gen/data/MapperInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb397fdb0a37474eef22d7c9f5603a699b7f3f13
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/data/MapperInfo.java
@@ -0,0 +1,18 @@
+package de.tudresden.inf.st.pnml.gen.data;
+
+public class MapperInfo {
+
+    private String nodeName;
+
+    public MapperInfo(String nodeName) {
+        this.nodeName = nodeName;
+    }
+
+    public String getNodeName() {
+        return nodeName;
+    }
+
+    public void setNodeName(String nodeName) {
+        this.nodeName = nodeName;
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/data/NodeContext.java b/src/main/java/de/tudresden/inf/st/pnml/gen/data/NodeContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f72ffca70dd8f25388fb007b0ad9c6e819fe2b4
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/data/NodeContext.java
@@ -0,0 +1,28 @@
+package de.tudresden.inf.st.pnml.gen.data;
+
+public class NodeContext {
+
+    private String packageNamespace;
+    private String nodeClassName;
+
+    public NodeContext(String packageNamespace, String nodeClassName) {
+        this.packageNamespace = packageNamespace;
+        this.nodeClassName = nodeClassName;
+    }
+
+    public String getPackageNamespace() {
+        return packageNamespace;
+    }
+
+    public void setPackageNamespace(String packageNamespace) {
+        this.packageNamespace = packageNamespace;
+    }
+
+    public String getNodeClassName() {
+        return nodeClassName;
+    }
+
+    public void setNodeClassName(String nodeClassName) {
+        this.nodeClassName = nodeClassName;
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/data/NodeInfo.java b/src/main/java/de/tudresden/inf/st/pnml/gen/data/NodeInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..ab006ef5fbb88ab8b4f1601069f3b2ee2fb263ff
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/data/NodeInfo.java
@@ -0,0 +1,48 @@
+package de.tudresden.inf.st.pnml.gen.data;
+
+public class NodeInfo {
+
+    private String netName;
+    private String nodeName;
+    private String nodeIndex;
+    private String nodeClassName;
+
+    public NodeInfo(String netName, String nodeName, String nodeIndex, String nodeClassName) {
+        this.netName = netName;
+        this.nodeName = nodeName;
+        this.nodeIndex = nodeIndex;
+        this.nodeClassName = nodeClassName;
+    }
+
+    public String getNetName() {
+        return netName;
+    }
+
+    public void setNetName(String netName) {
+        this.netName = netName;
+    }
+
+    public String getNodeName() {
+        return nodeName;
+    }
+
+    public void setNodeName(String nodeName) {
+        this.nodeName = nodeName;
+    }
+
+    public String getNodeIndex() {
+        return nodeIndex;
+    }
+
+    public void setNodeIndex(String nodeIndex) {
+        this.nodeIndex = nodeIndex;
+    }
+
+    public String getNodeClassName() {
+        return nodeClassName;
+    }
+
+    public void setNodeClassName(String nodeClassName) {
+        this.nodeClassName = nodeClassName;
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/data/ServerContext.java b/src/main/java/de/tudresden/inf/st/pnml/gen/data/ServerContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..c13e56eb839a0d83676ed2b2898d2d0626814b4c
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/data/ServerContext.java
@@ -0,0 +1,28 @@
+package de.tudresden.inf.st.pnml.gen.data;
+
+public class ServerContext {
+
+    private String packageNamespace;
+    private String serverClassName;
+
+    public String getPackageNamespace() {
+        return packageNamespace;
+    }
+
+    public void setPackageNamespace(String packageNamespace) {
+        this.packageNamespace = packageNamespace;
+    }
+
+    public String getServerClassName() {
+        return serverClassName;
+    }
+
+    public void setServerClassName(String serverClassName) {
+        this.serverClassName = serverClassName;
+    }
+
+    public ServerContext(String packageNamespace, String serverClassName) {
+        this.packageNamespace = packageNamespace;
+        this.serverClassName = serverClassName;
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/data/ServerInfo.java b/src/main/java/de/tudresden/inf/st/pnml/gen/data/ServerInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb5f20f89b41b847d5a2a6b957ba6496a0b1d8ad
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/data/ServerInfo.java
@@ -0,0 +1,40 @@
+package de.tudresden.inf.st.pnml.gen.data;
+
+public class ServerInfo {
+
+    private String serverNodeName;
+    private String serverSubnet;
+    private String serverClassName;
+
+    public ServerInfo(String serverNodeName, String serverSubnet, String serverClassName) {
+        this.serverNodeName = serverNodeName;
+        this.serverSubnet = serverSubnet;
+        this.serverClassName = serverClassName;
+    }
+
+    public String getServerNodeName() {
+        return serverNodeName;
+    }
+
+    public void setServerNodeName(String serverNodeName) {
+        this.serverNodeName = serverNodeName;
+    }
+
+    public String getServerSubnet() {
+        return serverSubnet;
+    }
+
+    public void setServerSubnet(String serverSubnet) {
+        this.serverSubnet = serverSubnet;
+    }
+
+    public String getServerClassName() {
+        return serverClassName;
+    }
+
+    public void setServerClassName(String serverClassName) {
+        this.serverClassName = serverClassName;
+    }
+
+
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/data/SubscriberContext.java b/src/main/java/de/tudresden/inf/st/pnml/gen/data/SubscriberContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..e48c5ca269f938365012b06a17318b4ac50589d2
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/data/SubscriberContext.java
@@ -0,0 +1,28 @@
+package de.tudresden.inf.st.pnml.gen.data;
+
+public class SubscriberContext {
+
+    private String packageNamespace;
+    private String subscriberClassName;
+
+    public SubscriberContext(String packageNamespace, String subscriberClassName) {
+        this.packageNamespace = packageNamespace;
+        this.subscriberClassName = subscriberClassName;
+    }
+
+    public String getPackageNamespace() {
+        return packageNamespace;
+    }
+
+    public void setPackageNamespace(String packageNamespace) {
+        this.packageNamespace = packageNamespace;
+    }
+
+    public String getSubscriberClassName() {
+        return subscriberClassName;
+    }
+
+    public void setSubscriberClassName(String subscriberClassName) {
+        this.subscriberClassName = subscriberClassName;
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/data/SubscriberInfo.java b/src/main/java/de/tudresden/inf/st/pnml/gen/data/SubscriberInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a4aafee58facb76191bbbddaed7b1e1426bb2ff
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/data/SubscriberInfo.java
@@ -0,0 +1,38 @@
+package de.tudresden.inf.st.pnml.gen.data;
+
+public class SubscriberInfo {
+
+    private String subscriberNodeName;
+    private String subscriberSubnet;
+    private String subscriberClassName;
+
+    public SubscriberInfo(String subscriberNodeName, String subscriberSubnet, String subscriberClassName) {
+        this.subscriberNodeName = subscriberNodeName;
+        this.subscriberSubnet = subscriberSubnet;
+        this.subscriberClassName = subscriberClassName;
+    }
+
+    public String getSubscriberNodeName() {
+        return subscriberNodeName;
+    }
+
+    public void setSubscriberNodeName(String subscriberNodeName) {
+        this.subscriberNodeName = subscriberNodeName;
+    }
+
+    public String getSubscriberSubnet() {
+        return subscriberSubnet;
+    }
+
+    public void setSubscriberSubnet(String subscriberSubnet) {
+        this.subscriberSubnet = subscriberSubnet;
+    }
+
+    public String getSubscriberClassName() {
+        return subscriberClassName;
+    }
+
+    public void setSubscriberClassName(String subscriberClassName) {
+        this.subscriberClassName = subscriberClassName;
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/data/TokenContext.java b/src/main/java/de/tudresden/inf/st/pnml/gen/data/TokenContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..4496f52827a39a2f365f4ea533cf5213f2a5e3e2
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/data/TokenContext.java
@@ -0,0 +1,18 @@
+package de.tudresden.inf.st.pnml.gen.data;
+
+public class TokenContext {
+
+    private String packageNamespace;
+
+    public TokenContext(String packageNamespace) {
+        this.packageNamespace = packageNamespace;
+    }
+
+    public String getPackageNamespace() {
+        return packageNamespace;
+    }
+
+    public void setPackageNamespace(String packageNamespace) {
+        this.packageNamespace = packageNamespace;
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/generators/AbstractGenUtil.java b/src/main/java/de/tudresden/inf/st/pnml/gen/generators/AbstractGenUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..fef8fadf369ae4d596c8084704c9c36a80b475eb
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/generators/AbstractGenUtil.java
@@ -0,0 +1,28 @@
+package de.tudresden.inf.st.pnml.gen.generators;
+
+import com.github.mustachejava.DefaultMustacheFactory;
+import com.github.mustachejava.Mustache;
+import com.github.mustachejava.MustacheFactory;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Map;
+
+public class AbstractGenUtil {
+
+    protected static final String TEMPLATE_PATH = "../pnml-relast-pkg-gen/src/main/resources/mustache/";
+
+    protected static String generate(Map<String, Object> context, String fileName) {
+        MustacheFactory mf = new DefaultMustacheFactory();
+        Mustache m = mf.compile(TEMPLATE_PATH + fileName);
+
+        StringWriter writer = new StringWriter();
+        try {
+            m.execute(writer, context).flush();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return writer.toString();
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/generators/GradleGenUtil.java b/src/main/java/de/tudresden/inf/st/pnml/gen/generators/GradleGenUtil.java
index 42ece8c76bd6cb960029c7eddaa003742af8db98..06d17b687879fbc57e275b346929c2dc5f1710a0 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/gen/generators/GradleGenUtil.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/generators/GradleGenUtil.java
@@ -6,33 +6,28 @@ import com.github.mustachejava.MustacheFactory;
 import de.tudresden.inf.st.pnml.gen.data.GradleBuildContext;
 import de.tudresden.inf.st.pnml.gen.data.SettingsGradleContext;
 
+import java.io.IOException;
 import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.Map;
 
-public class GradleGenUtil {
+public class GradleGenUtil extends AbstractGenUtil{
 
     public static String generateBuildGradle(String mainClass, String archiveBaseName, String version, String pnmlRelastersion){
 
         GradleBuildContext gradleBuildContext = new GradleBuildContext(mainClass, archiveBaseName, version, pnmlRelastersion);
+        Map<String, Object> context = new HashMap<>();
+        context.put("gradleBuildContext", gradleBuildContext);
 
-        MustacheFactory mf = new DefaultMustacheFactory();
-        Mustache m = mf.compile("/main/resources/mustache/build.mustache");
-
-        StringWriter writer = new StringWriter();
-        m.execute(writer, gradleBuildContext);
-
-        return writer.toString();
+        return generate(context, "build.mustache");
     }
 
     public static String generateGradleSettings(String rootProjectName){
 
         SettingsGradleContext settingsGradleContext = new SettingsGradleContext(rootProjectName);
+        Map<String, Object> context = new HashMap<>();
+        context.put("settingsGradleContext", settingsGradleContext);
 
-        MustacheFactory mf = new DefaultMustacheFactory();
-        Mustache m = mf.compile("/main/resources/mustache/settings.mustache");
-
-        StringWriter writer = new StringWriter();
-        m.execute(writer, settingsGradleContext);
-
-        return writer.toString();
+        return generate(context, "settings.mustache");
     }
 }
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/generators/JavaClassGenUtil.java b/src/main/java/de/tudresden/inf/st/pnml/gen/generators/JavaClassGenUtil.java
index fd7dc63b0d34ff5fdb47a20e7ecf08d85217ef12..21fe80eb24426c40cbd4e472af4293d2d98fe6ee 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/gen/generators/JavaClassGenUtil.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/generators/JavaClassGenUtil.java
@@ -1,4 +1,106 @@
 package de.tudresden.inf.st.pnml.gen.generators;
 
-public class JavaClassGenUtil {
+import de.tudresden.inf.st.pnml.base.constants.PnmlConstants;
+import de.tudresden.inf.st.pnml.gen.data.*;
+import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
+import de.tudresden.inf.st.pnml.jastadd.model.Transition;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class JavaClassGenUtil extends AbstractGenUtil{
+
+    public static String generateMain(List<PetriNet> petriNetList, List<String> petriNetFiles,
+                                      String rosHost, String rosMasterUri, String mqttHost, String packageNamespace){
+
+        Map<String, Object> context = new HashMap<>();
+
+        MainExecutionContext mainExecutionContext = new MainExecutionContext(rosHost, rosMasterUri, mqttHost, packageNamespace);
+        context.put("mainExecutionContext", mainExecutionContext);
+
+        List<NodeInfo> nodeInfos = new ArrayList<>();
+        List<ServerInfo> serverInfos = new ArrayList<>();
+        List<SubscriberInfo> subscriberInfos = new ArrayList<>();
+
+        for(int i = 0; i < petriNetList.size(); i++){
+
+            NodeInfo nodeInfo = new NodeInfo(petriNetFiles.get(i), "node" + i,
+                    String.valueOf(i), "Node" + i);
+            nodeInfos.add(nodeInfo);
+
+            int serverCount = 0;
+
+            for(Transition t : petriNetList.get(i).allTransitions()){
+
+                String transitionType = t.asInputSignalTransition().getStaticTransitionInformation().getType();
+                String subnet = t.asInputSignalTransition().getStaticTransitionInformation().getSubNet();
+
+                if(transitionType.equals(PnmlConstants.TRANSITION_TYPE_SERVICE_REQUEST_OUT)){
+                    serverInfos.add(new ServerInfo("node" + i, subnet,"Node" + i + "Server" + serverCount));
+                    serverCount++;
+                }
+                if(transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_LIMITED_IN)
+                        || transitionType.equals(PnmlConstants.TRANSITION_TYPE_TOPIC_UNLIMITED_IN) ){
+                    subscriberInfos.add(new SubscriberInfo("node" + i, subnet, "Node" + i + "Subscriber" + serverCount));
+                }
+            }
+        }
+
+        context.put("nodeInfos", nodeInfos);
+        context.put("serverInfos", serverInfos);
+        context.put("subscriberInfos", subscriberInfos);
+
+        return generate(context, "JavaMain.mustache");
+    }
+
+    public static String generateSubscriberClass(String packageNamespace, String className){
+
+        Map<String, Object> context = new HashMap<>();
+        SubscriberContext subscriberContext = new SubscriberContext(packageNamespace, className);
+        context.put("subscriberContext", subscriberContext);
+        return generate(context, "JavaSubscriber.mustache");
+    }
+
+    public static String generateNodeClass(String packageNamespace, String className){
+
+        Map<String, Object> context = new HashMap<>();
+        NodeContext nodeContext = new NodeContext(packageNamespace, className);
+        context.put("nodeContext", nodeContext);
+        return generate(context, "JavaNode.mustache");
+    }
+
+    public static String generateServerClass(String packageNamespace, String className){
+
+        Map<String, Object> context = new HashMap<>();
+        ServerContext serverContext = new ServerContext(packageNamespace, className);
+        context.put("serverContext", serverContext);
+        return generate(context, "JavaServer.mustache");
+    }
+
+    public static String generateMapperClass(String packageNamespace, PetriNet petriNet){
+
+        Map<String, Object> context = new HashMap<>();
+        MapperContext mapperContext = new MapperContext(packageNamespace);
+        context.put("serverContext", mapperContext);
+
+        List<MapperInfo> mapperInfos = new ArrayList<>();
+
+        for(int i = 1; i < petriNet.allTransitions().size(); i++){
+            MapperInfo mapperInfo = new MapperInfo("Node" + i);
+            mapperInfos.add(mapperInfo);
+        }
+
+        context.put("mapperInfos", mapperInfos);
+        return generate(context, "JavaCallbackMapper.mustache");
+    }
+
+    public static String generateTokenClass(String packageNamespace){
+
+        Map<String, Object> context = new HashMap<>();
+        TokenContext tokenContext = new TokenContext(packageNamespace);
+        context.put("tokenContext", tokenContext);
+        return generate(context, "JavaToken.mustache");
+    }
 }
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/generators/TokenGenUtil.java b/src/main/java/de/tudresden/inf/st/pnml/gen/generators/TokenGenUtil.java
index 6201d5f447c2425ddf737810a55c810ed6548061..6677d85b8d7b2c1ef7aab9ae83ce411f82eef93e 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/gen/generators/TokenGenUtil.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/generators/TokenGenUtil.java
@@ -1,4 +1,4 @@
 package de.tudresden.inf.st.pnml.gen.generators;
 
-public class TokenGenUtil {
+public class TokenGenUtil extends AbstractGenUtil{
 }
diff --git a/src/main/resources/mustache/JavaCallbackMapper.mustache b/src/main/resources/mustache/JavaCallbackMapper.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..04ca4cdd1c6ef9ef47948ef9bbabf0f6f6cd058c
--- /dev/null
+++ b/src/main/resources/mustache/JavaCallbackMapper.mustache
@@ -0,0 +1,27 @@
+{{#mapperContext}}
+package de.tudresden.inf.st.{{{packageNamespace}}}.callback;
+
+import de.tudresden.inf.st.pnml.engine.execution.DefaultTransitionCallback;
+import de.tudresden.inf.st.pnml.engine.execution.TransitionCallback;
+import de.tudresden.inf.st.pnml.jastadd.model.PetriNet;
+import de.tudresden.inf.st.pnml.jastadd.model.Transition;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class CallbackMapper {
+{{#mapperInfos}}
+
+    public static final Map<String, List<AbstractNetCallback>> initCallbacksFor{{{nodeName}}}(PetriNet petriNet){
+
+        Map<String, List<AbstractNetCallback>> callbackMap = new HashMap<>();
+
+        // TODO: implementation by user
+
+        return callbackMap;
+    }
+{{/mapperInfos}}
+}
+{{/mapperContext}}
\ No newline at end of file
diff --git a/src/main/resources/mustache/JavaMain.mustache b/src/main/resources/mustache/JavaMain.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..5905e30dbdb78f103670bcc390b710ecaf173b27
--- /dev/null
+++ b/src/main/resources/mustache/JavaMain.mustache
@@ -0,0 +1,111 @@
+{{#mainContext}}
+package de.tudresden.inf.st.{{{packageNamespace}}};
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import de.tudresden.inf.st.pnml.engine.execution.TransitionCallback;
+import de.tudresden.inf.st.pnml.engine.execution.TransitionCallbackService;
+import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode;
+import de.tudresden.inf.st.pnml.engine.transform.PetriNetInitializer;
+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.PnmlParser;
+import de.tudresden.inf.st.sample.balloon.Token;
+import de.tudresden.inf.st.sample.callback.AbstractNetCallback;
+import de.tudresden.inf.st.sample.callback.CallbackMapper;
+import de.tudresden.inf.st.sample.communication.Node2Subscriber1;
+import de.tudresden.inf.st.sample.nodes.Node1;
+import de.tudresden.inf.st.sample.nodes.Node2;
+import org.ros.node.DefaultNodeMainExecutor;
+import org.ros.node.NodeConfiguration;
+import org.ros.node.NodeMainExecutor;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Main {
+
+    // actual ros / mqtt host url is inserted based on configuration
+    private static final String ROS_HOST = "{{{rosHost}}}";
+    private static final String ROS_MASTER_URI = "{{{rosMasterUri}}}";
+    private static final String MQTT_HOST = "{{{mqttHost}}}";
+
+    private static final NodeConfiguration nodeConfiguration = NodeConfiguration.newPublic(ROS_HOST);
+    private static final NodeMainExecutor nodeMainExecutor = DefaultNodeMainExecutor.newDefault();
+
+    public static void main(java.lang.String[] args) throws IOException, ParserConfigurationException, SAXException {
+
+        /*
+         * Petri Net base data initialization
+         */
+
+        // actual petri net paths are generated
+        List<String> petriNetPaths = new ArrayList<>();
+        {{#nodeInfos}}
+        petriNetPaths.add("src/main/resources/nets/{{{netName}}}.pnml");
+        {{/nodeInfos}}
+
+        List<PetriNet> petriNets = new ArrayList<>();
+        Map<String, BalloonMarking> markings = new HashMap<>();
+        Map<String, BalloonCallbackStorage> callbackStorages = new HashMap<>();
+
+        for(String petriNetPath : petriNetPaths){
+            petriNets.add(PnmlParser.parsePnml(petriNetPath).get(0));
+        }
+
+        TransitionCallbackService transitionCallbackService = TransitionCallbackService.getInstance();
+
+        for(PetriNet petriNet : petriNets){
+            markings.put(petriNet.getId(), petriNet.initializeBalloonMarking());
+            BalloonCallbackStorage storage = petriNet.initializeCallbackStorage();
+            transitionCallbackService.init(petriNet.getId(), storage);
+            callbackStorages.put(petriNet.getId(), storage);
+            PetriNetInitializer.initInputSignalConnections(petriNet, MQTT_HOST, "mqtt");
+            PetriNetInitializer.initOutputSignalConnections(petriNet, MQTT_HOST, "mqtt");
+        }
+
+        /*
+         * Callback and token integration
+         */
+
+         {{#nodeInfos}}
+         Map<String, List<AbstractNetCallback>> callbackMap{{{nodeName}}} = CallbackMapper.initCallbacksFor{{{nodeName}}}(petriNets.get({{{nodeIndex}}}));
+
+         for (Map.Entry<String, List<AbstractNetCallback>> entry : callbackMap{{{nodeName}}}.entrySet()) {
+             for(AbstractNetCallback anc : entry.getValue()){
+                transitionCallbackService.registerCallback(petriNets.get({{{nodeIndex}}}), entry.getKey(), anc);
+             }
+         }
+         {{/nodeInfos}}
+
+         /*
+          * Start of the Dineros NodescallbackMap1
+          */
+
+          nodeConfiguration.setMasterUri(URI.create(ROS_MASTER_URI));
+
+          {{#nodeInfos}}
+          DiNeRosNode {{{nodeName}}} = new {{{nodeClassName}}}("{{{nodeName}}}", petriNets.get({{{nodeIndex}}}), markings.get(petriNets.get({{{nodeIndex}}}).getId()),
+                                    callbackStorages.get(petriNets.get({{{nodeIndex}}}).getId()));
+          {{/nodeInfos}}
+
+          {{#serverInfos}}
+              {{{serverNodeName}}}.getDinerosServiceServers().put("{{{serverSubnet}}}", new {{{serverClassName}}}());
+          {{/serverInfos}}
+
+          {{#subscriberInfos}}
+              {{{subscriberNodeName}}}.getDinerosSubscribers().put("{{{subscriberSubnet}}}", new {{{subscriberClassName}}}());
+          {{/subscriberInfos}}
+
+          {{#nodeInfos}}
+              new Thread(() -> nodeMainExecutor.execute({{{nodeName}}}, nodeConfiguration)) { {
+                  start();
+              } };
+          {{/nodeInfos}}
+{{/mainContext}}
\ No newline at end of file
diff --git a/src/main/resources/mustache/JavaNode.mustache b/src/main/resources/mustache/JavaNode.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..a34c6b84d9a41fbf21857ec3d939edae137e1d07
--- /dev/null
+++ b/src/main/resources/mustache/JavaNode.mustache
@@ -0,0 +1,26 @@
+{{#nodeContext}}
+package de.tudresden.inf.st.{{{packageNamespace}}}.nodes;
+
+import de.tudresden.inf.st.pnml.engine.ros.DiNeRosNode;
+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 class {{{nodeClassName}}} extends DiNeRosNode {
+
+    public {{{nodeClassName}}}(String nodeName, PetriNet petriNet) {
+        super(nodeName, petriNet);
+    }
+
+    public {{{nodeClassName}}}(String nodeName, PetriNet petriNet, BalloonMarking marking, BalloonCallbackStorage callbackStorage) {
+        super(nodeName, petriNet, marking, callbackStorage);
+    }
+
+    @Override
+    protected void nodeLoop() {
+
+        // TODO: Implementation by user
+
+    }
+}
+{{/nodeContext}}
\ No newline at end of file
diff --git a/src/main/resources/mustache/JavaServer.mustache b/src/main/resources/mustache/JavaServer.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..f75d6ce800cab73eae2a50dbc72989dae202a456
--- /dev/null
+++ b/src/main/resources/mustache/JavaServer.mustache
@@ -0,0 +1,15 @@
+{{#serverContext}}
+package de.tudresden.inf.st.{{{packageNamespace}}}.communication;
+
+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 class {{{serverClassName}}} extends AbstractDinerosServer{
+
+    @Override
+    public boolean serve(BalloonMarking balloonMarking, BalloonCallbackStorage balloonCallbackStorage, PetriNet petriNet, String subnet) {
+        return false;
+    }
+}
+{{/serverContext}}
\ No newline at end of file
diff --git a/src/main/resources/mustache/JavaSubscriber.mustache b/src/main/resources/mustache/JavaSubscriber.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..5d7ab2e07d8476c95bb42a86100f2453a0f1b69e
--- /dev/null
+++ b/src/main/resources/mustache/JavaSubscriber.mustache
@@ -0,0 +1,18 @@
+{{#subscriberContext}}
+package de.tudresden.inf.st.{{{packageNamespace}}}.communication;
+
+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 class {{{subscriberClassName}}} extends AbstractDinerosSubscriber {
+
+    @Override
+    public boolean subscribe(BalloonMarking balloonMarking, BalloonCallbackStorage balloonCallbackStorage, PetriNet petriNet, String subnet) {
+
+        // TODO: Implementation by user
+
+        return true;
+    }
+}
+{{/subscriberContext}}
diff --git a/src/main/resources/mustache/JavaToken.mustache b/src/main/resources/mustache/JavaToken.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..e3837ae7d7fc623232dcfcd0d5631324d9ae9e08
--- /dev/null
+++ b/src/main/resources/mustache/JavaToken.mustache
@@ -0,0 +1,9 @@
+{{#tokenContext}}
+package de.tudresden.inf.st.{{{packageNamespace}}}.balloon;
+
+public class Token {
+
+    // TODO: implement Java Pojo for the token format
+
+}
+{{/tokenContext}}
\ No newline at end of file