diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6d3ee52e70e84a3a2cd506b91ad3e72d8b355f0e..4531723af147a188a1fe2f382f7afc4d2de3b725 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,11 +6,9 @@ stages:
   - test
 
 build:
-  image: openjdk:8
+  image: openjdk:11
   stage: build
   script:
-    # see discussion in the answer of https://stackoverflow.com/questions/44911155/gradle-how-to-include-runtimeonly-dependencies-in-javaexec-classpath
-    - ./gradlew --console=plain --no-daemon relast.preprocessor:jar
     - ./gradlew --console=plain --no-daemon assemble jar
   artifacts:
     paths:
@@ -18,7 +16,7 @@ build:
 
 
 test:
-  image: openjdk:8
+  image: openjdk:11
   stage: test
   script:
     - ./gradlew --console=plain --no-daemon check
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index ef6ee67ef918ae615118351e1223fe4ceddf6f4b..0000000000000000000000000000000000000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "relast.preprocessor"]
-	path = relast.preprocessor
-	url = ../../relast-preprocessor.git
diff --git a/build.gradle b/build.gradle
index 78228deb83ea2c2acc14174e6a61f64f129d167f..3e8eb6674186b6586ab3a8b0bca7c95c0a229939 100644
--- a/build.gradle
+++ b/build.gradle
@@ -14,11 +14,20 @@ application.mainClassName = "${mainClassName}"
 
 repositories {
     mavenCentral()
+    maven {
+        name 'gitlab-maven'
+        url 'https://git-st.inf.tu-dresden.de/api/v4/groups/jastadd/-/packages/maven'
+    }
+}
+
+configurations {
+    relast
 }
 
 dependencies {
-    implementation project(':relast.preprocessor')
-    testImplementation testFixtures(project(":relast.preprocessor"))
+    relast group: 'org.jastadd', name: 'relast', version: "${relast_version}"
+    implementation group: 'org.jastadd', name: 'relast-preprocessor', version: "${preprocessor_version}"
+    testImplementation testFixtures(group: 'org.jastadd', name: 'relast-preprocessor', version: "${preprocessor_version}")
 }
 
 project.version = "0.2.0"
@@ -35,20 +44,37 @@ test {
     maxHeapSize = '1G'
 }
 
+task extractJastAddSources(type: Sync) {
+
+    dependsOn configurations.runtimeClasspath
+    configurations.runtimeClasspath.asFileTree.filter { it.toString().endsWith("relast-preprocessor-${preprocessor_version}.jar") }.collect {
+        from(zipTree(it)) {
+            include "**/*.jrag"
+            include "**/*.jadd"
+            include "**/*.ast"
+            include "**/*.relast"
+            include "**/*.flex"
+            include "**/*.parser"
+        }
+    }
+    includeEmptyDirs false
+    into file("${project.buildDir}/tmp/jastadd-sources")
+}
+
 jar {
     manifest {
         attributes "Main-Class": "${mainClassName}"
     }
 
     from {
-        configurations.runtimeClasspath.collect { return (it.exists() && (!it.toString().contains("/build/libs/")|| it.toString().contains("-base-"))) ? (it.isDirectory() ? it : zipTree(it)) : null }
+        configurations.runtimeClasspath.collect {it.isDirectory() ? it : zipTree(it) }
     }
 }
 
 // Input and output files for relast
 def relastInputFiles = [
-        "relast.preprocessor/src/main/jastadd/RelAst.relast",
-        "relast.preprocessor/src/main/jastadd/mustache/Mustache.relast"
+        "${project.buildDir}/tmp/jastadd-sources/RelAst.relast",
+        "${project.buildDir}/tmp/jastadd-sources/mustache/Mustache.relast"
 ]
 def relastOutputFiles = [
         "src/gen/jastadd/RelAst.ast",
@@ -59,8 +85,11 @@ def relastOutputFiles = [
 
 
 task relast(type: JavaExec) {
-    classpath = files("relast.preprocessor/libs/relast.jar")
     group = 'Build'
+    classpath = configurations.relast
+    mainClass = 'org.jastadd.relast.compiler.Compiler'
+
+    dependsOn extractJastAddSources
 
     doFirst {
         delete relastOutputFiles
@@ -88,9 +117,9 @@ jastadd {
 
             jastadd {
                 basedir "."
-                include "relast.preprocessor/src/main/jastadd/**/*.ast"
-                include "relast.preprocessor/src/main/jastadd/**/*.jadd"
-                include "relast.preprocessor/src/main/jastadd/**/*.jrag"
+                include "build/tmp/jastadd-sources/**/*.ast"
+                include "build/tmp/jastadd-sources/**/*.jadd"
+                include "build/tmp/jastadd-sources/**/*.jrag"
                 include "src/main/jastadd/**/*.ast"
                 include "src/main/jastadd/**/*.jadd"
                 include "src/main/jastadd/**/*.jrag"
@@ -100,18 +129,18 @@ jastadd {
             }
 
             scanner {
-                include "relast.preprocessor/src/main/jastadd/scanner/Header.flex",         [-4]
-                include "relast.preprocessor/src/main/jastadd/scanner/Preamble.flex",       [-3]
-                include "relast.preprocessor/src/main/jastadd/scanner/Macros.flex",         [-2]
-                include "relast.preprocessor/src/main/jastadd/scanner/RulesPreamble.flex",  [-1]
-                include "relast.preprocessor/src/main/jastadd/scanner/Keywords.flex",       [ 0]
-                include "relast.preprocessor/src/main/jastadd/scanner/Symbols.flex",        [ 1]
-                include "relast.preprocessor/src/main/jastadd/scanner/RulesPostamble.flex", [ 2]
+                include "build/tmp/jastadd-sources/scanner/Header.flex",         [-4]
+                include "build/tmp/jastadd-sources/scanner/Preamble.flex",       [-3]
+                include "build/tmp/jastadd-sources/scanner/Macros.flex",         [-2]
+                include "build/tmp/jastadd-sources/scanner/RulesPreamble.flex",  [-1]
+                include "build/tmp/jastadd-sources/scanner/Keywords.flex",       [ 0]
+                include "build/tmp/jastadd-sources/scanner/Symbols.flex",        [ 1]
+                include "build/tmp/jastadd-sources/scanner/RulesPostamble.flex", [ 2]
             }
 
             parser {
-                include "relast.preprocessor/src/main/jastadd/parser/Preamble.parser"
-                include "relast.preprocessor/src/main/jastadd/parser/RelAst.parser"
+                include "build/tmp/jastadd-sources/parser/Preamble.parser"
+                include "build/tmp/jastadd-sources/parser/RelAst.parser"
             }
         }
     }
@@ -142,5 +171,4 @@ jastadd {
 }
 
 clean.dependsOn(cleanGen)
-generateAst.dependsOn(relast)
-jar.dependsOn("relast.preprocessor:jar") // the jar is a fat jar that contains the jar of the preprocessor
+generateAst.dependsOn(relast, extractJastAddSources)
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000000000000000000000000000000000000..47cf02494925ad66bdfcd8d4d74ab2e1f5de6fc2
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,2 @@
+relast_version = 0.3.0-137
+preprocessor_version = 0.1.0-41
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index f3d88b1c2faf2fc91d853cd5d4242b5547257070..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 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 fcce76360e8b69fa3d4558417ff5929b9b2ca6e6..41dfb87909a877d96c3af4adccce4c7a301b55a2 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Sun Nov 01 15:07:09 CET 2020
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
 zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index 2fe81a7d95e4f9ad2c9b2a046707d36ceb3980b3..4f906e0c811fc9e230eb44819f509cd0627f2600 100755
--- a/gradlew
+++ b/gradlew
@@ -82,6 +82,7 @@ esac
 
 CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
 
+
 # Determine the Java command to use to start the JVM.
 if [ -n "$JAVA_HOME" ] ; then
     if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
@@ -129,6 +130,7 @@ fi
 if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
     APP_HOME=`cygpath --path --mixed "$APP_HOME"`
     CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
     JAVACMD=`cygpath --unix "$JAVACMD"`
 
     # We build the pattern for arguments to be converted via cygpath
diff --git a/gradlew.bat b/gradlew.bat
index 24467a141f791695fc1009c78d913b2c849d1412..ac1b06f93825db68fb0c0b5150917f340eaa5d02 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=.
 set APP_BASE_NAME=%~n0
 set APP_HOME=%DIRNAME%
 
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
 @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="-Xmx64m" "-Xms64m"
 
@@ -37,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
 
 set JAVA_EXE=java.exe
 %JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
+if "%ERRORLEVEL%" == "0" goto execute
 
 echo.
 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -51,7 +54,7 @@ goto fail
 set JAVA_HOME=%JAVA_HOME:"=%
 set JAVA_EXE=%JAVA_HOME%/bin/java.exe
 
-if exist "%JAVA_EXE%" goto init
+if exist "%JAVA_EXE%" goto execute
 
 echo.
 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -61,28 +64,14 @@ echo location of your Java installation.
 
 goto fail
 
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
 :execute
 @rem Setup the command line
 
 set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
 
+
 @rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
 
 :end
 @rem End local scope for the variables with windows NT shell
diff --git a/relast.preprocessor b/relast.preprocessor
deleted file mode 160000
index cee30f5c8a1b356118f5ed78302a1df64fe76897..0000000000000000000000000000000000000000
--- a/relast.preprocessor
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit cee30f5c8a1b356118f5ed78302a1df64fe76897
diff --git a/src/test/resources/RelAstPreprocessor/config.yaml b/src/test/resources/RelAstPreprocessor/config.yaml
index 0122f6c7a6cfb15f71004cc97bf1a413d6b55b2f..87455fb34c67de257f17c68970a281ba98aa5095 100644
--- a/src/test/resources/RelAstPreprocessor/config.yaml
+++ b/src/test/resources/RelAstPreprocessor/config.yaml
@@ -1,7 +1,7 @@
 - name: "RelAST Preprocessor Grammar from submodule (null)"
-  in: "../../../../relast.preprocessor/src/main/jastadd/"
+  in: "../../../../build/tmp/jastadd-sources/"
   args:
-    - "--inputBaseDir=../../../../relast.preprocessor/src/main/jastadd/"
+    - "--inputBaseDir=../../../../build/tmp/jastadd-sources/"
     - "--outputBaseDir=out"
     - "--errorHandling=null"
     - "RelAst.relast"