diff --git a/build.gradle b/build.gradle
index 468b680d364195038056ac2b196e326191887e01..75be59becf474138cededdb8bc4617030741edac 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,55 +1,3 @@
 plugins {
-    id "com.github.ben-manes.versions" version "0.34.0"
-}
-
-dependencyUpdates.gradleReleaseChannel="current"
-dependencyUpdates.revision="release"
-
-allprojects  {
-    group = 'de.tudresden.inf.st'
-    version = '0.1'
-}
-
-subprojects {
-    apply plugin: 'java-library'
-    apply plugin: 'idea'
-    apply plugin: "com.github.ben-manes.versions"
-
-    sourceCompatibility = 1.8
-    targetCompatibility = 1.8
-
-    task packageSources(type: Jar) {
-        classifier = 'sources'
-        from sourceSets.main.allSource
-    }
-
-    artifacts.archives packageSources
-    configurations {
-        testArtifacts.extendsFrom testRuntime
-    }
-
-    task testJar(type: Jar) {
-        classifier "test"
-        from sourceSets.test.output
-    }
-
-    artifacts {
-        testArtifacts testJar
-    }
-
-    repositories {
-        mavenCentral()
-    }
-
-    dependencies {
-        testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: "${jupiter_version}"
-        testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "${jupiter_version}"
-        testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.18.0'
-    }
-
-    test {
-        useJUnitPlatform()
-        maxHeapSize = '1G'
-    }
-
+  id 'com.github.ben-manes.versions'
 }
diff --git a/buildSrc/.gitignore b/buildSrc/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..567609b1234a9b8806c5a05da6c866e480aa148d
--- /dev/null
+++ b/buildSrc/.gitignore
@@ -0,0 +1 @@
+build/
diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..95bfe53999d61b768da82463f837ec9f5254e997
--- /dev/null
+++ b/buildSrc/build.gradle
@@ -0,0 +1,11 @@
+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/relast2uml.java-application-conventions.gradle b/buildSrc/src/main/groovy/relast2uml.java-application-conventions.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..a32686b88da9b321aa62cb18ddc319a12b9e483c
--- /dev/null
+++ b/buildSrc/src/main/groovy/relast2uml.java-application-conventions.gradle
@@ -0,0 +1,4 @@
+plugins {
+  id 'relast2uml.java-common-conventions'
+  id 'application'
+}
diff --git a/buildSrc/src/main/groovy/relast2uml.java-common-conventions.gradle b/buildSrc/src/main/groovy/relast2uml.java-common-conventions.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..644c9bd4588c608573019e72d799a760d75a88dc
--- /dev/null
+++ b/buildSrc/src/main/groovy/relast2uml.java-common-conventions.gradle
@@ -0,0 +1,19 @@
+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/relast2uml.java-jastadd-conventions.gradle b/buildSrc/src/main/groovy/relast2uml.java-jastadd-conventions.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..99218f1be8bd04d2af5fcd8a4c70b251ae1c525a
--- /dev/null
+++ b/buildSrc/src/main/groovy/relast2uml.java-jastadd-conventions.gradle
@@ -0,0 +1,8 @@
+plugins {
+  id 'relast2uml.java-common-conventions'
+  id 'java-library'
+}
+
+dependencies {
+  api group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11'
+}
diff --git a/dumpAst/build.gradle b/dumpAst/build.gradle
index 7c3c3a361ad4166202aa68fdfdacf19443839e0a..c8073d1434512aa0730c9cab7427ba945730c9e9 100644
--- a/dumpAst/build.gradle
+++ b/dumpAst/build.gradle
@@ -1,23 +1,19 @@
-apply plugin: 'jastadd'
-apply plugin: 'idea'
-
-sourceCompatibility = 1.8
-
-repositories {
-    jcenter()
-}
-
 buildscript {
-    repositories.jcenter()
+    repositories.mavenLocal()
+    repositories.mavenCentral()
     dependencies {
-        classpath 'org.jastadd:jastaddgradle:1.13.3'
+        classpath group: 'org.jastadd', name: 'jastaddgradle', version: '1.13.3'
     }
 }
 
+plugins {
+    id 'relast2uml.java-jastadd-conventions'
+}
+
+apply plugin: 'jastadd'
+
 dependencies {
     implementation group: 'com.github.spullara.mustache.java', name: 'compiler', version: "${mustache_java_version}"
-    api group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11'
-
 }
 
 def versionFile = 'src/main/resources/dumpAstVersion.properties'
@@ -51,12 +47,6 @@ File genSrc = file("src/gen/java")
 sourceSets.main.java.srcDir genSrc
 idea.module.generatedSourceDirs += genSrc
 
-test {
-    useJUnitPlatform()
-
-    maxHeapSize = '1G'
-}
-
 File dumpAstGrammar = file('./src/main/jastadd/DumpAst.relast')
 File mustacheGrammar = file('./src/main/jastadd/mustache/Mustache.relast')
 
diff --git a/dumpAstWithPlantuml/build.gradle b/dumpAstWithPlantuml/build.gradle
index 0dae196ffc80e6e88975867987c589fe1dfe4269..cda10caa19d3fd23335edb2311b93a4773a060da 100644
--- a/dumpAstWithPlantuml/build.gradle
+++ b/dumpAstWithPlantuml/build.gradle
@@ -1,24 +1,21 @@
-apply plugin: 'jastadd'
-apply plugin: 'idea'
-
-sourceCompatibility = 1.8
-
-repositories {
-    jcenter()
-}
-
 buildscript {
-    repositories.jcenter()
+    repositories.mavenLocal()
+    repositories.mavenCentral()
     dependencies {
-        classpath 'org.jastadd:jastaddgradle:1.13.3'
+        classpath group: 'org.jastadd', name: 'jastaddgradle', version: '1.13.3'
     }
 }
 
+plugins {
+    id 'relast2uml.java-jastadd-conventions'
+}
+
+apply plugin: 'jastadd'
+
 dependencies {
     implementation fileTree(include: ['plantuml.jar'], dir: '../libs')
 
     implementation group: 'com.github.spullara.mustache.java', name: 'compiler', version: "${mustache_java_version}"
-    api group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11'
 }
 
 def versionFile = '../dumpAst/src/main/resources/dumpAstVersion.properties'
@@ -44,12 +41,6 @@ File genSrc = file("src/gen/java")
 sourceSets.main.java.srcDir genSrc
 idea.module.generatedSourceDirs += genSrc
 
-test {
-    useJUnitPlatform()
-
-    maxHeapSize = '1G'
-}
-
 File dumpAstGrammar = file('../dumpAst/src/main/jastadd/DumpAst.relast')
 
 task relast(type: JavaExec) {
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 94336fcae912db8a11d55634156fa011f4686124..5c2d1cf016b3885f6930543d57b744ea8c220a1a 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 5028f28f8e4755a78a5bf0fef4644577b199c8c4..4d9ca1649142b0c20144adce78e2472e2da01c30 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index cccdd3d517fc5249beaefa600691cf150f2fa3e6..83f2acfdc319a24e8766cca78f32474ad7a22dd6 100755
--- a/gradlew
+++ b/gradlew
@@ -1,5 +1,21 @@
 #!/usr/bin/env sh
 
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
 ##############################################################################
 ##
 ##  Gradle start up script for UN*X
@@ -28,7 +44,7 @@ APP_NAME="Gradle"
 APP_BASE_NAME=`basename "$0"`
 
 # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
 
 # Use the maximum available, or set MAX_FD != -1 to use that value.
 MAX_FD="maximum"
@@ -109,8 +125,8 @@ if $darwin; then
     GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
 fi
 
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
     APP_HOME=`cygpath --path --mixed "$APP_HOME"`
     CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
     JAVACMD=`cygpath --unix "$JAVACMD"`
diff --git a/gradlew.bat b/gradlew.bat
index f9553162f122c71b34635112e717c3e733b5b212..9618d8d9607cd91a0efb866bcac4810064ba6fac 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,3 +1,19 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
 @if "%DEBUG%" == "" @echo off
 @rem ##########################################################################
 @rem
@@ -14,7 +30,7 @@ set APP_BASE_NAME=%~n0
 set APP_HOME=%DIRNAME%
 
 @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
 
 @rem Find java.exe
 if defined JAVA_HOME goto findJavaFromJavaHome
diff --git a/grammar2uml/build.gradle b/grammar2uml/build.gradle
index 4dc350e842e13bfafabe45e92cf62fc39631907a..53af6fb58a5743d0cc7eb98086bfb282e8057e0b 100644
--- a/grammar2uml/build.gradle
+++ b/grammar2uml/build.gradle
@@ -1,28 +1,25 @@
-apply plugin: 'jastadd'
-apply plugin: 'application'
-apply plugin: 'idea'
-
-sourceCompatibility = 1.8
-
-mainClassName = 'de.tudresden.inf.st.jastadd.grammar2uml.compiler.Compiler'
-
-repositories {
-    jcenter()
-}
-
 buildscript {
-    repositories.jcenter()
+    repositories.mavenLocal()
+    repositories.mavenCentral()
     dependencies {
-        classpath 'org.jastadd:jastaddgradle:1.13.3'
+        classpath group: 'org.jastadd', name: 'jastaddgradle', version: '1.13.3'
     }
 }
 
+plugins {
+    id 'relast2uml.java-jastadd-conventions'
+    id 'relast2uml.java-application-conventions'
+}
+
+apply plugin: 'jastadd'
+
+application.mainClassName = 'de.tudresden.inf.st.jastadd.grammar2uml.compiler.Compiler'
+
 dependencies {
     implementation project(':relast.preprocessor')
 
     implementation group: 'com.github.spullara.mustache.java', name: 'compiler', version: "${mustache_java_version}"
     runtime group: 'org.jastadd', name: 'jastadd', version: '2.3.4'
-    api group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11'
 }
 
 def versionFile = 'src/main/resources/grammar2umlVersion.properties'
@@ -46,7 +43,7 @@ task newVersion() {
 
 jar {
     manifest {
-        attributes "Main-Class": mainClassName
+        attributes "Main-Class": application.mainClassName
     }
 
     from {
@@ -61,12 +58,6 @@ File genSrc = file("src/gen/java")
 sourceSets.main.java.srcDir genSrc
 idea.module.generatedSourceDirs += genSrc
 
-test {
-    useJUnitPlatform()
-
-    maxHeapSize = '1G'
-}
-
 File preprocessorGrammar = file('../relast.preprocessor/src/main/jastadd/RelAst.relast')
 File grammar2umlGrammar = file('./src/main/jastadd/Grammar2Uml.relast')
 File intermediateGrammar = file('./src/main/jastadd/MustacheNodes.relast')
diff --git a/testDumper/build.gradle b/testDumper/build.gradle
index dac0574a50977c5843472a52fa6a45ed34d29a2d..b8622c70275eeea58e4f46c06eddf10b3b052d01 100644
--- a/testDumper/build.gradle
+++ b/testDumper/build.gradle
@@ -1,20 +1,18 @@
-apply plugin: 'jastadd'
-apply plugin: 'idea'
-
-repositories {
-    mavenCentral()
-}
-
 buildscript {
-    repositories.jcenter()
+    repositories.mavenLocal()
+    repositories.mavenCentral()
     dependencies {
-        classpath 'org.jastadd:jastaddgradle:1.13.3'
+        classpath group: 'org.jastadd', name: 'jastaddgradle', version: '1.13.3'
     }
 }
 
-dependencies {
-//    runtime group: 'org.jastadd', name: 'jastadd', version: '2.3.4'
+plugins {
+    id 'relast2uml.java-jastadd-conventions'
+}
 
+apply plugin: 'jastadd'
+
+dependencies {
     testImplementation project(':dumpAst')
 }
 
@@ -22,12 +20,6 @@ File genSrc = file("src/gen/java")
 sourceSets.main.java.srcDir genSrc
 idea.module.generatedSourceDirs += genSrc
 
-test {
-    useJUnitPlatform()
-
-    maxHeapSize = '1G'
-}
-
 File testingGrammar = file('./src/main/jastadd/testDumper.relast')
 
 task relast(type: JavaExec) {