diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 4989fda9ed75ff08ae1e20e92038258397b4f527..2a93d62f014e5927f58f0415fb2def09bdbc85b3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,27 +1,11 @@
 variables:
   GIT_SUBMODULE_STRATEGY: recursive
 
-services:
-  - name: "eclipse-mosquitto:1.6.9"
-    alias: "mqtt"
-
 stages:
   - build
-  - test
 
 build:
   image: openjdk:8
   stage: build
-  before_script:
-    - ls -lah *
   script:
     - ./gradlew assemble
-
-test:
-  image: openjdk:8
-  stage: test
-  script:
-    - ./gradlew allTests
-  artifacts:
-    reports:
-      junit: ros2rag.tests/build/test-results/test/TEST-*.xml
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index d26b5a22d5a7098f78d4bb4cbb21b00b09ace7d0..0000000000000000000000000000000000000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "relast-preprocessor"]
-	path = relast.preprocessor
-	url = ../relast-preprocessor.git
diff --git a/buildSrc/.gitignore b/buildSrc/.gitignore
deleted file mode 100644
index 567609b1234a9b8806c5a05da6c866e480aa148d..0000000000000000000000000000000000000000
--- a/buildSrc/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-build/
diff --git a/buildSrc/src/main/java/org/jastadd/relast/plugin/CompilerLocationExtension.java b/buildSrc/src/main/java/org/jastadd/relast/plugin/CompilerLocationExtension.java
deleted file mode 100644
index d28d7131797be7eac9869b9c7f0b58ed05739b14..0000000000000000000000000000000000000000
--- a/buildSrc/src/main/java/org/jastadd/relast/plugin/CompilerLocationExtension.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.jastadd.relast.plugin;
-
-import org.gradle.api.Project;
-import org.gradle.api.provider.Property;
-
-/**
- * TODO: Add description.
- *
- * @author rschoene - Initial contribution
- */
-public class CompilerLocationExtension {
-  public Property<String> compilerLocation;
-
-  public CompilerLocationExtension(Project project) {
-    compilerLocation = project.getObjects().property(String.class);
-  }
-
-  public Property<String> getCompilerLocation() {
-    return compilerLocation;
-  }
-}
diff --git a/buildSrc/src/main/java/org/jastadd/relast/plugin/RelastPlugin.java b/buildSrc/src/main/java/org/jastadd/relast/plugin/RelastPlugin.java
deleted file mode 100644
index 1ce9e963b27c2efdf53092a91335680e708e7509..0000000000000000000000000000000000000000
--- a/buildSrc/src/main/java/org/jastadd/relast/plugin/RelastPlugin.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.jastadd.relast.plugin;
-
-import org.gradle.api.Plugin;
-import org.gradle.api.Project;
-import org.gradle.api.Task;
-import org.gradle.api.tasks.TaskCollection;
-
-import java.util.Set;
-
-/**
- * Plugin for RelAst-Test.
- *
- * @author rschoene - Initial contribution
- */
-public class RelastPlugin implements Plugin<Project> {
-
-  private Task testTask;
-
-  @Override
-  public void apply(Project project) {
-    CompilerLocationExtension extension = project.getExtensions().create(
-        "relastTest",
-        CompilerLocationExtension.class,
-        project);
-
-    Set<Task> tasks = project.getTasksByName("test", false);
-    // there should be only one task "test"
-    testTask = tasks.iterator().next();
-    TaskCollection<RelastTest> relastTests = project.getTasks().withType(RelastTest.class);
-    relastTests.forEach(relastTest -> setupRelastTest(relastTest, extension.getCompilerLocation().getOrNull()));
-    relastTests.whenTaskAdded(relastTest -> setupRelastTest(relastTest, extension.getCompilerLocation().getOrNull()));
-  }
-
-  private void setupRelastTest(RelastTest relastTest, String compilerLocation) {
-    testTask.dependsOn(relastTest);
-    relastTest.setCompilerLocation(compilerLocation);
-    relastTest.setGroup("verification");
-  }
-}
diff --git a/buildSrc/src/main/java/org/jastadd/relast/plugin/RelastTest.java b/buildSrc/src/main/java/org/jastadd/relast/plugin/RelastTest.java
deleted file mode 100644
index dbda5a403e9c653a3836ead48da7a973bc0ba694..0000000000000000000000000000000000000000
--- a/buildSrc/src/main/java/org/jastadd/relast/plugin/RelastTest.java
+++ /dev/null
@@ -1,304 +0,0 @@
-package org.jastadd.relast.plugin;
-
-import org.gradle.api.DefaultTask;
-import org.gradle.api.Project;
-import org.gradle.api.file.FileCollection;
-import org.gradle.api.plugins.JavaPlugin;
-import org.gradle.api.tasks.SourceSet;
-import org.gradle.api.tasks.SourceSetContainer;
-import org.gradle.api.tasks.TaskAction;
-
-import java.io.IOException;
-import java.nio.file.*;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * RelAst Test Task
- *
- * @author rschoene - Initial contribution
- */
-@SuppressWarnings({"unused", "WeakerAccess"})
-public class RelastTest extends DefaultTask {
-  // configuration from plugin
-  private String compilerLocation;
-  // general options
-  private boolean verbose = false;
-  // pre-process options
-  private List<String> relastFiles = new ArrayList<>();
-  private boolean useJastAddNames;
-  private boolean resolverHelper;
-  private boolean writeToFile = true;
-  private String grammarName;
-  private String listClass;
-  private String jastAddList;
-  private String serializer;
-
-  // compile options
-  private boolean runJastAdd = true;
-  private String outputDir = "src/test/java-gen/";
-  private String packageName;
-  private final List<String> moreInputFiles = new ArrayList<>();
-
-  public void setCompilerLocation(String compilerLocation) {
-    this.compilerLocation = compilerLocation;
-  }
-
-  public boolean isVerbose() {
-    return verbose;
-  }
-
-  public void setVerbose(boolean verbose) {
-    this.verbose = verbose;
-  }
-
-  // pre-process options
-  public List<String> getRelastFiles() {
-    return relastFiles;
-  }
-
-  public void relastFiles(String relastFile) {
-    this.relastFiles.add(relastFile);
-  }
-
-  public void relastFiles(String[] relastFilesArray) {
-    this.relastFiles = Arrays.asList(relastFilesArray);
-  }
-
-  public boolean isUseJastAddNames() {
-    return useJastAddNames;
-  }
-
-  public void setUseJastAddNames(boolean useJastAddNames) {
-    this.useJastAddNames = useJastAddNames;
-  }
-
-  public boolean isResolverHelper() {
-    return resolverHelper;
-  }
-
-  public void setResolverHelper(boolean resolverHelper) {
-    this.resolverHelper = resolverHelper;
-  }
-
-  public boolean isWriteToFile() {
-    return writeToFile;
-  }
-
-  public void setWriteToFile(boolean writeToFile) {
-    this.writeToFile = writeToFile;
-  }
-
-  public String getGrammarName() {
-    return grammarName;
-  }
-
-  public void setGrammarName(String grammarName) {
-    this.grammarName = grammarName;
-  }
-
-  public String getListClass() {
-    return listClass;
-  }
-
-  public void setListClass(String listClass) {
-    this.listClass = listClass;
-  }
-
-  public String getJastAddList() {
-    return jastAddList;
-  }
-
-  public void setJastAddList(String jastAddList) {
-    this.jastAddList = jastAddList;
-  }
-
-  public String getSerializer() {
-    return serializer;
-  }
-
-  public void setSerializer(String serializer) {
-    this.serializer = serializer;
-  }
-
-  // compile options
-  public boolean isRunJastAdd() {
-    return runJastAdd;
-  }
-
-  public void setRunJastAdd(boolean runJastAdd) {
-    this.runJastAdd = runJastAdd;
-  }
-
-  public String getOutputDir() {
-    return outputDir;
-  }
-
-  public void setOutputDir(String outputDir) {
-    this.outputDir = outputDir;
-  }
-
-  public String getPackageName() {
-    return packageName;
-  }
-
-  public void setPackageName(String packageName) {
-    this.packageName = packageName;
-  }
-
-  public List<String> getMoreInputFiles() {
-    return moreInputFiles;
-  }
-
-  public void moreInputFiles(String f) {
-    this.moreInputFiles.add(f);
-  }
-
-  public void moreInputFiles(String[] fileArray) {
-    this.moreInputFiles.addAll(Arrays.asList(fileArray));
-  }
-
-  private boolean isSet(String option) {
-    return option != null && !option.isEmpty();
-  }
-
-  private final String[] genSuffixes = {".ast", ".jadd", "RefResolver.jadd", "ResolverStubs.jrag", "Serializer.jadd"};
-
-  private Path pathToAbsoluteProject(String filename) {
-    return Paths.get(getProject().getProjectDir().getAbsolutePath(), filename);
-  }
-
-  @TaskAction
-  void runTest() throws IOException {
-    setGroup("verification");
-    setDescription("Runs a relast test");
-    Project project = getProject();
-    String absoluteProjectPath = project.getProjectDir().getAbsolutePath();
-    if (isVerbose()) {
-      System.out.println("Running relast test in " + project.getDisplayName());
-      System.out.println("relast files: " + getRelastFiles());
-      System.out.println("Deleting files");
-    }
-    // first, delete generated files
-    List<Path> genFiles = new ArrayList<>();
-    for (String suffix : genSuffixes) {
-      genFiles.add(pathToAbsoluteProject(getGrammarName() + suffix));
-    }
-    if (isVerbose()) {
-      System.out.println("gen files: " + genFiles);
-    }
-    project.delete(deleteSpec -> {
-      deleteSpec.delete(genFiles);
-      if (isSet(getPackageName())) {
-        deleteSpec.delete(Paths.get(getOutputDir(), getPackageName()));
-      }
-    });
-    // create output directories, if not existing
-    createDirectory(pathToAbsoluteProject(getOutputDir()));
-    createDirectory(pathToAbsoluteProject(getGrammarName()).getParent());
-    if (isVerbose()) {
-      System.out.println("Pre processing, running relast");
-    }
-    // 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();
-      project.javaexec(javaExecSpec -> {
-        List<Object> args = new ArrayList<>();
-        javaExecSpec.setClasspath(runtimeClasspath);
-        if (compilerLocation != null) {
-          javaExecSpec.setMain("-jar");
-          args.add(compilerLocation);
-        } else {
-          javaExecSpec.setMain("org.jastadd.relast.compiler.Compiler");
-        }
-        args.addAll(getRelastFiles().stream().map(this::pathToAbsoluteProject).collect(Collectors.toList()));
-        args.add("--quiet");
-        if (isWriteToFile()) {
-          args.add("--file");
-        }
-        if (isUseJastAddNames()) {
-          args.add("--useJastAddNames");
-        }
-        if (isResolverHelper()) {
-          args.add("--resolverHelper");
-        }
-        if (isSet(getJastAddList())) {
-          args.add("--jastAddList=" + getJastAddList());
-        }
-        if (isSet(getListClass())) {
-          args.add("--listClass=" + getListClass());
-        }
-        if (isSet(getSerializer())) {
-          args.add("--serializer=" + getSerializer());
-        }
-        args.add("--grammarName=" + pathToAbsoluteProject(getGrammarName()));
-        if (isVerbose()) {
-          System.out.println("Start relast with args: " + args);
-        }
-        javaExecSpec.args(args);
-      }).assertNormalExitValue();
-    });
-    if (isRunJastAdd()) {
-      if (isVerbose()) {
-        System.out.println("Compile with JastAdd");
-      }
-      // check which files were actually generated
-      genFiles.removeIf(this::verboseFileNotExists);
-      // finally, compile generated files
-      project.getPlugins().withType(JavaPlugin.class, javaPlugin -> {
-        SourceSetContainer sourceSets = (SourceSetContainer) project.getProperties().get("sourceSets");
-        FileCollection runtimeClasspath = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME).getRuntimeClasspath();
-        project.javaexec(javaExecSpec -> {
-          javaExecSpec.setClasspath(runtimeClasspath);
-          javaExecSpec.setMain("org.jastadd.JastAdd");
-          List<Object> args = new ArrayList<>();
-          args.add("--o=" + pathToAbsoluteProject(getOutputDir()));
-          args.add("--package=" + getPackageName());
-          if (isSet(getJastAddList())) {
-            args.add("--List=" + getJastAddList());
-          }
-          args.addAll(genFiles);
-          args.addAll(getMoreInputFiles().stream().map(this::pathToAbsoluteProject).collect(Collectors.toList()));
-          if (isVerbose()) {
-            System.out.println("Start JastAdd with args: " + args);
-          }
-          javaExecSpec.args(args);
-        });
-      });
-    }
-  }
-
-  private String fileExtension(String filename) {
-    int indexOfDot = filename.lastIndexOf('.');
-    return indexOfDot == -1 ? filename : filename.substring(indexOfDot + 1);
-  }
-
-  private boolean verboseFileNotExists(Path path) {
-    boolean fileDoesNotExist = !Files.exists(path);
-    if (fileDoesNotExist && isVerbose()) {
-      System.out.println("Do not include " + path);
-    }
-    return fileDoesNotExist;
-  }
-
-  private void createDirectory(Path path) throws IOException {
-    if (Files.exists(path) && Files.isDirectory(path)) {
-      return;
-    }
-    if (isVerbose()) {
-      System.out.println("Creating " + path.toAbsolutePath());
-    }
-    try {
-      Files.createDirectories(path);
-    } catch (FileAlreadyExistsException e) {
-      System.err.println("Skipping creation of already existing " + path);
-    } catch (IOException e) {
-      System.err.println("Could not create output directory " + path);
-      throw e;
-    }
-  }
-
-}
diff --git a/buildSrc/src/main/resources/META-INF/gradle-plugins/org.jastadd.relast.plugin.properties b/buildSrc/src/main/resources/META-INF/gradle-plugins/org.jastadd.relast.plugin.properties
deleted file mode 100644
index 20222b8953522469ec2c0340ea3aeb5ed6294d13..0000000000000000000000000000000000000000
--- a/buildSrc/src/main/resources/META-INF/gradle-plugins/org.jastadd.relast.plugin.properties
+++ /dev/null
@@ -1 +0,0 @@
-implementation-class=org.jastadd.relast.plugin.RelastPlugin
diff --git a/libs/ragconnect.jar b/libs/ragconnect.jar
new file mode 100644
index 0000000000000000000000000000000000000000..d4f6a9a1cfcb7241b3f312ea671ee3fa0cb03148
Binary files /dev/null and b/libs/ragconnect.jar differ
diff --git a/ragconnect.base/.gitignore b/ragconnect.base/.gitignore
deleted file mode 100644
index 87b4cdd3d7c6a41502ca98703abeeb69a1d536fb..0000000000000000000000000000000000000000
--- a/ragconnect.base/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-build
-src/gen-res/
-src/gen/
-out/
-*.class
diff --git a/ragconnect.base/build.gradle b/ragconnect.base/build.gradle
deleted file mode 100644
index c986f2a61adf610a9c2e5fdc7fd20eb193a9a46a..0000000000000000000000000000000000000000
--- a/ragconnect.base/build.gradle
+++ /dev/null
@@ -1,174 +0,0 @@
-apply plugin: 'jastadd'
-apply plugin: 'application'
-
-sourceCompatibility = 1.8
-
-mainClassName = 'org.jastadd.ragconnect.compiler.Compiler'
-
-repositories {
-    jcenter()
-}
-
-buildscript {
-    repositories.jcenter()
-    dependencies {
-        classpath 'org.jastadd:jastaddgradle:1.13.3'
-    }
-}
-
-dependencies {
-    implementation project(':relast.preprocessor')
-    implementation group: 'com.github.spullara.mustache.java', name: 'compiler', version: '0.9.6'
-    implementation group: 'org.apache.logging.log4j', name: 'log4j-jul', version: '2.11.2'
-    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/ragConnectVersion.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 newVersion() {
-    doFirst {
-        def props = new Properties()
-        props['version'] = value
-        props.store(file(versionFile).newWriter(), null)
-    }
-}
-
-sourceSets {
-    main {
-        java.srcDir "src/gen/java"
-    }
-}
-
-test {
-    useJUnitPlatform()
-
-    maxHeapSize = '1G'
-}
-
-jar {
-    manifest {
-        attributes "Main-Class": 'org.jastadd.ragconnect.compiler.Compiler'
-    }
-
-    from {
-        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
-    }
-}
-
-task relast(type: JavaExec) {
-    group = 'Build'
-    main = "-jar"
-
-    args = [
-            "../libs/relast.jar",
-            "../relast.preprocessor/src/main/jastadd/RelAst.relast",
-            "./src/main/jastadd/RagConnect.relast",
-            "./src/main/jastadd/MustacheNodes.relast",
-            "./src/main/jastadd/YAML.relast",
-            "--listClass=java.util.ArrayList",
-            "--jastAddList=JastAddList",
-            "--useJastAddNames",
-            "--file",
-            "--resolverHelper",
-            "--grammarName=./src/gen/jastadd/RagConnect"
-    ]
-
-    inputs.files("../libs/relast.jar",
-            "../relast.preprocessor/src/main/jastadd/RelAst.relast",
-            "./src/main/jastadd/RagConnect.relast",
-            "./src/main/jastadd/MustacheNodes.relast",
-            "./src/main/jastadd/YAML.relast")
-    outputs.files("./src/gen/jastadd/RagConnect.ast",
-            "./src/gen/jastadd/RagConnect.jadd",
-            "./src/gen/jastadd/RagConnectRefResolver.jadd",
-            './src/gen/jastadd/RagConnectResolverStubs.jrag')
-}
-
-jastadd {
-    configureModuleBuild()
-    modules {
-        //noinspection GroovyAssignabilityCheck
-        module("RagConnect") {
-
-            java {
-                basedir ".."
-                include "relast.preprocessor/main/**/*.java"
-                include "relast.preprocessor/gen/**/*.java"
-                include "ragconnect.base/src/main/**/*.java"
-                include "ragconnect.base/src/gen/**/*.java"
-            }
-
-            jastadd {
-                basedir ".."
-                include "relast.preprocessor/src/main/jastadd/**/*.ast"
-                include "relast.preprocessor/src/main/jastadd/**/*.jadd"
-                include "relast.preprocessor/src/main/jastadd/**/*.jrag"
-                include "ragconnect.base/src/main/jastadd/**/*.ast"
-                include "ragconnect.base/src/main/jastadd/**/*.jadd"
-                include "ragconnect.base/src/main/jastadd/**/*.jrag"
-                include "ragconnect.base/src/gen/jastadd/**/*.ast"
-                include "ragconnect.base/src/gen/jastadd/**/*.jadd"
-                include "ragconnect.base/src/gen/jastadd/**/*.jrag"
-            }
-
-            scanner {
-                basedir ".."
-                include "ragconnect.base/src/main/jastadd/scanner/Header.flex",               [-5]
-                include "relast.preprocessor/src/main/jastadd/scanner/Preamble.flex",      [-4]
-                include "relast.preprocessor/src/main/jastadd/scanner/Macros.flex",        [-3]
-                include "ragconnect.base/src/main/jastadd/scanner/Macros.flex",               [-3]
-                include "relast.preprocessor/src/main/jastadd/scanner/RulesPreamble.flex", [-2]
-                include "ragconnect.base/src/main/jastadd/scanner/MappingContent.flex",       [-1]
-                include "ragconnect.base/src/main/jastadd/scanner/Keywords.flex"
-                include "relast.preprocessor/src/main/jastadd/scanner/Keywords.flex"
-                include "relast.preprocessor/src/main/jastadd/scanner/Symbols.flex",        [1]
-                include "relast.preprocessor/src/main/jastadd/scanner/RulesPostamble.flex", [2]
-            }
-
-            parser {
-                basedir ".."
-                include "ragconnect.base/src/main/jastadd/parser/Preamble.parser"
-                include "ragconnect.base/src/main/jastadd/parser/RagConnect.parser"
-                include "relast.preprocessor/src/main/jastadd/parser/RelAst.parser"
-            }
-        }
-    }
-
-    cleanGen.doFirst {
-        delete "src/gen/java/org"
-        delete "src/gen-res/BuildInfo.properties"
-    }
-
-    preprocessParser.doFirst {
-
-        args += ["--no-beaver-symbol"]
-
-    }
-
-    module = "RagConnect"
-
-    astPackage = 'org.jastadd.ragconnect.ast'
-
-    parser.name = 'RagConnectParser'
-
-    genDir = 'src/gen/java'
-
-    buildInfoDir = 'src/gen-res'
-
-    scanner.genDir = "src/gen/java/org/jastadd/ragconnect/scanner"
-    parser.genDir = "src/gen/java/org/jastadd/ragconnect/parser"
-
-    jastaddOptions = ["--lineColumnNumbers", "--List=JastAddList", "--safeLazy", "--visitCheck=true", "--rewrite=cnta", "--cache=all"]
-}
-
-generateAst.dependsOn relast
diff --git a/ragconnect.base/src/main/jastadd/Analysis.jrag b/ragconnect.base/src/main/jastadd/Analysis.jrag
deleted file mode 100644
index b62399960f34a4b8c23a8d23762ec195491ce4e3..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/Analysis.jrag
+++ /dev/null
@@ -1,57 +0,0 @@
-aspect Analysis {
-  // --- lookupTokenEndpointDefinition ---
-  inh java.util.List<TokenEndpointDefinition> TokenEndpointDefinition.lookupTokenEndpointDefinitions(TokenComponent token);
-  eq RagConnect.getEndpointDefinition().lookupTokenEndpointDefinitions(TokenComponent token) = lookupTokenEndpointDefinitions(token);
-  syn java.util.List<TokenEndpointDefinition> RagConnect.lookupTokenEndpointDefinitions(TokenComponent token) {
-    java.util.List<TokenEndpointDefinition> result = new java.util.ArrayList<>();
-    for (EndpointDefinition def : getEndpointDefinitionList()) {
-      if (def.isTokenEndpointDefinition() && def.asTokenEndpointDefinition().getToken().equals(token)) {
-        result.add(def.asTokenEndpointDefinition());
-      }
-    }
-    return result;
-  }
-
-  // --- lookupDependencyDefinition ---
-  inh DependencyDefinition DependencyDefinition.lookupDependencyDefinition(TypeDecl source, String id);
-  eq RagConnect.getDependencyDefinition().lookupDependencyDefinition(TypeDecl source, String id) {
-    for (DependencyDefinition def : getDependencyDefinitionList()) {
-      if (def.getID().equals(id) && def.getSource().containingTypeDecl().equals(source)) {
-        return def;
-      }
-    }
-    return null;
-  }
-
-  // --- isAlreadyDefined ---
-  syn boolean TokenEndpointDefinition.isAlreadyDefined() = lookupTokenEndpointDefinitions(getToken()).size() > 1;
-  syn boolean DependencyDefinition.isAlreadyDefined() = lookupDependencyDefinition(getSource().containingTypeDecl(), getID()) != this;
-
-  syn boolean MappingDefinitionType.assignableTo(JavaTypeUse target);
-  eq JavaMappingDefinitionType.assignableTo(JavaTypeUse target) = getType().assignableTo(target);
-  eq JavaArrayMappingDefinitionType.assignableTo(JavaTypeUse target) {
-    if (!target.getName().endsWith("[]")) { return false; }
-    return getType().assignableTo(new SimpleJavaTypeUse(target.getName().replace("[]", "")));
-  }
-  syn boolean JavaTypeUse.assignableTo(JavaTypeUse target) {
-    // target var = this;
-    return target.primitivePrettyPrint().equals(this.primitivePrettyPrint());
-  }
-  syn String JavaTypeUse.primitivePrettyPrint() {
-    switch(getName()) {
-      case "int":
-      case "Integer": return "int";
-      case "short":
-      case "Short": return "short";
-      case "long":
-      case "Long": return "long";
-      case "float":
-      case "Float": return "float";
-      case "double":
-      case "Double": return "double";
-      case "char":
-      case "Character": return "char";
-      default: return getName();
-    }
-  }
-}
diff --git a/ragconnect.base/src/main/jastadd/Errors.jrag b/ragconnect.base/src/main/jastadd/Errors.jrag
deleted file mode 100644
index fe2fcd59efd365174ca2803affebc34819cf3d7e..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/Errors.jrag
+++ /dev/null
@@ -1,121 +0,0 @@
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.LinkedList;
-
-aspect Errors {
-  coll Set<ErrorMessage> RagConnect.errors()
-    [new TreeSet<ErrorMessage>()]
-    root RagConnect;
-
-    ReceiveTokenEndpointDefinition contributes error("Receive definition already defined for " + getToken().getName())
-      when isAlreadyDefined()
-      to RagConnect.errors();
-
-    ReceiveTokenEndpointDefinition contributes error("Receiving target token must not be an NTA token!")
-      when getToken().getNTA()
-      to RagConnect.errors();
-
-    // if first mapping is null, then suitableDefaultMapping() == null
-    ReceiveTokenEndpointDefinition contributes error("No suitable default mapping found for type " +
-      ((getMappingList().isEmpty())
-        ? getToken().effectiveJavaTypeUse().prettyPrint()
-        : getMappingList().get(0).getFromType().prettyPrint()))
-      when effectiveMappings().get(0) == null
-      to RagConnect.errors();
-
-    ReceiveTokenEndpointDefinition contributes error("to-type of last mapping (" + effectiveMappings().get(effectiveMappings().size() - 1).getToType().prettyPrint() + ") not assignable to type of the Token (" + getToken().effectiveJavaTypeUse().prettyPrint() + ")!")
-      when !effectiveMappings().get(effectiveMappings().size() - 1).getToType().assignableTo(
-          getToken().effectiveJavaTypeUse())
-      to RagConnect.errors();
-
-    SendTokenEndpointDefinition contributes error("Sending target token must be an NTA token!")
-      when !getToken().getNTA()
-      to RagConnect.errors();
-
-    SendTokenEndpointDefinition contributes error("Send definition already defined for " + getToken().getName())
-      when isAlreadyDefined()
-      to RagConnect.errors();
-
-    DependencyDefinition contributes error("Dependency definition already defined for " + getSource().containingTypeDecl().getName() + " with name " + getID())
-      when isAlreadyDefined()
-      to RagConnect.errors();
-
-    DependencyDefinition contributes error("The name of a dependency definition must not be equal to a list-node on the source")
-      when isAlreadyDefinedAsList()
-      to RagConnect.errors();
-
-    DependencyDefinition contributes error("There must be a send endpoint definition targeting " + getSource().parentTypeypeAndName() + " for dependency definition " + getID())
-      when targetEndpointDefinition() == null
-      to RagConnect.errors();
-}
-
-aspect ErrorHelpers {
-  syn boolean DependencyDefinition.isAlreadyDefinedAsList() {
-    for (Component comp : getSource().containingTypeDecl().getComponentList()) {
-      if (comp.isListComponent() && comp.getName().equals(this.getID())) {
-        return true;
-      }
-    }
-    return false;
-  }
-  syn String TokenComponent.parentTypeypeAndName() = containingTypeDecl().getName() + "." + getName();
-}
-
-aspect ErrorMessage {
-  public class ErrorMessage implements Comparable<ErrorMessage> {
-    private final ASTNode node;
-    private final String filename;
-    private final int line;
-    private final int col;
-    private final String message;
-
-    public ErrorMessage(ASTNode node, String message) {
-      this.node = node;
-      this.filename = node.containedFileName();
-      this.line = node.getStartLine();
-      this.col = node.getStartColumn();
-      this.message = message;
-    }
-
-    public ASTNode getNode() {
-      return node;
-    }
-    public int getLine() {
-      return line;
-    }
-    public int getCol() {
-      return col;
-    }
-    public String getMessage() {
-      return message;
-    }
-
-    public String toString() {
-      return filename + " Line " + line + ", column " + col + ": " + message;
-    }
-
-    @Override
-    public int compareTo(ErrorMessage err) {
-      int n = filename.compareTo(err.filename);
-      if (n != 0) {
-        return n;
-      }
-
-      n = line - err.line;
-      if (n != 0) {
-        return n;
-      }
-
-      n = col-err.col;
-      if (n != 0) {
-        return n;
-      }
-
-      return message.compareTo(err.message);
-    }
-  }
-
-  protected ErrorMessage ASTNode.error(String message) {
-    return new ErrorMessage(this, message);
-  }
-}
diff --git a/ragconnect.base/src/main/jastadd/MustacheNodes.relast b/ragconnect.base/src/main/jastadd/MustacheNodes.relast
deleted file mode 100644
index 62ecdb6166a783e125cefef2826d550b73ab9e1b..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/MustacheNodes.relast
+++ /dev/null
@@ -1,19 +0,0 @@
-MRagConnect ::= ReceiveDefinition:MReceiveDefinition* SendDefinition:MSendDefinition* MappingDefinition:MMappingDefinition* DependencyDefinition:MDependencyDefinition* RootTypeComponent:MTypeComponent* TokenComponent:MTokenComponent*;
-abstract MEndpointDefinition ::= InnerMappingDefinition:MInnerMappingDefinition*;
-MReceiveDefinition : MEndpointDefinition;
-MSendDefinition : MEndpointDefinition;
-MMappingDefinition;
-MInnerMappingDefinition;
-MDependencyDefinition;
-MTypeComponent;
-MTokenComponent;
-
-rel MRagConnect.RagConnect -> RagConnect;
-rel MInnerMappingDefinition.MMappingDefinition -> MMappingDefinition;
-rel MReceiveDefinition.ReceiveTokenEndpointDefinition -> ReceiveTokenEndpointDefinition;
-rel MSendDefinition.SendTokenEndpointDefinition -> SendTokenEndpointDefinition;
-rel MMappingDefinition.MappingDefinition -> MappingDefinition;
-rel MDependencyDefinition.DependencyDefinition -> DependencyDefinition;
-rel MTypeComponent.TypeComponent -> TypeComponent;
-rel MTokenComponent.TokenComponent -> TokenComponent;
-rel MTokenComponent.DependencyDefinition* -> MDependencyDefinition;
diff --git a/ragconnect.base/src/main/jastadd/NameResolution.jrag b/ragconnect.base/src/main/jastadd/NameResolution.jrag
deleted file mode 100644
index f282ba55983feeae814e12823ff31f1d6480b6a8..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/NameResolution.jrag
+++ /dev/null
@@ -1,14 +0,0 @@
-aspect NameResolution {
-
-  refine RefResolverStubs eq EndpointDefinition.resolveMappingByToken(String id, int position) {
-    // return a MappingDefinition
-    for (MappingDefinition mappingDefinition : ragconnect().getMappingDefinitionList()) {
-      if (mappingDefinition.getID().equals(id)) {
-        return mappingDefinition;
-      }
-    }
-    System.err.println("Could not resolve MappingDefinition '" + id + "'.");
-    return null;
-  }
-
-}
diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag
deleted file mode 100644
index 752fc36aea4c59348874c1a08134696a9543b6cb..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/Navigation.jrag
+++ /dev/null
@@ -1,60 +0,0 @@
-aspect Navigation {
-
-  // --- program ---
-  eq RagConnect.getChild().program() = getProgram();
-  eq MRagConnect.getChild().program() = getRagConnect().program();
-
-  // --- ragconnect ---
-  inh RagConnect ASTNode.ragconnect();
-  eq RagConnect.getChild().ragconnect() = this;
-  eq MRagConnect.getChild().ragconnect() = getRagConnect();
-
-  // --- containedFile
-  eq Grammar.getChild().containedFile() = null;
-  eq RagConnect.getChild().containedFile() = null;
-  eq MRagConnect.getChild().containedFile() = null;
-
-  // --- containedFileName ---
-  eq Grammar.getChild().containedFileName() = null;  // should be in PP
-  eq RagConnect.getChild().containedFileName() = getFileName();
-  eq MRagConnect.getChild().containedFileName() = null;
-
-  // --- isTokenEndpointDefinition ---
-  syn boolean EndpointDefinition.isTokenEndpointDefinition() = false;
-  eq TokenEndpointDefinition.isTokenEndpointDefinition() = true;
-
-  // --- asTokenEndpointDefinition ---
-  syn TokenEndpointDefinition EndpointDefinition.asTokenEndpointDefinition() = null;
-  eq TokenEndpointDefinition.asTokenEndpointDefinition() = this;
-
-  // --- isSendTokenEndpointDefinition ---
-  syn boolean EndpointDefinition.isSendTokenEndpointDefinition() = false;
-  eq SendTokenEndpointDefinition.isSendTokenEndpointDefinition() = true;
-
-  // --- asSendTokenEndpointDefinition ---
-  syn SendTokenEndpointDefinition EndpointDefinition.asSendTokenEndpointDefinition() = null;
-  eq SendTokenEndpointDefinition.asSendTokenEndpointDefinition() = this;
-
-  // --- asReceiveTokenEndpointDefinition ---
-  syn ReceiveTokenEndpointDefinition EndpointDefinition.asReceiveTokenEndpointDefinition() = null;
-  eq ReceiveTokenEndpointDefinition.asReceiveTokenEndpointDefinition() = this;
-
-  // --- targetEndpointDefinition ---
-  syn SendTokenEndpointDefinition DependencyDefinition.targetEndpointDefinition() {
-    // resolve definition in here, as we do not need resolveMethod in any other place (yet)
-    for (EndpointDefinition endpointDefinition : ragconnect().getEndpointDefinitionList()) {
-      if (endpointDefinition.isSendTokenEndpointDefinition() &&
-          endpointDefinition.asSendTokenEndpointDefinition().getToken().equals(this.getTarget())) {
-        return endpointDefinition.asSendTokenEndpointDefinition();
-      }
-    }
-    return null;
-  }
-
-  // --- effectiveJavaTypeUse (should be in preprocessor) ---
-  syn lazy JavaTypeUse TokenComponent.effectiveJavaTypeUse() = hasJavaTypeUse() ? getJavaTypeUse() : new SimpleJavaTypeUse("String");
-
-  // --- isDefaultMappingDefinition ---
-  syn boolean MappingDefinition.isDefaultMappingDefinition() = false;
-  eq DefaultMappingDefinition.isDefaultMappingDefinition() = true;
-}
diff --git a/ragconnect.base/src/main/jastadd/Printing.jrag b/ragconnect.base/src/main/jastadd/Printing.jrag
deleted file mode 100644
index 74607aeb7737e1e43c9565b799693889a648a9df..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/Printing.jrag
+++ /dev/null
@@ -1,75 +0,0 @@
-aspect Printing {
-  String ASTNode.PRINT_INDENT = "  ";
-
-  syn String MappingDefinitionType.prettyPrint();
-  eq JavaMappingDefinitionType.prettyPrint() = getType().getName();
-  eq JavaArrayMappingDefinitionType.prettyPrint() = getType().getName() + "[]";
-
-  syn String JavaTypeUse.prettyPrint() {
-    StringBuilder sb = new StringBuilder();
-    generateAbstractGrammar(sb);
-    return sb.toString();
-  }
-
-  syn String Document.prettyPrint() {
-    StringBuilder sb = new StringBuilder();
-    sb.append("# RagConnect created at ").append(java.time.Instant.now()).append("\n");
-    for (ComplexElement element : getComplexElementList()) {
-      element.prettyPrint(sb, false, "");
-    }
-    if (sb.charAt(sb.length() - 1) != '\n') {
-      sb.append("\n");
-    }
-    return sb.toString();
-  }
-  syn StringBuilder Element.prettyPrint(StringBuilder sb, boolean printIndent, String indent);
-  eq ValueElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
-    sb.append(getValue());
-    return sb;
-  }
-  eq StringElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
-    sb.append("\"").append(getValue()).append("\"");
-    return sb;
-  }
-  eq ListElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
-    if (isEmpty()) {
-      sb.append("[]");
-    } else {
-      for (Element element : getElementList()) {
-        sb.append(indent).append("- ");
-        element.prettyPrint(sb, false, indent + PRINT_INDENT);
-        sb.append("\n");
-      }
-      // delete last newline
-      sb.deleteCharAt(sb.length() - 1);
-    }
-    return sb;
-  }
-  eq KeyValuePair.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
-    if (printIndent) sb.append(indent);
-    sb.append(getKey()).append(": ");
-    if (getValue().isComplex() && !getValue().isEmpty()) {
-      sb.append("\n");
-      getValue().prettyPrint(sb, true, indent + PRINT_INDENT);  //);
-    } else {
-      getValue().prettyPrint(sb, false, indent);
-    }
-    return sb;
-  }
-  eq MappingElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
-    if (isEmpty()) {
-      sb.append("{}");
-    } else {
-      boolean first = true;
-      for (KeyValuePair pair : getKeyValuePairList()) {
-        if (!first || printIndent) sb.append(indent);
-        first = false;
-        pair.prettyPrint(sb, false, indent);  // + PRINT_INDENT
-        sb.append("\n");
-      }
-      // delete last newline
-      sb.deleteCharAt(sb.length() - 1);
-    }
-    return sb;
-  }
-}
diff --git a/ragconnect.base/src/main/jastadd/RagConnect.relast b/ragconnect.base/src/main/jastadd/RagConnect.relast
deleted file mode 100644
index accc617714ff6bdd24a22831ea84e5d93e6a15b8..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/RagConnect.relast
+++ /dev/null
@@ -1,21 +0,0 @@
-RagConnect ::= EndpointDefinition* DependencyDefinition* MappingDefinition* Program <FileName> ;
-
-abstract EndpointDefinition ::= <AlwaysApply:boolean> ;
-
-rel EndpointDefinition.Mapping* <-> MappingDefinition.UsedAt*;
-
-abstract TokenEndpointDefinition : EndpointDefinition;
-rel TokenEndpointDefinition.Token -> TokenComponent;
-
-ReceiveTokenEndpointDefinition : TokenEndpointDefinition;
-SendTokenEndpointDefinition : TokenEndpointDefinition;
-
-DependencyDefinition ::= <ID>;
-rel DependencyDefinition.Source <-> TokenComponent.DependencySourceDefinition*;
-rel DependencyDefinition.Target -> TokenComponent;
-
-MappingDefinition ::= <ID> FromType:MappingDefinitionType <FromVariableName> ToType:MappingDefinitionType <Content> ;
-abstract MappingDefinitionType ::= ;
-JavaMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ;
-JavaArrayMappingDefinitionType : MappingDefinitionType ::= Type:JavaTypeUse ;
-DefaultMappingDefinition : MappingDefinition ;
diff --git a/ragconnect.base/src/main/jastadd/Util.jadd b/ragconnect.base/src/main/jastadd/Util.jadd
deleted file mode 100644
index 3b59b13c53a8d0e1ca2a05feba43294797a4577e..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/Util.jadd
+++ /dev/null
@@ -1,5 +0,0 @@
-aspect Util {
-  static String ASTNode.capitalize(String s) {
-    return Character.toUpperCase(s.charAt(0)) + s.substring(1);
-  }
-}
diff --git a/ragconnect.base/src/main/jastadd/YAML.jrag b/ragconnect.base/src/main/jastadd/YAML.jrag
deleted file mode 100644
index 93dd0f34b7b7b0505cf0970b6541fa3ae5bee7fa..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/YAML.jrag
+++ /dev/null
@@ -1,31 +0,0 @@
-aspect Navigation {
-  eq Document.getChild().program() = null;
-  eq Document.getChild().ragconnect() = null;
-  eq Document.getChild().containedFile() = null;
-  eq Document.getChild().containedFileName() = getFileName();
-
-  syn boolean Element.isComplex() = false;
-  eq ComplexElement.isComplex() = true;
-
-  syn boolean Element.isEmpty() = false;
-  eq MappingElement.isEmpty() = getNumKeyValuePair() == 0;
-  eq ListElement.isEmpty() = getNumElement() == 0;
-}
-
-aspect Helper {
-  public static ValueElement ValueElement.of(int value) {
-    return new ValueElement(String.valueOf(value));
-  }
-  public static ValueElement ValueElement.of(boolean value) {
-    return new ValueElement(String.valueOf(value));
-  }
-  public static ValueElement ValueElement.of(String value) {
-    return new ValueElement(value);
-  }
-  public static StringElement StringElement.of(String value) {
-    return new StringElement(value);
-  }
-  public void MappingElement.addKeyValuePair(String key, Element value) {
-    addKeyValuePair(new KeyValuePair(key, value));
-  }
-}
diff --git a/ragconnect.base/src/main/jastadd/YAML.relast b/ragconnect.base/src/main/jastadd/YAML.relast
deleted file mode 100644
index 94f4ab20fdc3838348bd53b812b3d1477cae3558..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/YAML.relast
+++ /dev/null
@@ -1,9 +0,0 @@
-Document ::= <FileName> ComplexElement* ;
-abstract Element ;
-abstract ComplexElement : Element ;
-MappingElement : ComplexElement ::= KeyValuePair* ;
-KeyValuePair : ComplexElement ::= <Key> Value:Element ;
-ListElement : ComplexElement ::= Element* ;
-abstract SimpleElement : Element ;
-ValueElement : SimpleElement ::= <Value> ;
-StringElement : SimpleElement ::= <Value> ;
diff --git a/ragconnect.base/src/main/jastadd/backend/Configuration.jadd b/ragconnect.base/src/main/jastadd/backend/Configuration.jadd
deleted file mode 100644
index 8d3b16c3f99014408c6aefa5655201d222c3d892..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/backend/Configuration.jadd
+++ /dev/null
@@ -1,7 +0,0 @@
-aspect Configuration {
-  public static boolean ASTNode.loggingEnabledForReads = false;
-  public static boolean ASTNode.loggingEnabledForWrites = false;
-  public static TypeDecl ASTNode.rootNode;
-  public static boolean ASTNode.usesMqtt;
-  public static boolean ASTNode.usesRest;
-}
diff --git a/ragconnect.base/src/main/jastadd/backend/Generation.jadd b/ragconnect.base/src/main/jastadd/backend/Generation.jadd
deleted file mode 100644
index 4b8d357e82e82eb8454451978589434f1ef44505..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/backend/Generation.jadd
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
-Design considerations
-- InnerMappingDefinition needed for iteration attribute (first, last) - not easily possible with list-relation
-*/
-
-aspect AttributesForMustache {
-  // --- MRagConnect ---
-  eq MRagConnect.getRootTypeComponent(int i).isFirst() = i == 0;
-
-  syn String MRagConnect.closeMethod() = "ragconnectCloseConnections";
-  syn String MRagConnect.mqttHandlerAttribute() = "_mqttHandler";
-  syn String MRagConnect.mqttHandlerField() = "_mqttHandler";
-  syn String MRagConnect.mqttSetupWaitUntilReadyMethod() = "ragconnectSetupMqttWaitUntilReady";
-
-  syn String MRagConnect.restHandlerAttribute() = "_restHandler";
-  syn String MRagConnect.restHandlerField() = "_restHandler";
-
-  // --- MEndpointDefinition ---
-  syn String MEndpointDefinition.preemptiveExpectedValue();
-  syn String MEndpointDefinition.preemptiveReturn();
-  syn TokenEndpointDefinition MEndpointDefinition.endpointDef();
-  syn String MEndpointDefinition.firstInputVarName();
-
-  eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1;
-  eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : getInnerMappingDefinition(i - 1).outputVarName();
-
-  syn String MEndpointDefinition.connectParameterName() = "uriString";
-  syn String MEndpointDefinition.connectMethod() = "connect" + tokenName();
-  syn TokenComponent MEndpointDefinition.token() = endpointDef().getToken();
-  syn boolean MEndpointDefinition.alwaysApply() = endpointDef().getAlwaysApply();
-  syn String MEndpointDefinition.parentTypeName() = token().containingTypeDecl().getName();
-  syn String MEndpointDefinition.tokenName() = token().getName();
-  syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1);
-  syn String MEndpointDefinition.lastDefinitionToType() = lastDefinition().toType();
-  syn String MEndpointDefinition.lastResult() = lastDefinition().outputVarName();
-  syn String MEndpointDefinition.condition() {
-    if (lastDefinition().mappingDef().getToType().isArray()) {
-      return "java.util.Arrays.equals(" + preemptiveExpectedValue() + ", " + lastResult() + ")";
-    }
-    if (token().isPrimitiveType() && lastDefinition().mappingDef().getToType().isPrimitiveType()) {
-      return preemptiveExpectedValue() + " == " + lastResult();
-    }
-    if (lastDefinition().mappingDef().isDefaultMappingDefinition()) {
-      return preemptiveExpectedValue() + " != null && " + preemptiveExpectedValue() + ".equals(" + lastResult() + ")";
-    }
-    return preemptiveExpectedValue() + " != null ? " + preemptiveExpectedValue() + ".equals(" + lastResult() + ") : " + lastResult() + " == null";
-  }
-
-  // --- MInnerMappingDefinition ---
-  inh boolean MInnerMappingDefinition.isLast();
-  inh String MInnerMappingDefinition.inputVarName();
-  syn String MInnerMappingDefinition.toType() = mappingDef().getToType().prettyPrint();
-  syn String MInnerMappingDefinition.methodName() = getMMappingDefinition().methodName();
-  syn MappingDefinition MInnerMappingDefinition.mappingDef() = getMMappingDefinition().getMappingDefinition();
-  syn String MInnerMappingDefinition.outputVarName() = "result" + methodName();  // we do not need "_" in between here, because methodName begins with one
-
-  // --- MReceiveDefinition ---
-  eq MReceiveDefinition.preemptiveExpectedValue() = "get" + tokenName() + "()";
-  eq MReceiveDefinition.preemptiveReturn() = "return;";
-  eq MReceiveDefinition.endpointDef() = getReceiveTokenEndpointDefinition();
-  eq MReceiveDefinition.firstInputVarName() = "message";
-
-  // --- MSendDefinition ---
-  eq MSendDefinition.preemptiveExpectedValue() = lastValue();
-  eq MSendDefinition.preemptiveReturn() = "return false;";
-  eq MSendDefinition.endpointDef() = getSendTokenEndpointDefinition();
-  eq MSendDefinition.firstInputVarName() = "get" + tokenName() + "()";
-
-  syn String MSendDefinition.sender() = "_sender_" + tokenName();
-  syn String MSendDefinition.lastValue() = "_lastValue" + tokenName();
-  syn String MSendDefinition.updateMethod() = "_update_" + tokenName();
-  syn String MSendDefinition.writeMethod() = "_writeLastValue_" + tokenName();
-  syn String MSendDefinition.tokenResetMethod() = "get" + tokenName() + "_reset";
-
-  // --- MMappingDefinition ---
-  syn String MMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint();
-  syn String MMappingDefinition.methodName() = "_apply_" + getMappingDefinition().getID();
-  syn String MMappingDefinition.fromType() = getMappingDefinition().getFromType().prettyPrint();
-  syn String MMappingDefinition.fromVariableName() = getMappingDefinition().getFromVariableName();
-  syn String MMappingDefinition.content() = getMappingDefinition().getContent();
-
-  // --- MDependencyDefinition ---
-  syn String MDependencyDefinition.targetParentTypeName() = getDependencyDefinition().getTarget().containingTypeDecl().getName();
-  syn String MDependencyDefinition.dependencyMethod() = "add" + capitalize(getDependencyDefinition().getID());
-  syn String MDependencyDefinition.sourceParentTypeName() = getDependencyDefinition().getSource().containingTypeDecl().getName();
-  syn String MDependencyDefinition.internalRelationPrefix() = "_internal_" + getDependencyDefinition().getID();
-  syn nta MSendDefinition MDependencyDefinition.targetEndpointDefinition() {
-    return getDependencyDefinition().targetEndpointDefinition().toMustache();
-  }
-
-  // --- MTypeComponent ---
-  syn String MTypeComponent.name() = getTypeComponent().getName();
-  inh boolean MTypeComponent.isFirst();
-
-  // --- MTokenComponent ---
-  syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName();
-  syn String MTokenComponent.name() = getTokenComponent().getName();
-  syn String MTokenComponent.javaType() = getTokenComponent().effectiveJavaTypeUse().prettyPrint();
-  syn String MTokenComponent.internalName() = getTokenComponent().getDependencySourceDefinitionList().isEmpty() ? externalName() : "_internal_" + name();
-  syn String MTokenComponent.externalName() = name();
-
-  // --- toMustache ---
-  syn lazy MRagConnect RagConnect.toMustache() {
-    MRagConnect result = new MRagConnect();
-    result.setRagConnect(this);
-    for (EndpointDefinition def : getEndpointDefinitionList()) {
-      if (def.isSendTokenEndpointDefinition()) {
-        SendTokenEndpointDefinition sendDef = def.asSendTokenEndpointDefinition();
-        result.addSendDefinition(sendDef.toMustache());
-      } else {
-        result.addReceiveDefinition(def.asReceiveTokenEndpointDefinition().toMustache());
-      }
-    }
-    for (MappingDefinition def : allMappingDefinitions()) {
-      result.addMappingDefinition(def.toMustache());
-    }
-    for (DependencyDefinition def : getDependencyDefinitionList()) {
-      result.addDependencyDefinition(def.toMustache());
-    }
-    for (TokenComponent token : getProgram().allTokenComponents()) {
-      if (!token.getDependencySourceDefinitionList().isEmpty()) {
-        result.addTokenComponent(token.toMustache());
-      }
-    }
-    for (Component child : rootNode.getComponentList()) {
-      if (child.isTypeComponent()) {
-        result.addRootTypeComponent(child.asTypeComponent().toMustache());
-      }
-    }
-    return result;
-  }
-
-  protected void MEndpointDefinition.addInnerMappings() {
-    for (MappingDefinition def : endpointDef().effectiveMappings()) {
-      MInnerMappingDefinition inner = new MInnerMappingDefinition();
-      inner.setMMappingDefinition(def.toMustache());
-      addInnerMappingDefinition(inner);
-    }
-  }
-
-  syn lazy MReceiveDefinition ReceiveTokenEndpointDefinition.toMustache() {
-    MReceiveDefinition result = new MReceiveDefinition();
-    result.setReceiveTokenEndpointDefinition(this);
-    result.addInnerMappings();
-    return result;
-  }
-
-  syn lazy MSendDefinition SendTokenEndpointDefinition.toMustache() {
-    MSendDefinition result = new MSendDefinition();
-    result.setSendTokenEndpointDefinition(this);
-    result.addInnerMappings();
-    return result;
-  }
-
-  syn lazy MMappingDefinition MappingDefinition.toMustache() {
-    MMappingDefinition result = new MMappingDefinition();
-    result.setMappingDefinition(this);
-    return result;
-  }
-
-  syn lazy MDependencyDefinition DependencyDefinition.toMustache() {
-    MDependencyDefinition result = new MDependencyDefinition();
-    result.setDependencyDefinition(this);
-    return result;
-  }
-
-  syn lazy MTypeComponent TypeComponent.toMustache() {
-    MTypeComponent result = new MTypeComponent();
-    result.setTypeComponent(this);
-    return result;
-  }
-
-  syn lazy MTokenComponent TokenComponent.toMustache() {
-    MTokenComponent result = new MTokenComponent();
-    result.setTokenComponent(this);
-    for (DependencyDefinition def : getDependencySourceDefinitionList()) {
-      result.addDependencyDefinition(def.toMustache());
-    }
-    return result;
-  }
-}
-
-aspect AspectGeneration {
-  // --- rootNodeName ---
-  syn String ASTNode.rootNodeName() = rootNode.getName();
-
-  public String RagConnect.generateAspect(String rootNodeName) {
-    rootNode = getProgram().resolveTypeDecl(rootNodeName);
-    return toMustache().generateAspect();
-  }
-
-  public String MRagConnect.generateAspect() {
-    StringBuilder sb = new StringBuilder();
-    com.github.mustachejava.reflect.ReflectionObjectHandler roh = new com.github.mustachejava.reflect.ReflectionObjectHandler() {
-      @Override
-      public com.github.mustachejava.Binding createBinding(String name, final com.github.mustachejava.TemplateContext tc, com.github.mustachejava.Code code) {
-        return new com.github.mustachejava.reflect.GuardedBinding(this, name, tc, code) {
-          @Override
-          protected synchronized com.github.mustachejava.util.Wrapper getWrapper(String name, java.util.List<Object> scopes) {
-            com.github.mustachejava.util.Wrapper wrapper = super.getWrapper(name, scopes);
-            if (wrapper instanceof com.github.mustachejava.reflect.MissingWrapper) {
-              throw new com.github.mustachejava.MustacheException(name + " not found in " + tc);
-            }
-            return wrapper;
-          }
-        };
-      }
-    };
-    com.github.mustachejava.DefaultMustacheFactory mf = new com.github.mustachejava.DefaultMustacheFactory();
-    mf.setObjectHandler(roh);
-    com.github.mustachejava.Mustache m = mf.compile("ragconnect.mustache");
-    m.execute(new java.io.PrintWriter(new org.jastadd.ragconnect.compiler.AppendableWriter(sb)), this);
-    return sb.toString();
-  }
-}
-
-aspect RelationGeneration {
-  syn java.util.List<Relation> RagConnect.additionalRelations() {
-    java.util.List<Relation> result = new java.util.ArrayList<>();
-    for (DependencyDefinition dd : getDependencyDefinitionList()) {
-      result.add(dd.getRelationToCreate());
-    }
-    return result;
-  }
-
-  syn nta Relation DependencyDefinition.getRelationToCreate() {
-    String internalRelationPrefix = toMustache().internalRelationPrefix();
-    BidirectionalRelation result = new BidirectionalRelation();
-    NavigableRole left = new ListRole(internalRelationPrefix + "Source");
-    left.setType(getTarget().containingTypeDecl());
-    NavigableRole right = new ListRole(internalRelationPrefix + "Target");
-    right.setType(getSource().containingTypeDecl());
-    result.setLeft(left);
-    result.setRight(right);
-    result.addComment(new WhitespaceComment("\n"));
-    return result;
-  }
-}
-
-aspect GrammarExtension {
-  refine BackendAbstractGrammar public void TokenComponent.generateAbstractGrammar(StringBuilder b) {
-    if (getNTA()) {
-      b.append("/");
-    }
-    b.append("<");
-    if (!getName().equals("")) {
-      b.append(toMustache().internalName()).append(":");
-    }
-    effectiveJavaTypeUse().generateAbstractGrammar(b);
-    b.append(">");
-    if (getNTA()) {
-      b.append("/");
-    }
-  }
-}
diff --git a/ragconnect.base/src/main/jastadd/backend/Mappings.jrag b/ragconnect.base/src/main/jastadd/backend/Mappings.jrag
deleted file mode 100644
index 7aa82d304079592d605997484d1348a3d3681875..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/backend/Mappings.jrag
+++ /dev/null
@@ -1,270 +0,0 @@
-aspect DefaultMappings {
-
-  private String RagConnect.baseDefaultMappingTypeNamePart(String typeName) {
-    return capitalize(typeName).replace("[]", "s");
-  }
-
-  private MappingDefinitionType RagConnect.baseDefaultMappingTypeFromName(String typeName) {
-    return typeName.endsWith("[]") ?
-        new JavaArrayMappingDefinitionType(new SimpleJavaTypeUse(typeName.replace("[]", ""))) :
-        new JavaMappingDefinitionType(new SimpleJavaTypeUse(typeName));
-  }
-
-  private DefaultMappingDefinition RagConnect.baseDefaultMappingDefinition(String fromTypeName, String toTypeName, String content) {
-    DefaultMappingDefinition result = new DefaultMappingDefinition();
-    result.setID("_Default" + baseDefaultMappingTypeNamePart(fromTypeName) + "To" + baseDefaultMappingTypeNamePart(toTypeName) + "Mapping");
-    result.setFromType(baseDefaultMappingTypeFromName(fromTypeName));
-    result.setFromVariableName("input");
-    result.setToType(baseDefaultMappingTypeFromName(toTypeName));
-    result.setContent(content);
-    return result;
-  }
-
-  syn nta DefaultMappingDefinition RagConnect.defaultBytesToIntMapping() = baseDefaultMappingDefinition(
-      "byte[]", "int", "return java.nio.ByteBuffer.wrap(input).getInt();");
-  syn nta DefaultMappingDefinition RagConnect.defaultBytesToShortMapping() = baseDefaultMappingDefinition(
-      "byte[]", "short", "return java.nio.ByteBuffer.wrap(input).getShort();");
-  syn nta DefaultMappingDefinition RagConnect.defaultBytesToLongMapping() = baseDefaultMappingDefinition(
-      "byte[]", "long", "return java.nio.ByteBuffer.wrap(input).getLong();");
-  syn nta DefaultMappingDefinition RagConnect.defaultBytesToFloatMapping() = baseDefaultMappingDefinition(
-      "byte[]", "float", "return java.nio.ByteBuffer.wrap(input).getFloat();");
-  syn nta DefaultMappingDefinition RagConnect.defaultBytesToDoubleMapping() = baseDefaultMappingDefinition(
-      "byte[]", "double", "return java.nio.ByteBuffer.wrap(input).getDouble();");
-  syn nta DefaultMappingDefinition RagConnect.defaultBytesToCharMapping() = baseDefaultMappingDefinition(
-      "byte[]", "char", "return java.nio.ByteBuffer.wrap(input).getChar();");
-  syn nta DefaultMappingDefinition RagConnect.defaultBytesToStringMapping() = baseDefaultMappingDefinition(
-      "byte[]", "String", "return new String(input);");
-
-  syn nta DefaultMappingDefinition RagConnect.defaultIntToBytesMapping() = baseDefaultMappingDefinition(
-      "int", "byte[]", "return java.nio.ByteBuffer.allocate(Integer.BYTES).putInt(input).array();");
-  syn nta DefaultMappingDefinition RagConnect.defaultShortToBytesMapping() = baseDefaultMappingDefinition(
-      "short", "byte[]", "return java.nio.ByteBuffer.allocate(Short.BYTES).putShort(input).array();");
-  syn nta DefaultMappingDefinition RagConnect.defaultLongToBytesMapping() = baseDefaultMappingDefinition(
-      "long", "byte[]", "return java.nio.ByteBuffer.allocate(Long.BYTES).putLong(input).array();");
-  syn nta DefaultMappingDefinition RagConnect.defaultFloatToBytesMapping() = baseDefaultMappingDefinition(
-      "float", "byte[]", "return java.nio.ByteBuffer.allocate(Float.BYTES).putFloat(input).array();");
-  syn nta DefaultMappingDefinition RagConnect.defaultDoubleToBytesMapping() = baseDefaultMappingDefinition(
-      "double", "byte[]", "return java.nio.ByteBuffer.allocate(Double.BYTES).putDouble(input).array();");
-  syn nta DefaultMappingDefinition RagConnect.defaultCharToBytesMapping() = baseDefaultMappingDefinition(
-      "char", "byte[]", "return java.nio.ByteBuffer.allocate(Character.BYTES).putChar(input).array();");
-  syn nta DefaultMappingDefinition RagConnect.defaultStringToBytesMapping() = baseDefaultMappingDefinition(
-      "String", "byte[]", "return input.getBytes();");
-
-  syn nta DefaultMappingDefinition RagConnect.defaultStringToIntMapping() = baseDefaultMappingDefinition(
-      "String", "int", "return Integer.parseInt(input);");
-  syn nta DefaultMappingDefinition RagConnect.defaultStringToShortMapping() = baseDefaultMappingDefinition(
-      "String", "short", "return Short.parseShort(input);");
-  syn nta DefaultMappingDefinition RagConnect.defaultStringToLongMapping() = baseDefaultMappingDefinition(
-      "String", "long", "return Long.parseLong(input);");
-  syn nta DefaultMappingDefinition RagConnect.defaultStringToFloatMapping() = baseDefaultMappingDefinition(
-      "String", "float", "return Float.parseFloat(input);");
-  syn nta DefaultMappingDefinition RagConnect.defaultStringToDoubleMapping() = baseDefaultMappingDefinition(
-      "String", "double", "return Double.parseDouble(input);");
-  syn nta DefaultMappingDefinition RagConnect.defaultStringToCharMapping() = baseDefaultMappingDefinition(
-      "String", "char", "return input.charAt(0);");
-
-  syn nta DefaultMappingDefinition RagConnect.defaultIntToStringMapping() = baseDefaultMappingDefinition(
-      "int", "String", "return String.valueOf(input);");
-  syn nta DefaultMappingDefinition RagConnect.defaultShortToStringMapping() = baseDefaultMappingDefinition(
-      "short", "String", "return String.valueOf(input);");
-  syn nta DefaultMappingDefinition RagConnect.defaultLongToStringMapping() = baseDefaultMappingDefinition(
-      "long", "String", "return String.valueOf(input);");
-  syn nta DefaultMappingDefinition RagConnect.defaultFloatToStringMapping() = baseDefaultMappingDefinition(
-      "float", "String", "return String.valueOf(input);");
-  syn nta DefaultMappingDefinition RagConnect.defaultDoubleToStringMapping() = baseDefaultMappingDefinition(
-      "double", "String", "return String.valueOf(input);");
-  syn nta DefaultMappingDefinition RagConnect.defaultCharToStringMapping() = baseDefaultMappingDefinition(
-      "char", "String", "return String.valueOf(input);");
-}
-
-aspect Mappings {
-  // --- effectiveMappings ---
-  syn java.util.List<MappingDefinition> EndpointDefinition.effectiveMappings();
-  eq ReceiveTokenEndpointDefinition.effectiveMappings() {
-    // if there is a first mapping, check if it is suitable.
-    //  or if no mappings are specified.
-    // then prepend the suitable default mapping
-    java.util.List<MappingDefinition> result;
-    if (getMappingList().isEmpty() || !hasSuitableEdgeMapping()) {
-      result = new java.util.ArrayList();
-      result.add(suitableDefaultMapping());
-      result.addAll(getMappingList());
-    } else {
-      result = getMappingList();
-    }
-    return result;
-  }
-  eq SendTokenEndpointDefinition.effectiveMappings() {
-    // if there is a mapping, check if it is suitable.
-    //  or if no mappings are specified.
-    // then append the suitable default mapping
-    java.util.List<MappingDefinition> result;
-    if (getMappingList().isEmpty() || !hasSuitableEdgeMapping()) {
-      result = new java.util.ArrayList(getMappingList());
-      result.add(suitableDefaultMapping());
-    } else {
-      result = getMappingList();
-    }
-    return result;
-  }
-
-  // --- hasSuitableEdgeMapping ---
-  syn boolean TokenEndpointDefinition.hasSuitableEdgeMapping();
-  eq ReceiveTokenEndpointDefinition.hasSuitableEdgeMapping() = isSuitableEdgeMapping(getMappingList().get(0));
-  eq SendTokenEndpointDefinition.hasSuitableEdgeMapping() = isSuitableEdgeMapping(getMappingList().get(getMappingList().size() - 1));
-
-  // --- isSuitableEdgeMapping(def) ---
-  syn boolean TokenEndpointDefinition.isSuitableEdgeMapping(MappingDefinition def);
-  eq ReceiveTokenEndpointDefinition.isSuitableEdgeMapping(MappingDefinition def) = def.getFromType().isByteArray();
-  eq SendTokenEndpointDefinition.isSuitableEdgeMapping(MappingDefinition def) = def.getToType().isByteArray();
-
-  // --- isPrimitiveType ---
-  syn boolean TokenComponent.isPrimitiveType() = effectiveJavaTypeUse().isPrimitiveType();
-  syn boolean JavaTypeUse.isPrimitiveType() = false;
-  eq SimpleJavaTypeUse.isPrimitiveType() {
-    switch(getName()) {
-      case "int":
-      case "short":
-      case "long":
-      case "float":
-      case "double":
-      case "char":
-      case "byte": return true;
-      default: return false;
-    }
-  }
-  syn boolean MappingDefinitionType.isPrimitiveType() = false;
-  eq JavaMappingDefinitionType.isPrimitiveType() = getType().isPrimitiveType();
-
-  // --- isArray ---
-  syn boolean MappingDefinitionType.isArray() = false;
-  eq JavaArrayMappingDefinitionType.isArray() = true;
-
-  // --- suitableDefaultMapping ---
-  syn DefaultMappingDefinition EndpointDefinition.suitableDefaultMapping();
-  eq ReceiveTokenEndpointDefinition.suitableDefaultMapping() {
-    String typeName = getMappingList().isEmpty() ?
-        getToken().effectiveJavaTypeUse().getName() :
-        getMappingList().get(0).getFromType().prettyPrint();
-    switch(typeName) {
-      case "int":
-      case "Integer": return ragconnect().defaultBytesToIntMapping();
-      case "short":
-      case "Short": return ragconnect().defaultBytesToShortMapping();
-      case "long":
-      case "Long": return ragconnect().defaultBytesToLongMapping();
-      case "float":
-      case "Float": return ragconnect().defaultBytesToFloatMapping();
-      case "double":
-      case "Double": return ragconnect().defaultBytesToDoubleMapping();
-      case "char":
-      case "Character": return ragconnect().defaultBytesToCharMapping();
-      case "String": return ragconnect().defaultBytesToStringMapping();
-      default: return null;
-    }
-  }
-  eq SendTokenEndpointDefinition.suitableDefaultMapping() {
-    String typeName = getMappingList().isEmpty() ?
-        getToken().effectiveJavaTypeUse().getName() :
-        getMappingList().get(getMappingList().size() - 1).getFromType().prettyPrint();
-    switch(typeName) {
-      case "int":
-      case "Integer": return ragconnect().defaultIntToBytesMapping();
-      case "short":
-      case "Short": return ragconnect().defaultShortToBytesMapping();
-      case "long":
-      case "Long": return ragconnect().defaultLongToBytesMapping();
-      case "float":
-      case "Float": return ragconnect().defaultFloatToBytesMapping();
-      case "double":
-      case "Double": return ragconnect().defaultDoubleToBytesMapping();
-      case "char":
-      case "Character": return ragconnect().defaultCharToBytesMapping();
-      case "String": return ragconnect().defaultStringToBytesMapping();
-      default: return null;
-    }
-  }
-//  eq ReceiveFromRestDefinition.suitableDefaultMapping() {
-//    String typeName = getMappingList().isEmpty() ?
-//        getToken().getJavaTypeUse().getName() :
-//        getMappingList().get(0).getFromType().prettyPrint();
-//    switch(typeName) {
-//      case "int":
-//      case "Integer": return ragconnect().defaultStringToIntMapping();
-//      case "short":
-//      case "Short": return ragconnect().defaultStringToShortMapping();
-//      case "long":
-//      case "Long": return ragconnect().defaultStringToLongMapping();
-//      case "float":
-//      case "Float": return ragconnect().defaultStringToFloatMapping();
-//      case "double":
-//      case "Double": return ragconnect().defaultStringToDoubleMapping();
-//      case "char":
-//      case "Character": return ragconnect().defaultStringToCharMapping();
-//      default: return null;
-//    }
-//  }
-//  eq SendToRestDefinition.suitableDefaultMapping() {
-//    String typeName = getMappingList().isEmpty() ?
-//        getToken().getJavaTypeUse().getName() :
-//        getMappingList().get(getMappingList().size() - 1).getFromType().prettyPrint();
-//    switch(typeName) {
-//      case "int":
-//      case "Integer": return ragconnect().defaultIntToStringMapping();
-//      case "short":
-//      case "Short": return ragconnect().defaultShortToStringMapping();
-//      case "long":
-//      case "Long": return ragconnect().defaultLongToStringMapping();
-//      case "float":
-//      case "Float": return ragconnect().defaultFloatToStringMapping();
-//      case "double":
-//      case "Double": return ragconnect().defaultDoubleToStringMapping();
-//      case "char":
-//      case "Character": return ragconnect().defaultCharToStringMapping();
-//      default: return null;
-//    }
-//  }
-
-  // --- isByteArray ---
-  syn boolean MappingDefinitionType.isByteArray() = false;
-  eq JavaArrayMappingDefinitionType.isByteArray() = getType().getName().equals("byte");
-
-//  // --- isString ---
-//  syn boolean MappingDefinitionType.isString() = false;
-//  eq JavaMappingDefinitionType.isString() = getType().getName().equals("String");
-
-  // --- allMappingDefinitions ---
-  syn java.util.List<MappingDefinition> RagConnect.allMappingDefinitions() {
-    java.util.List<MappingDefinition> result = new java.util.ArrayList<>();
-    getMappingDefinitionList().iterator().forEachRemaining(result::add);
-    // byte[] conversion
-    result.add(defaultBytesToIntMapping());
-    result.add(defaultBytesToShortMapping());
-    result.add(defaultBytesToLongMapping());
-    result.add(defaultBytesToFloatMapping());
-    result.add(defaultBytesToDoubleMapping());
-    result.add(defaultBytesToCharMapping());
-    result.add(defaultBytesToStringMapping());
-    result.add(defaultIntToBytesMapping());
-    result.add(defaultShortToBytesMapping());
-    result.add(defaultLongToBytesMapping());
-    result.add(defaultFloatToBytesMapping());
-    result.add(defaultDoubleToBytesMapping());
-    result.add(defaultCharToBytesMapping());
-    result.add(defaultStringToBytesMapping());
-//    // string conversion
-//    result.add(defaultStringToIntMapping());
-//    result.add(defaultStringToShortMapping());
-//    result.add(defaultStringToLongMapping());
-//    result.add(defaultStringToFloatMapping());
-//    result.add(defaultStringToDoubleMapping());
-//    result.add(defaultStringToCharMapping());
-//    result.add(defaultIntToStringMapping());
-//    result.add(defaultShortToStringMapping());
-//    result.add(defaultLongToStringMapping());
-//    result.add(defaultFloatToStringMapping());
-//    result.add(defaultDoubleToStringMapping());
-//    result.add(defaultCharToStringMapping());
-    return result;
-  }
-}
diff --git a/ragconnect.base/src/main/jastadd/backend/MustacheNodesToYAML.jrag b/ragconnect.base/src/main/jastadd/backend/MustacheNodesToYAML.jrag
deleted file mode 100644
index 2894d3a8a531a190e8146121dc8e7c97f2cecc91..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/backend/MustacheNodesToYAML.jrag
+++ /dev/null
@@ -1,155 +0,0 @@
-aspect MustacheNodesToYAML {
-  syn Document MRagConnect.toYAML() {
-    Document doc = new Document();
-    MappingElement root = new MappingElement();
-    root.addKeyValuePair("rootNodeName", StringElement.of(rootNodeName()));
-    root.addKeyValuePair("closeMethod", StringElement.of(closeMethod()));
-    root.addKeyValuePair("usesMqtt", ValueElement.of(usesMqtt));
-    root.addKeyValuePair("usesRest", ValueElement.of(usesRest));
-    // mqtt
-    root.addKeyValuePair("mqttHandlerField", StringElement.of(mqttHandlerField()));
-    root.addKeyValuePair("mqttHandlerAttribute", StringElement.of(mqttHandlerAttribute()));
-    root.addKeyValuePair("mqttSetupWaitUntilReadyMethod", StringElement.of(mqttSetupWaitUntilReadyMethod()));
-
-    // rootTypeComponents
-    ListElement rootTypeComponents = new ListElement();
-    for (MTypeComponent comp : getRootTypeComponentList()) {
-      MappingElement inner = new MappingElement();
-      inner.addKeyValuePair("first", ValueElement.of(comp.isFirst()));
-      inner.addKeyValuePair("name", StringElement.of(comp.name()));
-      rootTypeComponents.addElement(inner);
-    }
-    root.addKeyValuePair("RootTypeComponents", rootTypeComponents);
-
-    // rest
-    root.addKeyValuePair("restHandlerField", StringElement.of(restHandlerField()));
-    root.addKeyValuePair("restHandlerAttribute", StringElement.of(restHandlerAttribute()));
-
-    // ReceiveDefinitions
-    ListElement receiveDefinitions = new ListElement();
-    for (MReceiveDefinition def : getReceiveDefinitionList()) {
-      receiveDefinitions.addElement(def.toYAML());
-    }
-    root.addKeyValuePair("ReceiveDefinitions", receiveDefinitions);
-
-    // SendDefinitions
-    ListElement sendDefinitions = new ListElement();
-    for (MSendDefinition def : getSendDefinitionList()) {
-      sendDefinitions.addElement(def.toYAML());
-    }
-    root.addKeyValuePair("SendDefinitions", sendDefinitions);
-
-    // MappingDefinitions
-    ListElement mappingDefinitions = new ListElement();
-    for (MMappingDefinition def : getMappingDefinitionList()) {
-      mappingDefinitions.addElement(def.toYAML());
-    }
-    root.addKeyValuePair("MappingDefinitions", mappingDefinitions);
-
-    // DependencyDefinitions
-    ListElement dependencyDefinitions = new ListElement();
-    for (MDependencyDefinition def : getDependencyDefinitionList()) {
-      dependencyDefinitions.addElement(def.toYAML());
-    }
-    root.addKeyValuePair("DependencyDefinitions", dependencyDefinitions);
-
-    // TokenComponents
-    ListElement tokenComponents = new ListElement();
-    for (MTokenComponent comp : getTokenComponentList()) {
-      tokenComponents.addElement(comp.toYAML());
-    }
-    root.addKeyValuePair("TokenComponents", tokenComponents);
-
-    doc.addComplexElement(root);
-    return doc;
-  }
-
-  syn MappingElement MEndpointDefinition.toYAML() {
-    MappingElement result = new MappingElement();
-    result.addKeyValuePair("parentTypeName", StringElement.of(parentTypeName()));
-    result.addKeyValuePair("connectMethod", StringElement.of(connectMethod()));
-    result.addKeyValuePair("connectParameterName", StringElement.of(connectParameterName()));
-    result.addKeyValuePair("lastDefinitionToType", StringElement.of(lastDefinitionToType()));
-    result.addKeyValuePair("preemptiveReturn", StringElement.of(preemptiveReturn()));
-    result.addKeyValuePair("alwaysApply", ValueElement.of(alwaysApply()));
-    result.addKeyValuePair("condition", StringElement.of(
-    condition().replace("\"", "\\\"").replace("\n", "\\n")));
-    result.addKeyValuePair("lastResult", StringElement.of(lastResult()));
-    result.addKeyValuePair("tokenName", StringElement.of(tokenName()));
-    result.addKeyValuePair("InnerMappingDefinitions", innerMappingDefinitionsAsListElement());
-    return result;
-  }
-
-  syn MappingElement MReceiveDefinition.toYAML() {
-    MappingElement result = super.toYAML();
-    result.addKeyValuePair("loggingEnabledForReads", ValueElement.of(loggingEnabledForReads));
-    return result;
-  }
-
-  syn MappingElement MSendDefinition.toYAML() {
-    MappingElement result = super.toYAML();
-    result.addKeyValuePair("sender", StringElement.of(sender()));
-    result.addKeyValuePair("lastValue", StringElement.of(lastValue()));
-    result.addKeyValuePair("loggingEnabledForWrites", ValueElement.of(loggingEnabledForWrites));
-    result.addKeyValuePair("updateMethod", StringElement.of(updateMethod()));
-    result.addKeyValuePair("writeMethod", StringElement.of(writeMethod()));
-    result.addKeyValuePair("tokenResetMethod", StringElement.of(tokenResetMethod()));
-    return result;
-  }
-
-  syn Element MMappingDefinition.toYAML() {
-    MappingElement result = new MappingElement();
-    result.addKeyValuePair("toType", StringElement.of(toType()));
-    result.addKeyValuePair("methodName", StringElement.of(methodName()));
-    result.addKeyValuePair("fromType", StringElement.of(fromType()));
-    result.addKeyValuePair("fromVariableName", StringElement.of(fromVariableName()));
-    result.addKeyValuePair("content", StringElement.of(
-        content().replace("\"", "\\\"").replace("\n", "\\n")));
-    return result;
-  }
-
-  syn Element MDependencyDefinition.toYAML() {
-    MappingElement result = new MappingElement();
-    result.addKeyValuePair("targetParentTypeName", StringElement.of(targetParentTypeName()));
-    result.addKeyValuePair("dependencyMethod", StringElement.of(dependencyMethod()));
-    result.addKeyValuePair("sourceParentTypeName", StringElement.of(sourceParentTypeName()));
-    result.addKeyValuePair("internalRelationPrefix", StringElement.of(internalRelationPrefix()));
-    return result;
-  }
-
-  syn Element MTokenComponent.toYAML() {
-    MappingElement result = new MappingElement();
-    result.addKeyValuePair("parentTypeName", StringElement.of(parentTypeName()));
-    result.addKeyValuePair("name", StringElement.of(name()));
-    result.addKeyValuePair("javaType", StringElement.of(javaType()));
-    result.addKeyValuePair("internalName", StringElement.of(internalName()));
-    ListElement dependencyDefinitions = new ListElement();
-    for (MDependencyDefinition def : getDependencyDefinitionList()) {
-      MappingElement inner = new MappingElement();
-      inner.addKeyValuePair("targetParentTypeName", StringElement.of(def.targetParentTypeName()));
-      inner.addKeyValuePair("internalRelationPrefix", StringElement.of(def.internalRelationPrefix()));
-      MappingElement targetEndpointDefinition = new MappingElement();
-    targetEndpointDefinition.addKeyValuePair("updateMethod", StringElement.of(def.targetEndpointDefinition().updateMethod()));
-    targetEndpointDefinition.addKeyValuePair("writeMethod", StringElement.of(def.targetEndpointDefinition().writeMethod()));
-      inner.addKeyValuePair("targetEndpointDefinition", targetEndpointDefinition);
-      dependencyDefinitions.addElement(inner);
-    }
-    result.addKeyValuePair("DependencyDefinitions", dependencyDefinitions);
-    return result;
-  }
-
-  ListElement MEndpointDefinition.innerMappingDefinitionsAsListElement() {
-    ListElement innerMappingDefinitions = new ListElement();
-    for (MInnerMappingDefinition def : getInnerMappingDefinitionList()) {
-      MappingElement inner = new MappingElement();
-      inner.addKeyValuePair("toType", StringElement.of(def.toType()));
-      inner.addKeyValuePair("methodName", StringElement.of(def.methodName()));
-      inner.addKeyValuePair("inputVarName", StringElement.of(def.inputVarName()));
-      inner.addKeyValuePair("outputVarName", StringElement.of(def.outputVarName()));
-      inner.addKeyValuePair("last", ValueElement.of(def.isLast()));
-      innerMappingDefinitions.addElement(inner);
-    }
-    return innerMappingDefinitions;
-  }
-
-}
diff --git a/ragconnect.base/src/main/jastadd/parser/Preamble.parser b/ragconnect.base/src/main/jastadd/parser/Preamble.parser
deleted file mode 100644
index d701db19d6edb6d6c616bc79fc0145ea59d2713d..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/parser/Preamble.parser
+++ /dev/null
@@ -1,7 +0,0 @@
-%header {:
-package org.jastadd.ragconnect.parser;
-import org.jastadd.ragconnect.ast.*;
-:};
-
-%goal goal;
-%goal ragconnect;
diff --git a/ragconnect.base/src/main/jastadd/parser/RagConnect.parser b/ragconnect.base/src/main/jastadd/parser/RagConnect.parser
deleted file mode 100644
index 0432b0df96c44060f6df1d6918a856f62810230d..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/parser/RagConnect.parser
+++ /dev/null
@@ -1,84 +0,0 @@
-RagConnect ragconnect
-  = endpoint_definition.d ragconnect.r       {: r.getEndpointDefinitionList().insertChild(d, 0); return r; :}
-  | dependency_definition.d ragconnect.r   {: r.getDependencyDefinitionList().insertChild(d, 0); return r; :}
-  | mapping_definition.d ragconnect.r      {: r.getMappingDefinitionList().insertChild(d, 0); return r; :}
-  | comment ragconnect.r                   {: return r; :}
-  |                                     {: return new RagConnect(); :}
-;
-
-%embed {:
-  private Iterable<String> makeMappingDefs(ArrayList<?> raw_mapping_defs) {
-    return () -> raw_mapping_defs.stream().map(raw -> ((Symbol) raw).value.toString()).iterator();
-  }
-  private TokenEndpointDefinition enableAlwaysApply(TokenEndpointDefinition def) {
-    def.setAlwaysApply(true);
-    return def;
-  }
-:} ;
-
-EndpointDefinition endpoint_definition
-  = endpoint_definition_type.endpointDef SCOL
-    {:
-      return endpointDef;
-    :}
-  | endpoint_definition_type.endpointDef USING string_list.mapping_defs SCOL
-    {:
-      for (String mapping_def : makeMappingDefs(mapping_defs)) {
-        endpointDef.addMapping(MappingDefinition.createRef(mapping_def));
-      }
-      return endpointDef;
-    :}
-;
-
-EndpointDefinition endpoint_definition_type
-  = RECEIVE token_ref           {: return new ReceiveTokenEndpointDefinition().setToken(token_ref); :}
-  | SEND token_ref              {: return new SendTokenEndpointDefinition().setToken(token_ref); :}
-;
-
-TokenComponent token_ref
-  = ID.type_name DOT ID.token_name  {: return TokenComponent.createRef(type_name + "." + token_name); :}
-;
-
-ArrayList string_list
-  = ID
-  | string_list COMMA ID
-;
-
-DependencyDefinition dependency_definition
-  = ID.target_type DOT ID.target_token CAN_DEPEND_ON ID.source_type DOT ID.source_token AS ID.id SCOL
-    {:
-      DependencyDefinition result = new DependencyDefinition();
-      result.setSource(TokenComponent.createRef(source_type + "." + source_token));
-      result.setTarget(TokenComponent.createRef(target_type + "." + target_token));
-      result.setID(id);
-      return result;
-    :}
-;
-
-MappingDefinition mapping_definition
-  = ID.id MAPS mapping_type.from_type ID.from_name TO mapping_type.to_type MAPPING_CONTENT.content
-    {:
-      MappingDefinition result = new MappingDefinition();
-      result.setID(id);
-      result.setFromType(from_type);
-      result.setFromVariableName(from_name);
-      result.setToType(to_type);
-      result.setContent(content.substring(2, content.length() - 2));
-      return result;
-    :}
-;
-
-MappingDefinitionType mapping_type
-  = java_type_use.type
-    {:
-      JavaMappingDefinitionType result = new JavaMappingDefinitionType();
-      result.setType(type);
-      return result;
-    :}
-  | java_type_use.type LBRACKET RBRACKET
-    {:
-      JavaArrayMappingDefinitionType result = new JavaArrayMappingDefinitionType();
-      result.setType(type);
-      return result;
-    :}
-;
diff --git a/ragconnect.base/src/main/jastadd/scanner/Header.flex b/ragconnect.base/src/main/jastadd/scanner/Header.flex
deleted file mode 100644
index f289a7e89438a572e3dd936548355cf600d3b8bd..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/scanner/Header.flex
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.jastadd.ragconnect.scanner;
-
-import org.jastadd.ragconnect.parser.RagConnectParser.Terminals;
-%%
-
-%public
-%final
-%class RagConnectScanner
-%extends beaver.Scanner
-
-%type beaver.Symbol
-%function nextToken
-%yylexthrow beaver.Scanner.Exception
-%scanerror RagConnectScanner.ScannerError
-
-%x COMMENT
-%s DECLARATION
-
-%line
-%column
diff --git a/ragconnect.base/src/main/jastadd/scanner/Keywords.flex b/ragconnect.base/src/main/jastadd/scanner/Keywords.flex
deleted file mode 100644
index 5773118d8fda8ffdc536b504aa7056b8784ddfb3..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/scanner/Keywords.flex
+++ /dev/null
@@ -1,7 +0,0 @@
-"receive"    { yybegin(DECLARATION); return sym(Terminals.RECEIVE); }
-"send"       { yybegin(DECLARATION); return sym(Terminals.SEND); }
-"using"      { return sym(Terminals.USING); }
-"canDependOn" { return sym(Terminals.CAN_DEPEND_ON); }
-"maps"       { return sym(Terminals.MAPS); }
-"to"         { return sym(Terminals.TO); }
-"as"         { return sym(Terminals.AS); }
diff --git a/ragconnect.base/src/main/jastadd/scanner/Macros.flex b/ragconnect.base/src/main/jastadd/scanner/Macros.flex
deleted file mode 100644
index 08bb629fe2f9c10db42ab6e4587918447e330a63..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/scanner/Macros.flex
+++ /dev/null
@@ -1 +0,0 @@
-MappingContent = [{][:][^:]*[:]+([^:}][^:]*[:]+)*[}]
diff --git a/ragconnect.base/src/main/jastadd/scanner/MappingContent.flex b/ragconnect.base/src/main/jastadd/scanner/MappingContent.flex
deleted file mode 100644
index fdf3f205113e79a007bc7f5bb9d5f28433f7f387..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/scanner/MappingContent.flex
+++ /dev/null
@@ -1 +0,0 @@
-{MappingContent} { return sym(Terminals.MAPPING_CONTENT); }
diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/AppendableWriter.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/AppendableWriter.java
deleted file mode 100644
index 55818dcda1c89948726065c9d11640fcb6601130..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/AppendableWriter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.jastadd.ragconnect.compiler;
-
-import java.io.IOException;
-import java.io.Writer;
-
-/**
- * Writer appending to a StringBuilder.
- *
- * @author rschoene - Initial contribution
- */
-public class AppendableWriter extends Writer {
-  private final StringBuilder sb;
-
-  public AppendableWriter(StringBuilder sb) {
-    this.sb = sb;
-  }
-
-  @Override
-  public void write(char[] chars, int off, int len) throws IOException {
-    sb.append(chars, off, len);
-  }
-
-  @Override
-  public void write(String str) throws IOException {
-    sb.append(str);
-  }
-
-  @Override
-  public void flush() {
-
-  }
-
-  @Override
-  public void close() {
-
-  }
-}
diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
deleted file mode 100644
index 711169ec2ea7d9c21b48dc52c5a7d2cf4cc8b427..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
+++ /dev/null
@@ -1,283 +0,0 @@
-package org.jastadd.ragconnect.compiler;
-
-import beaver.Parser;
-import org.jastadd.option.BooleanOption;
-import org.jastadd.option.ValueOption;
-import org.jastadd.relast.compiler.AbstractCompiler;
-import org.jastadd.relast.compiler.CompilerException;
-import org.jastadd.ragconnect.ast.*;
-import org.jastadd.ragconnect.parser.RagConnectParser;
-import org.jastadd.ragconnect.scanner.RagConnectScanner;
-
-import java.io.*;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.util.*;
-
-public class Compiler extends AbstractCompiler {
-
-//  private ValueOption optionOutputDir;
-  private ValueOption optionRootNode;
-  private ValueOption optionProtocols;
-  private BooleanOption optionPrintYaml;
-  private BooleanOption optionVerbose;
-  private BooleanOption optionLogReads;
-  private BooleanOption optionLogWrites;
-
-  private static final String OPTION_PROTOCOL_MQTT = "mqtt";
-  private static final String OPTION_PROTOCOL_REST = "rest";
-
-  public Compiler() {
-    super("ragconnect", true);
-  }
-
-  @Override
-  protected int compile() throws CompilerException {
-    if (getConfiguration().shouldPrintVersion()) {
-      System.out.println(readVersion());
-      return 0;
-    }
-    if (getConfiguration().shouldPrintHelp()) {
-      getConfiguration().printHelp(System.out);
-      return 0;
-    }
-
-    printMessage("Running RagConnect " + readVersion());
-
-    if (!getConfiguration().outputDir().exists()) {
-      try {
-        Files.createDirectories(getConfiguration().outputDir().toPath());
-      } catch (IOException e) {
-        throw new CompilerException("Error creating output dir " + getConfiguration().outputDir(), e);
-      }
-    }
-
-    if (!optionRootNode.isMatched()) {
-      return error("Root node not specified");
-    }
-
-    RagConnect ragConnect = parseProgram(getConfiguration().getFiles());
-
-    if (!ragConnect.errors().isEmpty()) {
-      System.err.println("Errors:");
-      for (ErrorMessage e : ragConnect.errors()) {
-        System.err.println(e);
-      }
-      System.exit(1);
-    }
-
-    if (optionPrintYaml.value()) {
-      ASTNode.rootNode = ragConnect.getProgram().resolveTypeDecl(optionRootNode.value());
-      String yamlContent = ragConnect.toMustache().toYAML().prettyPrint();
-      System.out.println(yamlContent);
-      writeToFile(getConfiguration().outputDir().toPath().resolve("RagConnect.yml"), yamlContent);
-      return 0;
-    }
-
-    printMessage("Writing output files");
-    final List<String> handlers = new ArrayList<>();
-    if (ASTNode.usesMqtt) {
-      handlers.add("MqttHandler.jadd");
-    }
-    if (ASTNode.usesRest) {
-      handlers.add("RestHandler.jadd");
-    }
-    // copy handlers into outputDir
-    for (String handlerFileName : handlers) {
-      try {
-        InputStream inputStream = Compiler.class.getClassLoader().getResourceAsStream(handlerFileName);
-        if (inputStream == null) {
-          throw new CompilerException("Could not open " + handlerFileName);
-        }
-        Files.copy(inputStream,
-            getConfiguration().outputDir().toPath().resolve(handlerFileName),
-            StandardCopyOption.REPLACE_EXISTING);
-      } catch (IOException e) {
-        throw new CompilerException("Could not copy " + handlerFileName, e);
-      }
-    }
-    for (GrammarFile grammarFile : ragConnect.getProgram().getGrammarFileList()) {
-      Path outputFile = getConfiguration().outputDir().toPath().resolve(grammarFile.getFileName());
-      writeToFile(outputFile, grammarFile.generateAbstractGrammar());
-    }
-    writeToFile(getConfiguration().outputDir().toPath().resolve("RagConnect.jadd"), ragConnect.generateAspect(optionRootNode.value()));
-    return 0;
-  }
-
-  public static void main(String[] args) {
-    System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
-    System.setProperty("mustache.debug", "true");
-    try {
-      new Compiler().run(args);
-    } catch (CompilerException e) {
-      e.printStackTrace();
-      System.exit(1);
-    }
-  }
-
-  /**
-   * Reads the version string.
-   *
-   * The version string is read from the property file
-   * src/main/resources/Version.properties. This
-   * file should be generated during the build process. If it is missing
-   * then there is some problem in the build script.
-   *
-   * @author Jesper Öqvist <jesper.oqvist@cs.lth.se>
-   * @return the read version string, or <code>version ?</code>
-   */
-  private String readVersion() {
-    try {
-      ResourceBundle resources = ResourceBundle.getBundle("ragConnectVersion");
-      return resources.getString("version");
-    } catch (MissingResourceException e) {
-      return "version ?";
-    }
-  }
-
-  private void printMessage(String message) {
-    System.out.println(message);
-  }
-
-  private void writeToFile(Path path, String str) throws CompilerException {
-    try (BufferedWriter writer = Files.newBufferedWriter(path)) {
-      writer.append(str);
-    } catch (Exception e) {
-      throw new CompilerException("Could not write to file " + path.toAbsolutePath(), e);
-    }
-  }
-
-  protected void initOptions() {
-    super.initOptions();
-    optionRootNode = addOption(
-        new ValueOption("rootNode", "root node in the base grammar.")
-        .acceptAnyValue()
-        .needsValue(true));
-    optionProtocols = addOption(
-        new ValueOption("protocols", "Protocols to enable")
-        .acceptMultipleValues(true)
-        .addDefaultValue(OPTION_PROTOCOL_MQTT, "Enable MQTT")
-        .addAcceptedValue(OPTION_PROTOCOL_REST, "Enable REST")
-    );
-    optionPrintYaml = addOption(
-        new BooleanOption("printYaml", "Print out YAML instead of generating files")
-        .defaultValue(false));
-    optionVerbose = addOption(
-        new BooleanOption("verbose", "Print more messages while compiling.")
-        .defaultValue(false));
-    optionLogReads = addOption(
-        new BooleanOption("logReads", "Enable logging for every read.")
-        .defaultValue(false));
-    optionLogWrites = addOption(
-        new BooleanOption("logWrites", "Enable logging for every write.")
-        .defaultValue(false));
-  }
-
-  private RagConnect parseProgram(Collection<String> files) throws CompilerException {
-    Program program = new Program();
-    boolean atLeastOneGrammar = false;
-    boolean atLeastOneRagConnect = false;
-
-    RagConnect ragConnect = new RagConnect();
-    ragConnect.setProgram(program);
-
-    GrammarFile ragConnectGrammarPart = new GrammarFile();
-    ragConnectGrammarPart.setFileName("RagConnect.relast");
-    program.addGrammarFile(ragConnectGrammarPart);
-
-    for (String filename : files) {
-      String extension = filename.substring(filename.lastIndexOf('.') + 1);
-      switch (extension) {
-        case "ast":
-        case "relast":
-          // processGrammar
-          parseGrammar(program, filename);
-          atLeastOneGrammar = true;
-          break;
-        case "connect":
-        case "ragconnect":
-          // process ragConnect
-          RagConnect parsedRagConnect = parseRagConnect(program, filename);
-          mergeRagConnectDefinitions(ragConnect, parsedRagConnect);
-          atLeastOneRagConnect = true;
-          break;
-        default:
-          throw new CompilerException("Unknown file extension in " + filename);
-      }
-    }
-    if (!atLeastOneGrammar) {
-      System.err.println("No grammar file specified! (*.ast, *.relast)");
-    }
-    if (!atLeastOneRagConnect) {
-      System.err.println("No ragconnect file specified! (*.connect, *.ragconnect)");
-    }
-    if (!atLeastOneGrammar && !atLeastOneRagConnect) {
-      System.exit(1);
-    }
-    ragConnect.treeResolveAll();
-    ragConnect.additionalRelations().forEach(ragConnectGrammarPart::addDeclaration);
-    ASTNode.loggingEnabledForReads = optionLogReads.value();
-    ASTNode.loggingEnabledForWrites = optionLogWrites.value();
-    ASTNode.usesMqtt = optionProtocols.hasValue(OPTION_PROTOCOL_MQTT);
-    ASTNode.usesRest = optionProtocols.hasValue(OPTION_PROTOCOL_REST);
-    return ragConnect;
-  }
-
-  private void parseGrammar(Program program, String filename) throws CompilerException {
-    try (BufferedReader reader = Files.newBufferedReader(Paths.get(filename))) {
-      RagConnectScanner scanner = new RagConnectScanner(reader);
-      RagConnectParser parser = new RagConnectParser();
-      GrammarFile grammarFile = (GrammarFile) parser.parse(scanner);
-      if (optionVerbose.value()) {
-        grammarFile.dumpTree(System.out);
-      }
-      program.addGrammarFile(grammarFile);
-      grammarFile.treeResolveAll();
-      grammarFile.setFileName(toBaseName(filename));
-    } catch (IOException | Parser.Exception e) {
-      throw new CompilerException("Could not parse grammar file " + filename, e);
-    }
-  }
-
-  private RagConnect parseRagConnect(Program program, String filename) throws CompilerException {
-    try (BufferedReader reader = Files.newBufferedReader(Paths.get(filename))) {
-      RagConnectScanner scanner = new RagConnectScanner(reader);
-      RagConnectParser parser = new RagConnectParser();
-      RagConnect ragConnect = (RagConnect) parser.parse(scanner, RagConnectParser.AltGoals.ragconnect);
-      ragConnect.setProgram(program);
-      ragConnect.setFileName(toBaseName(filename));
-      return ragConnect;
-    } catch (IOException | Parser.Exception e) {
-      throw new CompilerException("Could not parse connect file " + filename, e);
-    }
-  }
-
-  /**
-   * Extracts the basename of the given file, with file extension
-   * @param filename the given filename
-   * @return the basename
-   */
-  private String toBaseName(String filename) {
-    return new File(filename).getName();
-  }
-
-  private void mergeRagConnectDefinitions(RagConnect ragConnect, RagConnect ragConnectToIntegrate) {
-    for (EndpointDefinition endpointDefinition : ragConnectToIntegrate.getEndpointDefinitionList()) {
-      ragConnect.addEndpointDefinition(endpointDefinition);
-    }
-    for (MappingDefinition mappingDefinition : ragConnectToIntegrate.getMappingDefinitionList()) {
-      ragConnect.addMappingDefinition(mappingDefinition);
-    }
-    for (DependencyDefinition dependencyDefinition : ragConnectToIntegrate.getDependencyDefinitionList()) {
-      ragConnect.addDependencyDefinition(dependencyDefinition);
-    }
-  }
-
-//  protected void printUsage() {
-//    System.out.println("Usage: java -jar ragconnect.jar [--option1] [--option2=value] ...  <filename1> <filename2> ... ");
-//    System.out.println("Options:");
-//    System.out.print(commandLine.printOptionHelp());
-//  }
-}
diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java
deleted file mode 100644
index ee9ed046348efeaa4b12dbc816c55414d93289cf..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package org.jastadd.ragconnect.compiler;
-
-import org.jastadd.ragconnect.ast.*;
-import org.jastadd.ragconnect.parser.RagConnectParser;
-import org.jastadd.ragconnect.scanner.RagConnectScanner;
-
-import java.io.Reader;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-
-/**
- * Testing Ros2Rag without parser.
- *
- * @author rschoene - Initial contribution
- */
-public class SimpleMain {
-
-  private static void printManualYAML() {
-    Document doc = new Document();
-    KeyValuePair root = new KeyValuePair();
-    root.setKey("panda_mqtt_connector");
-    MappingElement firstLevel = new MappingElement();
-    firstLevel.addKeyValuePair(new KeyValuePair("server", new StringElement("tcp://localhost:1883")));
-    firstLevel.addKeyValuePair(new KeyValuePair("robot_speed_factor", new ValueElement(".7")));
-
-    KeyValuePair topics = new KeyValuePair();
-    topics.setKey("topics");
-    MappingElement theTopics = new MappingElement();
-    theTopics.addKeyValuePair(new KeyValuePair("robotConfig", new StringElement("robotconfig")));
-    theTopics.addKeyValuePair(new KeyValuePair("trajectory", new StringElement("trajectory")));
-    theTopics.addKeyValuePair(new KeyValuePair("nextStep", new StringElement("ros2rag/nextStep")));
-    topics.setValue(theTopics);
-    firstLevel.addKeyValuePair(topics);
-
-    firstLevel.addKeyValuePair(new KeyValuePair("zone_size", new ValueElement("0.5")));
-
-    KeyValuePair zones = new KeyValuePair();
-    zones.setKey("zones");
-    ListElement theZones = new ListElement();
-    theZones.addElement(new StringElement("1 1"));
-    theZones.addElement(new StringElement("0 1"));
-    theZones.addElement(new StringElement("-1 1"));
-    zones.setValue(theZones);
-    firstLevel.addKeyValuePair(zones);
-
-    KeyValuePair parts = new KeyValuePair();
-    parts.setKey("end_effectors");
-    KeyValuePair pandaParts = new KeyValuePair();
-    pandaParts.setKey("panda");
-    MappingElement thePanda = new MappingElement();
-    thePanda.addKeyValuePair(new KeyValuePair("Link0", new StringElement("panda_link0")));
-    thePanda.addKeyValuePair(new KeyValuePair("Link1", new StringElement("panda_link1")));
-    thePanda.addKeyValuePair(new KeyValuePair("Link2", new StringElement("panda_link2")));
-    thePanda.addKeyValuePair(new KeyValuePair("Link3", new StringElement("panda_link3")));
-    thePanda.addKeyValuePair(new KeyValuePair("Link4", new StringElement("panda_link4")));
-    thePanda.addKeyValuePair(new KeyValuePair("Link5", new StringElement("panda_link5")));
-    thePanda.addKeyValuePair(new KeyValuePair("Link6", new StringElement("panda_link6")));
-    thePanda.addKeyValuePair(new KeyValuePair("RightFinger", new StringElement("panda_rightfinger")));
-    thePanda.addKeyValuePair(new KeyValuePair("LeftFinger", new StringElement("panda_leftfinger")));
-    pandaParts.setValue(thePanda);
-    parts.setValue(pandaParts);
-    firstLevel.addKeyValuePair(parts);
-
-    KeyValuePair end_effectors = new KeyValuePair();
-    end_effectors.setKey("end_effectors");
-    KeyValuePair endEffectorParts = new KeyValuePair();
-    endEffectorParts.setKey("panda");
-    endEffectorParts.setValue(new KeyValuePair("EndEffector", new StringElement("panda_hand")));
-    end_effectors.setValue(endEffectorParts);
-    firstLevel.addKeyValuePair(end_effectors);
-
-    KeyValuePair goalPoses = new KeyValuePair();
-    goalPoses.setKey("goal_poses");
-    ListElement theGoalPoses = new ListElement();
-    addPose(theGoalPoses, "0.4 0.4 0.3");
-    addPose(theGoalPoses, "-0.4 0.4 0.3");
-    addPose(theGoalPoses, "-0.4 -0.4 0.3");
-    addPose(theGoalPoses, "0.4 0.4 0.3");
-    addPose(theGoalPoses, "-0.4 0.4 0.3");
-    addPose(theGoalPoses, "0.4 0.4 0.3");
-    goalPoses.setValue(theGoalPoses);
-    firstLevel.addKeyValuePair(goalPoses);
-
-    root.setValue(firstLevel);
-    doc.addComplexElement(root);
-
-    System.out.println(doc.prettyPrint());
-  }
-
-  private static void addPose(ListElement theGoalPoses, String position) {
-    MappingElement goalPose1 = new MappingElement();
-    goalPose1.addKeyValuePair(new KeyValuePair("position", new StringElement(position)));
-    goalPose1.addKeyValuePair(new KeyValuePair("orientation", new StringElement("1 1 0 0")));
-    goalPose1.addKeyValuePair(new KeyValuePair("work", new StringElement("20000")));
-    theGoalPoses.addElement(goalPose1);
-  }
-
-  public static void main(String[] args) {
-    printManualYAML();
-  }
-}
diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Utils.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Utils.java
deleted file mode 100644
index c083fe1d912fa74cb4461fce5fcb839f5b88a40f..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Utils.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.jastadd.ragconnect.compiler;
-
-import java.util.*;
-import java.util.function.Predicate;
-
-import static java.util.stream.Collectors.toList;
-
-public class Utils {
-  public static <T> List<T> filterToList(Collection<T> collection, Predicate<T> predicate) {
-    return collection.stream().filter(predicate).collect(toList());
-  }
-
-  public static <T> Set<T> asSet(T... t) {
-    return new HashSet<T>(Arrays.asList(t));
-  }
-}
diff --git a/ragconnect.base/src/main/resources/MqttHandler.jadd b/ragconnect.base/src/main/resources/MqttHandler.jadd
deleted file mode 100644
index 6f40612520cfb97151600dff53c8e0d384ab441e..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/MqttHandler.jadd
+++ /dev/null
@@ -1,319 +0,0 @@
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;aspect MqttHandler {
-public class MqttServerHandler {
-  private final java.util.Map<String, MqttHandler> handlers = new java.util.HashMap<>();
-  private long time;
-  private java.util.concurrent.TimeUnit unit;
-  private String name;
-
-  public MqttServerHandler() {
-    this("RagConnect");
-  }
-
-  public MqttServerHandler(String name) {
-    this.name = name;
-    setupWaitUntilReady(1, TimeUnit.SECONDS);
-  }
-
-  public void setupWaitUntilReady(long time, java.util.concurrent.TimeUnit unit) {
-    this.time = time;
-    this.unit = unit;
-  }
-
-  public MqttHandler resolveHandler(java.net.URI uri) throws IOException {
-    MqttHandler handler = handlers.get(uri.getHost());
-    if (handler == null) {
-      // first connect to that server
-      handler = new MqttHandler();
-      if (uri.getPort() == -1) {
-        handler.setHost(uri.getHost());
-      } else {
-        handler.setHost(uri.getHost(), uri.getPort());
-      }
-      handlers.put(uri.getHost(), handler);
-    }
-    handler.waitUntilReady(this.time, this.unit);
-    return handler;
-  }
-
-  public boolean newConnection(java.net.URI uri, java.util.function.Consumer<byte[]> callback) throws IOException {
-    return resolveHandler(uri).newConnection(extractTopic(uri), callback);
-  }
-
-  public void publish(java.net.URI uri, byte[] bytes) throws IOException {
-    resolveHandler(uri).publish(extractTopic(uri), bytes);
-  }
-
-  public void publish(java.net.URI uri, byte[] bytes, boolean retain) throws IOException {
-    resolveHandler(uri).publish(extractTopic(uri), bytes, retain);
-  }
-
-  public void publish(java.net.URI uri, byte[] bytes,
-                      org.fusesource.mqtt.client.QoS qos, boolean retain) throws IOException {
-    resolveHandler(uri).publish(extractTopic(uri), bytes, qos, retain);
-  }
-
-  private String extractTopic(java.net.URI uri) {
-    String path = uri.getPath();
-    if (path.charAt(0) == '/') {
-      path = path.substring(1);
-    }
-    return path;
-  }
-
-  public void close() {
-    for (MqttHandler handler : handlers.values()) {
-      handler.close();
-    }
-  }
-
-}
-/**
- * Helper class to receive updates via MQTT and use callbacks to handle those messages.
- *
- * @author rschoene - Initial contribution
- */
-public class MqttHandler {
-  private static final int DEFAULT_PORT = 1883;
-
-  private final org.apache.logging.log4j.Logger logger;
-  private final String name;
-
-  /** The host running the MQTT broker. */
-  private java.net.URI host;
-  /** The connection to the MQTT broker. */
-  private org.fusesource.mqtt.client.CallbackConnection connection;
-  /** Whether we are connected yet */
-  private final java.util.concurrent.CountDownLatch readyLatch;
-  private boolean sendWelcomeMessage = true;
-  private org.fusesource.mqtt.client.QoS qos;
-  /** Dispatch knowledge */
-  private final java.util.Map<String, java.util.List<java.util.function.Consumer<byte[]>>> callbacks;
-
-  public MqttHandler() {
-    this("RagConnect");
-  }
-
-  public MqttHandler(String name) {
-    this.name = java.util.Objects.requireNonNull(name, "Name must be set");
-    this.logger = org.apache.logging.log4j.LogManager.getLogger(MqttHandler.class);
-    this.callbacks = new java.util.HashMap<>();
-    this.readyLatch = new java.util.concurrent.CountDownLatch(1);
-    this.qos = org.fusesource.mqtt.client.QoS.AT_LEAST_ONCE;
-  }
-
-  public MqttHandler dontSendWelcomeMessage() {
-    this.sendWelcomeMessage = false;
-    return this;
-  }
-
-  /**
-   * Sets the host (with default port) to receive messages from, and connects to it.
-   * @throws IOException if could not connect, or could not subscribe to a topic
-   * @return self
-   */
-  public MqttHandler setHost(String host) throws java.io.IOException {
-    return setHost(host, DEFAULT_PORT);
-  }
-
-  /**
-   * Sets the host to receive messages from, and connects to it.
-   * @throws IOException if could not connect, or could not subscribe to a topic
-   * @return self
-   */
-  public MqttHandler setHost(String host, int port) throws java.io.IOException {
-    java.util.Objects.requireNonNull(host, "Host need to be set!");
-
-    this.host = java.net.URI.create("tcp://" + host + ":" + port);
-    logger.debug("Host for {} is {}", this.name, this.host);
-
-    org.fusesource.mqtt.client.MQTT mqtt = new org.fusesource.mqtt.client.MQTT();
-    mqtt.setHost(this.host);
-    connection = mqtt.callbackConnection();
-    java.util.concurrent.atomic.AtomicReference<Throwable> error = new java.util.concurrent.atomic.AtomicReference<>();
-
-    // add the listener to dispatch messages later
-    connection.listener(new org.fusesource.mqtt.client.ExtendedListener() {
-      public void onConnected() {
-        logger.debug("Connected");
-      }
-
-      @Override
-      public void onDisconnected() {
-        logger.debug("Disconnected");
-      }
-
-      @Override
-      public void onPublish(org.fusesource.hawtbuf.UTF8Buffer topic, org.fusesource.hawtbuf.Buffer body, org.fusesource.mqtt.client.Callback<org.fusesource.mqtt.client.Callback<Void>> ack) {
-        String topicString = topic.toString();
-        java.util.List<java.util.function.Consumer<byte[]>> callbackList = callbacks.get(topicString);
-        if (callbackList == null || callbackList.isEmpty()) {
-          logger.debug("Got a message, but no callback to call. Forgot to subscribe?");
-        } else {
-          byte[] message = body.toByteArray();
-//          System.out.println("message = " + Arrays.toString(message));
-          for (java.util.function.Consumer<byte[]> callback : callbackList) {
-            callback.accept(message);
-          }
-        }
-        ack.onSuccess(null);  // always acknowledge message
-      }
-
-      @Override
-      public void onPublish(org.fusesource.hawtbuf.UTF8Buffer topicBuffer, org.fusesource.hawtbuf.Buffer body, Runnable ack) {
-        logger.warn("onPublish should not be called");
-      }
-
-      @Override
-      public void onFailure(Throwable cause) {
-//        logger.catching(cause);
-        error.set(cause);
-      }
-    });
-    throwIf(error);
-
-    // actually establish the connection
-    connection.connect(new org.fusesource.mqtt.client.Callback<Void>() {
-      @Override
-      public void onSuccess(Void value) {
-        if (MqttHandler.this.sendWelcomeMessage) {
-          connection.publish("components", (name + " is connected").getBytes(), org.fusesource.mqtt.client.QoS.AT_LEAST_ONCE, false, new org.fusesource.mqtt.client.Callback<Void>() {
-            @Override
-            public void onSuccess(Void value) {
-              logger.debug("success sending welcome message");
-              setReady();
-            }
-
-            @Override
-            public void onFailure(Throwable value) {
-              logger.debug("failure sending welcome message", value);
-            }
-          });
-        } else {
-          setReady();
-        }
-      }
-
-      @Override
-      public void onFailure(Throwable cause) {
-//        logger.error("Could not connect", cause);
-        error.set(cause);
-      }
-    });
-    throwIf(error);
-    return this;
-  }
-
-  public java.net.URI getHost() {
-    return host;
-  }
-
-  private void setReady() {
-    readyLatch.countDown();
-  }
-
-  private void throwIf(java.util.concurrent.atomic.AtomicReference<Throwable> error) throws java.io.IOException {
-    if (error.get() != null) {
-      throw new java.io.IOException(error.get());
-    }
-  }
-
-  public void setQoSForSubscription(org.fusesource.mqtt.client.QoS qos) {
-    this.qos = qos;
-  }
-
-  public boolean newConnection(String topic, java.util.function.Consumer<byte[]> callback) {
-    if (readyLatch.getCount() > 0) {
-      System.err.println("Handler not ready");
-      return false;
-//      // should maybe be something more kind than throwing an exception here
-//      throw new IllegalStateException("Updater not ready");
-    }
-    // register callback
-    logger.debug("new connection for {}", topic);
-    if (callbacks.get(topic) == null) {
-      callbacks.put(topic, new java.util.ArrayList<>());
-
-      // subscribe at broker
-      org.fusesource.mqtt.client.Topic[] topicArray = { new org.fusesource.mqtt.client.Topic(topic, this.qos) };
-      connection.getDispatchQueue().execute(() -> {
-        connection.subscribe(topicArray, new org.fusesource.mqtt.client.Callback<byte[]>() {
-          @Override
-          public void onSuccess(byte[] qoses) {
-            logger.debug("Subscribed to {}, qoses: {}", topic, qoses);
-          }
-
-          @Override
-          public void onFailure(Throwable cause) {
-            logger.error("Could not subscribe to {}", topic, cause);
-          }
-        });
-      });
-    }
-    callbacks.get(topic).add(callback);
-    return true;
-  }
-
-  /**
-   * Waits until this updater is ready to receive MQTT messages.
-   * If it already is ready, return immediately with the value <code>true</code>.
-   * Otherwise waits for the given amount of time, and either return <code>true</code> within the timespan,
-   * if it got ready, or <code>false</code> upon a timeout.
-   * @param time the maximum time to wait
-   * @param unit the time unit of the time argument
-   * @return whether this updater is ready
-   */
-  public boolean waitUntilReady(long time, java.util.concurrent.TimeUnit unit) {
-    try {
-      return readyLatch.await(time, unit);
-    } catch (InterruptedException e) {
-      e.printStackTrace();
-    }
-    return false;
-  }
-
-  public void close() {
-    if (connection == null) {
-      logger.warn("Stopping without connection. Was setHost() called?");
-      return;
-    }
-    connection.getDispatchQueue().execute(() -> {
-      connection.disconnect(new org.fusesource.mqtt.client.Callback<Void>() {
-        @Override
-        public void onSuccess(Void value) {
-          logger.info("Disconnected {} from {}", name, host);
-        }
-
-        @Override
-        public void onFailure(Throwable ignored) {
-          // Disconnects never fail. And we do not care either.
-        }
-      });
-    });
-  }
-
-  public void publish(String topic, byte[] bytes) {
-    publish(topic, bytes, false);
-  }
-
-  public void publish(String topic, byte[] bytes, boolean retain) {
-    publish(topic, bytes, this.qos, retain);
-  }
-
-  public void publish(String topic, byte[] bytes, org.fusesource.mqtt.client.QoS qos, boolean retain) {
-    connection.getDispatchQueue().execute(() -> {
-      connection.publish(topic, bytes, qos, retain, new org.fusesource.mqtt.client.Callback<Void>() {
-        @Override
-        public void onSuccess(Void value) {
-          logger.debug("Published some bytes to {}", topic);
-        }
-
-        @Override
-        public void onFailure(Throwable value) {
-          logger.warn("Could not publish on topic '{}'", topic, value);
-        }
-      });
-    });
-  }
-}
-}
diff --git a/ragconnect.base/src/main/resources/RestHandler.jadd b/ragconnect.base/src/main/resources/RestHandler.jadd
deleted file mode 100644
index f7b1a83304fe7aaebe97d105514c3f192d052aec..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/RestHandler.jadd
+++ /dev/null
@@ -1,140 +0,0 @@
-import java.util.concurrent.TimeUnit;aspect RestHandler {
-public class RestServerHandler {
-  private static final int DEFAULT_PORT = 4567;
-  private final java.util.Map<Integer, RestHandler> handlers = new java.util.HashMap<>();
-  private String name;
-
-  public RestServerHandler() {
-    this("RagConnect");
-  }
-
-  public RestServerHandler(String name) {
-    this.name = name;
-  }
-
-  private RestHandler resolveHandler(java.net.URI uri) {
-    int port = uri.getPort() != -1 ? uri.getPort() : DEFAULT_PORT;
-    RestHandler handler = handlers.get(port);
-    if (handler == null) {
-      // first connect to that server
-      handler = new RestHandler();
-      handler.setPort(port);
-      handlers.put(port, handler);
-    }
-    return handler;
-  }
-
-  public boolean newPUTConnection(java.net.URI uri, java.util.function.Consumer<String> callback) {
-    resolveHandler(uri).newPUTConnection(uri.getPath(), callback);
-    return true;
-  }
-
-  public boolean newGETConnection(java.net.URI uri, SupplierWithException<String> supplier) {
-    resolveHandler(uri).newGETConnection(uri.getPath(), supplier);
-    return true;
-  }
-
-  public void close() {
-    for (RestHandler handler : handlers.values()) {
-      handler.close();
-    }
-  }
-}
-/**
- * Helper class to receive updates and publishes information via REST.
- * @author rschoene - Initial contribution
- */
-public class RestHandler {
-  private static final int DEFAULT_PORT = 4567;
-
-  private final org.apache.logging.log4j.Logger logger;
-  private final String name;
-  private int port;
-  private final java.util.concurrent.CountDownLatch exitCondition;
-  /** Dispatch knowledge */
-  private final java.util.Map<String, java.util.List<java.util.function.Consumer<String>>> callbacks;
-  private final java.util.Map<String, SupplierWithException<String>> suppliers;
-
-  public RestHandler() {
-    this("RagConnect");
-  }
-
-  public RestHandler(String name) {
-    this.logger = org.apache.logging.log4j.LogManager.getLogger(RestHandler.class);
-    this.name = name;
-    this.port = DEFAULT_PORT;
-    this.exitCondition = new java.util.concurrent.CountDownLatch(1);
-    this.callbacks = new java.util.HashMap<>();
-    this.suppliers = new java.util.HashMap<>();
-  }
-
-  public RestHandler setPort(int port) {
-    this.port = port;
-    start();
-    return this;
-  }
-
-  public void newPUTConnection(String path, java.util.function.Consumer<String> callback) {
-    if (callbacks.containsKey(path)) {
-      callbacks.get(path).add(callback);
-    } else {
-      // setup path
-      java.util.List<java.util.function.Consumer<String>> callbackList = new java.util.ArrayList<>();
-      callbackList.add(callback);
-      callbacks.put(path, callbackList);
-      spark.Spark.put(path, (request, response) -> {
-        String content = request.body();
-        java.util.Set<String> errors = new java.util.HashSet<>();
-        for (java.util.function.Consumer<String> f : callbackList) {
-          try {
-            f.accept(content);
-          } catch (Exception e) {
-            errors.add(e.getMessage());
-          }
-        }
-        if (errors.isEmpty()) {
-          return "OK";
-        } else {
-          return makeError(response, 500, errors.stream().collect(java.util.stream.Collectors.joining("\n", "The following error(s) happened: [", "]")));
-        }
-      });
-    }
-  }
-
-  public void newGETConnection(String path, SupplierWithException<String> supplier) {
-    if (suppliers.get(path) != null) {
-      logger.warn("Overriding existing supplier for '{}'", path);
-    }
-    suppliers.put(path, supplier);
-    spark.Spark.get(path, (request, response) -> {
-      try {
-        return supplier.get();
-      } catch (Exception e) {
-        return makeError(response, 500, e.getMessage());
-      }
-    });
-  }
-
-  private String makeError(spark.Response response, int statusCode, String message) {
-    response.status(statusCode);
-    return message;
-  }
-
-  private void start() {
-    logger.info("Starting REST server at {}", this.port);
-    spark.Spark.port(this.port);
-    spark.Spark.init();
-    spark.Spark.awaitInitialization();
-  }
-
-  public void close() {
-    spark.Spark.stop();
-    spark.Spark.awaitStop();
-  }
-
-}
-@FunctionalInterface
-public interface SupplierWithException<T> {
-  public T get() throws Exception;
-}
-}
diff --git a/ragconnect.base/src/main/resources/dependencyDefinition.mustache b/ragconnect.base/src/main/resources/dependencyDefinition.mustache
deleted file mode 100644
index 0ab8d55242816a7d3ada0491c8c7db6dcd70ee42..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/dependencyDefinition.mustache
+++ /dev/null
@@ -1,3 +0,0 @@
-public void {{targetParentTypeName}}.{{dependencyMethod}}({{sourceParentTypeName}} source) {
-  add{{internalRelationPrefix}}Source(source);
-}
diff --git a/ragconnect.base/src/main/resources/handleUri.mustache b/ragconnect.base/src/main/resources/handleUri.mustache
deleted file mode 100644
index 1a20e7c4df2a4c54ccba4c825fff55ca89a51dec..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/handleUri.mustache
+++ /dev/null
@@ -1,11 +0,0 @@
-String scheme,host, path;
-java.net.URI uri;
-try {
-  uri = new java.net.URI({{connectParameterName}});
-  scheme = uri.getScheme();
-  host = uri.getHost();
-  path = uri.getPath();
-} catch (java.net.URISyntaxException e) {
-  System.err.println(e.getMessage());  // Maybe re-throw error?
-  return false;
-}
diff --git a/ragconnect.base/src/main/resources/handler.mustache b/ragconnect.base/src/main/resources/handler.mustache
deleted file mode 100644
index e89c451007ff309a77297b9b66fe0e20dece73b8..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/handler.mustache
+++ /dev/null
@@ -1,7 +0,0 @@
-aspect RagConnectHandler {
-interface RagConnectHandler<T> {
-  boolean connectReceive(String path, java.util.function.Consumer<T> callback);
-  boolean sendPush(String path, T value);
-  boolean connectSendPull(String path, SupplierWithException<T> supplier);
-}
-}
diff --git a/ragconnect.base/src/main/resources/log4j2.xml b/ragconnect.base/src/main/resources/log4j2.xml
deleted file mode 100644
index 98cfd73c75df58d8598521bc10b043e214ec4ad8..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/log4j2.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="INFO">
-    <Appenders>
-        <Console name="Console" target="SYSTEM_OUT">
-            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
-        </Console>
-    </Appenders>
-    <Loggers>
-        <Root level="info">
-            <AppenderRef ref="Console"/>
-        </Root>
-    </Loggers>
-</Configuration>
\ No newline at end of file
diff --git a/ragconnect.base/src/main/resources/mappingApplication.mustache b/ragconnect.base/src/main/resources/mappingApplication.mustache
deleted file mode 100644
index 064004b94886c155be883e7b186557c6fa87d38c..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/mappingApplication.mustache
+++ /dev/null
@@ -1,14 +0,0 @@
-{{lastDefinitionToType}} {{lastResult}};
-try {
-  {{#InnerMappingDefinitions}}
-  {{^last}}{{toType}} {{/last}}{{outputVarName}} = {{methodName}}({{inputVarName}});
-  {{/InnerMappingDefinitions}}
-} catch (Exception e) {
-  e.printStackTrace();
-  {{preemptiveReturn}}
-}
-{{^alwaysApply}}
-if ({{{condition}}}) {
-  {{preemptiveReturn}}
-}
-{{/alwaysApply}}
diff --git a/ragconnect.base/src/main/resources/mappingDefinition.mustache b/ragconnect.base/src/main/resources/mappingDefinition.mustache
deleted file mode 100644
index fe26e949b7a8e446bf97947e1632624741a83726..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/mappingDefinition.mustache
+++ /dev/null
@@ -1,3 +0,0 @@
-protected static {{toType}} ASTNode.{{methodName}}({{fromType}} {{fromVariableName}}) throws Exception {
-  {{{content}}}{{!maybe print line by line to get better indentation}}
-}
diff --git a/ragconnect.base/src/main/resources/mqtt.mustache b/ragconnect.base/src/main/resources/mqtt.mustache
deleted file mode 100644
index 9391d1091c41eee257f9e6a1368297ef743e39ce..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/mqtt.mustache
+++ /dev/null
@@ -1,16 +0,0 @@
-aspect MQTT {
-  private String {{rootNodeName}}.MqttName() { return "RagConnectMQTT"; }
-  private MqttServerHandler {{rootNodeName}}.{{mqttHandlerField}} = new MqttServerHandler(MqttName());
-
-  public void {{rootNodeName}}.{{mqttSetupWaitUntilReadyMethod}}(long time, java.util.concurrent.TimeUnit unit) {
-    {{mqttHandlerField}}.setupWaitUntilReady(time, unit);
-  }
-
-  {{#RootTypeComponents}}
-  {{#first}}inh MqttServerHandler ASTNode.{{mqttHandlerAttribute}}();{{/first}}
-  eq {{rootNodeName}}.get{{name}}().{{mqttHandlerAttribute}}() = {{mqttHandlerField}};
-  {{/RootTypeComponents}}
-  {{^RootTypeComponents}}
-  syn MqttServerHandler {{rootNodeName}}.{{mqttHandlerAttribute}}() = {{mqttHandlerField}};
-  {{/RootTypeComponents}}
-}
diff --git a/ragconnect.base/src/main/resources/ragConnectVersion.properties b/ragconnect.base/src/main/resources/ragConnectVersion.properties
deleted file mode 100644
index 8ec441610d66cd3f793075302676eb132eea35c3..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/ragConnectVersion.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-#Wed Jul 29 16:29:05 CEST 2020
-version=0.2.0
diff --git a/ragconnect.base/src/main/resources/ragconnect.mustache b/ragconnect.base/src/main/resources/ragconnect.mustache
deleted file mode 100644
index a39510d73854301efb1f05fe7f9c1fd476916ef7..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/ragconnect.mustache
+++ /dev/null
@@ -1,27 +0,0 @@
-{{#usesMqtt}}{{> mqtt}}{{/usesMqtt}}
-{{#usesRest}}{{> rest}}{{/usesRest}}
-aspect ROS2RAG {
-  public void {{rootNodeName}}.{{closeMethod}}() {
-    {{#usesMqtt}}{{mqttHandlerField}}.close();{{/usesMqtt}}
-    {{#usesRest}}{{restHandlerField}}.close();{{/usesRest}}
-  }
-  {{#ReceiveDefinitions}}
-  {{> receiveDefinition}}
-  {{/ReceiveDefinitions}}
-
-  {{#SendDefinitions}}
-  {{> sendDefinition}}
-  {{/SendDefinitions}}
-
-  {{#MappingDefinitions}}
-  {{> mappingDefinition}}
-  {{/MappingDefinitions}}
-
-  {{#DependencyDefinitions}}
-  {{> dependencyDefinition}}
-  {{/DependencyDefinitions}}
-
-  {{#TokenComponents}}
-  {{> tokenComponent}}
-  {{/TokenComponents}}
-}
diff --git a/ragconnect.base/src/main/resources/receiveDefinition.mustache b/ragconnect.base/src/main/resources/receiveDefinition.mustache
deleted file mode 100644
index 1dd0e0ddbfbfd2acf03536ff41a2d740043eb34b..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/receiveDefinition.mustache
+++ /dev/null
@@ -1,23 +0,0 @@
-public boolean {{parentTypeName}}.{{connectMethod}}(String {{connectParameterName}}) throws java.io.IOException {
-  {{>handleUri}}
-  java.util.function.Consumer<byte[]> consumer = message -> {
-    {{> mappingApplication}}
-    {{#loggingEnabledForReads}}
-    System.out.println("[Receive] " + {{connectParameterName}} + " -> {{tokenName}} = " + {{lastResult}});
-    {{/loggingEnabledForReads}}
-    set{{tokenName}}({{lastResult}});
-  };
-  switch (scheme) {
-  {{#usesMqtt}}
-    case "mqtt": return {{mqttHandlerAttribute}}().newConnection(uri, consumer);
-  {{/usesMqtt}}
-  {{#usesRest}}
-    case "rest": return {{restHandlerAttribute}}().newPUTConnection(uri, input -> {
-      consumer.accept(input.getBytes());
-    });
-  {{/usesRest}}
-    default:
-      System.err.println("Unknown protocol '" + scheme + "'.");
-      return false;
-  }
-}
diff --git a/ragconnect.base/src/main/resources/rest.mustache b/ragconnect.base/src/main/resources/rest.mustache
deleted file mode 100644
index 6bbde2be4d26e519635c85a6f39f9a18514bfb19..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/rest.mustache
+++ /dev/null
@@ -1,12 +0,0 @@
-aspect REST {
-  private String {{rootNodeName}}.RestName() { return "RagConnectREST"; }
-  private RestServerHandler {{rootNodeName}}.{{restHandlerField}} = new RestServerHandler(RestName());
-
-  {{#getRootTypeComponents}}
-  {{#first}}inh RestServerHandler ASTNode.{{restHandlerAttribute}}();{{/first}}
-  eq {{rootNodeName}}.get{{name}}().{{restHandlerAttribute}}() = {{restHandlerField}};
-  {{/getRootTypeComponents}}
-  {{^getRootTypeComponents}}
-  syn RestServerHandler {{rootNodeName}}.{{restHandlerAttribute}}() = {{restHandlerField}};
-  {{/getRootTypeComponents}}
-}
diff --git a/ragconnect.base/src/main/resources/sendDefinition.mustache b/ragconnect.base/src/main/resources/sendDefinition.mustache
deleted file mode 100644
index fac4ecd37967b8047c9101b58fab273527979ab2..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/sendDefinition.mustache
+++ /dev/null
@@ -1,51 +0,0 @@
-private Runnable {{parentTypeName}}.{{sender}} = null;
-private byte[] {{parentTypeName}}.{{lastValue}} = null;
-
-public boolean {{parentTypeName}}.{{connectMethod}}(String {{connectParameterName}}, boolean writeCurrentValue) {
-  {{>handleUri}}
-  switch (scheme) {
-  {{#usesMqtt}}
-    case "mqtt":
-      // MqttHandler handler = {{mqttHandlerAttribute}}().resolveHandler(uri);{{!optimize later}}
-      {{sender}} = () -> {
-        {{#loggingEnabledForWrites}}
-        System.out.println("[Send] {{tokenName}} = " + get{{tokenName}}() + " -> " + {{connectParameterName}});
-        {{/loggingEnabledForWrites}}
-        try {
-          {{mqttHandlerAttribute}}().publish(uri, {{lastValue}});
-        } catch (java.io.IOException e) {
-          e.printStackTrace();
-        }
-      };
-      {{updateMethod}}();
-      if (writeCurrentValue) {
-        {{writeMethod}}();
-      }
-      break;
-  {{/usesMqtt}}
-  {{#usesRest}}
-    case "rest":
-      {{restHandlerAttribute}}().newGETConnection(uri, () -> {
-        {{updateMethod}}();
-        return new String({{lastValue}});
-      });
-      break;
-  {{/usesRest}}
-    default:
-      System.err.println("Unknown protocol '" + scheme + "'.");
-      return false;
-  }
-  return true;
-}
-
-protected boolean {{parentTypeName}}.{{updateMethod}}() {
-  {{tokenResetMethod}}();
-  {{> mappingApplication}}
-  {{lastValue}} = {{lastResult}};
-  // normally we would return true here. unless no connect method was called so far to initialize {{sender}} yet
-  return {{sender}} != null;
-}
-
-protected void {{parentTypeName}}.{{writeMethod}}() {
-  {{sender}}.run();
-}
diff --git a/ragconnect.base/src/main/resources/tokenComponent.mustache b/ragconnect.base/src/main/resources/tokenComponent.mustache
deleted file mode 100644
index e78efb96b846bd7aa814723472032299a70c7de3..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/tokenComponent.mustache
+++ /dev/null
@@ -1,19 +0,0 @@
-public {{parentTypeName}} {{parentTypeName}}.set{{name}}({{javaType}} value) {
-  set{{internalName}}(value);
-  {{#DependencyDefinitions}}
-  for ({{targetParentTypeName}} target : get{{internalRelationPrefix}}TargetList()) {
-    {{#targetEndpointDefinition}}
-    {{!#isPush}}
-    if (target.{{updateMethod}}()) {
-      target.{{writeMethod}}();
-    }
-    {{!/isPush}}
-    {{/targetEndpointDefinition}}
-  }
-  {{/DependencyDefinitions}}
-  return this;
-}
-
-public {{javaType}} {{parentTypeName}}.get{{name}}() {
-  return get{{internalName}}();
-}
diff --git a/ragconnect.tests/.gitignore b/ragconnect.tests/.gitignore
deleted file mode 100644
index 87b4cdd3d7c6a41502ca98703abeeb69a1d536fb..0000000000000000000000000000000000000000
--- a/ragconnect.tests/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-build
-src/gen-res/
-src/gen/
-out/
-*.class
diff --git a/ragconnect.tests/README.md b/ragconnect.tests/README.md
deleted file mode 100644
index aabbb0195519ca2c1ce1e3bb5c82af475457bb0c..0000000000000000000000000000000000000000
--- a/ragconnect.tests/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Creating a new test case
-
-The following things must be done:
-
-- Create a new directory in `src/test/01-input` and put at least grammar, the ros2rag-specification and a README.md in there. Optionally, aspect files as needed.
-- Optionally, add new protobuf definitions in `src/test/proto` (they are processed automatically in this directory)
-- Copy and modify the compiler instructions in `build.gradle`, e.g. `preprocessExampleTest` and `compileExampleTest` for the `example` case. Also, copy the dependsOn-Definitions.
-    - Change the name of the tasks
-    - Change the directory in `delete` spec, and in all arguments
-    - Add/Remove aspect files
-    - Change the `packageName` argument in the compile-step
-    - Change the `--rootNode` argument in the preprocess-step
-    - For debugging build problems, the `--verbose` flag in the preprocess-step can be helpful
-- Create the test case itself in `src/test/java/` in the package `org.jastadd.ros2rag.tests` and import the AST files of your defined target generation package
-    - Extend the abstract base class `AbstractMqttTest` to have fail-fast-behaviour in case the MQTT-broker is not connected
-    - Remember to close all used MQTT-handling objects, like MqttHandler and the model itself after each test
diff --git a/ragconnect.tests/build.gradle b/ragconnect.tests/build.gradle
deleted file mode 100644
index d638ec5001a8a58505045e37e480ac7c5d08079d..0000000000000000000000000000000000000000
--- a/ragconnect.tests/build.gradle
+++ /dev/null
@@ -1,268 +0,0 @@
-import org.jastadd.relast.plugin.RelastPlugin
-import org.jastadd.relast.plugin.RelastTest
-apply plugin: 'jastadd'
-apply plugin: 'com.google.protobuf'
-apply plugin: RelastPlugin
-
-sourceCompatibility = 1.8
-
-repositories {
-    jcenter()
-}
-
-buildscript {
-    repositories.jcenter()
-    dependencies {
-        classpath 'org.jastadd:jastaddgradle:1.13.3'
-        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12'
-    }
-}
-
-dependencies {
-    implementation project(':ragconnect.base')
-
-    runtime group: 'org.jastadd', name: 'jastadd', version: '2.3.4'
-    testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.4.0'
-    testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.4.0'
-    testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.12.1'
-
-    // mqtt
-    testImplementation group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15'
-
-    // rest and client
-    testImplementation group: 'com.sparkjava', name: 'spark-core', version: '2.9.2'
-    testImplementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.11.2'
-    testImplementation group: 'org.glassfish.jersey.core', name: 'jersey-client', version: '2.31'
-    testImplementation group: 'org.glassfish.jersey.inject', name: 'jersey-hk2', version: '2.31'
-
-    testImplementation group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11'
-    api group: 'com.google.protobuf', name: 'protobuf-java', version: '3.0.0'
-}
-
-test {
-    useJUnitPlatform {
-        excludeTags 'mqtt'
-    }
-
-    maxHeapSize = '1G'
-}
-
-protobuf {
-    protoc {
-        // The artifact spec for the Protobuf Compiler
-        artifact = 'com.google.protobuf:protoc:3.0.0'
-    }
-}
-
-task allTests(type: Test, dependsOn: testClasses) {
-    description = 'Run every test'
-    group = 'verification'
-
-    useJUnitPlatform {
-        includeTags 'mqtt'
-    }
-}
-
-relastTest {
-    compilerLocation = '../libs/relast.jar'
-}
-
-File genSrc = file("src/test/java-gen");
-sourceSets.test.java.srcDir genSrc
-idea.module.generatedSourceDirs += genSrc
-
-clean {
-    delete 'src/test/02-after-ragconnect/*/', 'src/test/03-after-relast/*/', 'src/test/java-gen/*/'
-}
-
-// --- Test: Example ---
-task preprocessExampleTest(type: JavaExec, group: 'verification') {
-    doFirst {
-        delete 'src/test/02-after-ragconnect/example/Test.relast',
-                'src/test/02-after-ragconnect/example/MqttHandler.java',
-                'src/test/02-after-ragconnect/example/RagConnect.jadd'
-    }
-
-    classpath = sourceSets.main.runtimeClasspath
-    main = 'org.jastadd.ragconnect.compiler.Compiler'
-    args '--o=src/test/02-after-ragconnect/example',
-            'src/test/01-input/example/Test.relast',
-            'src/test/01-input/example/Test.connect',
-            '--rootNode=Model',
-            '--logReads', '--logWrites'
-}
-
-task compileExampleTest(type: RelastTest) {
-    useJastAddNames = true
-    jastAddList = 'JastAddList'
-    relastFiles 'src/test/02-after-ragconnect/example/Test.relast',
-            'src/test/02-after-ragconnect/example/RagConnect.relast'
-    grammarName = 'src/test/03-after-relast/example/example'
-    packageName = 'example.ast'
-    moreInputFiles 'src/test/01-input/example/Test.jadd',
-            'src/test/02-after-ragconnect/example/MqttHandler.jadd',
-            'src/test/02-after-ragconnect/example/RagConnect.jadd'
-}
-
-compileTestJava.dependsOn compileExampleTest
-compileExampleTest.dependsOn preprocessExampleTest
-
-// --- Test: default-only-read ---
-task preprocessDefaultOnlyReadTest(type: JavaExec, group: 'verification') {
-    doFirst {
-        delete 'src/test/02-after-ragconnect/defaultOnlyRead/Test.relast',
-                'src/test/02-after-ragconnect/defaultOnlyRead/MqttHandler.java',
-                'src/test/02-after-ragconnect/defaultOnlyRead/RagConnect.jadd'
-    }
-
-    classpath = sourceSets.main.runtimeClasspath
-    main = 'org.jastadd.ragconnect.compiler.Compiler'
-    args '--o=src/test/02-after-ragconnect/defaultOnlyRead',
-            'src/test/01-input/defaultOnlyRead/Test.relast',
-            'src/test/01-input/defaultOnlyRead/Test.connect',
-            '--rootNode=A'
-}
-
-task compileDefaultOnlyReadTest(type: RelastTest) {
-    useJastAddNames = true
-    jastAddList = 'JastAddList'
-    relastFiles 'src/test/02-after-ragconnect/defaultOnlyRead/Test.relast',
-            'src/test/02-after-ragconnect/defaultOnlyRead/RagConnect.relast'
-    grammarName = 'src/test/03-after-relast/defaultOnlyRead/defaultOnlyRead'
-    packageName = 'defaultOnlyRead.ast'
-    moreInputFiles 'src/test/02-after-ragconnect/defaultOnlyRead/MqttHandler.jadd',
-            'src/test/02-after-ragconnect/defaultOnlyRead/RagConnect.jadd'
-}
-
-compileTestJava.dependsOn compileDefaultOnlyReadTest
-compileDefaultOnlyReadTest.dependsOn preprocessDefaultOnlyReadTest
-
-// --- Test: default-only-write ---
-task preprocessDefaultOnlyWriteTest(type: JavaExec, group: 'verification') {
-    doFirst {
-        delete 'src/test/02-after-ragconnect/defaultOnlyWrite/Test.relast',
-                'src/test/02-after-ragconnect/defaultOnlyWrite/MqttHandler.java',
-                'src/test/02-after-ragconnect/defaultOnlyWrite/RagConnect.jadd'
-    }
-
-    classpath = sourceSets.main.runtimeClasspath
-    main = 'org.jastadd.ragconnect.compiler.Compiler'
-    args '--o=src/test/02-after-ragconnect/defaultOnlyWrite',
-            'src/test/01-input/defaultOnlyWrite/Test.relast',
-            'src/test/01-input/defaultOnlyWrite/Test.connect',
-            '--rootNode=A'
-}
-
-task compileDefaultOnlyWriteTest(type: RelastTest) {
-    useJastAddNames = true
-    jastAddList = 'JastAddList'
-    relastFiles 'src/test/02-after-ragconnect/defaultOnlyWrite/Test.relast',
-            'src/test/02-after-ragconnect/defaultOnlyWrite/RagConnect.relast'
-    grammarName = 'src/test/03-after-relast/defaultOnlyWrite/defaultOnlyWrite'
-    packageName = 'defaultOnlyWrite.ast'
-    moreInputFiles 'src/test/01-input/defaultOnlyWrite/Test.jadd',
-            'src/test/02-after-ragconnect/defaultOnlyWrite/MqttHandler.jadd',
-            'src/test/02-after-ragconnect/defaultOnlyWrite/RagConnect.jadd'
-}
-
-compileTestJava.dependsOn compileDefaultOnlyWriteTest
-compileDefaultOnlyWriteTest.dependsOn preprocessDefaultOnlyWriteTest
-
-// --- Test: read1write2 ---
-task preprocessRead1Write2Test(type: JavaExec, group: 'verification') {
-    doFirst {
-        delete 'src/test/02-after-ragconnect/read1write2/Test.relast',
-                'src/test/02-after-ragconnect/read1write2/MqttHandler.java',
-                'src/test/02-after-ragconnect/read1write2/RagConnect.jadd'
-    }
-
-    classpath = sourceSets.main.runtimeClasspath
-    main = 'org.jastadd.ragconnect.compiler.Compiler'
-    args '--o=src/test/02-after-ragconnect/read1write2',
-            'src/test/01-input/read1write2/Test.relast',
-            'src/test/01-input/read1write2/Test.connect',
-            '--rootNode=A',
-            '--logReads', '--logWrites'
-}
-
-task compileRead1Write2Test(type: RelastTest) {
-    useJastAddNames = true
-    jastAddList = 'JastAddList'
-    relastFiles 'src/test/02-after-ragconnect/read1write2/Test.relast',
-            'src/test/02-after-ragconnect/read1write2/RagConnect.relast'
-    grammarName = 'src/test/03-after-relast/read1write2/read1write2'
-    packageName = 'read1write2.ast'
-    moreInputFiles 'src/test/01-input/read1write2/Test.jadd',
-            'src/test/02-after-ragconnect/read1write2/MqttHandler.jadd',
-            'src/test/02-after-ragconnect/read1write2/RagConnect.jadd'
-}
-
-compileTestJava.dependsOn compileRead1Write2Test
-compileRead1Write2Test.dependsOn preprocessRead1Write2Test
-
-// --- Test: read2write1 ---
-task preprocessRead2Write1Test(type: JavaExec, group: 'verification') {
-    doFirst {
-        delete 'src/test/02-after-ragconnect/read2write1/Test.relast',
-                'src/test/02-after-ragconnect/read2write1/MqttHandler.java',
-                'src/test/02-after-ragconnect/read2write1/RagConnect.jadd'
-    }
-
-    classpath = sourceSets.main.runtimeClasspath
-    main = 'org.jastadd.ragconnect.compiler.Compiler'
-    args '--o=src/test/02-after-ragconnect/read2write1',
-            'src/test/01-input/read2write1/Test.relast',
-            'src/test/01-input/read2write1/Test.connect',
-            '--rootNode=A',
-            '--logReads', '--logWrites'
-}
-
-task compileRead2Write1Test(type: RelastTest) {
-    useJastAddNames = true
-    jastAddList = 'JastAddList'
-    relastFiles 'src/test/02-after-ragconnect/read2write1/Test.relast',
-            'src/test/02-after-ragconnect/read2write1/RagConnect.relast'
-    grammarName = 'src/test/03-after-relast/read2write1/read2write1'
-    packageName = 'read2write1.ast'
-    moreInputFiles 'src/test/01-input/read2write1/Test.jadd',
-            'src/test/02-after-ragconnect/read2write1/MqttHandler.jadd',
-            'src/test/02-after-ragconnect/read2write1/RagConnect.jadd'
-}
-
-compileTestJava.dependsOn compileRead2Write1Test
-compileRead2Write1Test.dependsOn preprocessRead2Write1Test
-
-// --- Test: via ---
-task preprocessViaTest(type: JavaExec, group: 'verification') {
-    doFirst {
-        delete 'src/test/02-after-ragconnect/via/Test.relast',
-                'src/test/02-after-ragconnect/via/MqttHandler.java',
-                'src/test/02-after-ragconnect/via/RestHandler.java',
-                'src/test/02-after-ragconnect/via/RagConnect.jadd'
-    }
-
-    classpath = sourceSets.main.runtimeClasspath
-    main = 'org.jastadd.ragconnect.compiler.Compiler'
-    args '--o=src/test/02-after-ragconnect/via',
-            'src/test/01-input/via/Test.relast',
-            'src/test/01-input/via/Test.connect',
-            '--rootNode=A', '--verbose',
-            '--protocols=mqtt,rest',
-            '--logReads', '--logWrites'
-}
-
-task compileViaTest(type: RelastTest) {
-    useJastAddNames = true
-    jastAddList = 'JastAddList'
-    relastFiles 'src/test/02-after-ragconnect/via/Test.relast',
-            'src/test/02-after-ragconnect/via/RagConnect.relast'
-    grammarName = 'src/test/03-after-relast/via/via'
-    packageName = 'via.ast'
-    moreInputFiles 'src/test/01-input/via/Test.jadd',
-            'src/test/02-after-ragconnect/via/MqttHandler.jadd',
-            'src/test/02-after-ragconnect/via/RestHandler.jadd',
-            'src/test/02-after-ragconnect/via/RagConnect.jadd'
-}
-
-compileTestJava.dependsOn compileViaTest
-compileViaTest.dependsOn preprocessViaTest
diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyRead/README.md b/ragconnect.tests/src/test/01-input/defaultOnlyRead/README.md
deleted file mode 100644
index ee05db648e9204945245cd42ad8d802d2cdab887..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/defaultOnlyRead/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Default Only Read
-
-Idea: Use only `ReadFromMqttDefinition`, test all default mapping definitions from `byte[]` to primitive (and boxed) types
diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect
deleted file mode 100644
index e274994175513ff743409068375f419b6e3141fc..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.connect
+++ /dev/null
@@ -1,15 +0,0 @@
-// --- update definitions ---
-receive NativeTypes.IntValue;
-receive NativeTypes.ShortValue;
-receive NativeTypes.LongValue;
-receive NativeTypes.FloatValue;
-receive NativeTypes.DoubleValue;
-receive NativeTypes.CharValue;
-receive NativeTypes.StringValue;
-
-receive BoxedTypes.IntValue;
-receive BoxedTypes.ShortValue;
-receive BoxedTypes.LongValue;
-receive BoxedTypes.FloatValue;
-receive BoxedTypes.DoubleValue;
-receive BoxedTypes.CharValue;
diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast
deleted file mode 100644
index 30eba76b346dace40c72ca4e172b88ef206ea063..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast
+++ /dev/null
@@ -1,3 +0,0 @@
-A ::= NativeTypes* BoxedTypes* ;
-NativeTypes ::= <IntValue:int> <ShortValue:short> <LongValue:long> <FloatValue:float> <DoubleValue:double> <CharValue:char> <StringValue:String> ;
-BoxedTypes ::= <IntValue:Integer> <ShortValue:Short> <LongValue:Long> <FloatValue:Float> <DoubleValue:Double> <CharValue:Character> ;
diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/README.md b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/README.md
deleted file mode 100644
index 1bcc8d61a7854b7f9ef4bc1694f4f81caaac2aed..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Default Only Write
-
-Idea: Use only `WriteToMqttDefintion`, test all default mapping definitions from primitive (and boxed) types to `byte[]`.
diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect
deleted file mode 100644
index a48f49f60f66c3358ee513e79f2bbeb43df8d5e9..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.connect
+++ /dev/null
@@ -1,51 +0,0 @@
-// --- update definitions ---
-// native types, synthesized
-send NativeTypesSyn.IntValue;
-send NativeTypesSyn.ShortValue;
-send NativeTypesSyn.LongValue;
-send NativeTypesSyn.FloatValue;
-send NativeTypesSyn.DoubleValue;
-send NativeTypesSyn.CharValue;
-send NativeTypesSyn.StringValue;
-
-// boxed types, synthesized
-send BoxedTypesSyn.IntValue;
-send BoxedTypesSyn.ShortValue;
-send BoxedTypesSyn.LongValue;
-send BoxedTypesSyn.FloatValue;
-send BoxedTypesSyn.DoubleValue;
-send BoxedTypesSyn.CharValue;
-
-// --- dependency definitions ---
-NativeTypesSyn.IntValue canDependOn NativeTypesSyn.DriverSyn as nativeIntDependency;
-NativeTypesSyn.ShortValue canDependOn NativeTypesSyn.DriverSyn as nativeShortDependency;
-NativeTypesSyn.LongValue canDependOn NativeTypesSyn.DriverSyn as nativeLongDependency;
-NativeTypesSyn.FloatValue canDependOn NativeTypesSyn.DriverSyn as nativeFloatDependency;
-NativeTypesSyn.DoubleValue canDependOn NativeTypesSyn.DriverSyn as nativeDoubleDependency;
-NativeTypesSyn.CharValue canDependOn NativeTypesSyn.DriverSyn as nativeCharDependency;
-NativeTypesSyn.StringValue canDependOn NativeTypesSyn.DriverSyn as nativeStringDependency;
-BoxedTypesSyn.IntValue canDependOn BoxedTypesSyn.DriverSyn as boxedIntDependency;
-BoxedTypesSyn.ShortValue canDependOn BoxedTypesSyn.DriverSyn as boxedShortDependency;
-BoxedTypesSyn.LongValue canDependOn BoxedTypesSyn.DriverSyn as boxedLongDependency;
-BoxedTypesSyn.FloatValue canDependOn BoxedTypesSyn.DriverSyn as boxedFloatDependency;
-BoxedTypesSyn.DoubleValue canDependOn BoxedTypesSyn.DriverSyn as boxedDoubleDependency;
-BoxedTypesSyn.CharValue canDependOn BoxedTypesSyn.DriverSyn as boxedCharDependency;
-
-
-// --- inherited attributes not supported ---
-//// native types, inherited
-//send NativeTypesInh.IntValue;
-//send NativeTypesInh.ShortValue;
-//send NativeTypesInh.LongValue;
-//send NativeTypesInh.FloatValue;
-//send NativeTypesInh.DoubleValue;
-//send NativeTypesInh.CharValue;
-//send NativeTypesInh.StringValue;
-//
-//// boxed types, inherited
-//send BoxedTypesInh.IntValue;
-//send BoxedTypesInh.ShortValue;
-//send BoxedTypesInh.LongValue;
-//send BoxedTypesInh.FloatValue;
-//send BoxedTypesInh.DoubleValue;
-//send BoxedTypesInh.CharValue;
diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd
deleted file mode 100644
index 49bbf604d398f7a9d92e879b2b515c9e83dd3182..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd
+++ /dev/null
@@ -1,49 +0,0 @@
-aspect Computation {
-  // native types, synthesized
-  syn int NativeTypesSyn.getIntValue() = Integer.parseInt(getDriverSyn());
-  syn short NativeTypesSyn.getShortValue() = Short.parseShort(getDriverSyn());
-  syn long NativeTypesSyn.getLongValue() = Long.parseLong(getDriverSyn());
-  syn float NativeTypesSyn.getFloatValue() = Float.parseFloat(getDriverSyn());
-  syn double NativeTypesSyn.getDoubleValue() = Double.parseDouble(getDriverSyn());
-  syn char NativeTypesSyn.getCharValue() = getDriverSyn().charAt(0);
-  syn String NativeTypesSyn.getStringValue() = new String(getDriverSyn());
-
-  // boxed types, synthesized
-  syn Integer BoxedTypesSyn.getIntValue() = Integer.valueOf(getDriverSyn());
-  syn Short BoxedTypesSyn.getShortValue() = Short.valueOf(getDriverSyn());
-  syn Long BoxedTypesSyn.getLongValue() = Long.valueOf(getDriverSyn());
-  syn Float BoxedTypesSyn.getFloatValue() = Float.valueOf(getDriverSyn());
-  syn Double BoxedTypesSyn.getDoubleValue() = Double.valueOf(getDriverSyn());
-  syn Character BoxedTypesSyn.getCharValue() = getDriverSyn().charAt(0);
-
-// --- inherited attributes not supported ---
-//  // native types, inherited
-//  inh int NativeTypesInh.getIntValue();
-//  eq A.getNativeTypesInh().getIntValue() = Integer.parseInt(getDriverInh());
-//  inh short NativeTypesInh.getShortValue();
-//  eq A.getNativeTypesInh().getShortValue() = Short.parseShort(getDriverInh());
-//  inh long NativeTypesInh.getLongValue();
-//  eq A.getNativeTypesInh().getLongValue() = Long.parseLong(getDriverInh());
-//  inh float NativeTypesInh.getFloatValue();
-//  eq A.getNativeTypesInh().getFloatValue() = Float.parseFloat(getDriverInh());
-//  inh double NativeTypesInh.getDoubleValue();
-//  eq A.getNativeTypesInh().getDoubleValue() = Double.parseDouble(getDriverInh());
-//  inh char NativeTypesInh.getCharValue();
-//  eq A.getNativeTypesInh().getCharValue() = getDriverInh().charAt(0);
-//  inh String NativeTypesInh.getStringValue();
-//  eq A.getNativeTypesInh().getStringValue() = new String(getDriverInh());
-//
-//  // boxed types, inherited
-//  inh Integer BoxedTypesInh.getIntValue();
-//  eq A.getBoxedTypesInh().getIntValue() = Integer.valueOf(getDriverInh());
-//  inh Short BoxedTypesInh.getShortValue();
-//  eq A.getBoxedTypesInh().getShortValue() = Short.valueOf(getDriverInh());
-//  inh Long BoxedTypesInh.getLongValue();
-//  eq A.getBoxedTypesInh().getLongValue() = Long.valueOf(getDriverInh());
-//  inh Float BoxedTypesInh.getFloatValue();
-//  eq A.getBoxedTypesInh().getFloatValue() = Float.valueOf(getDriverInh());
-//  inh Double BoxedTypesInh.getDoubleValue();
-//  eq A.getBoxedTypesInh().getDoubleValue() = Double.valueOf(getDriverInh());
-//  inh Character BoxedTypesInh.getCharValue();
-//  eq A.getBoxedTypesInh().getCharValue() = getDriverInh().charAt(0);
-}
diff --git a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast
deleted file mode 100644
index e0fd7829b88b8fac04b64393e0262c69b4ac6a62..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast
+++ /dev/null
@@ -1,11 +0,0 @@
-A ::= NativeTypesSyn* BoxedTypesSyn* <DriverInh:String>;
-// native types, synthesized
-NativeTypesSyn ::= <DriverSyn:String> /<IntValue:int>/ /<ShortValue:short>/ /<LongValue:long>/ /<FloatValue:float>/ /<DoubleValue:double>/ /<CharValue:char>/ /<StringValue:String>/ ;
-// boxed types, synthesized
-BoxedTypesSyn ::= <DriverSyn:String> /<IntValue:Integer>/ /<ShortValue:Short>/ /<LongValue:Long>/ /<FloatValue:Float>/ /<DoubleValue:Double>/ /<CharValue:Character>/ ;
-
-// --- inherited attributes not supported ---
-//// native types, inherited
-//NativeTypesInh ::= /<IntValue:int>/ /<ShortValue:short>/ /<LongValue:long>/ /<FloatValue:float>/ /<DoubleValue:double>/ /<CharValue:char>/ /<StringValue:String>/ ;
-//// boxed types, inherited
-//BoxedTypesInh ::= /<IntValue:Integer>/ /<ShortValue:Short>/ /<LongValue:Long>/ /<FloatValue:Float>/ /<DoubleValue:Double>/ /<CharValue:Character>/ ;
diff --git a/ragconnect.tests/src/test/01-input/errors/Errors.connect b/ragconnect.tests/src/test/01-input/errors/Errors.connect
deleted file mode 100644
index bd57822a6c70198cc36698f790fa90655ed4db73..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/errors/Errors.connect
+++ /dev/null
@@ -1,72 +0,0 @@
-// --- update receive definitions ---
-// Error: there must not be two receive definitions for the same token
-receive B.DoubledValue ;
-receive B.DoubledValue using IntToInt ;
-
-// NOT HANDLED \\ Error: the token must be resolvable within the parent type
-// NOT HANDLED \\ receive B.NonExisting ;
-
-// Error: the Token must not be a TokenNTA (i.e., check for !Token.getNTA())
-receive B.ErrorNTA ;
-
-// Error: from-type of first mapping must be byte[] or a supported primitive type
-receive B.ErrorTypeOfFirstMapping using ListToList ;
-
-// Error: to-type of last mapping must be type of the Token
-receive B.ErrorTypeOfLastMapping using StringToList ;
-
-// Error: types of mappings must match (modulo inheritance)
-receive B.ErrorTypeMismatch using StringToList, IntToInt ;
-
-// --- update send definitions ---
-// NOT HANDLED \\ Error: the token must be resolvable within the parent type
-// NOT HANDLED \\ receive C.NonExisting ;
-
-// Error: Token must be a TokenNTA (i.e., check for Token.getNTA())
-send C.ErrorNotNTA ;
-
-// Error: from-type of first mapping must be type of Token
-send C.ErrorTypeOfFirstMapping using IntToInt ;
-
-// Error: to-type of last mapping must be byte[] or a supported primitive type
-send C.ErrorTypeOfLastMapping1 using StringToList ;
-send C.ErrorTypeOfLastMapping2 ;
-
-// Error: types of mappings must match (modulo inheritance)
-send C.ErrorTypeMismatch using StringToList, IntToInt ;
-
-// Error: no more than one send mapping for each TokenComponent
-send C.DoubledValue ;
-send C.DoubledValue using IntToInt ;
-
-// --- dependency definitions ---
-// NOT HANDLED \\ Error: Both, source and target must be resolvable within the parent type
-// NOT HANDLED \\ D.SourceNonExistingTarget canDependOn D.NonExisting as NonExistingTarget ;
-// NOT HANDLED \\ D.NonExisting canDependOn D.TargetNonExistingSource as NonExistingSource ;
-
-// Error: There must be a send update definition for the target token
-D.SourceNoWriteDef canDependOn D.TargetNoWriteDef as NoWriteDef ;
-
-// Error: The name of a dependency definition must not be equal to a list-node on the source
-D.SourceSameAsListNode canDependOn D.TargetSameAsListNode as MyList ;
-send D.TargetSameAsListNode;
-
-// Error: There must not be two dependency definitions with the same name
-D.SourceDoubledValue canDependOn D.TargetDoubledValue as DoubledValue ;
-D.SourceDoubledValue canDependOn D.TargetDoubledValue as DoubledValue ;
-send D.TargetDoubledValue;
-
-// --- mapping definitions ---
-ListToList maps java.util.List<String> list to java.util.List<String> {:
-  return list;
-:}
-
-StringToList maps String s to List<String> {:
-  java.util.List<String> result = new java.util.ArrayList<>();
-  result.add(s);
-  return result;
-:}
-
-IntToInt maps int number to int {:
-  return number + 1;
-:}
diff --git a/ragconnect.tests/src/test/01-input/errors/Errors.expected b/ragconnect.tests/src/test/01-input/errors/Errors.expected
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/ragconnect.tests/src/test/01-input/errors/Errors.relast b/ragconnect.tests/src/test/01-input/errors/Errors.relast
deleted file mode 100644
index fcde7df1d2e48b9591ddea31aaa3b0a9efdd4cfa..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/errors/Errors.relast
+++ /dev/null
@@ -1,15 +0,0 @@
-A ::= B C D ;
-
-// read definitions
-B ::= /<ErrorNTA:String>/ <ErrorTypeOfFirstMapping:String> <ErrorTypeOfLastMapping:String> <DoubledValue:int> <ErrorTypeMismatch:String> ;
-
-// write definitions
-C ::= <ErrorNotNTA:String> /<ErrorTypeOfFirstMapping:String>/ /<ErrorTypeOfLastMapping1:String>/ /<ErrorTypeOfLastMapping2:List<String>>/ /<ErrorTypeMismatch:String>/ /<DoubledValue:int>/ ;
-
-// dependency definitions
-D ::= <SourceNonExistingTarget>
-      /<TargetNonExistingSource>/
-      <SourceNoWriteDef> /<TargetNoWriteDef>/
-      <SourceSameAsListNode> /<TargetSameAsListNode>/
-      <SourceDoubledValue> /<TargetDoubledValue>/
-      MyList:D* ;
diff --git a/ragconnect.tests/src/test/01-input/errors/README.md b/ragconnect.tests/src/test/01-input/errors/README.md
deleted file mode 100644
index e8efed33eb3868441a63dc719e3e92993a2c9d49..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/errors/README.md
+++ /dev/null
@@ -1,25 +0,0 @@
-Ideas for errors:
-
-- Read-Update
-    - the token must be resolvable within the parent type
-    - the Token must not be a TokenNTA (i.e., check for `!Token.getNTA()`)
-    - type of first mapping must be `byte[]`
-    - type of last mapping must be type of the Token
-    - types of mappings must match (modulo inheritance)
-- Write-Update
-    - the token must be resolvable within the parent type
-    - Token must be a TokenNTA (i.e., check for `Token.getNTA()`)
-    - type of first mapping must be type of Token
-    - type of last mapping must be `byte[]`
-    - types of mappings must match (modulo inheritance)
-    - no more than one write mapping for each TokenComponent
-- for all type checks, there are three cases regarding the two types to check against:
-    1) both are nonterminal types, check with grammar
-    2) both are known classes, check with `Class.forName()` and subclass-checking-methods
-    3) otherwise issue warning, that types could not be matched
-- dependency-definition
-    - There **must be** a write update definition for the target token
-        - Otherwise there are missing update and write methods used in the virtual setter
-    - Both, source and target must be resolvable within the parent type
-    - The name of a dependency definition must not be equal to a list-node on the source
-    - There must not be two dependency definitions with the same name
diff --git a/ragconnect.tests/src/test/01-input/example/README.md b/ragconnect.tests/src/test/01-input/example/README.md
deleted file mode 100644
index 7665b437a513602587474904ef08135efee13b44..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/example/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Example
-
-Idea: Use the motivating example from our paper as a test case, including one read, one write update definition
diff --git a/ragconnect.tests/src/test/01-input/example/Test.connect b/ragconnect.tests/src/test/01-input/example/Test.connect
deleted file mode 100644
index 2a26051b743145ad8af6ad7b8ea84ad58ce1348f..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/example/Test.connect
+++ /dev/null
@@ -1,31 +0,0 @@
-/* Version 2020-07-15  */
-// --- update definitions ---
-receive Link.CurrentPosition using ParseRobotState, RobotStateToIntPosition ;
-send RobotArm.AppropriateSpeed using CreateSpeedMessage, SerializeRobotConfig ;
-
-// --- dependency definitions ---
-RobotArm.AppropriateSpeed canDependOn Link.CurrentPosition as dependency1 ;
-
-// --- mapping definitions ---
-ParseRobotState maps byte[] bytes to robot.RobotStateOuterClass.RobotState {:
-  TestCounter.INSTANCE.numberParseLinkState += 1;
-  return robot.RobotStateOuterClass.RobotState.parseFrom(bytes);
-:}
-
-SerializeRobotConfig maps config.Config.RobotConfig rc to byte[] {:
-  TestCounter.INSTANCE.numberSerializeRobotConfig += 1;
-  return rc.toByteArray();
-:}
-
-RobotStateToIntPosition maps robot.RobotStateOuterClass.RobotState rs to IntPosition {:
-  TestCounter.INSTANCE.numberLinkStateToIntPosition += 1;
-  robot.RobotStateOuterClass.RobotState.Position p = rs.getPosition();
-  return IntPosition.of((int) (Math.round(p.getX() * 10)), (int) (Math.round(p.getY() * 10)), (int) (Math.round(p.getZ() * 10)));
-:}
-
-CreateSpeedMessage maps double speed to config.Config.RobotConfig {:
-  TestCounter.INSTANCE.numberCreateSpeedMessage += 1;
-  return config.Config.RobotConfig.newBuilder()
-    .setSpeed(speed)
-    .build();
-:}
diff --git a/ragconnect.tests/src/test/01-input/example/Test.jadd b/ragconnect.tests/src/test/01-input/example/Test.jadd
deleted file mode 100644
index b62b9aee7cb344c587993feefccdd64ab0bf6e4b..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/example/Test.jadd
+++ /dev/null
@@ -1,95 +0,0 @@
-aspect GrammarTypes {
-  public class TestCounter {
-    public static TestCounter INSTANCE = new TestCounter();
-    public int numberParseLinkState = 0;
-    public int numberSerializeRobotConfig = 0;
-    public int numberLinkStateToIntPosition = 0;
-    public int numberCreateSpeedMessage = 0;
-    public int numberInSafetyZone = 0;
-    public static void reset() {
-      TestCounter.INSTANCE = new TestCounter();
-    }
-  }
-
-  public class IntPosition {
-    private final int x, y, z;
-
-    private IntPosition(int x, int y, int z) {
-      this.x = x;
-      this.y = y;
-      this.z = z;
-    }
-
-    public static IntPosition of(int x, int y, int z) {
-      return new IntPosition(x, y, z);
-    }
-
-    public int getX() {
-      return x;
-    }
-
-    public int getY() {
-      return y;
-    }
-
-    public int getZ() {
-      return z;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (this == o) return true;
-      if (o == null || getClass() != o.getClass()) return false;
-      IntPosition that = (IntPosition) o;
-      return x == that.x &&
-          y == that.y &&
-          z == that.z;
-    }
-
-    @Override
-    public int hashCode() {
-      return java.util.Objects.hash(x, y, z);
-    }
-
-    @Override
-    public String toString() {
-      return "(" + x + ", " + y + ", " + z + ")";
-    }
-  }
-
-  inh Model RobotArm.model();
-  eq Model.getRobotArm().model() = this;
-
-  inh RobotArm Link.containingRobotArm();
-  eq RobotArm.getLink().containingRobotArm() = this;
-  eq RobotArm.getEndEffector().containingRobotArm() = this;
-
-  syn boolean RobotArm.isInSafetyZone() {
-    TestCounter.INSTANCE.numberInSafetyZone += 1;
-    for (Link link : getLinkList()) {
-      if (model().getZoneModel().isInSafetyZone(link.getCurrentPosition())) {
-        return true;
-      }
-    }
-    return model().getZoneModel().isInSafetyZone(getEndEffector().getCurrentPosition());
-  }
-
-  cache ZoneModel.isInSafetyZone(IntPosition pos);
-  syn boolean ZoneModel.isInSafetyZone(IntPosition pos) {
-    for (Zone sz : getSafetyZoneList()) {
-      for (Coordinate coordinate : sz.getCoordinateList()) {
-        if (coordinate.getPosition().equals(pos)) {
-          return true;
-        }
-      }
-    }
-    return false;
-  }
-
-  syn double RobotArm.speedLow() = 0.4d;
-  syn double RobotArm.speedHigh() = 1.0d;
-
-  syn double RobotArm.getAppropriateSpeed() {
-    return isInSafetyZone() ? speedLow() : speedHigh();
-  }
-}
diff --git a/ragconnect.tests/src/test/01-input/example/Test.relast b/ragconnect.tests/src/test/01-input/example/Test.relast
deleted file mode 100644
index b8d932ae470e4bf3dc433f8610eec1f05016e595..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/example/Test.relast
+++ /dev/null
@@ -1,13 +0,0 @@
-Model ::= RobotArm ZoneModel ;
-
-ZoneModel ::= SafetyZone:Zone* ;
-
-Zone ::= Coordinate* ;
-
-RobotArm ::= Link* EndEffector /<AppropriateSpeed:double>/ ;
-
-Link ::= <Name:String> <CurrentPosition:IntPosition> ;
-
-EndEffector : Link;
-
-Coordinate ::= <Position:IntPosition> ;
diff --git a/ragconnect.tests/src/test/01-input/example/config.json b/ragconnect.tests/src/test/01-input/example/config.json
deleted file mode 100644
index 02843152a51197a04bce4e8e54ad4ec0f703eca5..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/example/config.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "joints": [
-    {"name": "Joint1", "topic": "robot/arm/joint1"},
-    {"name": "Joint2", "topic": "robot/arm/joint2"},
-    {"name": "EndEffector", "topic": "-", "isEndEffector": true}
-  ],
-  "robotConfigTopic": "robot/config",
-  "dataConfigTopic": "-"
-}
diff --git a/ragconnect.tests/src/test/01-input/read1write2/README.md b/ragconnect.tests/src/test/01-input/read1write2/README.md
deleted file mode 100644
index 197eeb5b1399a079bd16c9e928622732511f7ca1..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/read1write2/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Read one - Write two
-
-Idea: Define Read-Update for one terminal, add dependencies to two other terminals, which each have Write-Update defined. Test, whether code gets generated correctly and that write is trigger for each of the two terminals upon read.
diff --git a/ragconnect.tests/src/test/01-input/read1write2/Test.connect b/ragconnect.tests/src/test/01-input/read1write2/Test.connect
deleted file mode 100644
index e826f1d040d1668ae5d5d56a83e5b4e5e96a7290..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/read1write2/Test.connect
+++ /dev/null
@@ -1,18 +0,0 @@
-// --- update definitions ---
-// OnSameNonterminal
-receive OnSameNonterminal.Input;
-send OnSameNonterminal.OutInteger;
-send OnSameNonterminal.OutString;
-
-// OnDifferentNonterminal
-receive OnDifferentNonterminal.Input;
-send TheOther.OutInteger;
-send TheOther.OutString;
-
-// --- dependency definitions ---
-// OnSameNonterminal
-OnSameNonterminal.OutInteger canDependOn OnSameNonterminal.Input as IntDependency;
-OnSameNonterminal.OutString canDependOn OnSameNonterminal.Input as StringDependency;
-// OnDifferentNonterminal
-TheOther.OutInteger canDependOn OnDifferentNonterminal.Input as IntDependency;
-TheOther.OutString canDependOn OnDifferentNonterminal.Input as StringDependency;
diff --git a/ragconnect.tests/src/test/01-input/read1write2/Test.jadd b/ragconnect.tests/src/test/01-input/read1write2/Test.jadd
deleted file mode 100644
index 490772fcc7dcd1f27841c84eaa8a0231851ed6cc..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/read1write2/Test.jadd
+++ /dev/null
@@ -1,11 +0,0 @@
-aspect Computation{
-  // OnSameNonterminal
-  syn int OnSameNonterminal.getOutInteger() = Integer.parseInt(getInput());
-  syn String OnSameNonterminal.getOutString() = "prefix" + getInput();
-
-  // OnDifferentNonterminal
-  syn int TheOther.getOutInteger() = Integer.parseInt(input());
-  syn String TheOther.getOutString() = "prefix" + input();
-  inh String TheOther.input();
-  eq OnDifferentNonterminal.getTheOther().input() = getInput();
-}
diff --git a/ragconnect.tests/src/test/01-input/read1write2/Test.relast b/ragconnect.tests/src/test/01-input/read1write2/Test.relast
deleted file mode 100644
index fa0b171c4b96f097e6812f34434fc60801bc307c..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/read1write2/Test.relast
+++ /dev/null
@@ -1,4 +0,0 @@
-A ::= OnSameNonterminal OnDifferentNonterminal ;
-OnSameNonterminal ::= <Input:String> /<OutInteger:int>/ /<OutString:String>/ ;
-OnDifferentNonterminal ::= <Input:String> TheOther* ;
-TheOther ::= /<OutInteger:int>/ /<OutString:String>/ ;
diff --git a/ragconnect.tests/src/test/01-input/read2write1/Test.connect b/ragconnect.tests/src/test/01-input/read2write1/Test.connect
deleted file mode 100644
index 4c2a9b237acb5b42f274a2f095fcb74b4132a49d..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/read2write1/Test.connect
+++ /dev/null
@@ -1,18 +0,0 @@
-// --- update definitions ---
-// OnSameNonterminal
-receive OnSameNonterminal.Input1;
-receive OnSameNonterminal.Input2;
-send OnSameNonterminal.OutInteger;
-
-// OnDifferentNonterminal
-receive OnDifferentNonterminal.Input1;
-receive OnDifferentNonterminal.Input2;
-send TheOther.OutInteger;
-
-// --- dependency definitions ---
-// OnSameNonterminal
-OnSameNonterminal.OutInteger canDependOn OnSameNonterminal.Input1 as Int1Dependency;
-OnSameNonterminal.OutInteger canDependOn OnSameNonterminal.Input2 as Int2Dependency;
-// OnDifferentNonterminal
-TheOther.OutInteger canDependOn OnDifferentNonterminal.Input1 as Int1Dependency;
-TheOther.OutInteger canDependOn OnDifferentNonterminal.Input2 as Int2Dependency;
diff --git a/ragconnect.tests/src/test/01-input/read2write1/Test.jadd b/ragconnect.tests/src/test/01-input/read2write1/Test.jadd
deleted file mode 100644
index 4d31f1a6441311469f8f93cd150e6c8bb353877e..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/read2write1/Test.jadd
+++ /dev/null
@@ -1,11 +0,0 @@
-aspect Computation{
-  // OnSameNonterminal
-  syn int OnSameNonterminal.getOutInteger() = Integer.parseInt(getInput1() + getInput2());
-
-  // OnDifferentNonterminal
-  syn int TheOther.getOutInteger() = Integer.parseInt(input1() + input2());
-  inh String TheOther.input1();
-  eq OnDifferentNonterminal.getTheOther().input1() = getInput1();
-  inh String TheOther.input2();
-  eq OnDifferentNonterminal.getTheOther().input2() = getInput2();
-}
diff --git a/ragconnect.tests/src/test/01-input/read2write1/Test.relast b/ragconnect.tests/src/test/01-input/read2write1/Test.relast
deleted file mode 100644
index afe0125760afe222c830f383536f6e2f97c8f656..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/read2write1/Test.relast
+++ /dev/null
@@ -1,4 +0,0 @@
-A ::= OnSameNonterminal OnDifferentNonterminal ;
-OnSameNonterminal ::= <Input1:String> <Input2:String> /<OutInteger:int>/ ;
-OnDifferentNonterminal ::= <Input1:String> <Input2:String> TheOther* ;
-TheOther ::= /<OutInteger:int>/ ;
diff --git a/ragconnect.tests/src/test/01-input/via/Test.connect b/ragconnect.tests/src/test/01-input/via/Test.connect
deleted file mode 100644
index e4d2862a651dd6e68f67d2a492b6105a15f0a77c..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/via/Test.connect
+++ /dev/null
@@ -1,33 +0,0 @@
-receive A.Mqtt2MqttInput using MarkMqttInput ;
-receive A.Rest2RestInput using MarkRestInput ;
-receive A.Mqtt2RestInput using MarkMqttInput ;
-receive A.Rest2MqttInput using MarkRestInput ;
-receive A.Both2BothInput ;
-
-send A.Mqtt2MqttOutput using MarkMqttOutput ;
-send A.Rest2RestOutput using MarkRestOutput ;
-send A.Mqtt2RestOutput using MarkRestOutput ;
-send A.Rest2MqttOutput using MarkMqttOutput ;
-send A.Both2RestOutput using MarkRestOutput ;
-send A.Both2MqttOutput using MarkMqttOutput ;
-
-A.Mqtt2MqttOutput canDependOn A.Mqtt2MqttInput as dependencyMqtt2Mqtt ;
-A.Rest2RestOutput canDependOn A.Rest2RestInput as dependencyRest2Rest ;
-A.Mqtt2RestOutput canDependOn A.Mqtt2RestInput as dependencyMqtt2Rest ;
-A.Rest2MqttOutput canDependOn A.Rest2MqttInput as dependencyRest2Mqtt ;
-A.Both2RestOutput canDependOn A.Both2BothInput as dependencyBoth2Rest ;
-A.Both2MqttOutput canDependOn A.Both2BothInput as dependencyBoth2Mqtt ;
-
-MarkMqttInput maps String s to String {:
-  return "FromMqtt-" + s;
-:}
-MarkRestInput maps String s to String {:
-  return "FromRest-" + s;
-:}
-
-MarkMqttOutput maps String s to String {:
-  return s + "-ToMqtt";
-:}
-MarkRestOutput maps String s to String {:
-  return s + "-ToRest";
-:}
diff --git a/ragconnect.tests/src/test/01-input/via/Test.jadd b/ragconnect.tests/src/test/01-input/via/Test.jadd
deleted file mode 100644
index 9d25387d26e651fe25a937a56a863311b4b7b69a..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/via/Test.jadd
+++ /dev/null
@@ -1,8 +0,0 @@
-aspect Computation {
-  syn lazy String A.getMqtt2MqttOutput() = getMqtt2MqttInput() + "-M2M" ;
-  syn lazy String A.getRest2RestOutput() = getRest2RestInput() + "-R2R" ;
-  syn lazy String A.getMqtt2RestOutput() = getMqtt2RestInput() + "-M2R" ;
-  syn lazy String A.getRest2MqttOutput() = getRest2MqttInput() + "-R2M" ;
-  syn lazy String A.getBoth2MqttOutput() = getBoth2BothInput() + "-B2M" ;
-  syn lazy String A.getBoth2RestOutput() = getBoth2BothInput() + "-B2R" ;
-}
diff --git a/ragconnect.tests/src/test/01-input/via/Test.relast b/ragconnect.tests/src/test/01-input/via/Test.relast
deleted file mode 100644
index 1e707fbbc04b1204381351d0c38e826fcbcc8b80..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/01-input/via/Test.relast
+++ /dev/null
@@ -1,5 +0,0 @@
-A ::= <Mqtt2MqttInput> /<Mqtt2MqttOutput>/
-      <Rest2RestInput> /<Rest2RestOutput>/
-      <Mqtt2RestInput> /<Mqtt2RestOutput>/
-      <Rest2MqttInput> /<Rest2MqttOutput>/
-      <Both2BothInput> /<Both2MqttOutput>/ /<Both2RestOutput>/;
diff --git a/ragconnect.tests/src/test/02-after-ragconnect/.gitignore b/ragconnect.tests/src/test/02-after-ragconnect/.gitignore
deleted file mode 100644
index d6b7ef32c8478a48c3994dcadc86837f4371184d..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/02-after-ragconnect/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore
diff --git a/ragconnect.tests/src/test/03-after-relast/.gitignore b/ragconnect.tests/src/test/03-after-relast/.gitignore
deleted file mode 100644
index d6b7ef32c8478a48c3994dcadc86837f4371184d..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/03-after-relast/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore
diff --git a/ragconnect.tests/src/test/java-gen/.gitignore b/ragconnect.tests/src/test/java-gen/.gitignore
deleted file mode 100644
index d6b7ef32c8478a48c3994dcadc86837f4371184d..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/java-gen/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/AbstractMqttTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/AbstractMqttTest.java
deleted file mode 100644
index efaa302508d351f8d1fce557b49634527b54ac6e..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/AbstractMqttTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.jastadd.ragconnect.tests;
-
-import defaultOnlyRead.ast.MqttHandler;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Tag;
-
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Base class for tests ensuring running mqtt broker.
- *
- * @author rschoene - Initial contribution
- */
-@Tag("mqtt")
-public abstract class AbstractMqttTest {
-  static boolean checkDone = false;
-  static Boolean checkResult;
-
-  @BeforeAll
-  public static void checkMqttConnection() {
-    if (!checkDone) {
-      checkDone = true;
-      try {
-        checkResult = new MqttHandler()
-            .dontSendWelcomeMessage()
-            .setHost(TestUtils.getMqttHost())
-            .waitUntilReady(2, TimeUnit.SECONDS);
-      } catch (IOException e) {
-        checkResult = false;
-      }
-    }
-    if (!checkResult) {
-      throw new IllegalStateException("Mqtt Broker not ready!");
-    }
-  }
-}
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java
deleted file mode 100644
index 3746ceb3eaf8c83671747000e1fbf70ff37b9e96..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package org.jastadd.ragconnect.tests;
-
-import defaultOnlyRead.ast.A;
-import defaultOnlyRead.ast.BoxedTypes;
-import defaultOnlyRead.ast.MqttHandler;
-import defaultOnlyRead.ast.NativeTypes;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.Test;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.concurrent.TimeUnit;
-
-import static org.jastadd.ragconnect.tests.TestUtils.mqttUri;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * Test case "defaultOnlyRead".
- *
- * @author rschoene - Initial contribution
- */
-public class DefaultOnlyReadTest extends AbstractMqttTest {
-
-  private static final String TOPIC_NATIVE_INT = "native/int";
-  private static final String TOPIC_NATIVE_SHORT = "native/short";
-  private static final String TOPIC_NATIVE_LONG = "native/long";
-  private static final String TOPIC_NATIVE_FLOAT = "native/float";
-  private static final String TOPIC_NATIVE_DOUBLE = "native/double";
-  private static final String TOPIC_NATIVE_CHAR = "native/char";
-  private static final String TOPIC_NATIVE_STRING = "native/string";
-
-  private static final String TOPIC_BOXED_INTEGER = "boxed/Integer";
-  private static final String TOPIC_BOXED_SHORT = "boxed/Short";
-  private static final String TOPIC_BOXED_LONG = "boxed/Long";
-  private static final String TOPIC_BOXED_FLOAT = "boxed/Float";
-  private static final String TOPIC_BOXED_DOUBLE = "boxed/Double";
-  private static final String TOPIC_BOXED_CHARACTER = "boxed/Character";
-
-  private A model;
-  private NativeTypes integers;
-  private NativeTypes floats;
-  private NativeTypes chars;
-  private BoxedTypes allBoxed;
-  private MqttHandler sender;
-
-  @AfterEach
-  public void closeConnections() {
-    if (sender != null) {
-      sender.close();
-    }
-    if (model != null) {
-      model.ragconnectCloseConnections();
-    }
-  }
-
-
-  @Test
-  public void buildModel() {
-    createModel();
-  }
-
-  @Test
-  public void communicate() throws IOException, InterruptedException {
-    createModel();
-    model.ragconnectSetupMqttWaitUntilReady(2, TimeUnit.SECONDS);
-
-    integers.connectIntValue(mqttUri(TOPIC_NATIVE_INT));
-    integers.connectShortValue(mqttUri(TOPIC_NATIVE_SHORT));
-    integers.connectLongValue(mqttUri(TOPIC_NATIVE_LONG));
-    floats.connectFloatValue(mqttUri(TOPIC_NATIVE_FLOAT));
-    floats.connectDoubleValue(mqttUri(TOPIC_NATIVE_DOUBLE));
-    chars.connectCharValue(mqttUri(TOPIC_NATIVE_CHAR));
-    chars.connectStringValue(mqttUri(TOPIC_NATIVE_STRING));
-    allBoxed.connectIntValue(mqttUri(TOPIC_BOXED_INTEGER));
-    allBoxed.connectShortValue(mqttUri(TOPIC_BOXED_SHORT));
-    allBoxed.connectLongValue(mqttUri(TOPIC_BOXED_LONG));
-    allBoxed.connectFloatValue(mqttUri(TOPIC_BOXED_FLOAT));
-    allBoxed.connectDoubleValue(mqttUri(TOPIC_BOXED_DOUBLE));
-    allBoxed.connectCharValue(mqttUri(TOPIC_BOXED_CHARACTER));
-
-    sender = new MqttHandler().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost());
-    assertTrue(sender.waitUntilReady(2, TimeUnit.SECONDS));
-
-    final int expectedIntValue = 1;
-    final short expectedShortValue = 2;
-    final long expectedLongValue = 3L;
-    final float expectedFloatValue = 4.1f;
-    final double expectedDoubleValue = 5.2;
-    final char expectedCharValue = 'c';
-    final String expectedStringValue = "6.3";
-
-    sender.publish(TOPIC_NATIVE_INT, ByteBuffer.allocate(4).putInt(expectedIntValue).array());
-    sender.publish(TOPIC_NATIVE_SHORT, ByteBuffer.allocate(2).putShort(expectedShortValue).array());
-    sender.publish(TOPIC_NATIVE_LONG, ByteBuffer.allocate(8).putLong(expectedLongValue).array());
-    sender.publish(TOPIC_NATIVE_FLOAT, ByteBuffer.allocate(4).putFloat(expectedFloatValue).array());
-    sender.publish(TOPIC_NATIVE_DOUBLE, ByteBuffer.allocate(8).putDouble(expectedDoubleValue).array());
-    sender.publish(TOPIC_NATIVE_CHAR, ByteBuffer.allocate(2).putChar(expectedCharValue).array());
-    sender.publish(TOPIC_NATIVE_STRING, expectedStringValue.getBytes());
-
-    sender.publish(TOPIC_BOXED_INTEGER, ByteBuffer.allocate(4).putInt(expectedIntValue).array());
-    sender.publish(TOPIC_BOXED_SHORT, ByteBuffer.allocate(2).putShort(expectedShortValue).array());
-    sender.publish(TOPIC_BOXED_LONG, ByteBuffer.allocate(8).putLong(expectedLongValue).array());
-    sender.publish(TOPIC_BOXED_FLOAT, ByteBuffer.allocate(4).putFloat(expectedFloatValue).array());
-    sender.publish(TOPIC_BOXED_DOUBLE, ByteBuffer.allocate(8).putDouble(expectedDoubleValue).array());
-    sender.publish(TOPIC_BOXED_CHARACTER, ByteBuffer.allocate(2).putChar(expectedCharValue).array());
-
-    TestUtils.waitForMqtt();
-
-    assertEquals(expectedIntValue, integers.getIntValue());
-    assertEquals(expectedShortValue, integers.getShortValue());
-    assertEquals(expectedLongValue, integers.getLongValue());
-    assertEquals(expectedFloatValue, floats.getFloatValue(), TestUtils.DELTA);
-    assertEquals(expectedDoubleValue, floats.getDoubleValue(), TestUtils.DELTA);
-    assertEquals(expectedCharValue, chars.getCharValue());
-    assertEquals(expectedStringValue, chars.getStringValue());
-
-    assertEquals(expectedIntValue, allBoxed.getIntValue().intValue());
-    assertEquals(expectedShortValue, allBoxed.getShortValue().shortValue());
-    assertEquals(expectedLongValue, allBoxed.getLongValue().longValue());
-    assertEquals(expectedFloatValue, allBoxed.getFloatValue(), TestUtils.DELTA);
-    assertEquals(expectedDoubleValue, allBoxed.getDoubleValue(), TestUtils.DELTA);
-    assertEquals(expectedCharValue, allBoxed.getCharValue().charValue());
-  }
-
-  private void createModel() {
-    model = new A();
-    integers = new NativeTypes();
-    model.addNativeTypes(integers);
-    floats = new NativeTypes();
-    model.addNativeTypes(floats);
-    chars = new NativeTypes();
-    model.addNativeTypes(chars);
-    allBoxed = new BoxedTypes();
-    model.addBoxedTypes(allBoxed);
-  }
-
-}
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyWriteTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyWriteTest.java
deleted file mode 100644
index 80bd95c603da385184927862b42a6f54b1d4f57e..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyWriteTest.java
+++ /dev/null
@@ -1,319 +0,0 @@
-package org.jastadd.ragconnect.tests;
-
-import defaultOnlyWrite.ast.A;
-import defaultOnlyWrite.ast.BoxedTypesSyn;
-import defaultOnlyWrite.ast.MqttHandler;
-import defaultOnlyWrite.ast.NativeTypesSyn;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.Test;
-
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-
-import static org.jastadd.ragconnect.tests.TestUtils.mqttUri;
-import static org.junit.jupiter.api.Assertions.*;
-
-/**
- * Test case "defaultOnlyRead".
- *
- * @author rschoene - Initial contribution
- */
-public class DefaultOnlyWriteTest extends AbstractMqttTest {
-
-  private static final String TOPIC_NATIVE_INT = "native/int";
-  private static final String TOPIC_NATIVE_SHORT = "native/short";
-  private static final String TOPIC_NATIVE_LONG = "native/long";
-  private static final String TOPIC_NATIVE_FLOAT = "native/float";
-  private static final String TOPIC_NATIVE_DOUBLE = "native/double";
-  private static final String TOPIC_NATIVE_CHAR = "native/char";
-  private static final String TOPIC_NATIVE_STRING = "native/string";
-
-  private static final String TOPIC_BOXED_INTEGER = "boxed/Integer";
-  private static final String TOPIC_BOXED_SHORT = "boxed/Short";
-  private static final String TOPIC_BOXED_LONG = "boxed/Long";
-  private static final String TOPIC_BOXED_FLOAT = "boxed/Float";
-  private static final String TOPIC_BOXED_DOUBLE = "boxed/Double";
-  private static final String TOPIC_BOXED_CHARACTER = "boxed/Character";
-
-  private A model;
-  private NativeTypesSyn nativeIntegers;
-  private NativeTypesSyn nativeFloats;
-  private NativeTypesSyn nativeChars;
-  private BoxedTypesSyn boxedIntegers;
-  private BoxedTypesSyn boxedFloats;
-  private BoxedTypesSyn boxedChars;
-  private MqttHandler receiver;
-  private ReceiverData data;
-
-  @AfterEach
-  public void closeConnections() {
-    if (receiver != null) {
-      receiver.close();
-    }
-    if (model != null) {
-      model.ragconnectCloseConnections();
-    }
-  }
-
-
-  @Test
-  public void buildModel() {
-    createModel();
-  }
-
-  @Test
-  public void communicateSendInitialValue() throws IOException, InterruptedException {
-    createModel();
-    setData("1", "1.1", "ab");
-    setupReceiverAndConnect(true);
-
-    // check initial value
-    TestUtils.waitForMqtt();
-    checkData(1, 1, 1.1, 'a', "ab");
-
-    // set new value
-    setData("2", "2.2", "cd");
-
-    // check new value
-    TestUtils.waitForMqtt();
-    checkData(2, 2, 2.2, 'c', "cd");
-
-    // set new value
-    setData("3", "3.2", "ee");
-
-    // check new value
-    TestUtils.waitForMqtt();
-    checkData(3, 3, 3.2, 'e', "ee");
-  }
-
-  @Test
-  public void communicateOnlyUpdatedValue() throws IOException, InterruptedException {
-    createModel();
-    setData("1", "1.1", "ab");
-    setupReceiverAndConnect(false);
-
-    // check initial value (will be default values)
-    TestUtils.waitForMqtt();
-    checkData(0, null, null, null, null);
-
-    // set new value
-    setData("2", "2.2", "cd");
-
-    // check new value
-    TestUtils.waitForMqtt();
-    checkData(1, 2, 2.2, 'c', "cd");
-
-    // set new value
-    setData("3", "3.2", "ee");
-
-    // check new value
-    TestUtils.waitForMqtt();
-    checkData(2, 3, 3.2, 'e', "ee");
-  }
-
-  private void createModel() {
-    model = new A();
-
-    nativeIntegers = new NativeTypesSyn();
-    nativeFloats = new NativeTypesSyn();
-    nativeChars = new NativeTypesSyn();
-    model.addNativeTypesSyn(nativeIntegers);
-    model.addNativeTypesSyn(nativeFloats);
-    model.addNativeTypesSyn(nativeChars);
-
-    boxedIntegers = new BoxedTypesSyn();
-    boxedFloats = new BoxedTypesSyn();
-    boxedChars = new BoxedTypesSyn();
-    model.addBoxedTypesSyn(boxedIntegers);
-    model.addBoxedTypesSyn(boxedFloats);
-    model.addBoxedTypesSyn(boxedChars);
-  }
-
-  private void setupReceiverAndConnect(boolean writeCurrentValue) throws IOException {
-    model.ragconnectSetupMqttWaitUntilReady(2, TimeUnit.SECONDS);
-
-    receiver = new MqttHandler().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost());
-    assertTrue(receiver.waitUntilReady(2, TimeUnit.SECONDS));
-
-    nativeIntegers.addNativeIntDependency(nativeIntegers);
-    nativeIntegers.addNativeShortDependency(nativeIntegers);
-    nativeIntegers.addNativeLongDependency(nativeIntegers);
-    nativeFloats.addNativeFloatDependency(nativeFloats);
-    nativeFloats.addNativeDoubleDependency(nativeFloats);
-    nativeChars.addNativeCharDependency(nativeChars);
-    nativeChars.addNativeStringDependency(nativeChars);
-
-    boxedIntegers.addBoxedIntDependency(boxedIntegers);
-    boxedIntegers.addBoxedShortDependency(boxedIntegers);
-    boxedIntegers.addBoxedLongDependency(boxedIntegers);
-    boxedFloats.addBoxedFloatDependency(boxedFloats);
-    boxedFloats.addBoxedDoubleDependency(boxedFloats);
-    boxedChars.addBoxedCharDependency(boxedChars);
-
-    data = new ReceiverData();
-
-    receiver.newConnection(TOPIC_NATIVE_INT, bytes -> {
-      data.numberOfNativeIntValues += 1;
-      data.lastNativeIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
-    });
-    receiver.newConnection(TOPIC_NATIVE_SHORT, bytes -> {
-      data.numberOfNativeShortValues += 1;
-      data.lastNativeShortValue = java.nio.ByteBuffer.wrap(bytes).getShort();
-    });
-    receiver.newConnection(TOPIC_NATIVE_LONG, bytes -> {
-      data.numberOfNativeLongValues += 1;
-      data.lastNativeLongValue = java.nio.ByteBuffer.wrap(bytes).getLong();
-    });
-    receiver.newConnection(TOPIC_NATIVE_FLOAT, bytes -> {
-      data.numberOfNativeFloatValues += 1;
-      data.lastNativeFloatValue = java.nio.ByteBuffer.wrap(bytes).getFloat();
-    });
-    receiver.newConnection(TOPIC_NATIVE_DOUBLE, bytes -> {
-      data.numberOfNativeDoubleValues += 1;
-      data.lastNativeDoubleValue = java.nio.ByteBuffer.wrap(bytes).getDouble();
-    });
-    receiver.newConnection(TOPIC_NATIVE_CHAR, bytes -> {
-      data.numberOfNativeCharValues += 1;
-      data.lastNativeCharValue = java.nio.ByteBuffer.wrap(bytes).getChar();
-    });
-    receiver.newConnection(TOPIC_NATIVE_STRING, bytes -> {
-      data.numberOfNativeStringValues += 1;
-      data.lastNativeStringValue = new String(bytes);
-    });
-    receiver.newConnection(TOPIC_BOXED_INTEGER, bytes -> {
-      data.numberOfBoxedIntValues += 1;
-      data.lastBoxedIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
-    });
-    receiver.newConnection(TOPIC_BOXED_SHORT, bytes -> {
-      data.numberOfBoxedShortValues += 1;
-      data.lastBoxedShortValue = java.nio.ByteBuffer.wrap(bytes).getShort();
-    });
-    receiver.newConnection(TOPIC_BOXED_LONG, bytes -> {
-      data.numberOfBoxedLongValues += 1;
-      data.lastBoxedLongValue = java.nio.ByteBuffer.wrap(bytes).getLong();
-    });
-    receiver.newConnection(TOPIC_BOXED_FLOAT, bytes -> {
-      data.numberOfBoxedFloatValues += 1;
-      data.lastBoxedFloatValue = java.nio.ByteBuffer.wrap(bytes).getFloat();
-    });
-    receiver.newConnection(TOPIC_BOXED_DOUBLE, bytes -> {
-      data.numberOfBoxedDoubleValues += 1;
-      data.lastBoxedDoubleValue = java.nio.ByteBuffer.wrap(bytes).getDouble();
-    });
-    receiver.newConnection(TOPIC_BOXED_CHARACTER, bytes -> {
-      data.numberOfBoxedCharValues += 1;
-      data.lastBoxedCharValue = java.nio.ByteBuffer.wrap(bytes).getChar();
-    });
-
-    nativeIntegers.connectIntValue(mqttUri(TOPIC_NATIVE_INT), writeCurrentValue);
-    nativeIntegers.connectShortValue(mqttUri(TOPIC_NATIVE_SHORT), writeCurrentValue);
-    nativeIntegers.connectLongValue(mqttUri(TOPIC_NATIVE_LONG), writeCurrentValue);
-    nativeFloats.connectFloatValue(mqttUri(TOPIC_NATIVE_FLOAT), writeCurrentValue);
-    nativeFloats.connectDoubleValue(mqttUri(TOPIC_NATIVE_DOUBLE), writeCurrentValue);
-    nativeChars.connectCharValue(mqttUri(TOPIC_NATIVE_CHAR), writeCurrentValue);
-    nativeChars.connectStringValue(mqttUri(TOPIC_NATIVE_STRING), writeCurrentValue);
-    boxedIntegers.connectIntValue(mqttUri(TOPIC_BOXED_INTEGER), writeCurrentValue);
-    boxedIntegers.connectShortValue(mqttUri(TOPIC_BOXED_SHORT), writeCurrentValue);
-    boxedIntegers.connectLongValue(mqttUri(TOPIC_BOXED_LONG), writeCurrentValue);
-    boxedFloats.connectFloatValue(mqttUri(TOPIC_BOXED_FLOAT), writeCurrentValue);
-    boxedFloats.connectDoubleValue(mqttUri(TOPIC_BOXED_DOUBLE), writeCurrentValue);
-    boxedChars.connectCharValue(mqttUri(TOPIC_BOXED_CHARACTER), writeCurrentValue);
-  }
-
-  private void setData(String integerDriver, String floatDriver, String stringDriver) {
-    nativeIntegers.setDriverSyn(integerDriver);
-    nativeFloats.setDriverSyn(floatDriver);
-    nativeChars.setDriverSyn(stringDriver);
-
-    boxedIntegers.setDriverSyn(integerDriver);
-    boxedFloats.setDriverSyn(floatDriver);
-    boxedChars.setDriverSyn(stringDriver);
-  }
-
-  private void checkData(int expectedNumberOfValues,
-                         Integer expectedInt, Double expectedDouble,
-                         Character expectedChar, String expectedString) {
-    assertEquals(expectedNumberOfValues, data.numberOfNativeIntValues);
-    assertEquals(expectedNumberOfValues, data.numberOfNativeShortValues);
-    assertEquals(expectedNumberOfValues, data.numberOfNativeLongValues);
-    assertEquals(expectedNumberOfValues, data.numberOfNativeFloatValues);
-    assertEquals(expectedNumberOfValues, data.numberOfNativeDoubleValues);
-    assertEquals(expectedNumberOfValues, data.numberOfNativeCharValues);
-    assertEquals(expectedNumberOfValues, data.numberOfNativeStringValues);
-
-    assertEquals(expectedNumberOfValues, data.numberOfBoxedIntValues);
-    assertEquals(expectedNumberOfValues, data.numberOfBoxedShortValues);
-    assertEquals(expectedNumberOfValues, data.numberOfBoxedLongValues);
-    assertEquals(expectedNumberOfValues, data.numberOfBoxedFloatValues);
-    assertEquals(expectedNumberOfValues, data.numberOfBoxedDoubleValues);
-    assertEquals(expectedNumberOfValues, data.numberOfBoxedCharValues);
-
-    if (expectedInt != null) {
-      assertEquals(expectedInt.intValue(), data.lastNativeIntValue);
-      assertEquals(expectedInt.shortValue(), data.lastNativeShortValue);
-      assertEquals(expectedInt.longValue(), data.lastNativeLongValue);
-      assertEquals(expectedInt.intValue(), data.lastBoxedIntValue.intValue());
-      assertEquals(expectedInt.shortValue(), data.lastBoxedShortValue.shortValue());
-      assertEquals(expectedInt.longValue(), data.lastBoxedLongValue.longValue());
-    } else {
-      assertEquals(0, data.lastNativeIntValue);
-      assertEquals(0, data.lastNativeShortValue);
-      assertEquals(0, data.lastNativeLongValue);
-      assertNull(data.lastBoxedIntValue);
-      assertNull(data.lastBoxedShortValue);
-      assertNull(data.lastBoxedLongValue);
-    }
-
-    if (expectedDouble != null) {
-      assertEquals(expectedDouble.floatValue(), data.lastNativeFloatValue, TestUtils.DELTA);
-      assertEquals(expectedDouble, data.lastNativeDoubleValue, TestUtils.DELTA);
-      assertEquals(expectedDouble.floatValue(), data.lastBoxedFloatValue, TestUtils.DELTA);
-      assertEquals(expectedDouble, data.lastBoxedDoubleValue, TestUtils.DELTA);
-    } else {
-      assertEquals(0f, data.lastNativeFloatValue, TestUtils.DELTA);
-      assertEquals(0d, data.lastNativeDoubleValue, TestUtils.DELTA);
-      assertNull(data.lastBoxedFloatValue);
-      assertNull(data.lastBoxedDoubleValue);
-    }
-
-    if (expectedChar != null) {
-      assertEquals(expectedChar.charValue(), data.lastNativeCharValue);
-      assertEquals(expectedChar, data.lastBoxedCharValue);
-    } else {
-      assertEquals('\0', data.lastNativeCharValue);
-      assertNull(data.lastBoxedCharValue);
-    }
-    assertEquals(expectedString, data.lastNativeStringValue);
-  }
-
-  private static class ReceiverData {
-    int lastNativeIntValue;
-    int numberOfNativeIntValues = 0;
-    short lastNativeShortValue;
-    int numberOfNativeShortValues = 0;
-    long lastNativeLongValue;
-    int numberOfNativeLongValues = 0;
-    float lastNativeFloatValue;
-    int numberOfNativeFloatValues = 0;
-    double lastNativeDoubleValue;
-    int numberOfNativeDoubleValues = 0;
-    char lastNativeCharValue;
-    int numberOfNativeCharValues = 0;
-    String lastNativeStringValue;
-    int numberOfNativeStringValues = 0;
-
-    Integer lastBoxedIntValue;
-    int numberOfBoxedIntValues = 0;
-    Short lastBoxedShortValue;
-    int numberOfBoxedShortValues = 0;
-    Long lastBoxedLongValue;
-    int numberOfBoxedLongValues = 0;
-    Float lastBoxedFloatValue;
-    int numberOfBoxedFloatValues = 0;
-    Double lastBoxedDoubleValue;
-    int numberOfBoxedDoubleValues = 0;
-    Character lastBoxedCharValue;
-    int numberOfBoxedCharValues = 0;
-  }
-
-}
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java
deleted file mode 100644
index 17d853fba71c2ee46c6c6c7b5424958af0a5f8d2..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Errors.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.jastadd.ragconnect.tests;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.jastadd.ragconnect.compiler.Compiler;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.Charset;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.jastadd.ragconnect.tests.TestUtils.exec;
-import static org.jastadd.ragconnect.tests.TestUtils.readFile;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-class Errors {
-
-  private static final Logger logger = LogManager.getLogger(Errors.class);
-  private static final String FILENAME_PATTERN = "$FILENAME";
-  private static final String INPUT_DIRECTORY = "./src/test/01-input/errors/";
-  private static final String OUTPUT_DIRECTORY = "./src/test/02-after-ragconnect/errors/";
-
-  @BeforeAll
-  public static void createOutputDirectory() {
-    File outputDirectory = new File(OUTPUT_DIRECTORY);
-    assertTrue((outputDirectory.exists() && outputDirectory.isDirectory()) || outputDirectory.mkdir());
-  }
-
-  @Test
-  void testStandardErrors() throws IOException {
-    test("Errors", "A");
-  }
-
-  @SuppressWarnings("SameParameterValue")
-  private void test(String name, String rootNode) throws IOException {
-    String grammarFile = INPUT_DIRECTORY + name + ".relast";
-    String ragconnectFile = INPUT_DIRECTORY + name + ".connect";
-    String outFile = OUTPUT_DIRECTORY + name + ".out";
-    String expectedFile = INPUT_DIRECTORY + name + ".expected";
-
-    try {
-      logger.debug("user.dir: {}", System.getProperty("user.dir"));
-      String[] args = {
-          "--o=" + OUTPUT_DIRECTORY,
-          grammarFile,
-          ragconnectFile,
-          "--rootNode=" + rootNode,
-          "--verbose"
-      };
-      int returnValue = exec(Compiler.class, args, new File(outFile));
-      Assertions.assertEquals(1, returnValue, "RagConnect did not return with value 1");
-    } catch (IOException | InterruptedException e) {
-      e.printStackTrace();
-    }
-
-    String out = readFile(outFile, Charset.defaultCharset());
-    String expected = readFile(expectedFile, Charset.defaultCharset());
-//    if (inFiles.size() == 1) {
-      expected = expected.replace(FILENAME_PATTERN, name);
-//    } else {
-//      for (int i = 0; i < inFiles.size(); i++) {
-//        expected = expected.replace(FILENAME_PATTERN + (i + 1), inFiles.get(i));
-//      }
-//    }
-    List<String> outList = Arrays.asList(out.split("\n"));
-    Collections.sort(outList);
-    List<String> expectedList = Arrays.stream(expected.split("\n"))
-        .sorted()
-        .filter(s -> !s.isEmpty() && !s.startsWith("//"))
-        .collect(Collectors.toList());
-
-    // FIXME errors not handled correctly at the moment
-//    Assertions.assertLinesMatch(expectedList, outList);
-
-    logger.info("ragconnect for " + name + " returned:\n{}", out);
-  }
-
-}
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ExampleTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ExampleTest.java
deleted file mode 100644
index 3d0706c075d8e4af3b3c5e5fa703f3885b80ddf3..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ExampleTest.java
+++ /dev/null
@@ -1,286 +0,0 @@
-package org.jastadd.ragconnect.tests;
-
-import com.google.protobuf.InvalidProtocolBufferException;
-import config.Config.RobotConfig;
-import example.ast.*;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import robot.RobotStateOuterClass.RobotState;
-
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-
-import static org.jastadd.ragconnect.tests.TestUtils.mqttUri;
-import static org.junit.jupiter.api.Assertions.*;
-
-/**
- * Test case "example".
- *
- * @author rschoene - Initial contribution
- */
-public class ExampleTest extends AbstractMqttTest {
-
-  private static final String TOPIC_CONFIG = "robot/config";
-  private static final String TOPIC_JOINT1 = "robot/arm/joint1";
-  private static final String TOPIC_JOINT2 = "robot/arm/joint2";
-
-  private Model model;
-  private RobotArm robotArm;
-  private Link link1;
-  private Link link2;
-  private MqttHandler handler;
-  private ReceiverData data;
-
-  @BeforeEach
-  public void resetTestCounter() {
-    TestCounter.reset();
-  }
-
-  @AfterEach
-  public void closeConnections() {
-    if (handler != null) {
-      handler.close();
-    }
-    if (model != null) {
-      model.ragconnectCloseConnections();
-    }
-  }
-
-  @Test
-  public void buildModel() {
-    createModel();
-  }
-
-  @Test
-  public void communicateSendInitialValue() throws IOException, InterruptedException {
-    createModel();
-    setupReceiverAndConnect(true);
-
-    // joint is currently within the safety zone, so speed should be low
-    TestUtils.waitForMqtt();
-    assertEquals(0, TestCounter.INSTANCE.numberParseLinkState);
-    assertEquals(0, TestCounter.INSTANCE.numberLinkStateToIntPosition);
-    assertEquals(1, TestCounter.INSTANCE.numberInSafetyZone);
-    assertEquals(1, TestCounter.INSTANCE.numberCreateSpeedMessage);
-    assertEquals(1, TestCounter.INSTANCE.numberSerializeRobotConfig);
-    assertEquals(1, data.numberOfConfigs);
-    assertFalse(data.failedLastConversion);
-    assertEquals(robotArm.speedLow(), data.lastConfig.getSpeed(), TestUtils.DELTA);
-
-    // change position of the first joint out of the safety zone, second still in
-    sendData(TOPIC_JOINT1, 0.2f, 0.2f, 0.2f);
-
-    // still in safety zone, so no update should have been sent
-    TestUtils.waitForMqtt();
-    assertEquals(makePosition(2, 2, 2), link1.getCurrentPosition());
-    assertEquals(1, TestCounter.INSTANCE.numberParseLinkState);
-    assertEquals(1, TestCounter.INSTANCE.numberLinkStateToIntPosition);
-    assertEquals(2, TestCounter.INSTANCE.numberInSafetyZone);
-    assertEquals(2, TestCounter.INSTANCE.numberCreateSpeedMessage);
-    assertEquals(2, TestCounter.INSTANCE.numberSerializeRobotConfig);
-    assertEquals(1, data.numberOfConfigs);
-    assertFalse(data.failedLastConversion);
-    assertEquals(robotArm.speedLow(), data.lastConfig.getSpeed(), TestUtils.DELTA);
-
-    // change position of second joint also out of the safety zone, now speed must be high
-    sendData(TOPIC_JOINT2, 0.3f, 0.4f, 0.5f);
-
-    TestUtils.waitForMqtt();
-    assertEquals(makePosition(3, 4, 5), link2.getCurrentPosition());
-    assertEquals(2, TestCounter.INSTANCE.numberParseLinkState);
-    assertEquals(2, TestCounter.INSTANCE.numberLinkStateToIntPosition);
-    assertEquals(3, TestCounter.INSTANCE.numberInSafetyZone);
-    assertEquals(3, TestCounter.INSTANCE.numberCreateSpeedMessage);
-    assertEquals(3, TestCounter.INSTANCE.numberSerializeRobotConfig);
-    assertEquals(2, data.numberOfConfigs);
-    assertFalse(data.failedLastConversion);
-    assertEquals(robotArm.speedHigh(), data.lastConfig.getSpeed(), TestUtils.DELTA);
-
-    // change position of second joint, no change after mapping
-    sendData(TOPIC_JOINT2, 0.33f, 0.42f, 0.51f);
-
-    TestUtils.waitForMqtt();
-    assertEquals(makePosition(3, 4, 5), link2.getCurrentPosition());
-    assertEquals(3, TestCounter.INSTANCE.numberParseLinkState);
-    assertEquals(3, TestCounter.INSTANCE.numberLinkStateToIntPosition);
-    assertEquals(3, TestCounter.INSTANCE.numberInSafetyZone);
-    assertEquals(3, TestCounter.INSTANCE.numberCreateSpeedMessage);
-    assertEquals(3, TestCounter.INSTANCE.numberSerializeRobotConfig);
-    assertEquals(2, data.numberOfConfigs);
-    assertFalse(data.failedLastConversion);
-
-    // change position of second joint, still out of the safety zone, no update should be sent
-    sendData(TOPIC_JOINT2, 1.3f, 2.4f, 3.5f);
-
-    TestUtils.waitForMqtt();
-    assertEquals(makePosition(13, 24, 35), link2.getCurrentPosition());
-    assertEquals(4, TestCounter.INSTANCE.numberParseLinkState);
-    assertEquals(4, TestCounter.INSTANCE.numberLinkStateToIntPosition);
-    assertEquals(4, TestCounter.INSTANCE.numberInSafetyZone);
-    assertEquals(4, TestCounter.INSTANCE.numberCreateSpeedMessage);
-    assertEquals(4, TestCounter.INSTANCE.numberSerializeRobotConfig);
-    assertEquals(2, data.numberOfConfigs);
-    assertFalse(data.failedLastConversion);
-  }
-
-  @Test
-  public void communicateOnlyUpdatedValue() throws IOException, InterruptedException {
-    createModel();
-    setupReceiverAndConnect(false);
-
-    // no value should have been sent
-    TestUtils.waitForMqtt();
-    assertEquals(0, TestCounter.INSTANCE.numberParseLinkState);
-    assertEquals(0, TestCounter.INSTANCE.numberLinkStateToIntPosition);
-    assertEquals(1, TestCounter.INSTANCE.numberInSafetyZone);
-    assertEquals(1, TestCounter.INSTANCE.numberCreateSpeedMessage);
-    assertEquals(1, TestCounter.INSTANCE.numberSerializeRobotConfig);
-    assertEquals(0, data.numberOfConfigs);
-
-    // change position of the first joint out of the safety zone, second still in
-    sendData(TOPIC_JOINT1, 0.2f, 0.2f, 0.2f);
-
-    // still in safety zone, hence, no value should have been sent
-    TestUtils.waitForMqtt();
-    assertEquals(makePosition(2, 2, 2), link1.getCurrentPosition());
-    assertEquals(1, TestCounter.INSTANCE.numberParseLinkState);
-    assertEquals(1, TestCounter.INSTANCE.numberLinkStateToIntPosition);
-    assertEquals(2, TestCounter.INSTANCE.numberInSafetyZone);
-    assertEquals(2, TestCounter.INSTANCE.numberCreateSpeedMessage);
-    assertEquals(2, TestCounter.INSTANCE.numberSerializeRobotConfig);
-    assertEquals(0, data.numberOfConfigs);
-
-    // change position of second joint also out of the safety zone, now speed must be high
-    sendData(TOPIC_JOINT2, 0.3f, 0.4f, 0.5f);
-
-    TestUtils.waitForMqtt();
-    assertEquals(makePosition(3, 4, 5), link2.getCurrentPosition());
-    assertEquals(2, TestCounter.INSTANCE.numberParseLinkState);
-    assertEquals(2, TestCounter.INSTANCE.numberLinkStateToIntPosition);
-    assertEquals(3, TestCounter.INSTANCE.numberInSafetyZone);
-    assertEquals(3, TestCounter.INSTANCE.numberCreateSpeedMessage);
-    assertEquals(3, TestCounter.INSTANCE.numberSerializeRobotConfig);
-    assertEquals(1, data.numberOfConfigs);
-    assertFalse(data.failedLastConversion);
-    assertEquals(robotArm.speedHigh(), data.lastConfig.getSpeed(), TestUtils.DELTA);
-
-    // change position of second joint, no change after mapping
-    sendData(TOPIC_JOINT2, 0.33f, 0.42f, 0.51f);
-
-    TestUtils.waitForMqtt();
-    assertEquals(makePosition(3, 4, 5), link2.getCurrentPosition());
-    assertEquals(3, TestCounter.INSTANCE.numberParseLinkState);
-    assertEquals(3, TestCounter.INSTANCE.numberLinkStateToIntPosition);
-    assertEquals(3, TestCounter.INSTANCE.numberInSafetyZone);
-    assertEquals(3, TestCounter.INSTANCE.numberCreateSpeedMessage);
-    assertEquals(3, TestCounter.INSTANCE.numberSerializeRobotConfig);
-    assertEquals(1, data.numberOfConfigs);
-    assertFalse(data.failedLastConversion);
-
-    // change position of second joint, still out of the safety zone, no update should be sent
-    sendData(TOPIC_JOINT2, 1.3f, 2.4f, 3.5f);
-
-    TestUtils.waitForMqtt();
-    assertEquals(makePosition(13, 24, 35), link2.getCurrentPosition());
-    assertEquals(4, TestCounter.INSTANCE.numberParseLinkState);
-    assertEquals(4, TestCounter.INSTANCE.numberLinkStateToIntPosition);
-    assertEquals(4, TestCounter.INSTANCE.numberInSafetyZone);
-    assertEquals(4, TestCounter.INSTANCE.numberCreateSpeedMessage);
-    assertEquals(4, TestCounter.INSTANCE.numberSerializeRobotConfig);
-    assertEquals(1, data.numberOfConfigs);
-    assertFalse(data.failedLastConversion);
-  }
-
-  @Test
-  public void testFailedConversion() throws IOException {
-    createModel();
-    setupReceiverAndConnect(false);
-
-    handler.publish(TOPIC_JOINT1, "not-a-pandaLinkState".getBytes());
-    assertEquals(0, data.numberOfConfigs);
-    assertTrue(data.failedLastConversion);
-  }
-
-  private void sendData(String topic, float x, float y, float z) {
-    handler.publish(topic, RobotState.newBuilder()
-        .setPosition(RobotState.Position.newBuilder().setX(x).setY(y).setZ(z).build())
-        .build()
-        .toByteArray()
-    );
-  }
-
-  private void setupReceiverAndConnect(boolean writeCurrentValue) throws IOException {
-    model.ragconnectSetupMqttWaitUntilReady(2, TimeUnit.SECONDS);
-
-    handler = new MqttHandler().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost());
-    assertTrue(handler.waitUntilReady(2, TimeUnit.SECONDS));
-
-    // add dependencies
-    robotArm.addDependency1(link1);
-    robotArm.addDependency1(link2);
-    robotArm.addDependency1(robotArm.getEndEffector());
-
-    data = new ReceiverData();
-
-    handler.newConnection(TOPIC_CONFIG, bytes -> {
-      data.numberOfConfigs += 1;
-      try {
-        data.lastConfig = RobotConfig.parseFrom(bytes);
-        data.failedLastConversion = false;
-      } catch (InvalidProtocolBufferException e) {
-        data.failedLastConversion = true;
-      }
-    });
-
-    robotArm.connectAppropriateSpeed(mqttUri(TOPIC_CONFIG), writeCurrentValue);
-    link1.connectCurrentPosition(mqttUri(TOPIC_JOINT1));
-    link2.connectCurrentPosition(mqttUri(TOPIC_JOINT2));
-  }
-
-  private void createModel() {
-    model = new Model();
-
-    ZoneModel zoneModel = new ZoneModel();
-
-    IntPosition firstPosition = makePosition(0, 0, 0);
-    IntPosition secondPosition = makePosition(-1, 0, 0);
-    IntPosition thirdPosition = makePosition(1, 0, 0);
-
-    Zone safetyZone = new Zone();
-    safetyZone.addCoordinate(new Coordinate(firstPosition));
-    safetyZone.addCoordinate(new Coordinate(secondPosition));
-    safetyZone.addCoordinate(new Coordinate(thirdPosition));
-    zoneModel.addSafetyZone(safetyZone);
-    model.setZoneModel(zoneModel);
-
-    robotArm = new RobotArm();
-
-    link1 = new Link();
-    link1.setName("joint1");
-    link1.setCurrentPosition(firstPosition);
-
-    link2 = new Link();
-    link2.setName("joint2");
-    link2.setCurrentPosition(secondPosition);
-
-    EndEffector endEffector = new EndEffector();
-    endEffector.setName("gripper");
-    endEffector.setCurrentPosition(makePosition(2, 2, 3));
-
-    robotArm.addLink(link1);
-    robotArm.addLink(link2);
-    robotArm.setEndEffector(endEffector);
-    model.setRobotArm(robotArm);
-  }
-
-  private static IntPosition makePosition(int x, int y, int z) {
-    return IntPosition.of(x, y, z);
-  }
-
-  private static class ReceiverData {
-    RobotConfig lastConfig;
-    boolean failedLastConversion = true;
-    int numberOfConfigs = 0;
-  }
-}
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read1Write2Test.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read1Write2Test.java
deleted file mode 100644
index 5ede1e1896afadc70da7b868cf4272eafa250514..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read1Write2Test.java
+++ /dev/null
@@ -1,250 +0,0 @@
-package org.jastadd.ragconnect.tests;
-
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.Test;
-import read1write2.ast.*;
-
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-
-import static org.jastadd.ragconnect.tests.TestUtils.mqttUri;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * Test case "read-1-write-2".
- *
- * @author rschoene - Initial contribution
- */
-public class Read1Write2Test extends AbstractMqttTest {
-
-  private static final String TOPIC_SAME_READ = "same/read";
-  private static final String TOPIC_SAME_WRITE_INT = "same/write/int";
-  private static final String TOPIC_SAME_WRITE_STRING = "same/write/string";
-  private static final String TOPIC_DIFFERENT_READ = "different/read";
-  private static final String TOPIC_DIFFERENT_WRITE1_INT = "different/write1/int";
-  private static final String TOPIC_DIFFERENT_WRITE1_STRING = "different/write1/string";
-  private static final String TOPIC_DIFFERENT_WRITE2_INT = "different/write2/int";
-  private static final String TOPIC_DIFFERENT_WRITE2_STRING = "different/write2/string";
-  private static final String INITIAL_VALUE = "-1";
-
-  private MqttHandler handler;
-  private A model;
-  private OnSameNonterminal onSameNonterminal;
-  private OnDifferentNonterminal onDifferentNonterminal;
-  private TheOther other1;
-  private TheOther other2;
-
-  private ReceiverData dataSame;
-  private ReceiverData dataOther1;
-  private ReceiverData dataOther2;
-
-  @AfterEach
-  public void closeConnections() {
-    if (handler != null) {
-      handler.close();
-    }
-    if (model != null) {
-      model.ragconnectCloseConnections();
-    }
-  }
-
-  @Test
-  public void buildModel() {
-    createModel();
-  }
-
-  @Test
-  public void communicateSendInitialValue() throws IOException, InterruptedException {
-    createModel();
-    setupReceiverAndConnect(true);
-
-    // check initial value
-    TestUtils.waitForMqtt();
-    checkData(1, Integer.parseInt(INITIAL_VALUE), prefixed(INITIAL_VALUE), 1, Integer.parseInt(INITIAL_VALUE), prefixed(INITIAL_VALUE));
-
-    // set new value
-    sendData("2", "3");
-
-    // check new value
-    TestUtils.waitForMqtt();
-    checkData(2, 2, prefixed("2"), 2, 3, prefixed("3"));
-
-    // set new value
-    sendData("4", "4");
-
-    // check new value
-    TestUtils.waitForMqtt();
-    checkData(3, 4, prefixed("4"), 3, 4, prefixed("4"));
-
-    // set new value only for same
-    setDataOnlySame("77");
-
-    // check new value
-    TestUtils.waitForMqtt();
-    checkData(4, 77, prefixed("77"), 3, 4, prefixed("4"));
-  }
-
-  private String prefixed(String s) {
-    return "prefix" + s;
-  }
-
-  @Test
-  public void communicateOnlyUpdatedValue() throws IOException, InterruptedException {
-    createModel();
-    setupReceiverAndConnect(false);
-
-    // check initial value
-    TestUtils.waitForMqtt();
-    checkData(0, null, null, 0, null, null);
-
-    // set new value
-    sendData("2", "3");
-
-    // check new value
-    TestUtils.waitForMqtt();
-    checkData(1, 2, prefixed("2"), 1, 3, prefixed("3"));
-
-    // set new value
-    sendData("4", "4");
-
-    // check new value
-    TestUtils.waitForMqtt();
-    checkData(2, 4, prefixed("4"), 2, 4, prefixed("4"));
-
-    // set new value only for same
-    setDataOnlySame("77");
-
-    // check new value
-    TestUtils.waitForMqtt();
-    checkData(3, 77, prefixed("77"), 2, 4, prefixed("4"));
-  }
-
-  private void createModel() {
-    // Setting value for Input without dependencies does not trigger any updates
-    model = new A();
-
-    onSameNonterminal = new OnSameNonterminal();
-    model.setOnSameNonterminal(onSameNonterminal);
-    onSameNonterminal.setInput(INITIAL_VALUE);
-
-    onDifferentNonterminal = new OnDifferentNonterminal();
-    other1 = new TheOther();
-    other2 = new TheOther();
-    onDifferentNonterminal.addTheOther(other1);
-    onDifferentNonterminal.addTheOther(other2);
-    model.setOnDifferentNonterminal(onDifferentNonterminal);
-    onDifferentNonterminal.setInput(INITIAL_VALUE);
-  }
-
-  private void setupReceiverAndConnect(boolean writeCurrentValue) throws IOException {
-    model.ragconnectSetupMqttWaitUntilReady(2, TimeUnit.SECONDS);
-
-    handler = new MqttHandler().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost());
-    assertTrue(handler.waitUntilReady(2, TimeUnit.SECONDS));
-
-    onSameNonterminal.addIntDependency(onSameNonterminal);
-    onSameNonterminal.addStringDependency(onSameNonterminal);
-    other1.addIntDependency(onDifferentNonterminal);
-    other1.addStringDependency(onDifferentNonterminal);
-    other2.addIntDependency(onDifferentNonterminal);
-    other2.addStringDependency(onDifferentNonterminal);
-
-    dataSame = new Read1Write2Test.ReceiverData();
-    dataOther1 = new Read1Write2Test.ReceiverData();
-    dataOther2 = new Read1Write2Test.ReceiverData();
-
-    handler.newConnection(TOPIC_SAME_WRITE_INT, bytes -> {
-      dataSame.numberOfIntValues += 1;
-      dataSame.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
-    });
-    handler.newConnection(TOPIC_SAME_WRITE_STRING, bytes -> {
-      dataSame.numberOfStringValues += 1;
-      dataSame.lastStringValue = new String(bytes);
-    });
-
-    handler.newConnection(TOPIC_DIFFERENT_WRITE1_INT, bytes -> {
-      dataOther1.numberOfIntValues += 1;
-      dataOther1.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
-    });
-    handler.newConnection(TOPIC_DIFFERENT_WRITE1_STRING, bytes -> {
-      dataOther1.numberOfStringValues += 1;
-      dataOther1.lastStringValue = new String(bytes);
-    });
-
-    handler.newConnection(TOPIC_DIFFERENT_WRITE2_INT, bytes -> {
-      dataOther2.numberOfIntValues += 1;
-      dataOther2.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
-    });
-    handler.newConnection(TOPIC_DIFFERENT_WRITE2_STRING, bytes -> {
-      dataOther2.numberOfStringValues += 1;
-      dataOther2.lastStringValue = new String(bytes);
-    });
-
-    onSameNonterminal.connectInput(mqttUri(TOPIC_SAME_READ));
-    onSameNonterminal.connectOutInteger(mqttUri(TOPIC_SAME_WRITE_INT), writeCurrentValue);
-    onSameNonterminal.connectOutString(mqttUri(TOPIC_SAME_WRITE_STRING), writeCurrentValue);
-
-    onDifferentNonterminal.connectInput(mqttUri(TOPIC_DIFFERENT_READ));
-    other1.connectOutInteger(mqttUri(TOPIC_DIFFERENT_WRITE1_INT), writeCurrentValue);
-    other1.connectOutString(mqttUri(TOPIC_DIFFERENT_WRITE1_STRING), writeCurrentValue);
-    other2.connectOutInteger(mqttUri(TOPIC_DIFFERENT_WRITE2_INT), writeCurrentValue);
-    other2.connectOutString(mqttUri(TOPIC_DIFFERENT_WRITE2_STRING), writeCurrentValue);
-  }
-
-  private void sendData(String inputSame, String inputDifferent) {
-    handler.publish(TOPIC_SAME_READ, inputSame.getBytes());
-    handler.publish(TOPIC_DIFFERENT_READ, inputDifferent.getBytes());
-  }
-
-  private void setDataOnlySame(String inputSame) {
-    handler.publish(TOPIC_SAME_READ, inputSame.getBytes());
-  }
-
-  private void checkData(int numberOfSameValues, Integer lastSameIntValue, String lastSameStringValue,
-                         int numberOfDifferentValues, Integer lastDifferentIntValue,
-                         String lastDifferentStringValue) {
-    /* the value "-2" is never used in the test, so a test will always fail comparing to this value
-     especially, it is not the initial value */
-    ReceiverData expectedDataSame = ReceiverData.of(
-        numberOfSameValues,
-        lastSameIntValue != null ? lastSameIntValue : -2,
-        lastSameStringValue);
-    compareData(expectedDataSame, dataSame);
-    ReceiverData expectedDataDifferent = ReceiverData.of(
-        numberOfDifferentValues,
-        lastDifferentIntValue != null ? lastDifferentIntValue : -2,
-        lastDifferentStringValue);
-    compareData(expectedDataDifferent, dataOther1);
-    compareData(expectedDataDifferent, dataOther2);
-  }
-
-  private void compareData(ReceiverData expectedData,
-                         ReceiverData actual) {
-    assertEquals(expectedData.numberOfIntValues, actual.numberOfIntValues);
-    assertEquals(expectedData.numberOfStringValues, actual.numberOfStringValues);
-    if (expectedData.numberOfIntValues > 0) {
-      assertEquals(expectedData.lastIntValue, actual.lastIntValue);
-    }
-    if (expectedData.numberOfStringValues > 0) {
-      assertEquals(expectedData.lastStringValue, actual.lastStringValue);
-    }
-  }
-
-  private static class ReceiverData {
-    int lastIntValue;
-    int numberOfIntValues = 0;
-    String lastStringValue;
-    int numberOfStringValues = 0;
-
-    static ReceiverData of(int numberOfValues, int lastIntValue, String lastStringValue) {
-      ReceiverData result = new ReceiverData();
-      result.lastIntValue = lastIntValue;
-      result.lastStringValue = lastStringValue;
-      result.numberOfIntValues = numberOfValues;
-      result.numberOfStringValues = numberOfValues;
-      return result;
-    }
-  }
-
-}
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read2Write1Test.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read2Write1Test.java
deleted file mode 100644
index 9881eb7110f98a3bc36301f2f7a163c417e9a54e..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/Read2Write1Test.java
+++ /dev/null
@@ -1,241 +0,0 @@
-package org.jastadd.ragconnect.tests;
-
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.Test;
-import read2write1.ast.*;
-
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-
-import static org.jastadd.ragconnect.tests.TestUtils.mqttUri;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * Test case "read-1-write-2".
- *
- * @author rschoene - Initial contribution
- */
-public class Read2Write1Test extends AbstractMqttTest {
-
-  private static final String TOPIC_SAME_READ1 = "same/read1";
-  private static final String TOPIC_SAME_READ2 = "same/read2";
-  private static final String TOPIC_SAME_WRITE_INT = "same/write/int";
-  private static final String TOPIC_DIFFERENT_READ1 = "different/read1";
-  private static final String TOPIC_DIFFERENT_READ2 = "different/read2";
-  private static final String TOPIC_DIFFERENT_WRITE1_INT = "different/write1/int";
-  private static final String TOPIC_DIFFERENT_WRITE2_INT = "different/write2/int";
-  private static final String INITIAL_VALUE = "0";
-
-  private MqttHandler handler;
-  private A model;
-  private OnSameNonterminal onSameNonterminal;
-  private OnDifferentNonterminal onDifferentNonterminal;
-  private TheOther other1;
-  private TheOther other2;
-
-  private ReceiverData dataSame;
-  private ReceiverData dataOther1;
-  private ReceiverData dataOther2;
-
-  @AfterEach
-  public void closeConnections() {
-    if (handler != null) {
-      handler.close();
-    }
-    if (model != null) {
-      model.ragconnectCloseConnections();
-    }
-  }
-
-  @Test
-  public void buildModel() {
-    createModel();
-  }
-
-  @Test
-  public void communicateSendInitialValue() throws IOException, InterruptedException {
-    createModel();
-    setupReceiverAndConnect(true);
-
-    // check initial value
-    TestUtils.waitForMqtt();
-    checkData(1, Integer.parseInt(INITIAL_VALUE + INITIAL_VALUE),
-        1, Integer.parseInt(INITIAL_VALUE + INITIAL_VALUE));
-
-    // set new value
-    sendData(true, "2", true, "3");
-
-    // check new value. same: 2, 0. different: 3, 0.
-    TestUtils.waitForMqtt();
-    checkData(2, 20,
-        2, 30);
-
-    // set new value
-    sendData(false, "4", false, "4");
-
-    // check new value. same: 2, 4. different: 3, 4.
-    TestUtils.waitForMqtt();
-    checkData(3, 24,
-        3, 34);
-
-    // set new value only for same
-    setDataOnlySame(true, "77");
-
-    // check new value. same: 77, 4. different: 3, 4.
-    TestUtils.waitForMqtt();
-    checkData(4, 774,
-        3, 34);
-  }
-
-  private String prefixed(String s) {
-    return "prefix" + s;
-  }
-
-  @Test
-  public void communicateOnlyUpdatedValue() throws IOException, InterruptedException {
-    createModel();
-    setupReceiverAndConnect(false);
-
-    // check initial value
-    TestUtils.waitForMqtt();
-    checkData(0, null,
-        0, null);
-
-    // set new value
-    sendData(true, "2", true, "3");
-
-    // check new value. same: 2, 0. different: 3, 0.
-    TestUtils.waitForMqtt();
-    checkData(1, 20,
-        1, 30);
-
-    // set new value
-    sendData(false, "4", false, "4");
-
-    // check new value. same: 2, 4. different: 3, 4.
-    TestUtils.waitForMqtt();
-    checkData(2, 24,
-        2, 34);
-
-    // set new value only for same
-    setDataOnlySame(true, "77");
-
-    // check new value. same: 77, 4. different: 3, 4.
-    TestUtils.waitForMqtt();
-    checkData(3, 774,
-        2, 34);
-  }
-
-  private void createModel() {
-    // Setting value for Input without dependencies does not trigger any updates
-    model = new A();
-
-    onSameNonterminal = new OnSameNonterminal();
-    model.setOnSameNonterminal(onSameNonterminal);
-    onSameNonterminal.setInput1(INITIAL_VALUE);
-    onSameNonterminal.setInput2(INITIAL_VALUE);
-
-    onDifferentNonterminal = new OnDifferentNonterminal();
-    other1 = new TheOther();
-    other2 = new TheOther();
-    onDifferentNonterminal.addTheOther(other1);
-    onDifferentNonterminal.addTheOther(other2);
-    model.setOnDifferentNonterminal(onDifferentNonterminal);
-    onDifferentNonterminal.setInput1(INITIAL_VALUE);
-    onDifferentNonterminal.setInput2(INITIAL_VALUE);
-  }
-
-  private void setupReceiverAndConnect(boolean writeCurrentValue) throws IOException {
-    model.ragconnectSetupMqttWaitUntilReady(2, TimeUnit.SECONDS);
-
-    handler = new MqttHandler().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost());
-    assertTrue(handler.waitUntilReady(2, TimeUnit.SECONDS));
-
-    onSameNonterminal.addInt1Dependency(onSameNonterminal);
-    onSameNonterminal.addInt2Dependency(onSameNonterminal);
-    other1.addInt1Dependency(onDifferentNonterminal);
-    other1.addInt2Dependency(onDifferentNonterminal);
-    other2.addInt1Dependency(onDifferentNonterminal);
-    other2.addInt2Dependency(onDifferentNonterminal);
-
-    dataSame = new Read2Write1Test.ReceiverData();
-    dataOther1 = new Read2Write1Test.ReceiverData();
-    dataOther2 = new Read2Write1Test.ReceiverData();
-
-    handler.newConnection(TOPIC_SAME_WRITE_INT, bytes -> {
-      dataSame.numberOfIntValues += 1;
-      dataSame.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
-    });
-
-    handler.newConnection(TOPIC_DIFFERENT_WRITE1_INT, bytes -> {
-      dataOther1.numberOfIntValues += 1;
-      dataOther1.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
-    });
-
-    handler.newConnection(TOPIC_DIFFERENT_WRITE2_INT, bytes -> {
-      dataOther2.numberOfIntValues += 1;
-      dataOther2.lastIntValue = java.nio.ByteBuffer.wrap(bytes).getInt();
-    });
-
-    onSameNonterminal.connectInput1(mqttUri(TOPIC_SAME_READ1));
-    onSameNonterminal.connectInput2(mqttUri(TOPIC_SAME_READ2));
-    onSameNonterminal.connectOutInteger(mqttUri(TOPIC_SAME_WRITE_INT), writeCurrentValue);
-
-    onDifferentNonterminal.connectInput1(mqttUri(TOPIC_DIFFERENT_READ1));
-    onDifferentNonterminal.connectInput2(mqttUri(TOPIC_DIFFERENT_READ2));
-    other1.connectOutInteger(mqttUri(TOPIC_DIFFERENT_WRITE1_INT), writeCurrentValue);
-    other2.connectOutInteger(mqttUri(TOPIC_DIFFERENT_WRITE2_INT), writeCurrentValue);
-  }
-
-  private void sendData(boolean useSameInput1, String inputSame,
-                        boolean useDifferentInput1, String inputDifferent) {
-    handler.publish(useSameInput1 ? TOPIC_SAME_READ1 : TOPIC_SAME_READ2,
-        inputSame.getBytes());
-    handler.publish(useDifferentInput1 ? TOPIC_DIFFERENT_READ1 : TOPIC_DIFFERENT_READ2,
-        inputDifferent.getBytes());
-  }
-
-  private void setDataOnlySame(boolean useSameInput1, String inputSame) {
-    handler.publish(useSameInput1 ? TOPIC_SAME_READ1 : TOPIC_DIFFERENT_READ2,
-        inputSame.getBytes());
-  }
-
-  private void checkData(int numberOfSameValues, Integer lastSameIntValue,
-                         int numberOfDifferentValues, Integer lastDifferentIntValue) {
-    /* the value "-2" is never used in the test, so a test will always fail comparing to this value
-     especially, it is not the initial value */
-    ReceiverData expectedDataSame = ReceiverData.of(
-        numberOfSameValues,
-        lastSameIntValue != null ? lastSameIntValue : -2
-    );
-    compareData(expectedDataSame, dataSame);
-    ReceiverData expectedDataDifferent = ReceiverData.of(
-        numberOfDifferentValues,
-        lastDifferentIntValue != null ? lastDifferentIntValue : -2
-    );
-    compareData(expectedDataDifferent, dataOther1);
-    compareData(expectedDataDifferent, dataOther2);
-  }
-
-  private void compareData(ReceiverData expectedData,
-                         ReceiverData actual) {
-    assertEquals(expectedData.numberOfIntValues, actual.numberOfIntValues);
-    if (expectedData.numberOfIntValues > 0) {
-      assertEquals(expectedData.lastIntValue, actual.lastIntValue);
-    }
-  }
-
-  private static class ReceiverData {
-    int lastIntValue;
-    int numberOfIntValues = 0;
-
-    static ReceiverData of(int numberOfValues, int lastIntValue) {
-      ReceiverData result = new ReceiverData();
-      result.lastIntValue = lastIntValue;
-      result.numberOfIntValues = numberOfValues;
-      return result;
-    }
-  }
-
-}
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java
deleted file mode 100644
index 26c32c5a438bf133d984efa31bde4b05b3b15af1..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.jastadd.ragconnect.tests;
-
-import org.junit.jupiter.api.Assertions;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.charset.Charset;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Utility methods for tests.
- *
- * @author rschoene - Initial contribution
- */
-public class TestUtils {
-
-  public static final double DELTA = 0.001d;
-
-  public static String getMqttHost() {
-    if (System.getenv("GITLAB_CI") != null) {
-      // we are in the CI, so use "mqtt" as host
-      return "mqtt";
-    } {
-      // else assume a locally running mqtt broker
-      return "localhost";
-    }
-  }
-
-  public static String mqttUri(String path) {
-    return "mqtt://" + getMqttHost() + "/" + path;
-  }
-
-  public static String restUri(String path, int port) {
-    return "rest://localhost:" + port + "/" + path;
-  }
-
-  public static int getMqttDefaultPort() {
-    return 1883;
-  }
-
-  public static int exec(Class<?> klass, String[] args, File err) throws IOException,
-      InterruptedException {
-    String javaHome = System.getProperty("java.home");
-    String javaBin = javaHome + File.separator + "bin" + File.separator + "java";
-    String classpath = System.getProperty("java.class.path");
-    String className = klass.getName();
-
-    String[] newArgs = new String[args.length + 4];
-    newArgs[0] = javaBin;
-    newArgs[1] = "-cp";
-    newArgs[2] = classpath;
-    newArgs[3] = className;
-    System.arraycopy(args, 0, newArgs, 4, args.length);
-
-    ProcessBuilder builder = new ProcessBuilder(newArgs);
-//    builder.redirectOutput(err);
-    builder.redirectError(err);
-
-    Process process = builder.start();
-    process.waitFor();
-    return process.exitValue();
-  }
-
-  public static String readFile(String path, Charset encoding)
-      throws IOException {
-    byte[] encoded = Files.readAllBytes(Paths.get(path));
-    return new String(encoded, encoding);
-  }
-
-  static void waitForMqtt() throws InterruptedException {
-    TimeUnit.SECONDS.sleep(2);
-  }
-}
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ViaTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ViaTest.java
deleted file mode 100644
index 896b8711fee14bce4dcf8a12006ddb9e26a5791c..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/ViaTest.java
+++ /dev/null
@@ -1,333 +0,0 @@
-package org.jastadd.ragconnect.tests;
-
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.Test;
-import via.ast.A;
-import via.ast.MqttHandler;
-
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.MediaType;
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
-
-import static org.jastadd.ragconnect.tests.TestUtils.mqttUri;
-import static org.jastadd.ragconnect.tests.TestUtils.restUri;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-/**
- * Test case "via".
- *
- * @author rschoene - Initial contribution
- */
-@Tag("rest")
-public class ViaTest extends AbstractMqttTest {
-
-  private static final int REST_PORT = 9002;
-
-  private static final String TOPIC_MQTT_2_MQTT_RECEIVE = "mqtt2mqtt/receive";
-  private static final String PATH_REST_2_REST_RECEIVE = "rest2rest/receive";
-  private static final String TOPIC_MQTT_2_REST_RECEIVE = "mqtt2rest/receive";
-  private static final String PATH_REST_2_MQTT_RECEIVE = "rest2mqtt/receive";
-  private static final String TOPIC_BOTH_MQTT_RECEIVE = "both/send";
-  private static final String PATH_BOTH_REST_RECEIVE = "both/send";
-
-  private static final String TOPIC_MQTT_2_MQTT_SEND = "mqtt2mqtt/send";
-  private static final String PATH_REST_2_REST_SEND = "rest2rest/send";
-  private static final String PATH_MQTT_2_REST_SEND = "mqtt2rest/send";
-  private static final String TOPIC_REST_2_MQTT_SEND = "rest2mqtt/send";
-  private static final String TOPIC_BOTH_2_MQTT_SEND = "both2mqtt/send";
-  private static final String PATH_BOTH_2_REST_SEND = "both2rest/send";
-
-  private static final String REST_SERVER_BASE_URL = "http://localhost:" + REST_PORT + "/";
-
-  private MqttHandler handler;
-  private A model;
-  private ReceiverData dataMqtt2Mqtt;
-  private ReceiverData dataRest2Mqtt;
-  private WebTarget dataRest2Rest;
-  private WebTarget dataMqtt2Rest;
-  private ReceiverData dataBoth2Mqtt;
-  private WebTarget dataBoth2Rest;
-
-  private WebTarget senderRest2Rest;
-  private WebTarget senderRest2Mqtt;
-  private WebTarget senderBoth2Rest;
-
-  @AfterEach
-  public void closeConnections() {
-    if (handler != null) {
-      handler.close();
-    }
-    if (model != null) {
-      model.ragconnectCloseConnections();
-    }
-  }
-
-  @Test
-  public void buildModel() {
-    createModel();
-  }
-
-  @Test
-  public void communicateSendInitialValue() throws IOException, InterruptedException {
-    createModel();
-    setupReceiverAndConnect(true);
-
-    // check initial value
-    TestUtils.waitForMqtt();
-    checkData(1, "100-M2M-ToMqtt",
-        "200-R2R-ToRest",
-        "300-M2R-ToRest",
-        1, "400-R2M-ToMqtt",
-        1, "500-B2M-ToMqtt",
-        "500-B2R-ToRest");
-
-    sendData("101", "201", "301", "401");
-    sendDataForBoth("501", true);
-
-    // check new value
-    TestUtils.waitForMqtt();
-    checkData(2, "FromMqtt-101-M2M-ToMqtt",
-        "FromRest-201-R2R-ToRest",
-        "FromMqtt-301-M2R-ToRest",
-        2, "FromRest-401-R2M-ToMqtt",
-        2, "501-B2M-ToMqtt",
-        "501-B2R-ToRest");
-
-    // send value only for bothInput via REST
-    sendDataForBoth("502", false);
-
-    // check this value
-    TestUtils.waitForMqtt();
-    checkData(2, "FromMqtt-101-M2M-ToMqtt",
-        "FromRest-201-R2R-ToRest",
-        "FromMqtt-301-M2R-ToRest",
-        2, "FromRest-401-R2M-ToMqtt",
-        3, "502-B2M-ToMqtt",
-        "502-B2R-ToRest");
-
-    // send same value only for bothInput via MQTT
-    sendDataForBoth("502", true);
-
-    // check this value
-    TestUtils.waitForMqtt();
-    checkData(2, "FromMqtt-101-M2M-ToMqtt",
-        "FromRest-201-R2R-ToRest",
-        "FromMqtt-301-M2R-ToRest",
-        2, "FromRest-401-R2M-ToMqtt",
-        3, "502-B2M-ToMqtt",
-        "502-B2R-ToRest");
-
-    // send values for other things
-    sendData("102", "202", "302", "402");
-
-    // check this value
-    TestUtils.waitForMqtt();
-    checkData(3, "FromMqtt-102-M2M-ToMqtt",
-        "FromRest-202-R2R-ToRest",
-        "FromMqtt-302-M2R-ToRest",
-        3, "FromRest-402-R2M-ToMqtt",
-        3, "502-B2M-ToMqtt",
-        "502-B2R-ToRest");
-
-    // send same values again for other things
-    sendData("102", "202", "302", "402");
-
-    // check this value
-    TestUtils.waitForMqtt();
-    checkData(3, "FromMqtt-102-M2M-ToMqtt",
-        "FromRest-202-R2R-ToRest",
-        "FromMqtt-302-M2R-ToRest",
-        3, "FromRest-402-R2M-ToMqtt",
-        3, "502-B2M-ToMqtt",
-        "502-B2R-ToRest");
-  }
-
-  @Test
-  public void communicateOnlyUpdatedValue() throws IOException, InterruptedException {
-    createModel();
-    setupReceiverAndConnect(false);
-
-    // check initial value
-    TestUtils.waitForMqtt();
-    checkData(0, null,
-        "200-R2R-ToRest",
-        "300-M2R-ToRest",
-        0, null,
-        0, null,
-        "500-B2R-ToRest");
-
-    sendData("111", "211", "311", "411");
-    sendDataForBoth("511", true);
-
-    // check new value
-    TestUtils.waitForMqtt();
-    checkData(1, "FromMqtt-111-M2M-ToMqtt",
-        "FromRest-211-R2R-ToRest",
-        "FromMqtt-311-M2R-ToRest",
-        1, "FromRest-411-R2M-ToMqtt",
-        1, "511-B2M-ToMqtt",
-        "511-B2R-ToRest");
-
-    // send value only for bothInput via REST
-    sendDataForBoth("512", false);
-
-    // check this value
-    TestUtils.waitForMqtt();
-    checkData(1, "FromMqtt-111-M2M-ToMqtt",
-        "FromRest-211-R2R-ToRest",
-        "FromMqtt-311-M2R-ToRest",
-        1, "FromRest-411-R2M-ToMqtt",
-        2, "512-B2M-ToMqtt",
-        "512-B2R-ToRest");
-
-    // send same value only for bothInput via MQTT
-    sendDataForBoth("512", true);
-
-    // check this value
-    TestUtils.waitForMqtt();
-    checkData(1, "FromMqtt-111-M2M-ToMqtt",
-        "FromRest-211-R2R-ToRest",
-        "FromMqtt-311-M2R-ToRest",
-        1, "FromRest-411-R2M-ToMqtt",
-        2, "512-B2M-ToMqtt",
-        "512-B2R-ToRest");
-
-    // send values for other things
-    sendData("112", "212", "312", "412");
-
-    // check this value
-    TestUtils.waitForMqtt();
-    checkData(2, "FromMqtt-112-M2M-ToMqtt",
-        "FromRest-212-R2R-ToRest",
-        "FromMqtt-312-M2R-ToRest",
-        2, "FromRest-412-R2M-ToMqtt",
-        2, "512-B2M-ToMqtt",
-        "512-B2R-ToRest");
-
-    // send same values again for other things
-    sendData("112", "212", "312", "412");
-
-    // check this value
-    TestUtils.waitForMqtt();
-    checkData(2, "FromMqtt-112-M2M-ToMqtt",
-        "FromRest-212-R2R-ToRest",
-        "FromMqtt-312-M2R-ToRest",
-        2, "FromRest-412-R2M-ToMqtt",
-        2, "512-B2M-ToMqtt",
-        "512-B2R-ToRest");
-  }
-
-  private void sendData(String inputMqtt2Mqtt, String inputRest2Rest, String inputMqtt2Rest, String inputRest2Mqtt) {
-    handler.publish(TOPIC_MQTT_2_MQTT_RECEIVE, inputMqtt2Mqtt.getBytes());
-    senderRest2Rest.request().put(Entity.entity(inputRest2Rest, MediaType.TEXT_PLAIN_TYPE));
-    handler.publish(TOPIC_MQTT_2_REST_RECEIVE, inputMqtt2Rest.getBytes());
-    senderRest2Mqtt.request().put(Entity.entity(inputRest2Mqtt, MediaType.TEXT_PLAIN_TYPE));
-  }
-
-  private void sendDataForBoth(String input, boolean useMqtt) {
-    if (useMqtt) {
-      handler.publish(TOPIC_BOTH_MQTT_RECEIVE, input.getBytes());
-    } else {
-      senderBoth2Rest.request().put(Entity.entity(input, MediaType.TEXT_PLAIN_TYPE));
-    }
-  }
-
-  private void checkData(int numberOfMqtt2MqttValues, String mqtt2MqttValue, String rest2RestValue, String mqtt2RestValue, int numberOfRest2MqttValues, String rest2MqttValue, int numberOfBoth2MqttValues, String both2MqttValue, String both2RestValue) {
-    dataMqtt2Mqtt.assertEqualData(numberOfMqtt2MqttValues, mqtt2MqttValue);
-    dataRest2Mqtt.assertEqualData(numberOfRest2MqttValues, rest2MqttValue);
-    dataBoth2Mqtt.assertEqualData(numberOfBoth2MqttValues, both2MqttValue);
-    assertEquals(rest2RestValue, readRest2Rest());
-    assertEquals(mqtt2RestValue, readMqtt2Rest());
-    assertEquals(both2RestValue, readBoth2Rest());
-  }
-
-  private String readRest2Rest() {
-    return dataRest2Rest.request().get().readEntity(String.class);
-  }
-
-  private String readMqtt2Rest() {
-    return dataMqtt2Rest.request().get().readEntity(String.class);
-  }
-
-  private String readBoth2Rest() {
-    return dataBoth2Rest.request().get().readEntity(String.class);
-  }
-
-  private void createModel() {
-    // Setting value for Input without dependencies does not trigger any updates
-    model = new A();
-    model.setMqtt2MqttInput("100");
-    model.setRest2RestInput("200");
-    model.setMqtt2RestInput("300");
-    model.setRest2MqttInput("400");
-    model.setBoth2BothInput("500");
-  }
-
-  private void setupReceiverAndConnect(boolean writeCurrentValue) throws IOException {
-    model.ragconnectSetupMqttWaitUntilReady(2, TimeUnit.SECONDS);
-
-    handler = new MqttHandler().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost());
-    assertTrue(handler.waitUntilReady(2, TimeUnit.SECONDS));
-
-    model.addDependencyMqtt2Mqtt(model);
-    model.addDependencyRest2Rest(model);
-    model.addDependencyMqtt2Rest(model);
-    model.addDependencyRest2Mqtt(model);
-    model.addDependencyBoth2Mqtt(model);
-    model.addDependencyBoth2Rest(model);
-
-    dataMqtt2Mqtt = new ReceiverData();
-    dataRest2Mqtt = new ReceiverData();
-    dataBoth2Mqtt = new ReceiverData();
-
-    handler.newConnection(TOPIC_MQTT_2_MQTT_SEND, bytes -> {
-      dataMqtt2Mqtt.numberOfStringValues += 1;
-      dataMqtt2Mqtt.lastStringValue = new String(bytes);
-    });
-    handler.newConnection(TOPIC_REST_2_MQTT_SEND, bytes -> {
-      dataRest2Mqtt.numberOfStringValues += 1;
-      dataRest2Mqtt.lastStringValue = new String(bytes);
-    });
-    handler.newConnection(TOPIC_BOTH_2_MQTT_SEND, bytes -> {
-      dataBoth2Mqtt.numberOfStringValues += 1;
-      dataBoth2Mqtt.lastStringValue = new String(bytes);
-    });
-
-    Client client = ClientBuilder.newClient();
-    dataRest2Rest = client.target(REST_SERVER_BASE_URL + PATH_REST_2_REST_SEND);
-    dataMqtt2Rest = client.target(REST_SERVER_BASE_URL + PATH_MQTT_2_REST_SEND);
-    dataBoth2Rest = client.target(REST_SERVER_BASE_URL + PATH_BOTH_2_REST_SEND);
-    senderRest2Rest = client.target(REST_SERVER_BASE_URL + PATH_REST_2_REST_RECEIVE);
-    senderRest2Mqtt = client.target(REST_SERVER_BASE_URL + PATH_REST_2_MQTT_RECEIVE);
-    senderBoth2Rest = client.target(REST_SERVER_BASE_URL + PATH_BOTH_REST_RECEIVE);
-
-    model.connectMqtt2MqttInput(mqttUri(TOPIC_MQTT_2_MQTT_RECEIVE));
-    model.connectMqtt2MqttOutput(mqttUri(TOPIC_MQTT_2_MQTT_SEND), writeCurrentValue);
-    model.connectMqtt2RestInput(mqttUri(TOPIC_MQTT_2_REST_RECEIVE));
-    model.connectMqtt2RestOutput(restUri(PATH_MQTT_2_REST_SEND, REST_PORT), writeCurrentValue);
-    model.connectRest2MqttInput(restUri(PATH_REST_2_MQTT_RECEIVE, REST_PORT));
-    model.connectRest2MqttOutput(mqttUri(TOPIC_REST_2_MQTT_SEND), writeCurrentValue);
-    model.connectRest2RestInput(restUri(PATH_REST_2_REST_RECEIVE, REST_PORT));
-    model.connectRest2RestOutput(restUri(PATH_REST_2_REST_SEND, REST_PORT), writeCurrentValue);
-    model.connectBoth2BothInput(mqttUri(TOPIC_BOTH_MQTT_RECEIVE));
-    model.connectBoth2BothInput(restUri(PATH_BOTH_REST_RECEIVE, REST_PORT));
-    model.connectBoth2MqttOutput(mqttUri(TOPIC_BOTH_2_MQTT_SEND), writeCurrentValue);
-    model.connectBoth2RestOutput(restUri(PATH_BOTH_2_REST_SEND, REST_PORT), writeCurrentValue);
-  }
-
-  private static class ReceiverData {
-    String lastStringValue;
-    int numberOfStringValues = 0;
-
-    public void assertEqualData(int expectedNumberOfValues, String expectedLastValue) {
-      assertEquals(expectedNumberOfValues, this.numberOfStringValues);
-      assertEquals(expectedLastValue, this.lastStringValue);
-    }
-  }
-}
diff --git a/ragconnect.tests/src/test/proto/config.proto b/ragconnect.tests/src/test/proto/config.proto
deleted file mode 100644
index 38cb5d0a25b02c96dcbdf30f685212ea972feee6..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/proto/config.proto
+++ /dev/null
@@ -1,7 +0,0 @@
-syntax = "proto3";
-
-package config;
-
-message RobotConfig {
-  double speed = 1;
-}
\ No newline at end of file
diff --git a/ragconnect.tests/src/test/proto/robot_state.proto b/ragconnect.tests/src/test/proto/robot_state.proto
deleted file mode 100644
index 6630631f16e00493be3f50307c9092e56184e9c6..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/proto/robot_state.proto
+++ /dev/null
@@ -1,37 +0,0 @@
-syntax = "proto3";
-
-package robot;
-
-message RobotState {
-
-  message Position {
-    double x = 1;
-    double y = 2;
-    double z = 3;
-  }
-
-  message Orientation {
-    double x = 1;
-    double y = 2;
-    double z = 3;
-    double w = 4;
-  }
-
-  message LinearTwist {
-    double x = 1;
-    double y = 2;
-    double z = 3;
-  }
-
-  message AngularTwist {
-    double x = 1;
-    double y = 2;
-    double z = 3;
-  }
-
-  string name = 1;
-  Position position = 2;
-  Orientation orientation = 3;
-  LinearTwist linear_twist = 4;
-  AngularTwist angular_twist = 5;
-}
\ No newline at end of file
diff --git a/ragconnect.tests/src/test/proto/trajectory.proto b/ragconnect.tests/src/test/proto/trajectory.proto
deleted file mode 100644
index 4a7f375e1ae37ba386f45e1149dc38990d0c7a0e..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/proto/trajectory.proto
+++ /dev/null
@@ -1,33 +0,0 @@
-syntax = "proto3";
-
-package plan;
-
-message Trajectory {
-
-  message Position {
-    double x = 1;
-    double y = 2;
-    double z = 3;
-  }
-
-  message Orientation {
-    double x = 1;
-    double y = 2;
-    double z = 3;
-    double w = 4;
-  }
-
-  enum PlanningMode {
-    FLUID = 0;
-    CARTESIAN = 1;
-  }
-
-  message Pose {
-    Position position = 1;
-    Orientation orientation = 2;
-    PlanningMode mode = 3;
-  }
-
-  repeated Pose pose = 1;
-  bool loop = 2;
-}
diff --git a/ragconnect.tests/src/test/resources/log4j2.xml b/ragconnect.tests/src/test/resources/log4j2.xml
deleted file mode 100644
index 4c0d4548c61b23abad6aabc6811e68cd8a928871..0000000000000000000000000000000000000000
--- a/ragconnect.tests/src/test/resources/log4j2.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="INFO">
-    <Appenders>
-        <Console name="Console" target="SYSTEM_OUT">
-            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
-        </Console>
-    </Appenders>
-    <Loggers>
-        <Root level="debug">
-            <AppenderRef ref="Console"/>
-        </Root>
-        <Logger name="org.eclipse.jetty" level="info" additivity="false">
-            <AppenderRef ref="Console"/>
-        </Logger>
-    </Loggers>
-</Configuration>
diff --git a/relast.preprocessor b/relast.preprocessor
deleted file mode 160000
index 79d237fda220364ffebf77dc7de0a7b29635e360..0000000000000000000000000000000000000000
--- a/relast.preprocessor
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 79d237fda220364ffebf77dc7de0a7b29635e360
diff --git a/ros2rag.goal/build.gradle b/ros2rag.goal/build.gradle
index 3bfe45ab6c9aef96b069ff56faf8c47597f11acf..d372747e0417f0dcf17aa9ecac084e3163e56a19 100644
--- a/ros2rag.goal/build.gradle
+++ b/ros2rag.goal/build.gradle
@@ -23,9 +23,7 @@ sourceSets.main.java.srcDir genSrc
 idea.module.generatedSourceDirs += genSrc
 
 dependencies {
-    implementation project (':ragconnect.base')
     implementation project (':ros2rag.common')
-    baseRuntimeClasspath project (':ragconnect.base')
     api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15'
 
     jastadd2 "org.jastadd:jastadd:2.3.4"
@@ -37,12 +35,11 @@ def relastFiles = ["src/gen/jastadd/GoalModel.relast", "src/gen/jastadd/RagConne
 // phases: ragConnect -> RelAst -> JastAdd
 // phase: ragConnect
 task ragConnect(type: JavaExec) {
-    classpath = configurations.baseRuntimeClasspath
-
     group = 'Build'
-    main = 'org.jastadd.ragconnect.compiler.Compiler'
+    main = '-jar'
 
     args([
+            '../libs/ragconnect.jar',
             '--verbose',
             '--o=src/gen/jastadd',
             'src/main/jastadd/GoalModel.relast',
diff --git a/ros2rag.receiverstub/build.gradle b/ros2rag.receiverstub/build.gradle
index 02b49e36590bc01a544bcc9a7fc839109d32d817..e774287a067bffbcd0de8938a05f703e59b9407d 100644
--- a/ros2rag.receiverstub/build.gradle
+++ b/ros2rag.receiverstub/build.gradle
@@ -21,9 +21,7 @@ configurations {
 }
 
 dependencies {
-    implementation project(':ragconnect.base')
     implementation project(':ros2rag.common')
-    baseRuntimeClasspath project (':ragconnect.base')
     api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15'
 
     jastadd2 "org.jastadd:jastadd:2.3.4"
@@ -33,9 +31,10 @@ task ragConnect(type: JavaExec) {
     classpath = configurations.baseRuntimeClasspath
 
     group = 'Build'
-    main = 'org.jastadd.ragconnect.compiler.Compiler'
+    main = '-jar'
 
     args([
+            '../libs/ragconnect.jar',
             '--o=src/gen/jastadd',
             'src/main/jastadd/Receiver.ast',
             'src/main/jastadd/Receiver.connect',
diff --git a/ros2rag.safety/build.gradle b/ros2rag.safety/build.gradle
index 4bfec22f282ed5700cd4bf05edfd4791b0f4515a..ea820a988b3077ce3fb0d0f38ccc42473f82a7c6 100644
--- a/ros2rag.safety/build.gradle
+++ b/ros2rag.safety/build.gradle
@@ -24,9 +24,7 @@ sourceSets.main.java.srcDir genSrc
 idea.module.generatedSourceDirs += genSrc
 
 dependencies {
-    implementation project (':ragconnect.base')
     implementation project (':ros2rag.common')
-    baseRuntimeClasspath project (':ragconnect.base')
     api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15'
 
     jastadd2 "org.jastadd:jastadd:2.3.4"
@@ -41,9 +39,10 @@ task ragConnect(type: JavaExec) {
     classpath = configurations.baseRuntimeClasspath
 
     group = 'Build'
-    main = 'org.jastadd.ragconnect.compiler.Compiler'
+    main = '-jar'
 
     args([
+            '../libs/ragconnect.jar',
             '--o=src/gen/jastadd',
             'src/main/jastadd/SafetyModel.relast',
             'src/main/jastadd/SafetyModel.connect',
diff --git a/ros2rag.senderstub/build.gradle b/ros2rag.senderstub/build.gradle
index 1497d02abfcb5882708dd12497686c893976d772..66d17274772d01c4643f9f204c6fafad046c0d91 100644
--- a/ros2rag.senderstub/build.gradle
+++ b/ros2rag.senderstub/build.gradle
@@ -21,9 +21,7 @@ configurations {
 }
 
 dependencies {
-    implementation project(':ragconnect.base')
     implementation project(':ros2rag.common')
-    baseRuntimeClasspath project (':ragconnect.base')
     api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15'
 
     jastadd2 "org.jastadd:jastadd:2.3.4"
@@ -33,9 +31,10 @@ task ragConnect(type: JavaExec) {
     classpath = configurations.baseRuntimeClasspath
 
     group = 'Build'
-    main = 'org.jastadd.ragconnect.compiler.Compiler'
+    main = '-jar'
 
     args([
+            '../libs/ragconnect.jar',
             '--o=src/gen/jastadd',
             'src/main/jastadd/Sender.ast',
             'src/main/jastadd/Sender.connect',
diff --git a/settings.gradle b/settings.gradle
index cc56321647f48ec49cd042b9a2ae609a13cf5398..bc157327cc0b950e86b6412268067219547231d0 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,8 +1,5 @@
 rootProject.name = 'ros2rag'
 
-include 'relast.preprocessor'
-include 'ragconnect.base'
-include 'ragconnect.tests'
 include 'ros2rag.safety'
 include 'ros2rag.senderstub'
 include 'ros2rag.receiverstub'