diff --git a/.gitmodules b/.gitmodules
index dfd5681b75f6183d860a874e3e3205613e8c925e..fd02da4a7d8ee075ead5252101b19badf6e2d905 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,4 +1,4 @@
 [submodule "relast.preprocessor"]
 	path = relast.preprocessor
 	url = ../relast-preprocessor.git
-	branch = master
+	branch = develop
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..9c0a43b9c4b44f43deffdffa0ef2186542b364ef
--- /dev/null
+++ b/README.md
@@ -0,0 +1,3 @@
+# Grammar2uml
+
+For documentation, please see <https://jastadd.pages.st.inf.tu-dresden.de/grammar2uml/>
diff --git a/build.gradle b/build.gradle
index 75be59becf474138cededdb8bc4617030741edac..fd845cb07d5e9fa96127753b0a0a67195926b07c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,3 +1,3 @@
 plugins {
-  id 'com.github.ben-manes.versions'
+  id 'com.github.ben-manes.versions' version '0.42.0'
 }
diff --git a/buildSrc/.gitignore b/buildSrc/.gitignore
deleted file mode 100644
index 9f2a078806e1b8600d753f53ee7437b168a1b55b..0000000000000000000000000000000000000000
--- a/buildSrc/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build/
-.gradle/
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
deleted file mode 100644
index 95bfe53999d61b768da82463f837ec9f5254e997..0000000000000000000000000000000000000000
--- a/buildSrc/build.gradle
+++ /dev/null
@@ -1,11 +0,0 @@
-plugins {
-    id 'groovy-gradle-plugin'
-}
-
-repositories {
-    gradlePluginPortal()
-}
-
-dependencies {
-    implementation 'com.github.ben-manes:gradle-versions-plugin:0.36.0'
-}
diff --git a/buildSrc/src/main/groovy/grammar2uml.java-application-conventions.gradle b/buildSrc/src/main/groovy/grammar2uml.java-application-conventions.gradle
deleted file mode 100644
index c13a9fca788d2a399f1f5458bd24bb372ab5b96d..0000000000000000000000000000000000000000
--- a/buildSrc/src/main/groovy/grammar2uml.java-application-conventions.gradle
+++ /dev/null
@@ -1,4 +0,0 @@
-plugins {
-  id 'grammar2uml.java-common-conventions'
-  id 'application'
-}
diff --git a/buildSrc/src/main/groovy/grammar2uml.java-common-conventions.gradle b/buildSrc/src/main/groovy/grammar2uml.java-common-conventions.gradle
deleted file mode 100644
index 644c9bd4588c608573019e72d799a760d75a88dc..0000000000000000000000000000000000000000
--- a/buildSrc/src/main/groovy/grammar2uml.java-common-conventions.gradle
+++ /dev/null
@@ -1,19 +0,0 @@
-plugins {
-  id 'java'
-  id 'idea'
-  id 'com.github.ben-manes.versions'
-}
-
-repositories {
-  mavenCentral()
-}
-
-dependencies {
-  testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: "${jupiter_version}"
-  testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.18.1'
-  testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "${jupiter_version}"
-}
-
-tasks.named('test') {
-  useJUnitPlatform()
-}
diff --git a/buildSrc/src/main/groovy/grammar2uml.java-jastadd-conventions.gradle b/buildSrc/src/main/groovy/grammar2uml.java-jastadd-conventions.gradle
deleted file mode 100644
index 57d085788c40a351e76ca575d9f6b982e2da6d12..0000000000000000000000000000000000000000
--- a/buildSrc/src/main/groovy/grammar2uml.java-jastadd-conventions.gradle
+++ /dev/null
@@ -1,12 +0,0 @@
-plugins {
-  id 'grammar2uml.java-common-conventions'
-  id 'java-library'
-}
-
-dependencies {
-  api group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11'
-}
-
-File genSrc = file("src/gen/java")
-sourceSets.main.java.srcDir genSrc
-idea.module.generatedSourceDirs += genSrc
diff --git a/buildSrc/src/main/groovy/grammar2uml.java-publishing-conventions.gradle b/buildSrc/src/main/groovy/grammar2uml.java-publishing-conventions.gradle
deleted file mode 100644
index fea621616010ba05fb4e307cd81f163955970823..0000000000000000000000000000000000000000
--- a/buildSrc/src/main/groovy/grammar2uml.java-publishing-conventions.gradle
+++ /dev/null
@@ -1,88 +0,0 @@
-plugins {
-  id 'java'
-  id 'idea'
-  id 'com.github.ben-manes.versions'
-  id 'maven-publish'
-}
-
-repositories {
-  mavenCentral()
-}
-
-dependencies {
-  testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: "${jupiter_version}"
-  testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.18.1'
-  testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "${jupiter_version}"
-}
-
-jar {
-  from {
-    configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
-  }
-}
-
-def versionFile = "src/main/resources/${project.getName()}Version.properties"
-def oldProps = new Properties()
-
-try {
-  file(versionFile).withInputStream { stream -> oldProps.load(stream) }
-  version = oldProps['version']
-} catch (e) {
-  // this happens, if either the properties file is not present, or cannot be read from
-  throw new GradleException("File ${versionFile} not found or unreadable. Aborting.", e)
-}
-
-task printVersion() {
-  doLast {
-    println(version)
-  }
-}
-
-task newVersion() {
-  doFirst {
-    def props = new Properties()
-    props['version'] = value
-    props.store(file(versionFile).newWriter(), null)
-  }
-}
-
-task setDevVersionForCI() {
-  doFirst {
-    def props = new Properties()
-    props['version'] = version + "-$System.env.CI_PIPELINE_IID"
-    props.store(file(versionFile).newWriter(), null)
-  }
-}
-
-//1158
-publishing {
-  publications {
-    maven(MavenPublication) {
-      groupId = 'de.tudresden.inf.st'
-//      from components.java
-      artifact("build/libs/${project.getName()}-${project.getVersion()}.jar") {
-          extension 'jar'
-      }
-    }
-  }
-  repositories {
-    maven {
-      url "https://git-st.inf.tu-dresden.de/api/v4/projects/$System.env.CI_PROJECT_ID/packages/maven"
-      // Uncomment the following lines to publish manually (and comment out the other credentials section)
-//            credentials(HttpHeaderCredentials) {
-//                name = "Private-Token"
-//                value = gitLabPrivateToken // the variable resides in ~/.gradle/gradle.properties
-//            }
-      credentials(HttpHeaderCredentials) {
-        name = 'Job-Token'
-        value = System.getenv("CI_JOB_TOKEN")
-      }
-      authentication {
-        header(HttpHeaderAuthentication)
-      }
-    }
-
-  }
-}
-
-publish.dependsOn jar
diff --git a/gradle.properties b/gradle.properties
deleted file mode 100644
index 0b9ca1a9e095602aa642d4f103b301728a005d3c..0000000000000000000000000000000000000000
--- a/gradle.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-log4j_version = 2.13.3
-jupiter_version = 5.7.0
-mustache_java_version = 0.9.7
diff --git a/grammar2uml/build.gradle b/grammar2uml/build.gradle
index fc69ae6b1526a625f10515ca8e32a0a90f5f0340..05bd313f63ee8d8632d8d8f065620616fb095f36 100644
--- a/grammar2uml/build.gradle
+++ b/grammar2uml/build.gradle
@@ -1,58 +1,61 @@
+// --- Buildscripts (must be at the top) ---
 buildscript {
-    repositories.mavenLocal()
     repositories.mavenCentral()
     dependencies {
         classpath group: 'org.jastadd', name: 'jastaddgradle', version: '1.13.3'
     }
 }
 
+// --- Plugin definitions ---
 plugins {
-    id 'grammar2uml.java-jastadd-conventions'
-    id 'grammar2uml.java-application-conventions'
-    id 'grammar2uml.java-publishing-conventions'
+    id 'com.github.ben-manes.versions'
+    id 'java'
+    id 'idea'
+    id 'application'
+    id 'java-library'
+    id 'maven-publish'
 }
 
 apply plugin: 'jastadd'
 
-application.mainClassName = 'de.tudresden.inf.st.jastadd.grammar2uml.compiler.Compiler'
+// --- Dependencies ---
+repositories {
+    mavenCentral()
+}
 
 jar {
-    manifest {
-        attributes "Main-Class": application.mainClassName
-    }
+    manifest.attributes "Main-Class": "${mainClassName}"
 }
 
 dependencies {
     implementation project(':relast.preprocessor')
-    implementation fileTree(include: ['plantuml.jar'], dir: '../libs')
 
-    implementation group: 'com.github.spullara.mustache.java', name: 'compiler', version: "${mustache_java_version}"
-    runtime group: 'org.jastadd', name: 'jastadd', version: '2.3.4'
+    implementation group: 'net.sourceforge.plantuml', name: 'plantuml', version: '1.2022.2'
+
+    api group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11'
+
+    implementation group: 'com.github.spullara.mustache.java', name: 'compiler', version: '0.9.10'
+    // runtime group: 'org.jastadd', name: 'jastadd', version: '2.3.4'
+
+    testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.8.2'
+    testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.8.2'
 }
 
-File preprocessorGrammar = file('../relast.preprocessor/src/main/jastadd/RelAst.relast')
-File mustacheGrammar = file('../relast.preprocessor/src/main/jastadd/mustache/Mustache.relast')
-File grammar2umlGrammar = file('./src/main/jastadd/Grammar2Uml.relast')
-File intermediateGrammar = file('./src/main/jastadd/MustacheNodes.relast')
+// --- Preprocessors ---
+File genSrc = file("src/gen/java")
+sourceSets.main.java.srcDir genSrc
+idea.module.generatedSourceDirs += genSrc
 
 task relast(type: JavaExec) {
     group = 'Build'
     main = "-jar"
 
-    doFirst {
-        delete "src/gen/jastadd/*.ast"
-        delete "src/gen/jastadd/Grammar2Uml.jadd"
-        delete "src/gen/jastadd/Grammar2UmlRefResolver.jadd"
-        delete "src/gen/jastadd/Grammar2UmlResolverStubs.jrag"
-        mkdir  "src/gen/jastadd/"
-    }
-
     args = [
             "../libs/relast.jar",
-            preprocessorGrammar,
-            mustacheGrammar,
-            grammar2umlGrammar,
-            intermediateGrammar,
+            '../relast.preprocessor/src/main/jastadd/RelAst.relast',
+            '../relast.preprocessor/src/main/jastadd/mustache/Mustache.relast',
+            './src/main/jastadd/Grammar2Uml.relast',
+            './src/main/jastadd/MustacheNodes.relast',
             "--listClass=java.util.ArrayList",
             "--jastAddList=JastAddList",
             "--useJastAddNames",
@@ -60,18 +63,9 @@ task relast(type: JavaExec) {
             "--resolverHelper",
             "--grammarName=./src/gen/jastadd/Grammar2Uml"
     ]
-
-    inputs.files(file("../libs/relast.jar"),
-            preprocessorGrammar,
-            mustacheGrammar,
-            grammar2umlGrammar,
-            intermediateGrammar)
-    outputs.files(file("./src/gen/jastadd/Grammar2Uml.ast"),
-            file("./src/gen/jastadd/Grammar2Uml.jadd"),
-            file("./src/gen/jastadd/Grammar2UmlRefResolver.jadd"),
-            file('./src/gen/jastadd/Grammar2UmlResolverStubs.jrag'))
 }
 
+// --- JastAdd ---
 jastadd {
     configureModuleBuild()
     modules {
@@ -136,8 +130,88 @@ jastadd {
     scanner.genDir = "src/gen/java/de/tudresden/inf/st/jastadd/grammar2uml/scanner"
     parser.genDir = "src/gen/java/de/tudresden/inf/st/jastadd/grammar2uml/parser"
 
-    jastaddOptions = ["--lineColumnNumbers", "--List=JastAddList", "--safeLazy", "--visitCheck=true", "--rewrite=cnta", "--cache=all"]
+    // defalt options are: '--rewrite=cnta', '--safeLazy', '--visitCheck=false', '--cacheCycle=false'
+    extraJastAddOptions = ["--lineColumnNumbers", "--List=JastAddList", "--visitCheck=true"]
+}
+
+// --- Tests ---
+test.useJUnitPlatform()
+
+// --- Versioning and Publishing ---
+ext {
+    mainClassName = 'de.tudresden.inf.st.jastadd.grammar2uml.compiler.Compiler'
+}
+
+application.mainClassName = "${mainClassName}"
+
+task fatJar(type: Jar) {
+    dependsOn jar
+    group = "build"
+    archiveAppendix = "fatjar"
+    from {
+        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
+    }
+    manifest {
+        attributes "Main-Class": "${mainClassName}"
+    }
+}
+
+def versionFile = 'src/main/resources/grammar2umlVersion.properties'
+
+try {
+    def oldProps = new Properties()
+    file(versionFile).withInputStream { stream -> oldProps.load(stream) }
+    version = oldProps['version']
+} catch (ignored) {
+    // this happens, if either the properties file is not present, or cannot be read from
+    throw new GradleException("File ${versionFile} not found or unreadable. Aborting.")
+}
+
+task newVersion() {
+    doFirst {
+        def props = new Properties()
+        props['version'] = value
+        props.store(file(versionFile).newWriter(), null)
+    }
+}
+
+task printVersion() {
+    doLast {
+        println(version)
+    }
+}
+
+task setDevVersionForCI() {
+    doFirst {
+        def props = new Properties()
+        props['version'] = version + "-$System.env.CI_PIPELINE_IID"
+        props.store(file(versionFile).newWriter(), null)
+    }
+}
+
+group = 'de.tudresden.inf.st'
+
+publishing {
+    publications {
+        maven(MavenPublication) {
+            from components.java
+        }
+    }
+    repositories {
+        maven {
+            url "https://git-st.inf.tu-dresden.de/api/v4/projects/708/packages/maven"
+            credentials(HttpHeaderCredentials) {
+                name = 'Job-Token'
+                value = System.getenv("CI_JOB_TOKEN")
+            }
+            authentication {
+                header(HttpHeaderAuthentication)
+            }
+        }
+
+    }
 }
 
+// --- Task order ---
 generateAst.dependsOn relast
 jar.dependsOn ":relast.preprocessor:jar"
diff --git a/grammar2uml/src/main/jastadd/Navigation.jrag b/grammar2uml/src/main/jastadd/Navigation.jrag
index ccd0f3d49ede4fbecfafafff05b5228e42c76ed9..f519c0a9ed661e6089113711487ef273c29728cd 100644
--- a/grammar2uml/src/main/jastadd/Navigation.jrag
+++ b/grammar2uml/src/main/jastadd/Navigation.jrag
@@ -14,8 +14,5 @@ aspect Navigation {
   eq MGrammar2Uml.getChild().containedFile() = null;
 
   // --- containedFileName ---
-  eq Grammar2Uml.getChild().containedFileName() = getFileName();
-  eq Program.getChild().containedFileName() = null;
-  eq Grammar.getChild().containedFileName() = null;
-  eq MGrammar2Uml.getChild().containedFileName() = null;
+  eq Grammar2Uml.containedFileName() = getFileName();
 }
diff --git a/grammar2uml/src/main/resources/grammar2umlVersion.properties b/grammar2uml/src/main/resources/grammar2umlVersion.properties
index 0dab828ca2b57a871cb4f88cffafcae01b30c1aa..4d7122ec31b88850b7548ffc80c0957a2789b127 100644
--- a/grammar2uml/src/main/resources/grammar2umlVersion.properties
+++ b/grammar2uml/src/main/resources/grammar2umlVersion.properties
@@ -1,2 +1,2 @@
-#Thu Feb 24 16:54:04 CET 2022
-version=0.2.1
+#Mon Mar 21 13:09:36 CET 2022
+version=0.2.2
diff --git a/libs/plantuml.jar b/libs/plantuml.jar
deleted file mode 100644
index f3a204fc9cb7297951950e05c34f4bd270c5ebb6..0000000000000000000000000000000000000000
Binary files a/libs/plantuml.jar and /dev/null differ
diff --git a/relast.preprocessor b/relast.preprocessor
index 7959fd58f90538a7d8751855a61f69ba775bc82c..cee30f5c8a1b356118f5ed78302a1df64fe76897 160000
--- a/relast.preprocessor
+++ b/relast.preprocessor
@@ -1 +1 @@
-Subproject commit 7959fd58f90538a7d8751855a61f69ba775bc82c
+Subproject commit cee30f5c8a1b356118f5ed78302a1df64fe76897