diff --git a/build.gradle b/build.gradle
index e4683dd9e34be3d14951b050188a67ddb4db0e90..569e21c5b44c732bf91e67694158ac653c000b74 100644
--- a/build.gradle
+++ b/build.gradle
@@ -82,6 +82,10 @@ dependencies {
     // testing
     testImplementation('org.junit.jupiter:junit-jupiter:5.8.2')
 
+    // https://mvnrepository.com/artifact/com.github.spullara.mustache.java/compiler
+    implementation group: 'com.github.spullara.mustache.java', name: 'compiler', version: '0.9.10'
+
+
 }
 
 run {
@@ -115,7 +119,7 @@ def ecoreInputFiles = [ecoreFile]
 def ecoreOutputFiles = [ecoreRelastAspect,
                         ecoreRelastGrammar]
 
-def relastInputFiles = [ecoreRelastGrammar, './src/main/jastadd/base/marking/Marking.relast', './src/main/jastadd/base/io/IoPN.relast', './src/main/jastadd/base/clauses/expressions.relast']
+def relastInputFiles = [ecoreRelastGrammar, './src/main/jastadd/gen/Package.relast', './src/main/jastadd/base/marking/Marking.relast', './src/main/jastadd/base/io/IoPN.relast', './src/main/jastadd/base/clauses/expressions.relast']
 def relastOutputFiles = ['src/gen/jastadd/pnml/placeTransition.ast', 'src/gen/jastadd/pnml/placeTransition.jadd']
 
 task ecoreToRelast(type: JavaExec) {
diff --git a/src/main/jastadd/gen/Package.relast b/src/main/jastadd/gen/Package.relast
new file mode 100644
index 0000000000000000000000000000000000000000..8752bd8520b316c6336a2062708bcf2e9da33edb
--- /dev/null
+++ b/src/main/jastadd/gen/Package.relast
@@ -0,0 +1,13 @@
+DinerosPackage ::= Dir:PackageDirectory* File:PackageFile* <Name:String> <TokenClass:String>;
+
+abstract PackageFile ::= <Name:String>  ;
+
+TemplateFile:PackageFile ;
+StaticFile:PackageFile ;
+
+NodeFile:TemplateFile ;
+SubscriberFile:TemplateFile ;
+ServerFile:TemplateFile ;
+MapperFile:TemplateFile;
+
+PackageDirectory ::= <Name:String> ;
diff --git a/src/main/java/de/tudresden/inf/st/pnml/base b/src/main/java/de/tudresden/inf/st/pnml/base
new file mode 120000
index 0000000000000000000000000000000000000000..e5524eae07717f59311b55d567de85d7cac4f06f
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/base
@@ -0,0 +1 @@
+../../../../../../../../../../pnml-relast-base/src/data/java/de/tudresden/inf/st/pnml/base
\ No newline at end of file
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/base b/src/main/java/de/tudresden/inf/st/pnml/gen/base
deleted file mode 120000
index c973a6a4cdad85570cf4fc46191a73650bae2352..0000000000000000000000000000000000000000
--- a/src/main/java/de/tudresden/inf/st/pnml/gen/base
+++ /dev/null
@@ -1 +0,0 @@
-../../../../../../../../../../../pnml-relast-base/src/data/java/de/tudresden/inf/st/pnml/base
\ No newline at end of file
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/data/GradleBuildContext.java b/src/main/java/de/tudresden/inf/st/pnml/gen/data/GradleBuildContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..7e72d1ccc3b21973631150a1ed4dd5c3f0f1c4c7
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/data/GradleBuildContext.java
@@ -0,0 +1,48 @@
+package de.tudresden.inf.st.pnml.gen.data;
+
+public class GradleBuildContext {
+
+    private String mainClass;
+    private String archiveBaseName;
+    private String version;
+    private String pnmlRelastVersion;
+
+    public GradleBuildContext(String mainClass, String archiveBaseName, String version, String pnmlRelastVersion) {
+        this.mainClass = mainClass;
+        this.archiveBaseName = archiveBaseName;
+        this.version = version;
+        this.pnmlRelastVersion = pnmlRelastVersion;
+    }
+
+    public String getMainClass() {
+        return mainClass;
+    }
+
+    public void setMainClass(String mainClass) {
+        this.mainClass = mainClass;
+    }
+
+    public String getArchiveBaseName() {
+        return archiveBaseName;
+    }
+
+    public void setArchiveBaseName(String archiveBaseName) {
+        this.archiveBaseName = archiveBaseName;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getPnmlRelastVersion() {
+        return pnmlRelastVersion;
+    }
+
+    public void setPnmlRelastVersion(String pnmlRelastVersion) {
+        this.pnmlRelastVersion = pnmlRelastVersion;
+    }
+}
diff --git a/src/main/java/de/tudresden/inf/st/pnml/gen/data/SettingsGradleContext.java b/src/main/java/de/tudresden/inf/st/pnml/gen/data/SettingsGradleContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..95c618fd7b1072c083d23e84aae8261cbaba83fd
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/data/SettingsGradleContext.java
@@ -0,0 +1,18 @@
+package de.tudresden.inf.st.pnml.gen.data;
+
+public class SettingsGradleContext {
+
+    private String rootProjectName;
+
+    public String getRootProjectName() {
+        return rootProjectName;
+    }
+
+    public void setRootProjectName(String rootProjectName) {
+        this.rootProjectName = rootProjectName;
+    }
+
+    public SettingsGradleContext(String rootProjectName) {
+        this.rootProjectName = rootProjectName;
+    }
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..42ece8c76bd6cb960029c7eddaa003742af8db98
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/generators/GradleGenUtil.java
@@ -0,0 +1,38 @@
+package de.tudresden.inf.st.pnml.gen.generators;
+
+import com.github.mustachejava.DefaultMustacheFactory;
+import com.github.mustachejava.Mustache;
+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.StringWriter;
+
+public class GradleGenUtil {
+
+    public static String generateBuildGradle(String mainClass, String archiveBaseName, String version, String pnmlRelastersion){
+
+        GradleBuildContext gradleBuildContext = new GradleBuildContext(mainClass, archiveBaseName, version, pnmlRelastersion);
+
+        MustacheFactory mf = new DefaultMustacheFactory();
+        Mustache m = mf.compile("/main/resources/mustache/build.mustache");
+
+        StringWriter writer = new StringWriter();
+        m.execute(writer, gradleBuildContext);
+
+        return writer.toString();
+    }
+
+    public static String generateGradleSettings(String rootProjectName){
+
+        SettingsGradleContext settingsGradleContext = new SettingsGradleContext(rootProjectName);
+
+        MustacheFactory mf = new DefaultMustacheFactory();
+        Mustache m = mf.compile("/main/resources/mustache/settings.mustache");
+
+        StringWriter writer = new StringWriter();
+        m.execute(writer, settingsGradleContext);
+
+        return writer.toString();
+    }
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..fd7dc63b0d34ff5fdb47a20e7ecf08d85217ef12
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/generators/JavaClassGenUtil.java
@@ -0,0 +1,4 @@
+package de.tudresden.inf.st.pnml.gen.generators;
+
+public class JavaClassGenUtil {
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..6201d5f447c2425ddf737810a55c810ed6548061
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/pnml/gen/generators/TokenGenUtil.java
@@ -0,0 +1,4 @@
+package de.tudresden.inf.st.pnml.gen.generators;
+
+public class TokenGenUtil {
+}
diff --git a/src/main/resources/mustache/build.mustache b/src/main/resources/mustache/build.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..462bee6704715f4ee904eb0eb20c99ef50fce49d
--- /dev/null
+++ b/src/main/resources/mustache/build.mustache
@@ -0,0 +1,60 @@
+{{#gradleBuildContext}}
+buildscript {
+    repositories.mavenCentral()
+}
+
+group 'de.tudresden.inf.st'
+version '{{version}}'
+
+apply plugin: 'java'
+apply plugin: 'java-library'
+apply plugin: 'application'
+apply plugin: "idea"
+
+java.toolchain.languageVersion.set(JavaLanguageVersion.of(11))
+
+repositories {
+    jcenter()
+    mavenCentral()
+}
+
+dependencies {
+    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.13.3'
+    compile fileTree(include: ['pnml-relast-engine-fatjar-{{pnmlRelastersion}}.jar'], dir: './libs')
+    testCompile group: 'junit', name: 'junit', version: '4.12'
+}
+
+jar {
+    manifest {
+        attributes "Main-Class": "{{mainClass}}"
+    }
+
+    from {
+        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
+    }
+
+    exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'
+
+    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+
+    archiveBaseName = '{{archiveBaseName}}'
+}
+
+task fatJar(type: Jar) {
+    dependsOn jar
+    group = "build"
+
+    archiveAppendix = "fatjar"
+    from sourceSets.main.output
+    from {
+        configurations.runtimeClasspath.collect {it.isDirectory() ? it : zipTree(it) }
+    }
+
+    manifest.attributes "Main-Class": "{{mainClass}}"
+}
+
+run {
+    mainClassName = '{{mainClass}}'
+    standardInput = System.in
+}
+{{/gradleBuildContext}}
\ No newline at end of file
diff --git a/src/main/resources/mustache/settings.mustache b/src/main/resources/mustache/settings.mustache
new file mode 100644
index 0000000000000000000000000000000000000000..04de97005e4030885de53b18d3f0025a8d8ef693
--- /dev/null
+++ b/src/main/resources/mustache/settings.mustache
@@ -0,0 +1,3 @@
+{{#settingsGradleContext}}
+rootProject.name = '{{rootProjectName}}'
+{{/settingsGradleContext}}
\ No newline at end of file