diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5a4afe8f3713d4d4d5957fe1e5a6417e267644c0..a07891d846bc3319746c23f076b04de227f9ff58 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -32,8 +32,10 @@ publish:
   image: openjdk:11
   stage: publish
   script:
+    - "./gradlew setDevVersionForCI"
     - "./gradlew publishPluginMavenPublicationToMavenRepository"
   only:
+    - dev
     - master
 
 pages:
diff --git a/build.gradle b/build.gradle
index f57b22c698089bfbc29ed3fb43c989e530fa0d72..1ccfb713b7450908c5ec7c6954a0301b90420629 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,6 @@ plugins {
 }
 
 group 'org.jastadd.preprocessor'
-version '0.2.12'
 mainClassName = 'org.jastadd.preprocessor.testing.doc.DocumentationCreator'
 
 gradlePlugin {
@@ -17,6 +16,39 @@ gradlePlugin {
     }
 }
 
+def versionFile = 'src/main/resources/PreprocessorTesting.properties'
+def oldProps = new Properties()
+
+try {
+    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)
+    }
+}
+
 //830
 publishing {
     publications {
@@ -28,7 +60,7 @@ publishing {
     }
     repositories {
         maven {
-            url "https://git-st.inf.tu-dresden.de/api/v4/projects/830/packages/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"
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 5c2d1cf016b3885f6930543d57b744ea8c220a1a..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 4d9ca1649142b0c20144adce78e2472e2da01c30..41dfb87909a877d96c3af4adccce4c7a301b55a2 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-6.7.1-bin.zip
+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 83f2acfdc319a24e8766cca78f32474ad7a22dd6..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
@@ -154,19 +156,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
         else
             eval `echo args$i`="\"$arg\""
         fi
-        i=$((i+1))
+        i=`expr $i + 1`
     done
     case $i in
-        (0) set -- ;;
-        (1) set -- "$args0" ;;
-        (2) set -- "$args0" "$args1" ;;
-        (3) set -- "$args0" "$args1" "$args2" ;;
-        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+        0) set -- ;;
+        1) set -- "$args0" ;;
+        2) set -- "$args0" "$args1" ;;
+        3) set -- "$args0" "$args1" "$args2" ;;
+        4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
     esac
 fi
 
@@ -175,14 +177,9 @@ save () {
     for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
     echo " "
 }
-APP_ARGS=$(save "$@")
+APP_ARGS=`save "$@"`
 
 # Collect all arguments for the java command, following the shell quoting and substitution rules
 eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
 
-# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
-if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
-  cd "$(dirname "$0")"
-fi
-
 exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index 9618d8d9607cd91a0efb866bcac4810064ba6fac..107acd32c4e687021ef32db511e8a206129b88ec 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/src/main/java/org/jastadd/preprocessor/testing/plugin/JastAddConfiguration.java b/src/main/java/org/jastadd/preprocessor/testing/plugin/JastAddConfiguration.java
index 37419009a277a22190602f5dc796ca585b7031a1..ae3d27c7c493514dc439210399c3b29f63eee152 100644
--- a/src/main/java/org/jastadd/preprocessor/testing/plugin/JastAddConfiguration.java
+++ b/src/main/java/org/jastadd/preprocessor/testing/plugin/JastAddConfiguration.java
@@ -1,9 +1,6 @@
 package org.jastadd.preprocessor.testing.plugin;
 
-import org.gradle.api.tasks.Input;
-import org.gradle.api.tasks.InputFiles;
-import org.gradle.api.tasks.Optional;
-import org.gradle.api.tasks.OutputDirectory;
+import org.gradle.api.tasks.*;
 import org.jastadd.preprocessor.testing.doc.Description;
 
 import java.io.File;
@@ -32,14 +29,14 @@ public interface JastAddConfiguration {
   @Description(value = "Do not run JastAdd")
   @Optional
   @Input
-  boolean isSkipRun();
-  void setSkipRun(boolean skipRun);
+  Boolean isSkipRun();
+  void setSkipRun(Boolean skipRun);
 
   @Description(value = "Add more options not directly supported")
-  @Optional
-  @Input
+  @Internal
   List<String> getExtraOptions();
   void setExtraOptions(List<String> extraOptions);
+  @Input
   default List<String> getExtraOptionsOrDefault() {
     return getExtraOptions() != null ? getExtraOptions() : Collections.emptyList();
   }
diff --git a/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectConfiguration.java b/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectConfiguration.java
index e115687855ca413aef2a143a96febe309405e20f..9aa151750f1134cb94ce8c08255a1e1bb89a92af 100644
--- a/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectConfiguration.java
+++ b/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectConfiguration.java
@@ -2,6 +2,7 @@ package org.jastadd.preprocessor.testing.plugin;
 
 import org.gradle.api.tasks.Input;
 import org.gradle.api.tasks.InputFiles;
+import org.gradle.api.tasks.Internal;
 import org.gradle.api.tasks.Optional;
 import org.jastadd.preprocessor.testing.doc.Description;
 
@@ -34,26 +35,26 @@ public interface RagConnectConfiguration {
   @Description(value = "Log read endpoints", correspondingParameter = "--logReads")
   @Optional
   @Input
-  boolean isLogReads();
-  void setLogReads(boolean logReads);
+  Boolean isLogReads();
+  void setLogReads(Boolean logReads);
 
   @Description(value = "Log write endpoints", correspondingParameter = "--logWrites")
   @Optional
   @Input
-  boolean isLogWrites();
-  void setLogWrites(boolean logWrites);
+  Boolean isLogWrites();
+  void setLogWrites(Boolean logWrites);
 
   @Description(value = "Log incremental activities", correspondingParameter = "--logIncremental")
   @Optional
   @Input
-  boolean isLogIncremental();
-  void setLogIncremental(boolean loggIncremental);
+  Boolean isLogIncremental();
+  void setLogIncremental(Boolean logIncremental);
 
   @Description(value = "Be more verbose during compilation", correspondingParameter = "--verbose")
   @Optional
   @Input
-  boolean isVerbose();
-  void setVerbose(boolean verbose);
+  Boolean isVerbose();
+  void setVerbose(Boolean verbose);
 
   @Description(value = "Set protocols to be used", correspondingParameter = "--protocols")
   @Optional
@@ -62,10 +63,10 @@ public interface RagConnectConfiguration {
   void setProtocols(List<String> protocols);
 
   @Description(value = "Add more options not directly supported")
-  @Optional
-  @Input
+  @Internal
   List<String> getExtraOptions();
   void setExtraOptions(List<String> extraOptions);
+  @Input
   default List<String> getExtraOptionsOrDefault() {
     return getExtraOptions() != null ? getExtraOptions() : Collections.emptyList();
   }
diff --git a/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectTest.java b/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectTest.java
index 351bf9b939c8bec4892c91e16cd4e2e3f146fdf7..d3fc464c17893121c87a0999892b7805b39d08e8 100644
--- a/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectTest.java
+++ b/src/main/java/org/jastadd/preprocessor/testing/plugin/RagConnectTest.java
@@ -38,7 +38,7 @@ public abstract class RagConnectTest extends RelastTest {
   }
 
   @OutputFiles
-  public List<File> grammarFilesGeneratedByRagconnect() {
+  public List<File> getGrammarFilesGeneratedByRagconnect() {
     // files are RagConnect.relast and <INPUT_GRAMMAR(s)>.relast
     List<File> result = new ArrayList<>();
     result.add(resolveOutputDir("RagConnect.relast"));
@@ -52,7 +52,7 @@ public abstract class RagConnectTest extends RelastTest {
   }
 
   @OutputFiles
-  public List<File> aspectFilesGeneratedByRagconnect() {
+  public List<File> getAspectFilesGeneratedByRagconnect() {
     // file is only RagConnect.jadd
     List<File> result = new ArrayList<>();
     result.add(resolveOutputDir("RagConnect.jadd"));
@@ -73,8 +73,8 @@ public abstract class RagConnectTest extends RelastTest {
 
     // delete generated files
     project.delete(deleteSpec -> {
-      deleteSpec.delete(grammarFilesGeneratedByRagconnect());
-      deleteSpec.delete(aspectFilesGeneratedByRagconnect());
+      deleteSpec.delete(getGrammarFilesGeneratedByRagconnect());
+      deleteSpec.delete(getAspectFilesGeneratedByRagconnect());
     });
 
     // run ragconnect first
@@ -119,11 +119,11 @@ public abstract class RagConnectTest extends RelastTest {
 
 
     // now run relast + jastadd
-    getRelast().setInputFiles(grammarFilesGeneratedByRagconnect());
+    getRelast().setInputFiles(getGrammarFilesGeneratedByRagconnect());
     if (getJastadd().getInputFiles() == null) {
       getJastadd().setInputFiles(new ArrayList<>());
     }
-    for (File file : aspectFilesGeneratedByRagconnect()) {
+    for (File file : getAspectFilesGeneratedByRagconnect()) {
       if (getJastadd().getInputFiles().contains(file)) {
         getLogger().warn("Input file to JastAdd already known: {} - Remove from jastadd.inputFiles!", file);
       } else {
diff --git a/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastConfiguration.java b/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastConfiguration.java
index c42cbc912a03e97061269db18258f3f24bb6cb92..450c32dc6b0d927c89f1fc966b4a4ae72e6df539 100644
--- a/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastConfiguration.java
+++ b/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastConfiguration.java
@@ -2,6 +2,7 @@ package org.jastadd.preprocessor.testing.plugin;
 
 import org.gradle.api.tasks.Input;
 import org.gradle.api.tasks.InputFiles;
+import org.gradle.api.tasks.Internal;
 import org.gradle.api.tasks.Optional;
 import org.jastadd.preprocessor.testing.doc.Description;
 
@@ -19,8 +20,8 @@ public interface RelastConfiguration {
   @Description(value = "Use JastAdd like API for relations", correspondingParameter = "--useJastAddNames")
   @Optional
   @Input
-  boolean isUseJastAddNames();
-  void setUseJastAddNames(boolean useJastAddNames);
+  Boolean isUseJastAddNames();
+  void setUseJastAddNames(Boolean useJastAddNames);
 
   @Description(value = "Name of resulting grammar (can be a path)", correspondingParameter = "--grammarName")
   @Input
@@ -36,14 +37,14 @@ public interface RelastConfiguration {
   @Description(value = "Do not write any files", correspondingParameter = "--file")
   @Optional
   @Input
-  boolean isNoWriteToFile();
-  void setNoWriteToFile(boolean noWriteToFile);
+  Boolean isNoWriteToFile();
+  void setNoWriteToFile(Boolean noWriteToFile);
 
   @Description(value = "Do not generate resolverHelper", correspondingParameter = "--resolverHelper")
   @Optional
   @Input
-  boolean isNoResolverHelper();
-  void setNoResolverHelper(boolean noResolverHelper);
+  Boolean isNoResolverHelper();
+  void setNoResolverHelper(Boolean noResolverHelper);
 
   @Description(value = "Class to be used for relations", correspondingParameter = "--listClass")
   @Optional
@@ -52,22 +53,22 @@ public interface RelastConfiguration {
   void setListClass(String listClass);
 
   @Description(value = "Activate serialization, and set its implementation", correspondingParameter = "--serializer")
-  @Optional
-  @Input
+  @Internal
   String getSerializer();
   void setSerializer(String serializer);
 
   @Description(value = "Be more verbose during compilation")
   @Optional
   @Input
-  boolean isVerbose();
-  void setVerbose(boolean verbose);
+  Boolean isVerbose();
+  void setVerbose(Boolean verbose);
 
   @Description(value = "Add more options not directly supported")
   @Optional
   @Input
   List<String> getExtraOptions();
   void setExtraOptions(List<String> extraOptions);
+  @Input
   default List<String> getExtraOptionsOrDefault() {
     return getExtraOptions() != null ? getExtraOptions() : Collections.emptyList();
   }
diff --git a/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastTest.java b/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastTest.java
index 5ae9dd4ca86aa655b8d7b328f999f7b790239fab..1969ba481149dd048d24cb4209ac7bfd1bb2888f 100644
--- a/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastTest.java
+++ b/src/main/java/org/jastadd/preprocessor/testing/plugin/RelastTest.java
@@ -91,7 +91,7 @@ public abstract class RelastTest extends DefaultTask {
     if (getRelast().isVerbose()) {
       System.out.println("Pre processing, running relast");
     }
-    // then, run relast pre processing
+    // then, run relast pre-processing
     project.getPlugins().withType(JavaPlugin.class, javaPlugin -> {
       SourceSetContainer sourceSets = (SourceSetContainer) project.getProperties().get("sourceSets");
       FileCollection runtimeClasspath = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME).getRuntimeClasspath();
@@ -129,7 +129,7 @@ public abstract class RelastTest extends DefaultTask {
         args.add("--grammarName=" + pathToAbsoluteProject(getRelast().getGrammarName()));
         args.addAll(getRelast().getExtraOptionsOrDefault());
         if (getRelast().isVerbose()) {
-          System.out.println("Start relast with args: " + args + " and main: " + javaExecSpec.getMain());
+          System.out.println("Start relast with args: " + args + " and main: " + javaExecSpec.getMainClass());
         }
         javaExecSpec.args(args);
       }).assertNormalExitValue();
diff --git a/src/main/resources/PreprocessorTesting.properties b/src/main/resources/PreprocessorTesting.properties
new file mode 100644
index 0000000000000000000000000000000000000000..9f19e4559d63e26a977725b8a8491e58deaa6e55
--- /dev/null
+++ b/src/main/resources/PreprocessorTesting.properties
@@ -0,0 +1,2 @@
+#Tue Mar 08 14:00:49 CET 2022
+version=0.2.13