diff --git a/ros2rag.base/.gitignore b/ragconnect.base/.gitignore
similarity index 100%
rename from ros2rag.base/.gitignore
rename to ragconnect.base/.gitignore
diff --git a/ros2rag.base/build.gradle b/ragconnect.base/build.gradle
similarity index 61%
rename from ros2rag.base/build.gradle
rename to ragconnect.base/build.gradle
index a6a7882eeee6db3cc34887d5b8cce3fe267905d5..c04195a9cc3a7ea4a799a717910a276f18b8d403 100644
--- a/ros2rag.base/build.gradle
+++ b/ragconnect.base/build.gradle
@@ -3,7 +3,7 @@ apply plugin: 'application'
 
 sourceCompatibility = 1.8
 
-mainClassName = 'org.jastadd.ros2rag.compiler.Compiler'
+mainClassName = 'org.jastadd.ragconnect.compiler.Compiler'
 
 repositories {
     jcenter()
@@ -37,7 +37,7 @@ test {
 
 jar {
     manifest {
-        attributes "Main-Class": 'org.jastadd.ros2rag.compiler.Compiler'
+        attributes "Main-Class": 'org.jastadd.ragconnect.compiler.Compiler'
     }
 
     from {
@@ -51,47 +51,47 @@ task relast(type: JavaExec) {
 
     doFirst {
         delete "src/gen/jastadd/*.ast"
-        delete "src/gen/jastadd/Ros2Rag.jadd"
-        delete "src/gen/jastadd/Ros2RagRefResolver.jadd"
-        delete "src/gen/jastadd/Ros2RagResolverStubs.jrag"
+        delete "src/gen/jastadd/RagConnect.jadd"
+        delete "src/gen/jastadd/RagConnectRefResolver.jadd"
+        delete "src/gen/jastadd/RagConnectResolverStubs.jrag"
         mkdir  "src/gen/jastadd/"
     }
 
     args = [
             "../libs/relast.jar",
             "../relast.preprocessor/src/main/jastadd/RelAst.relast",
-            "./src/main/jastadd/Ros2Rag.relast",
+            "./src/main/jastadd/RagConnect.relast",
             "./src/main/jastadd/MustacheNodes.relast",
             "--listClass=java.util.ArrayList",
             "--jastAddList=JastAddList",
             "--useJastAddNames",
             "--file",
             "--resolverHelper",
-            "--grammarName=./src/gen/jastadd/Ros2Rag"
+            "--grammarName=./src/gen/jastadd/RagConnect"
     ]
 
     inputs.files file("../libs/relast.jar"),
             file("../relast.preprocessor/src/main/jastadd/RelAST.relast"),
-            file("./src/main/jastadd/Ros2Rag.relast")
+            file("./src/main/jastadd/RagConnect.relast")
             file("./src/main/jastadd/MustacheNodes.relast")
-    outputs.files file("./src/gen/jastadd/Ros2Rag.ast"),
-            file("./src/gen/jastadd/Ros2Rag.jadd"),
-            file("./src/gen/jastadd/Ros2RagRefResolver.jadd"),
-            file('./src/gen/jastadd/Ros2RagResolverStubs.jrag')
+    outputs.files file("./src/gen/jastadd/RagConnect.ast"),
+            file("./src/gen/jastadd/RagConnect.jadd"),
+            file("./src/gen/jastadd/RagConnectRefResolver.jadd"),
+            file('./src/gen/jastadd/RagConnectResolverStubs.jrag')
 }
 
 jastadd {
     configureModuleBuild()
     modules {
         //noinspection GroovyAssignabilityCheck
-        module("Ros2Rag") {
+        module("RagConnect") {
 
             java {
                 basedir ".."
                 include "relast.preprocessor/main/**/*.java"
                 include "relast.preprocessor/gen/**/*.java"
-                include "ros2rag.base/src/main/**/*.java"
-                include "ros2rag.base/src/gen/**/*.java"
+                include "ragconnect.base/src/main/**/*.java"
+                include "ragconnect.base/src/gen/**/*.java"
             }
 
             jastadd {
@@ -99,23 +99,23 @@ jastadd {
                 include "relast.preprocessor/src/main/jastadd/**/*.ast"
                 include "relast.preprocessor/src/main/jastadd/**/*.jadd"
                 include "relast.preprocessor/src/main/jastadd/**/*.jrag"
-                include "ros2rag.base/src/main/jastadd/**/*.ast"
-                include "ros2rag.base/src/main/jastadd/**/*.jadd"
-                include "ros2rag.base/src/main/jastadd/**/*.jrag"
-                include "ros2rag.base/src/gen/jastadd/**/*.ast"
-                include "ros2rag.base/src/gen/jastadd/**/*.jadd"
-                include "ros2rag.base/src/gen/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 "ros2rag.base/src/main/jastadd/scanner/Header.flex",               [-5]
+                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 "ros2rag.base/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 "ros2rag.base/src/main/jastadd/scanner/MappingContent.flex",       [-1]
-                include "ros2rag.base/src/main/jastadd/scanner/Keywords.flex"
+                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]
@@ -123,8 +123,8 @@ jastadd {
 
             parser {
                 basedir ".."
-                include "ros2rag.base/src/main/jastadd/parser/Preamble.parser"
-                include "ros2rag.base/src/main/jastadd/parser/Ros2Rag.parser"
+                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"
             }
         }
@@ -141,18 +141,18 @@ jastadd {
 
     }
 
-    module = "Ros2Rag"
+    module = "RagConnect"
 
-    astPackage = 'org.jastadd.ros2rag.ast'
+    astPackage = 'org.jastadd.ragconnect.ast'
 
-    parser.name = 'Ros2RagParser'
+    parser.name = 'RagConnectParser'
 
     genDir = 'src/gen/java'
 
     buildInfoDir = 'src/gen-res'
 
-    scanner.genDir = "src/gen/java/org/jastadd/ros2rag/scanner"
-    parser.genDir = "src/gen/java/org/jastadd/ros2rag/parser"
+    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"]
 }
diff --git a/ros2rag.base/src/main/jastadd/Analysis.jrag b/ragconnect.base/src/main/jastadd/Analysis.jrag
similarity index 84%
rename from ros2rag.base/src/main/jastadd/Analysis.jrag
rename to ragconnect.base/src/main/jastadd/Analysis.jrag
index 228a3479df5be9d24998479bc3b48bd1626775aa..da9a88b6c0d76925c0876d84063075ed495a02a1 100644
--- a/ros2rag.base/src/main/jastadd/Analysis.jrag
+++ b/ragconnect.base/src/main/jastadd/Analysis.jrag
@@ -1,7 +1,7 @@
 aspect Analysis {
   // --- lookupTokenUpdateDefinition ---
   inh TokenUpdateDefinition TokenUpdateDefinition.lookupTokenUpdateDefinition(TokenComponent token);
-  eq Ros2Rag.getUpdateDefinition().lookupTokenUpdateDefinition(TokenComponent token) {
+  eq RagConnect.getUpdateDefinition().lookupTokenUpdateDefinition(TokenComponent token) {
     for (UpdateDefinition def : getUpdateDefinitionList()) {
       if (def.isTokenUpdateDefinition() && def.asTokenUpdateDefinition().getToken().equals(token)) {
         return def.asTokenUpdateDefinition();
@@ -12,7 +12,7 @@ aspect Analysis {
 
   // --- lookupDependencyDefinition ---
   inh DependencyDefinition DependencyDefinition.lookupDependencyDefinition(TypeDecl source, String id);
-  eq Ros2Rag.getDependencyDefinition().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;
diff --git a/ros2rag.base/src/main/jastadd/Errors.jrag b/ragconnect.base/src/main/jastadd/Errors.jrag
similarity index 91%
rename from ros2rag.base/src/main/jastadd/Errors.jrag
rename to ragconnect.base/src/main/jastadd/Errors.jrag
index ef223a4081e169273555140a35a9f8b47876109d..4ea4c18912a1550938a603090c941ba85397e2ba 100644
--- a/ros2rag.base/src/main/jastadd/Errors.jrag
+++ b/ragconnect.base/src/main/jastadd/Errors.jrag
@@ -3,17 +3,17 @@ import java.util.TreeSet;
 import java.util.LinkedList;
 
 aspect Errors {
-  coll Set<ErrorMessage> Ros2Rag.errors()
+  coll Set<ErrorMessage> RagConnect.errors()
     [new TreeSet<ErrorMessage>()]
-    root Ros2Rag;
+    root RagConnect;
 
     ReadFromMqttDefinition contributes error("Read definition already defined for " + getToken().getName())
       when isAlreadyDefined()
-      to Ros2Rag.errors();
+      to RagConnect.errors();
 
     ReadFromMqttDefinition contributes error("Reading target token must not be an NTA token!")
       when getToken().getNTA()
-      to Ros2Rag.errors();
+      to RagConnect.errors();
 
     // if first mapping is null, then suitableDefaultMapping() == null
     ReadFromMqttDefinition contributes error("No suitable default mapping found for type " +
@@ -21,32 +21,32 @@ aspect Errors {
         ? getToken().getJavaTypeUse().prettyPrint()
         : getMappingList().get(0).getFromType().prettyPrint()))
       when effectiveMappings().get(0) == null
-      to Ros2Rag.errors();
+      to RagConnect.errors();
 
     ReadFromMqttDefinition contributes error("to-type of last mapping must be type of the Token!")
       when getToken().getJavaTypeUse().prettyPrint().equals(
           effectiveMappings().get(effectiveMappings().size() - 1))
-      to Ros2Rag.errors();
+      to RagConnect.errors();
 
     WriteToMqttDefinition contributes error("Writing target token must be an NTA token!")
       when !getToken().getNTA()
-      to Ros2Rag.errors();
+      to RagConnect.errors();
 
     WriteToMqttDefinition contributes error("Write definition already defined for " + getToken().getName())
       when isAlreadyDefined()
-      to Ros2Rag.errors();
+      to RagConnect.errors();
 
     DependencyDefinition contributes error("Dependency definition already defined for " + getSource().containingTypeDecl().getName() + " with name " + getID())
       when isAlreadyDefined()
-      to Ros2Rag.errors();
+      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 Ros2Rag.errors();
+      to RagConnect.errors();
 
     DependencyDefinition contributes error("There must be a write update definition targeting " + getSource().parentTypeypeAndName() + " for dependency definition " + getID())
       when targetUpdateDefinition() == null
-      to Ros2Rag.errors();
+      to RagConnect.errors();
 }
 
 aspect ErrorHelpers {
diff --git a/ros2rag.base/src/main/jastadd/MustacheNodes.relast b/ragconnect.base/src/main/jastadd/MustacheNodes.relast
similarity index 75%
rename from ros2rag.base/src/main/jastadd/MustacheNodes.relast
rename to ragconnect.base/src/main/jastadd/MustacheNodes.relast
index 69d4280f9d9038c838e83767c6e72be9a8d6d5d8..f213a35741dd514ac86201c7e6ee32f2053a7a83 100644
--- a/ros2rag.base/src/main/jastadd/MustacheNodes.relast
+++ b/ragconnect.base/src/main/jastadd/MustacheNodes.relast
@@ -1,7 +1,7 @@
 //TypeComponentMustache ;
 //rel TypeComponentMustache.TypeComponent -> TypeComponent ;
 
-MRos2Rag ::= ReadDefinition:MReadDefinition* WriteDefinition:MWriteDefinition* MappingDefinition:MMappingDefinition* DependencyDefinition:MDependencyDefinition* RootTypeComponent:MTypeComponent* TokenComponent:MTokenComponent*;
+MRagConnect ::= ReadDefinition:MReadDefinition* WriteDefinition:MWriteDefinition* MappingDefinition:MMappingDefinition* DependencyDefinition:MDependencyDefinition* RootTypeComponent:MTypeComponent* TokenComponent:MTokenComponent*;
 abstract MUpdateDefinition ::= InnerMappingDefinition:MInnerMappingDefinition*;
 MReadDefinition : MUpdateDefinition;
 MWriteDefinition : MUpdateDefinition;
@@ -11,7 +11,7 @@ MDependencyDefinition;
 MTypeComponent;
 MTokenComponent;
 
-rel MRos2Rag.Ros2Rag -> Ros2Rag;
+rel MRagConnect.RagConnect -> RagConnect;
 rel MInnerMappingDefinition.MappingDefinition -> MappingDefinition;
 rel MReadDefinition.ReadFromMqttDefinition -> ReadFromMqttDefinition;
 rel MWriteDefinition.WriteToMqttDefinition -> WriteToMqttDefinition;
diff --git a/ros2rag.base/src/main/jastadd/NameResolution.jrag b/ragconnect.base/src/main/jastadd/NameResolution.jrag
similarity index 79%
rename from ros2rag.base/src/main/jastadd/NameResolution.jrag
rename to ragconnect.base/src/main/jastadd/NameResolution.jrag
index fc4485858d199f352c18fcd188914020666ef619..6d5ebe27211b6a83917126201cfa09e3d63f4064 100644
--- a/ros2rag.base/src/main/jastadd/NameResolution.jrag
+++ b/ragconnect.base/src/main/jastadd/NameResolution.jrag
@@ -2,7 +2,7 @@ aspect NameResolution {
 
   refine RefResolverStubs eq UpdateDefinition.resolveMappingByToken(String id, int position) {
     // return a MappingDefinition
-    for (MappingDefinition mappingDefinition : ros2rag().getMappingDefinitionList()) {
+    for (MappingDefinition mappingDefinition : ragconnect().getMappingDefinitionList()) {
       if (mappingDefinition.getID().equals(id)) {
         return mappingDefinition;
       }
diff --git a/ros2rag.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag
similarity index 83%
rename from ros2rag.base/src/main/jastadd/Navigation.jrag
rename to ragconnect.base/src/main/jastadd/Navigation.jrag
index a4f21e6e8d79c549a63d54474792382457bf74fd..b031267ab8dc8ddcbaf3d5a75e4b8fe5a068f0bb 100644
--- a/ros2rag.base/src/main/jastadd/Navigation.jrag
+++ b/ragconnect.base/src/main/jastadd/Navigation.jrag
@@ -1,17 +1,17 @@
 aspect Navigation {
 
   // --- program ---
-  eq Ros2Rag.getChild().program() = getProgram();
-  eq MRos2Rag.getChild().program() = getRos2Rag().program();
+  eq RagConnect.getChild().program() = getProgram();
+  eq MRagConnect.getChild().program() = getRagConnect().program();
 
-  // --- ros2rag ---
-  inh Ros2Rag ASTNode.ros2rag();
-  eq Ros2Rag.getChild().ros2rag() = this;
-  eq MRos2Rag.getChild().ros2rag() = getRos2Rag();
+  // --- ragconnect ---
+  inh RagConnect ASTNode.ragconnect();
+  eq RagConnect.getChild().ragconnect() = this;
+  eq MRagConnect.getChild().ragconnect() = getRagConnect();
 
   // --- containedFile (first equation should be in preprocessor) ---
   eq Program.getChild().containedFile() = null;
-  eq Ros2Rag.getChild().containedFile() = null;
+  eq RagConnect.getChild().containedFile() = null;
 
   // --- isTypeComponent (should be in preprocessor) ---
   syn boolean Component.isTypeComponent() = false;
@@ -32,9 +32,9 @@ aspect Navigation {
   // --- containedFileName (should replace containedFile in preprocessor) ---
   inh String ASTNode.containedFileName();
   eq GrammarFile.getChild().containedFileName() = getFileName();
-  eq Ros2Rag.getChild().containedFileName() = getFileName();
+  eq RagConnect.getChild().containedFileName() = getFileName();
   eq Program.getChild().containedFileName() = null;
-  eq MRos2Rag.getChild().containedFileName() = null;
+  eq MRagConnect.getChild().containedFileName() = null;
 
   // --- isTokenUpdateDefinition ---
   syn boolean UpdateDefinition.isTokenUpdateDefinition() = false;
@@ -59,7 +59,7 @@ aspect Navigation {
   // --- targetUpdateDefinition ---
   syn WriteToMqttDefinition DependencyDefinition.targetUpdateDefinition() {
     // resolve definition in here, as we do not need resolveMethod in any other place (yet)
-    for (UpdateDefinition updateDefinition : ros2rag().getUpdateDefinitionList()) {
+    for (UpdateDefinition updateDefinition : ragconnect().getUpdateDefinitionList()) {
       if (updateDefinition.isWriteToMqttDefinition() &&
           updateDefinition.asWriteToMqttDefinition().getToken().equals(this.getTarget())) {
         return updateDefinition.asWriteToMqttDefinition();
diff --git a/ros2rag.base/src/main/jastadd/Ros2Rag.relast b/ragconnect.base/src/main/jastadd/RagConnect.relast
similarity index 89%
rename from ros2rag.base/src/main/jastadd/Ros2Rag.relast
rename to ragconnect.base/src/main/jastadd/RagConnect.relast
index e1a84e8beac44fcbc23d09fc56ed536586bde4e8..e3ab24ad171007ea53ed78314b89b079d574d508 100644
--- a/ros2rag.base/src/main/jastadd/Ros2Rag.relast
+++ b/ragconnect.base/src/main/jastadd/RagConnect.relast
@@ -1,4 +1,4 @@
-Ros2Rag ::= UpdateDefinition* DependencyDefinition* MappingDefinition* Program <FileName> ;
+RagConnect ::= UpdateDefinition* DependencyDefinition* MappingDefinition* Program <FileName> ;
 
 abstract UpdateDefinition ::= <AlwaysApply:boolean> ;
 
diff --git a/ros2rag.base/src/main/jastadd/backend/Configuration.jadd b/ragconnect.base/src/main/jastadd/backend/Configuration.jadd
similarity index 100%
rename from ros2rag.base/src/main/jastadd/backend/Configuration.jadd
rename to ragconnect.base/src/main/jastadd/backend/Configuration.jadd
diff --git a/ros2rag.base/src/main/jastadd/backend/Generation.jadd b/ragconnect.base/src/main/jastadd/backend/Generation.jadd
similarity index 88%
rename from ros2rag.base/src/main/jastadd/backend/Generation.jadd
rename to ragconnect.base/src/main/jastadd/backend/Generation.jadd
index 9179b3d5ad520e4a3255a5b26c7ea86deaeef50b..060d4dfb6c9a87b7601391e1d5adf081c6666f78 100644
--- a/ros2rag.base/src/main/jastadd/backend/Generation.jadd
+++ b/ragconnect.base/src/main/jastadd/backend/Generation.jadd
@@ -26,15 +26,16 @@ aspect GenerationUtils {
 */
 
 aspect AttributesForMustache {
-  // --- MRos2Rag ---
-  eq MRos2Rag.getChild().mqttHandlerAttribute() = mqttHandlerAttribute();
-  eq MRos2Rag.getChild().mqttHandlerField() = mqttHandlerField();
+  // --- MRagConnect ---
+  eq MRagConnect.getChild().mqttHandlerAttribute() = mqttHandlerAttribute();
+  eq MRagConnect.getChild().mqttHandlerField() = mqttHandlerField();
+  eq MRagConnect.getRootTypeComponent(int i).isFirst() = i == 0;
 
-  syn String MRos2Rag.mqttHandlerAttribute() = getRos2Rag().mqttHandlerAttribute();
-  syn String MRos2Rag.mqttHandlerField() = getRos2Rag().mqttHandlerField();
-  syn String MRos2Rag.mqttSetHostMethod() = getRos2Rag().mqttSetHostMethod();
-  syn String MRos2Rag.mqttWaitUntilReadyMethod() = getRos2Rag().mqttWaitUntilReadyMethod();
-  syn String MRos2Rag.mqttCloseMethod() = getRos2Rag().mqttCloseMethod();
+  syn String MRagConnect.mqttHandlerAttribute() = getRagConnect().mqttHandlerAttribute();
+  syn String MRagConnect.mqttHandlerField() = getRagConnect().mqttHandlerField();
+  syn String MRagConnect.mqttSetHostMethod() = getRagConnect().mqttSetHostMethod();
+  syn String MRagConnect.mqttWaitUntilReadyMethod() = getRagConnect().mqttWaitUntilReadyMethod();
+  syn String MRagConnect.mqttCloseMethod() = getRagConnect().mqttCloseMethod();
 
   // --- MUpdateDefinition ---
   syn String MUpdateDefinition.preemptiveExpectedValue();
@@ -116,6 +117,7 @@ aspect AttributesForMustache {
   syn String MTypeComponent.name() = getTypeComponent().getName();
   inh String MTypeComponent.mqttHandlerAttribute();
   inh String MTypeComponent.mqttHandlerField();
+  inh boolean MTypeComponent.isFirst();
 
   // --- MTokenComponent ---
   syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName();
@@ -124,9 +126,9 @@ aspect AttributesForMustache {
   syn String MTokenComponent.internalName() = getTokenComponent().internalName();
 
   // --- toMustache ---
-  syn lazy MRos2Rag Ros2Rag.toMustache() {
-    MRos2Rag result = new MRos2Rag();
-    result.setRos2Rag(this);
+  syn lazy MRagConnect RagConnect.toMustache() {
+    MRagConnect result = new MRagConnect();
+    result.setRagConnect(this);
     for (UpdateDefinition def : getUpdateDefinitionList()) {
       if (def.isWriteToMqttDefinition()) {
         result.addWriteDefinition(def.asWriteToMqttDefinition().toMustache());
@@ -216,29 +218,29 @@ aspect AspectGeneration {
   syn String DependencyDefinition.internalRelationPrefix() = "_internal_" + getID();
   syn String DependencyDefinition.internalTokenName() = getSource().internalName();
 
-  syn String Ros2Rag.mqttHandlerAttribute() = "_mqttHandler";
-  syn String Ros2Rag.mqttHandlerField() = "_mqttHandler";
+  syn String RagConnect.mqttHandlerAttribute() = "_mqttHandler";
+  syn String RagConnect.mqttHandlerField() = "_mqttHandler";
 
-  syn String Ros2Rag.mqttSetHostMethod() = "MqttSetHost";
-  syn String Ros2Rag.mqttWaitUntilReadyMethod() = "MqttWaitUntilReady";
-  syn String Ros2Rag.mqttCloseMethod() = "MqttCloseConnections";
+  syn String RagConnect.mqttSetHostMethod() = "MqttSetHost";
+  syn String RagConnect.mqttWaitUntilReadyMethod() = "MqttWaitUntilReady";
+  syn String RagConnect.mqttCloseMethod() = "MqttCloseConnections";
 
   // naming copy attributes
   // --- mqttHandlerAttribute ---
   inh String UpdateDefinition.mqttHandlerAttribute();
   inh String MappingDefinition.mqttHandlerAttribute();
   inh String DependencyDefinition.mqttHandlerAttribute();
-  eq Ros2Rag.getChild().mqttHandlerAttribute() = mqttHandlerAttribute();
+  eq RagConnect.getChild().mqttHandlerAttribute() = mqttHandlerAttribute();
 
   // --- rootNodeName ---
   syn String ASTNode.rootNodeName() = rootNode.getName();
 
-  public String Ros2Rag.generateAspect(String rootNodeName) {
+  public String RagConnect.generateAspect(String rootNodeName) {
     rootNode = getProgram().resolveTypeDecl(rootNodeName);
     return toMustache().generateAspect();
   }
 
-  public String MRos2Rag.generateAspect() {
+  public String MRagConnect.generateAspect() {
     StringBuilder sb = new StringBuilder();
     com.github.mustachejava.reflect.ReflectionObjectHandler roh = new com.github.mustachejava.reflect.ReflectionObjectHandler() {
       @Override
@@ -257,14 +259,14 @@ aspect AspectGeneration {
     };
     com.github.mustachejava.DefaultMustacheFactory mf = new com.github.mustachejava.DefaultMustacheFactory();
     mf.setObjectHandler(roh);
-    com.github.mustachejava.Mustache m = mf.compile("ros2rag.mustache");
-    m.execute(new java.io.PrintWriter(new org.jastadd.ros2rag.compiler.AppendableWriter(sb)), this);
+    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> Ros2Rag.additionalRelations() {
+  syn java.util.List<Relation> RagConnect.additionalRelations() {
     java.util.List<Relation> result = new java.util.ArrayList<>();
     for (DependencyDefinition dd : getDependencyDefinitionList()) {
       result.add(dd.getRelationToCreate());
diff --git a/ros2rag.base/src/main/jastadd/backend/Mappings.jrag b/ragconnect.base/src/main/jastadd/backend/Mappings.jrag
similarity index 76%
rename from ros2rag.base/src/main/jastadd/backend/Mappings.jrag
rename to ragconnect.base/src/main/jastadd/backend/Mappings.jrag
index 600ce92ee064f45fe0f41860dd3ab0bc5e334bd3..8232e8ffbf4d099023f3d215666d47cfce179fa0 100644
--- a/ros2rag.base/src/main/jastadd/backend/Mappings.jrag
+++ b/ragconnect.base/src/main/jastadd/backend/Mappings.jrag
@@ -1,6 +1,6 @@
 aspect DefaultMappings {
 
-  private DefaultMappingDefinition Ros2Rag.baseDefaultMappingDefinitionFromBytes(String typeName) {
+  private DefaultMappingDefinition RagConnect.baseDefaultMappingDefinitionFromBytes(String typeName) {
     DefaultMappingDefinition result = new DefaultMappingDefinition();
     result.setID("_DefaultBytesTo" + Character.toUpperCase(typeName.charAt(0)) + typeName.substring(1) + "Mapping");
     result.setFromType(new JavaArrayMappingDefinitionType(new SimpleJavaTypeUse("byte")));
@@ -9,7 +9,7 @@ aspect DefaultMappings {
     return result;
   }
 
-  private DefaultMappingDefinition Ros2Rag.baseDefaultMappingDefinitionToBytes(String typeName) {
+  private DefaultMappingDefinition RagConnect.baseDefaultMappingDefinitionToBytes(String typeName) {
     DefaultMappingDefinition result = new DefaultMappingDefinition();
     result.setID("_Default" + Character.toUpperCase(typeName.charAt(0)) + typeName.substring(1) + "ToBytesMapping");
     result.setFromType(new JavaMappingDefinitionType(new SimpleJavaTypeUse(typeName)));
@@ -18,85 +18,85 @@ aspect DefaultMappings {
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToIntMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultBytesToIntMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("int");
     result.setContent("return java.nio.ByteBuffer.wrap(bytes).getInt();");
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToShortMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultBytesToShortMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("short");
     result.setContent("return java.nio.ByteBuffer.wrap(bytes).getShort();");
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToLongMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultBytesToLongMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("long");
     result.setContent("return java.nio.ByteBuffer.wrap(bytes).getLong();");
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToFloatMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultBytesToFloatMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("float");
     result.setContent("return java.nio.ByteBuffer.wrap(bytes).getFloat();");
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToDoubleMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultBytesToDoubleMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("double");
     result.setContent("return java.nio.ByteBuffer.wrap(bytes).getDouble();");
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToCharMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultBytesToCharMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("char");
     result.setContent("return java.nio.ByteBuffer.wrap(bytes).getChar();");
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultBytesToStringMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultBytesToStringMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionFromBytes("String");
     result.setContent("return new String(bytes);");
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultIntToBytesMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultIntToBytesMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("int");
     result.setContent("return java.nio.ByteBuffer.allocate(4).putInt(input).array();");
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultShortToBytesMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultShortToBytesMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("short");
     result.setContent("return java.nio.ByteBuffer.allocate(2).putShort(input).array();");
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultLongToBytesMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultLongToBytesMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("long");
     result.setContent("return java.nio.ByteBuffer.allocate(8).putLong(input).array();");
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultFloatToBytesMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultFloatToBytesMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("float");
     result.setContent("return java.nio.ByteBuffer.allocate(4).putFloat(input).array();");
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultDoubleToBytesMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultDoubleToBytesMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("double");
     result.setContent("return java.nio.ByteBuffer.allocate(8).putDouble(input).array();");
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultCharToBytesMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultCharToBytesMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("char");
     result.setContent("return java.nio.ByteBuffer.allocate(2).putChar(input).array();");
     return result;
   }
 
-  syn nta DefaultMappingDefinition Ros2Rag.defaultStringToBytesMapping() {
+  syn nta DefaultMappingDefinition RagConnect.defaultStringToBytesMapping() {
     DefaultMappingDefinition result = baseDefaultMappingDefinitionToBytes("String");
     result.setContent("return input.getBytes();");
     return result;
@@ -166,18 +166,18 @@ aspect Mappings {
         getMappingList().get(0).getFromType().prettyPrint();
     switch(typeName) {
       case "int":
-      case "Integer": return ros2rag().defaultBytesToIntMapping();
+      case "Integer": return ragconnect().defaultBytesToIntMapping();
       case "short":
-      case "Short": return ros2rag().defaultBytesToShortMapping();
+      case "Short": return ragconnect().defaultBytesToShortMapping();
       case "long":
-      case "Long": return ros2rag().defaultBytesToLongMapping();
+      case "Long": return ragconnect().defaultBytesToLongMapping();
       case "float":
-      case "Float": return ros2rag().defaultBytesToFloatMapping();
+      case "Float": return ragconnect().defaultBytesToFloatMapping();
       case "double":
-      case "Double": return ros2rag().defaultBytesToDoubleMapping();
+      case "Double": return ragconnect().defaultBytesToDoubleMapping();
       case "char":
-      case "Character": return ros2rag().defaultBytesToCharMapping();
-      case "String": return ros2rag().defaultBytesToStringMapping();
+      case "Character": return ragconnect().defaultBytesToCharMapping();
+      case "String": return ragconnect().defaultBytesToStringMapping();
       default: return null;
     }
   }
@@ -187,18 +187,18 @@ aspect Mappings {
         getMappingList().get(getMappingList().size() - 1).getFromType().prettyPrint();
     switch(typeName) {
       case "int":
-      case "Integer": return ros2rag().defaultIntToBytesMapping();
+      case "Integer": return ragconnect().defaultIntToBytesMapping();
       case "short":
-      case "Short": return ros2rag().defaultShortToBytesMapping();
+      case "Short": return ragconnect().defaultShortToBytesMapping();
       case "long":
-      case "Long": return ros2rag().defaultLongToBytesMapping();
+      case "Long": return ragconnect().defaultLongToBytesMapping();
       case "float":
-      case "Float": return ros2rag().defaultFloatToBytesMapping();
+      case "Float": return ragconnect().defaultFloatToBytesMapping();
       case "double":
-      case "Double": return ros2rag().defaultDoubleToBytesMapping();
+      case "Double": return ragconnect().defaultDoubleToBytesMapping();
       case "char":
-      case "Character": return ros2rag().defaultCharToBytesMapping();
-      case "String": return ros2rag().defaultStringToBytesMapping();
+      case "Character": return ragconnect().defaultCharToBytesMapping();
+      case "String": return ragconnect().defaultStringToBytesMapping();
       default: return null;
     }
   }
@@ -208,7 +208,7 @@ aspect Mappings {
   eq JavaArrayMappingDefinitionType.isByteArray() = getType().getName().equals("byte");
 
   // --- allMappingDefinitions ---
-  syn java.util.List<MappingDefinition> Ros2Rag.allMappingDefinitions() {
+  syn java.util.List<MappingDefinition> RagConnect.allMappingDefinitions() {
     java.util.List<MappingDefinition> result = new java.util.ArrayList<>();
     getMappingDefinitionList().iterator().forEachRemaining(result::add);
     result.add(defaultBytesToIntMapping());
diff --git a/ragconnect.base/src/main/jastadd/parser/Preamble.parser b/ragconnect.base/src/main/jastadd/parser/Preamble.parser
new file mode 100644
index 0000000000000000000000000000000000000000..d701db19d6edb6d6c616bc79fc0145ea59d2713d
--- /dev/null
+++ b/ragconnect.base/src/main/jastadd/parser/Preamble.parser
@@ -0,0 +1,7 @@
+%header {:
+package org.jastadd.ragconnect.parser;
+import org.jastadd.ragconnect.ast.*;
+:};
+
+%goal goal;
+%goal ragconnect;
diff --git a/ros2rag.base/src/main/jastadd/parser/Ros2Rag.parser b/ragconnect.base/src/main/jastadd/parser/RagConnect.parser
similarity index 86%
rename from ros2rag.base/src/main/jastadd/parser/Ros2Rag.parser
rename to ragconnect.base/src/main/jastadd/parser/RagConnect.parser
index 015b4e664950fd9f49601dbea53fc67225c41169..3fbf4b8ef3c7abdfc10b72c38938ba980079d653 100644
--- a/ros2rag.base/src/main/jastadd/parser/Ros2Rag.parser
+++ b/ragconnect.base/src/main/jastadd/parser/RagConnect.parser
@@ -1,9 +1,9 @@
-Ros2Rag ros2rag
-  = update_definition.d ros2rag.r       {: r.getUpdateDefinitionList().insertChild(d, 0); return r; :}
-  | dependency_definition.d ros2rag.r   {: r.getDependencyDefinitionList().insertChild(d, 0); return r; :}
-  | mapping_definition.d ros2rag.r      {: r.getMappingDefinitionList().insertChild(d, 0); return r; :}
-  | comment ros2rag.r                   {: return r; :}
-  |                                     {: return new Ros2Rag(); :}
+RagConnect ragconnect
+  = update_definition.d ragconnect.r       {: r.getUpdateDefinitionList().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 {:
diff --git a/ragconnect.base/src/main/jastadd/scanner/Header.flex b/ragconnect.base/src/main/jastadd/scanner/Header.flex
new file mode 100644
index 0000000000000000000000000000000000000000..53f20ea9b3ea615da3c90ac3120ddea033afc4c0
--- /dev/null
+++ b/ragconnect.base/src/main/jastadd/scanner/Header.flex
@@ -0,0 +1,17 @@
+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
+
+%line
+%column
diff --git a/ros2rag.base/src/main/jastadd/scanner/Keywords.flex b/ragconnect.base/src/main/jastadd/scanner/Keywords.flex
similarity index 100%
rename from ros2rag.base/src/main/jastadd/scanner/Keywords.flex
rename to ragconnect.base/src/main/jastadd/scanner/Keywords.flex
diff --git a/ros2rag.base/src/main/jastadd/scanner/Macros.flex b/ragconnect.base/src/main/jastadd/scanner/Macros.flex
similarity index 100%
rename from ros2rag.base/src/main/jastadd/scanner/Macros.flex
rename to ragconnect.base/src/main/jastadd/scanner/Macros.flex
diff --git a/ros2rag.base/src/main/jastadd/scanner/MappingContent.flex b/ragconnect.base/src/main/jastadd/scanner/MappingContent.flex
similarity index 100%
rename from ros2rag.base/src/main/jastadd/scanner/MappingContent.flex
rename to ragconnect.base/src/main/jastadd/scanner/MappingContent.flex
diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/AppendableWriter.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/AppendableWriter.java
similarity index 93%
rename from ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/AppendableWriter.java
rename to ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/AppendableWriter.java
index 97680b18dc4fd1d8af3df75f35221e059355e19e..55818dcda1c89948726065c9d11640fcb6601130 100644
--- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/AppendableWriter.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/AppendableWriter.java
@@ -1,4 +1,4 @@
-package org.jastadd.ros2rag.compiler;
+package org.jastadd.ragconnect.compiler;
 
 import java.io.IOException;
 import java.io.Writer;
diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/Compiler.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
similarity index 76%
rename from ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/Compiler.java
rename to ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
index b6331130a7b338ef1bf37f6ac372d612cb1754f1..e23d4bdd168c1b5f40fb95c7cc9a2a5f02c43cdf 100644
--- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/Compiler.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
@@ -1,14 +1,13 @@
-package org.jastadd.ros2rag.compiler;
+package org.jastadd.ragconnect.compiler;
 
 import beaver.Parser;
-import org.jastadd.ros2rag.ast.*;
-import org.jastadd.ros2rag.compiler.options.CommandLine;
-import org.jastadd.ros2rag.compiler.options.CommandLine.CommandLineException;
-import org.jastadd.ros2rag.compiler.options.FlagOption;
-import org.jastadd.ros2rag.compiler.options.Option;
-import org.jastadd.ros2rag.compiler.options.StringOption;
-import org.jastadd.ros2rag.parser.Ros2RagParser;
-import org.jastadd.ros2rag.scanner.Ros2RagScanner;
+import org.jastadd.ragconnect.compiler.options.CommandLine;
+import org.jastadd.ragconnect.compiler.options.FlagOption;
+import org.jastadd.ragconnect.compiler.options.Option;
+import org.jastadd.ragconnect.compiler.options.StringOption;
+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;
@@ -22,7 +21,7 @@ public class Compiler {
   private StringOption optionOutputDir;
   private StringOption optionInputGrammar;
   private StringOption optionRootNode;
-  private StringOption optionInputRos2Rag;
+  private StringOption optionInputRagConnect;
   private FlagOption optionHelp;
   private FlagOption optionVerbose;
   private FlagOption optionLogReads;
@@ -36,7 +35,7 @@ public class Compiler {
     addOptions();
   }
 
-  public void run(String[] args) throws CommandLineException, CompilerException {
+  public void run(String[] args) throws CommandLine.CommandLineException, CompilerException {
     System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
     System.setProperty("mustache.debug", "true");
     options = new ArrayList<>();
@@ -75,7 +74,7 @@ public class Compiler {
       throw new CompilerException("Error creating output dir " + outputDir, e);
     }
 
-    printMessage("Running Ros2Rag Preprocessor");
+    printMessage("Running RagConnect Preprocessor");
 
     if (anyRequiredOptionIsUnset()) {
       throw new CompilerException("Aborting due to missing values for required options.");
@@ -85,11 +84,11 @@ public class Compiler {
     if (!otherArgs.isEmpty()) {
       printMessage("Superfluous arguments will be ignored: " + otherArgs);
     }
-    Ros2Rag ros2Rag = parseProgram(optionInputGrammar.getValue(), optionInputRos2Rag.getValue());
+    RagConnect ragConnect = parseProgram(optionInputGrammar.getValue(), optionInputRagConnect.getValue());
 
-    if (!ros2Rag.errors().isEmpty()) {
+    if (!ragConnect.errors().isEmpty()) {
       System.err.println("Errors:");
-      for (ErrorMessage e : ros2Rag.errors()) {
+      for (ErrorMessage e : ragConnect.errors()) {
         System.err.println(e);
       }
       System.exit(1);
@@ -109,8 +108,8 @@ public class Compiler {
     } catch (IOException e) {
       throw new CompilerException("Could not copy " + mqttHandlerFileName, e);
     }
-    writeToFile(outputDir + "/Grammar.relast", ros2Rag.getProgram().generateAbstractGrammar());
-    writeToFile(outputDir + "/ROS2RAG.jadd", ros2Rag.generateAspect(optionRootNode.getValue()));
+    writeToFile(outputDir + "/Grammar.relast", ragConnect.getProgram().generateAbstractGrammar());
+    writeToFile(outputDir + "/RagConnect.jadd", ragConnect.generateAspect(optionRootNode.getValue()));
   }
 
   private boolean anyRequiredOptionIsUnset() {
@@ -129,7 +128,7 @@ public class Compiler {
   public static void main(String[] args) {
     try {
       new Compiler().run(args);
-    } catch (CommandLineException | CompilerException e) {
+    } catch (CommandLine.CommandLineException | CompilerException e) {
       System.err.println(e.getMessage());
       System.exit(-1);
     }
@@ -153,7 +152,7 @@ public class Compiler {
     optionOutputDir = addOption(new StringOption("outputDir", "target directory for the generated files."));
     optionInputGrammar = addOption(new StringOption("inputGrammar", "base grammar."));
     optionRootNode = addOption(new StringOption("rootNode", "root node in the base grammar."));
-    optionInputRos2Rag = addOption(new StringOption("inputRos2Rag", "ros2rag definition file."));
+    optionInputRagConnect = addOption(new StringOption("inputRagConnect", "connect definition file."));
     optionHelp = addOption(new FlagOption("help", "Print usage and exit."));
     optionVerbose = addOption(new FlagOption("verbose", "Print more messages while compiling."));
     optionLogReads = addOption(new FlagOption("logReads", "Enable logging for every read."));
@@ -165,14 +164,14 @@ public class Compiler {
     return option;
   }
 
-  private Ros2Rag parseProgram(String inputGrammarFileName, String inputRos2RagFileName) throws CompilerException {
+  private RagConnect parseProgram(String inputGrammarFileName, String inputRagConnectFileName) throws CompilerException {
     Program program = new Program();
-    Ros2Rag ros2Rag;
+    RagConnect ros2Rag;
     GrammarFile inputGrammar;
 
     try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputGrammarFileName))) {
-      Ros2RagScanner scanner = new Ros2RagScanner(reader);
-      Ros2RagParser parser = new Ros2RagParser();
+      RagConnectScanner scanner = new RagConnectScanner(reader);
+      RagConnectParser parser = new RagConnectParser();
       inputGrammar = (GrammarFile) parser.parse(scanner);
       if (optionVerbose.isSet()) {
         inputGrammar.dumpTree(System.out);
@@ -184,14 +183,14 @@ public class Compiler {
       throw new CompilerException("Could not parse grammar file " + inputGrammarFileName, e);
     }
 
-    try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputRos2RagFileName))) {
-      Ros2RagScanner scanner = new Ros2RagScanner(reader);
-      Ros2RagParser parser = new Ros2RagParser();
-      ros2Rag = (Ros2Rag) parser.parse(scanner, Ros2RagParser.AltGoals.ros2rag);
+    try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputRagConnectFileName))) {
+      RagConnectScanner scanner = new RagConnectScanner(reader);
+      RagConnectParser parser = new RagConnectParser();
+      ros2Rag = (RagConnect) parser.parse(scanner, RagConnectParser.AltGoals.ragconnect);
       ros2Rag.setProgram(program);
-      ros2Rag.setFileName(inputRos2RagFileName);
+      ros2Rag.setFileName(inputRagConnectFileName);
     } catch (IOException | Parser.Exception e) {
-      throw new CompilerException("Could not parse ros2rag file " + inputRos2RagFileName, e);
+      throw new CompilerException("Could not parse ros2rag file " + inputRagConnectFileName, e);
     }
     ros2Rag.treeResolveAll();
     ros2Rag.additionalRelations().forEach(inputGrammar::addDeclaration);
diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/SimpleMain.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java
similarity index 81%
rename from ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/SimpleMain.java
rename to ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java
index 74406f87a166732efedafbc772d114185f24e227..2e7d5c9cc72b5f1915ef0c73090e30dd21fb2ae6 100644
--- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/SimpleMain.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java
@@ -1,9 +1,9 @@
-package org.jastadd.ros2rag.compiler;
+package org.jastadd.ragconnect.compiler;
 
 import beaver.Parser;
-import org.jastadd.ros2rag.ast.*;
-import org.jastadd.ros2rag.parser.Ros2RagParser;
-import org.jastadd.ros2rag.scanner.Ros2RagScanner;
+import org.jastadd.ragconnect.ast.*;
+import org.jastadd.ragconnect.parser.RagConnectParser;
+import org.jastadd.ragconnect.scanner.RagConnectScanner;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -102,18 +102,18 @@ public class SimpleMain {
   }
 
   public static void main(String[] args) {
-    testing();
-//    createManualAST();
+//    testing();
+    createManualAST();
   }
 
   private static void createManualAST() {
-    Ros2Rag model = new Ros2Rag();
-    Program program = parseProgram(Paths.get("src", "test", "resources", "Example.relast"));
+    RagConnect model = new RagConnect();
+    Program program = parseProgram(Paths.get("ros2rag.starter","src", "main", "jastadd", "RobotModel.relast"));
     model.setProgram(program);
 
     MappingDefinition mappingDefinition = new MappingDefinition();
     mappingDefinition.setID("PoseToPosition");
-    mappingDefinition.setFromType(makeMappingDefinitionType("PBPose"));
+    mappingDefinition.setFromType(makeMappingDefinitionType("int"));
     mappingDefinition.setFromVariableName("x");
     mappingDefinition.setToType(makeMappingDefinitionType("Position"));
     mappingDefinition.setContent("      pose.position.x += sqrt(.5 * size.x)\n" +
@@ -125,11 +125,14 @@ public class SimpleMain {
 
     ReadFromMqttDefinition readFromMqttDefinition = new ReadFromMqttDefinition();
     readFromMqttDefinition.setAlwaysApply(false);
-    readFromMqttDefinition.setToken(TokenComponent.createRef("Joint.CurrentPosition"));
+    readFromMqttDefinition.setToken(TokenComponent.createRef("Link.CurrentPosition"));
     readFromMqttDefinition.addMapping(mappingDefinition);
     model.addUpdateDefinition(readFromMqttDefinition);
 
     model.treeResolveAll();
+    for (ErrorMessage error : model.errors()) {
+      System.err.println(error);
+    }
 
     System.out.println(model.generateAspect("Model"));
   }
@@ -142,9 +145,12 @@ public class SimpleMain {
 
   private static Program parseProgram(Path path) {
     try (BufferedReader reader = Files.newBufferedReader(path)) {
-      Ros2RagScanner scanner = new Ros2RagScanner(reader);
-      Ros2RagParser parser = new Ros2RagParser();
-      return (Program) parser.parse(scanner);
+      RagConnectScanner scanner = new RagConnectScanner(reader);
+      RagConnectParser parser = new RagConnectParser();
+      GrammarFile grammarFile = (GrammarFile) parser.parse(scanner);
+      Program program = new Program();
+      program.addGrammarFile(grammarFile);
+      return program;
     } catch (IOException | Parser.Exception e) {
       e.printStackTrace();
     }
diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/Utils.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Utils.java
similarity index 90%
rename from ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/Utils.java
rename to ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Utils.java
index 6a229cd7e9a2551578a87f1c7b5fcccfebd31ff7..c083fe1d912fa74cb4461fce5fcb839f5b88a40f 100644
--- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/Utils.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Utils.java
@@ -1,4 +1,4 @@
-package org.jastadd.ros2rag.compiler;
+package org.jastadd.ragconnect.compiler;
 
 import java.util.*;
 import java.util.function.Predicate;
diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/CommandLine.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/CommandLine.java
similarity index 98%
rename from ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/CommandLine.java
rename to ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/CommandLine.java
index 89a1335c5440cc88fc8ee7c0c22552fffd86c13b..dc29ba032e1a7cdc234a9fdac60064205b5ca5ea 100644
--- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/CommandLine.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/CommandLine.java
@@ -1,4 +1,4 @@
-package org.jastadd.ros2rag.compiler.options;
+package org.jastadd.ragconnect.compiler.options;
 
 import java.util.*;
 
diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/EnumOption.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/EnumOption.java
similarity index 97%
rename from ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/EnumOption.java
rename to ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/EnumOption.java
index 67ada98e8c2483b8d29ffeb73f99e4be8e6244c8..a5278d36a39d12e21b2015cca2659321ced5117f 100644
--- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/EnumOption.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/EnumOption.java
@@ -1,4 +1,4 @@
-package org.jastadd.ros2rag.compiler.options;
+package org.jastadd.ragconnect.compiler.options;
 
 import java.util.Collection;
 import java.util.TreeSet;
diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/FlagOption.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/FlagOption.java
similarity index 91%
rename from ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/FlagOption.java
rename to ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/FlagOption.java
index ad87ed19e91b03f05d163f0cc123af15a4a4e2e2..c16e20dc2075ad1a472bbc483e312561f9cd1d1a 100644
--- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/FlagOption.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/FlagOption.java
@@ -1,4 +1,4 @@
-package org.jastadd.ros2rag.compiler.options;
+package org.jastadd.ragconnect.compiler.options;
 
 public class FlagOption extends Option<Boolean> {
   private boolean value;
diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/Option.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/Option.java
similarity index 96%
rename from ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/Option.java
rename to ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/Option.java
index 0f57f9899ba5f28ee80ca6d37788a6e31123ac47..cc1469cfa49e8b85ea95dda0de5509e91027b315 100644
--- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/Option.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/Option.java
@@ -1,4 +1,4 @@
-package org.jastadd.ros2rag.compiler.options;
+package org.jastadd.ragconnect.compiler.options;
 
 abstract public class Option<ValueType> implements Comparable<Option<?>> {
   public final static String PREFIX = "--";
diff --git a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/StringOption.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/StringOption.java
similarity index 93%
rename from ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/StringOption.java
rename to ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/StringOption.java
index 19082b5ae6b9fa90145a73ff4ddc4b58b2f9b122..51ee57a5c999f32822b249d5caf48a2f4de8ce7d 100644
--- a/ros2rag.base/src/main/java/org/jastadd/ros2rag/compiler/options/StringOption.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/options/StringOption.java
@@ -1,4 +1,4 @@
-package org.jastadd.ros2rag.compiler.options;
+package org.jastadd.ragconnect.compiler.options;
 
 public class StringOption extends Option<String> {
   private String value;
diff --git a/ros2rag.base/src/main/resources/MqttHandler.jadd b/ragconnect.base/src/main/resources/MqttHandler.jadd
similarity index 99%
rename from ros2rag.base/src/main/resources/MqttHandler.jadd
rename to ragconnect.base/src/main/resources/MqttHandler.jadd
index c3e98dc89377e6217946fafa54a9eb7ab7594c61..493d8e4452e81c5dbfa45a522a6366345908cdcc 100644
--- a/ros2rag.base/src/main/resources/MqttHandler.jadd
+++ b/ragconnect.base/src/main/resources/MqttHandler.jadd
@@ -24,7 +24,7 @@ public class MqttHandler {
   private final java.util.Map<String, java.util.List<java.util.function.Consumer<byte[]>>> callbacks;
 
   public MqttHandler() {
-    this("Ros2Rag");
+    this("RagConnect");
   }
 
   public MqttHandler(String name) {
diff --git a/ros2rag.base/src/main/resources/dependencyDefinition.mustache b/ragconnect.base/src/main/resources/dependencyDefinition.mustache
similarity index 100%
rename from ros2rag.base/src/main/resources/dependencyDefinition.mustache
rename to ragconnect.base/src/main/resources/dependencyDefinition.mustache
diff --git a/ros2rag.base/src/main/resources/log4j2.xml b/ragconnect.base/src/main/resources/log4j2.xml
similarity index 100%
rename from ros2rag.base/src/main/resources/log4j2.xml
rename to ragconnect.base/src/main/resources/log4j2.xml
diff --git a/ros2rag.base/src/main/resources/mappingApplication.mustache b/ragconnect.base/src/main/resources/mappingApplication.mustache
similarity index 100%
rename from ros2rag.base/src/main/resources/mappingApplication.mustache
rename to ragconnect.base/src/main/resources/mappingApplication.mustache
diff --git a/ros2rag.base/src/main/resources/mappingDefinition.mustache b/ragconnect.base/src/main/resources/mappingDefinition.mustache
similarity index 100%
rename from ros2rag.base/src/main/resources/mappingDefinition.mustache
rename to ragconnect.base/src/main/resources/mappingDefinition.mustache
diff --git a/ros2rag.base/src/main/resources/mqtt.mustache b/ragconnect.base/src/main/resources/mqtt.mustache
similarity index 92%
rename from ros2rag.base/src/main/resources/mqtt.mustache
rename to ragconnect.base/src/main/resources/mqtt.mustache
index d65ca944a9dc7e881ff75d89ea696d4bb1fe09fc..dbdb85e7954dbf50ae7e150ffc43dd4cbda0fd80 100644
--- a/ros2rag.base/src/main/resources/mqtt.mustache
+++ b/ragconnect.base/src/main/resources/mqtt.mustache
@@ -16,8 +16,8 @@ aspect MQTT {
     {{mqttHandlerField}}.close();
   }
 
-  inh MqttHandler ASTNode.{{mqttHandlerAttribute}}();
   {{#getRootTypeComponents}}
+  {{#first}}inh MqttHandler ASTNode.{{mqttHandlerAttribute}}();{{/first}}
   eq {{rootNodeName}}.get{{name}}().{{mqttHandlerAttribute}}() = {{mqttHandlerField}};
   {{/getRootTypeComponents}}
 }
diff --git a/ros2rag.base/src/main/resources/ros2rag.mustache b/ragconnect.base/src/main/resources/ragconnect.mustache
similarity index 100%
rename from ros2rag.base/src/main/resources/ros2rag.mustache
rename to ragconnect.base/src/main/resources/ragconnect.mustache
diff --git a/ros2rag.base/src/main/resources/readDefinition.mustache b/ragconnect.base/src/main/resources/readDefinition.mustache
similarity index 100%
rename from ros2rag.base/src/main/resources/readDefinition.mustache
rename to ragconnect.base/src/main/resources/readDefinition.mustache
diff --git a/ros2rag.base/src/main/resources/tokenComponent.mustache b/ragconnect.base/src/main/resources/tokenComponent.mustache
similarity index 100%
rename from ros2rag.base/src/main/resources/tokenComponent.mustache
rename to ragconnect.base/src/main/resources/tokenComponent.mustache
diff --git a/ros2rag.base/src/main/resources/writeDefinition.mustache b/ragconnect.base/src/main/resources/writeDefinition.mustache
similarity index 100%
rename from ros2rag.base/src/main/resources/writeDefinition.mustache
rename to ragconnect.base/src/main/resources/writeDefinition.mustache
diff --git a/ros2rag.starter/.gitignore b/ragconnect.tests/.gitignore
similarity index 100%
rename from ros2rag.starter/.gitignore
rename to ragconnect.tests/.gitignore
diff --git a/ros2rag.tests/README.md b/ragconnect.tests/README.md
similarity index 100%
rename from ros2rag.tests/README.md
rename to ragconnect.tests/README.md
diff --git a/ros2rag.tests/build.gradle b/ragconnect.tests/build.gradle
similarity index 55%
rename from ros2rag.tests/build.gradle
rename to ragconnect.tests/build.gradle
index efff9a553b1da39904b80933df36e4e4d809f526..ab534e4e47548c416e99769616d85f3de190ab70 100644
--- a/ros2rag.tests/build.gradle
+++ b/ragconnect.tests/build.gradle
@@ -1,6 +1,7 @@
 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
@@ -13,12 +14,12 @@ buildscript {
     repositories.jcenter()
     dependencies {
         classpath 'org.jastadd:jastaddgradle:1.13.3'
+        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.12'
     }
 }
 
 dependencies {
-    implementation project(':ros2rag.base')
-    implementation project(':ros2rag.common')
+    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'
@@ -26,6 +27,7 @@ dependencies {
     testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.12.1'
     testImplementation group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15'
     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 {
@@ -36,6 +38,13 @@ test {
     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'
@@ -58,16 +67,16 @@ sourceSets {
 // --- Test: Example ---
 task preprocessExampleTest(type: JavaExec, group: 'verification') {
     doFirst {
-        delete 'src/test/02-after-ros2rag/example/Grammar.relast',
-                'src/test/02-after-ros2rag/example/MqttHandler.java',
-                'src/test/02-after-ros2rag/example/ROS2RAG.jadd'
+        delete 'src/test/02-after-ragconnect/example/Grammar.relast',
+                'src/test/02-after-ragconnect/example/MqttHandler.java',
+                'src/test/02-after-ragconnect/example/RagConnect.jadd'
     }
 
     classpath = sourceSets.main.runtimeClasspath
-    main = 'org.jastadd.ros2rag.compiler.Compiler'
-    args '--outputDir=src/test/02-after-ros2rag/example',
+    main = 'org.jastadd.ragconnect.compiler.Compiler'
+    args '--outputDir=src/test/02-after-ragconnect/example',
             '--inputGrammar=src/test/01-input/example/Test.relast',
-            '--inputRos2Rag=src/test/01-input/example/Test.ros2rag',
+            '--inputRagConnect=src/test/01-input/example/Test.ragconnect',
             '--rootNode=Model',
             '--logReads', '--logWrites'
 }
@@ -75,12 +84,12 @@ task preprocessExampleTest(type: JavaExec, group: 'verification') {
 task compileExampleTest(type: RelastTest) {
     useJastAddNames = true
     jastAddList = 'JastAddList'
-    relastFiles 'src/test/02-after-ros2rag/example/Grammar.relast'
+    relastFiles 'src/test/02-after-ragconnect/example/Grammar.relast'
     grammarName = 'src/test/03-after-relast/example/example'
     packageName = 'example.ast'
     moreInputFiles 'src/test/01-input/example/Test.jadd',
-            'src/test/02-after-ros2rag/example/MqttHandler.jadd',
-            'src/test/02-after-ros2rag/example/ROS2RAG.jadd'
+            'src/test/02-after-ragconnect/example/MqttHandler.jadd',
+            'src/test/02-after-ragconnect/example/RagConnect.jadd'
 }
 
 testClasses.dependsOn compileExampleTest
@@ -89,16 +98,16 @@ compileExampleTest.dependsOn preprocessExampleTest
 // --- Test: default-only-read ---
 task preprocessDefaultOnlyReadTest(type: JavaExec, group: 'verification') {
     doFirst {
-        delete 'src/test/02-after-ros2rag/defaultOnlyRead/Grammar.relast',
-                'src/test/02-after-ros2rag/defaultOnlyRead/MqttHandler.java',
-                'src/test/02-after-ros2rag/defaultOnlyRead/ROS2RAG.jadd'
+        delete 'src/test/02-after-ragconnect/defaultOnlyRead/Grammar.relast',
+                'src/test/02-after-ragconnect/defaultOnlyRead/MqttHandler.java',
+                'src/test/02-after-ragconnect/defaultOnlyRead/RagConnect.jadd'
     }
 
     classpath = sourceSets.main.runtimeClasspath
-    main = 'org.jastadd.ros2rag.compiler.Compiler'
-    args '--outputDir=src/test/02-after-ros2rag/defaultOnlyRead',
+    main = 'org.jastadd.ragconnect.compiler.Compiler'
+    args '--outputDir=src/test/02-after-ragconnect/defaultOnlyRead',
             '--inputGrammar=src/test/01-input/defaultOnlyRead/Test.relast',
-            '--inputRos2Rag=src/test/01-input/defaultOnlyRead/Test.ros2rag',
+            '--inputRagConnect=src/test/01-input/defaultOnlyRead/Test.ragconnect',
             '--rootNode=A',
             '--verbose'
 }
@@ -106,11 +115,11 @@ task preprocessDefaultOnlyReadTest(type: JavaExec, group: 'verification') {
 task compileDefaultOnlyReadTest(type: RelastTest) {
     useJastAddNames = true
     jastAddList = 'JastAddList'
-    relastFiles 'src/test/02-after-ros2rag/defaultOnlyRead/Grammar.relast'
+    relastFiles 'src/test/02-after-ragconnect/defaultOnlyRead/Grammar.relast'
     grammarName = 'src/test/03-after-relast/defaultOnlyRead/defaultOnlyRead'
     packageName = 'defaultOnlyRead.ast'
-    moreInputFiles 'src/test/02-after-ros2rag/defaultOnlyRead/MqttHandler.jadd',
-            'src/test/02-after-ros2rag/defaultOnlyRead/ROS2RAG.jadd'
+    moreInputFiles 'src/test/02-after-ragconnect/defaultOnlyRead/MqttHandler.jadd',
+            'src/test/02-after-ragconnect/defaultOnlyRead/RagConnect.jadd'
 }
 
 testClasses.dependsOn compileDefaultOnlyReadTest
@@ -119,16 +128,16 @@ compileDefaultOnlyReadTest.dependsOn preprocessDefaultOnlyReadTest
 // --- Test: default-only-write ---
 task preprocessDefaultOnlyWriteTest(type: JavaExec, group: 'verification') {
     doFirst {
-        delete 'src/test/02-after-ros2rag/defaultOnlyWrite/Grammar.relast',
-                'src/test/02-after-ros2rag/defaultOnlyWrite/MqttHandler.java',
-                'src/test/02-after-ros2rag/defaultOnlyWrite/ROS2RAG.jadd'
+        delete 'src/test/02-after-ragconnect/defaultOnlyWrite/Grammar.relast',
+                'src/test/02-after-ragconnect/defaultOnlyWrite/MqttHandler.java',
+                'src/test/02-after-ragconnect/defaultOnlyWrite/RagConnect.jadd'
     }
 
     classpath = sourceSets.main.runtimeClasspath
-    main = 'org.jastadd.ros2rag.compiler.Compiler'
-    args '--outputDir=src/test/02-after-ros2rag/defaultOnlyWrite',
+    main = 'org.jastadd.ragconnect.compiler.Compiler'
+    args '--outputDir=src/test/02-after-ragconnect/defaultOnlyWrite',
             '--inputGrammar=src/test/01-input/defaultOnlyWrite/Test.relast',
-            '--inputRos2Rag=src/test/01-input/defaultOnlyWrite/Test.ros2rag',
+            '--inputRagConnect=src/test/01-input/defaultOnlyWrite/Test.ragconnect',
             '--rootNode=A',
             '--verbose'
 }
@@ -136,12 +145,12 @@ task preprocessDefaultOnlyWriteTest(type: JavaExec, group: 'verification') {
 task compileDefaultOnlyWriteTest(type: RelastTest) {
     useJastAddNames = true
     jastAddList = 'JastAddList'
-    relastFiles 'src/test/02-after-ros2rag/defaultOnlyWrite/Grammar.relast'
+    relastFiles 'src/test/02-after-ragconnect/defaultOnlyWrite/Grammar.relast'
     grammarName = 'src/test/03-after-relast/defaultOnlyWrite/defaultOnlyWrite'
     packageName = 'defaultOnlyWrite.ast'
     moreInputFiles 'src/test/01-input/defaultOnlyWrite/Test.jadd',
-            'src/test/02-after-ros2rag/defaultOnlyWrite/MqttHandler.jadd',
-            'src/test/02-after-ros2rag/defaultOnlyWrite/ROS2RAG.jadd'
+            'src/test/02-after-ragconnect/defaultOnlyWrite/MqttHandler.jadd',
+            'src/test/02-after-ragconnect/defaultOnlyWrite/RagConnect.jadd'
 }
 
 testClasses.dependsOn compileDefaultOnlyWriteTest
@@ -150,16 +159,16 @@ compileDefaultOnlyWriteTest.dependsOn preprocessDefaultOnlyWriteTest
 // --- Test: read1write2 ---
 task preprocessRead1Write2Test(type: JavaExec, group: 'verification') {
     doFirst {
-        delete 'src/test/02-after-ros2rag/read1write2/Grammar.relast',
-                'src/test/02-after-ros2rag/read1write2/MqttHandler.java',
-                'src/test/02-after-ros2rag/read1write2/ROS2RAG.jadd'
+        delete 'src/test/02-after-ragconnect/read1write2/Grammar.relast',
+                'src/test/02-after-ragconnect/read1write2/MqttHandler.java',
+                'src/test/02-after-ragconnect/read1write2/RagConnect.jadd'
     }
 
     classpath = sourceSets.main.runtimeClasspath
-    main = 'org.jastadd.ros2rag.compiler.Compiler'
-    args '--outputDir=src/test/02-after-ros2rag/read1write2',
+    main = 'org.jastadd.ragconnect.compiler.Compiler'
+    args '--outputDir=src/test/02-after-ragconnect/read1write2',
             '--inputGrammar=src/test/01-input/read1write2/Test.relast',
-            '--inputRos2Rag=src/test/01-input/read1write2/Test.ros2rag',
+            '--inputRagConnect=src/test/01-input/read1write2/Test.ragconnect',
             '--rootNode=A',
             '--logReads', '--logWrites'
 }
@@ -167,12 +176,12 @@ task preprocessRead1Write2Test(type: JavaExec, group: 'verification') {
 task compileRead1Write2Test(type: RelastTest) {
     useJastAddNames = true
     jastAddList = 'JastAddList'
-    relastFiles 'src/test/02-after-ros2rag/read1write2/Grammar.relast'
+    relastFiles 'src/test/02-after-ragconnect/read1write2/Grammar.relast'
     grammarName = 'src/test/03-after-relast/read1write2/read1write2'
     packageName = 'read1write2.ast'
     moreInputFiles 'src/test/01-input/read1write2/Test.jadd',
-            'src/test/02-after-ros2rag/read1write2/MqttHandler.jadd',
-            'src/test/02-after-ros2rag/read1write2/ROS2RAG.jadd'
+            'src/test/02-after-ragconnect/read1write2/MqttHandler.jadd',
+            'src/test/02-after-ragconnect/read1write2/RagConnect.jadd'
 }
 
 testClasses.dependsOn compileRead1Write2Test
@@ -181,16 +190,16 @@ compileRead1Write2Test.dependsOn preprocessRead1Write2Test
 // --- Test: read2write1 ---
 task preprocessRead2Write1Test(type: JavaExec, group: 'verification') {
     doFirst {
-        delete 'src/test/02-after-ros2rag/read2write1/Grammar.relast',
-                'src/test/02-after-ros2rag/read2write1/MqttHandler.java',
-                'src/test/02-after-ros2rag/read2write1/ROS2RAG.jadd'
+        delete 'src/test/02-after-ragconnect/read2write1/Grammar.relast',
+                'src/test/02-after-ragconnect/read2write1/MqttHandler.java',
+                'src/test/02-after-ragconnect/read2write1/RagConnect.jadd'
     }
 
     classpath = sourceSets.main.runtimeClasspath
-    main = 'org.jastadd.ros2rag.compiler.Compiler'
-    args '--outputDir=src/test/02-after-ros2rag/read2write1',
+    main = 'org.jastadd.ragconnect.compiler.Compiler'
+    args '--outputDir=src/test/02-after-ragconnect/read2write1',
             '--inputGrammar=src/test/01-input/read2write1/Test.relast',
-            '--inputRos2Rag=src/test/01-input/read2write1/Test.ros2rag',
+            '--inputRagConnect=src/test/01-input/read2write1/Test.ragconnect',
             '--rootNode=A', '--verbose',
             '--logReads', '--logWrites'
 }
@@ -198,17 +207,17 @@ task preprocessRead2Write1Test(type: JavaExec, group: 'verification') {
 task compileRead2Write1Test(type: RelastTest) {
     useJastAddNames = true
     jastAddList = 'JastAddList'
-    relastFiles 'src/test/02-after-ros2rag/read2write1/Grammar.relast'
+    relastFiles 'src/test/02-after-ragconnect/read2write1/Grammar.relast'
     grammarName = 'src/test/03-after-relast/read2write1/read2write1'
     packageName = 'read2write1.ast'
     moreInputFiles 'src/test/01-input/read2write1/Test.jadd',
-            'src/test/02-after-ros2rag/read2write1/MqttHandler.jadd',
-            'src/test/02-after-ros2rag/read2write1/ROS2RAG.jadd'
+            'src/test/02-after-ragconnect/read2write1/MqttHandler.jadd',
+            'src/test/02-after-ragconnect/read2write1/RagConnect.jadd'
 }
 
 testClasses.dependsOn compileRead2Write1Test
 compileRead2Write1Test.dependsOn preprocessRead2Write1Test
 
 clean {
-    delete 'src/test/02-after-ros2rag/*/', 'src/test/03-after-relast/*/', 'src/test/java-gen/*/'
+    delete 'src/test/02-after-ragconnect/*/', 'src/test/03-after-relast/*/', 'src/test/java-gen/*/'
 }
diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyRead/README.md b/ragconnect.tests/src/test/01-input/defaultOnlyRead/README.md
similarity index 100%
rename from ros2rag.tests/src/test/01-input/defaultOnlyRead/README.md
rename to ragconnect.tests/src/test/01-input/defaultOnlyRead/README.md
diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyRead/Test.ros2rag b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.ragconnect
similarity index 100%
rename from ros2rag.tests/src/test/01-input/defaultOnlyRead/Test.ros2rag
rename to ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.ragconnect
diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyRead/Test.relast b/ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast
similarity index 100%
rename from ros2rag.tests/src/test/01-input/defaultOnlyRead/Test.relast
rename to ragconnect.tests/src/test/01-input/defaultOnlyRead/Test.relast
diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyWrite/README.md b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/README.md
similarity index 100%
rename from ros2rag.tests/src/test/01-input/defaultOnlyWrite/README.md
rename to ragconnect.tests/src/test/01-input/defaultOnlyWrite/README.md
diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyWrite/Test.jadd b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd
similarity index 100%
rename from ros2rag.tests/src/test/01-input/defaultOnlyWrite/Test.jadd
rename to ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.jadd
diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyWrite/Test.ros2rag b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.ragconnect
similarity index 100%
rename from ros2rag.tests/src/test/01-input/defaultOnlyWrite/Test.ros2rag
rename to ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.ragconnect
diff --git a/ros2rag.tests/src/test/01-input/defaultOnlyWrite/Test.relast b/ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast
similarity index 100%
rename from ros2rag.tests/src/test/01-input/defaultOnlyWrite/Test.relast
rename to ragconnect.tests/src/test/01-input/defaultOnlyWrite/Test.relast
diff --git a/ros2rag.tests/src/test/01-input/errors/Errors.expected b/ragconnect.tests/src/test/01-input/errors/Errors.expected
similarity index 100%
rename from ros2rag.tests/src/test/01-input/errors/Errors.expected
rename to ragconnect.tests/src/test/01-input/errors/Errors.expected
diff --git a/ros2rag.tests/src/test/01-input/errors/Errors.ros2rag b/ragconnect.tests/src/test/01-input/errors/Errors.ragconnect
similarity index 100%
rename from ros2rag.tests/src/test/01-input/errors/Errors.ros2rag
rename to ragconnect.tests/src/test/01-input/errors/Errors.ragconnect
diff --git a/ros2rag.tests/src/test/01-input/errors/Errors.relast b/ragconnect.tests/src/test/01-input/errors/Errors.relast
similarity index 100%
rename from ros2rag.tests/src/test/01-input/errors/Errors.relast
rename to ragconnect.tests/src/test/01-input/errors/Errors.relast
diff --git a/ros2rag.tests/src/test/01-input/errors/README.md b/ragconnect.tests/src/test/01-input/errors/README.md
similarity index 100%
rename from ros2rag.tests/src/test/01-input/errors/README.md
rename to ragconnect.tests/src/test/01-input/errors/README.md
diff --git a/ros2rag.tests/src/test/01-input/example/README.md b/ragconnect.tests/src/test/01-input/example/README.md
similarity index 100%
rename from ros2rag.tests/src/test/01-input/example/README.md
rename to ragconnect.tests/src/test/01-input/example/README.md
diff --git a/ros2rag.tests/src/test/01-input/example/Test.jadd b/ragconnect.tests/src/test/01-input/example/Test.jadd
similarity index 100%
rename from ros2rag.tests/src/test/01-input/example/Test.jadd
rename to ragconnect.tests/src/test/01-input/example/Test.jadd
diff --git a/ros2rag.tests/src/test/01-input/example/Test.ros2rag b/ragconnect.tests/src/test/01-input/example/Test.ragconnect
similarity index 100%
rename from ros2rag.tests/src/test/01-input/example/Test.ros2rag
rename to ragconnect.tests/src/test/01-input/example/Test.ragconnect
diff --git a/ros2rag.tests/src/test/01-input/example/Test.relast b/ragconnect.tests/src/test/01-input/example/Test.relast
similarity index 100%
rename from ros2rag.tests/src/test/01-input/example/Test.relast
rename to ragconnect.tests/src/test/01-input/example/Test.relast
diff --git a/ros2rag.tests/src/test/01-input/read1write2/README.md b/ragconnect.tests/src/test/01-input/read1write2/README.md
similarity index 100%
rename from ros2rag.tests/src/test/01-input/read1write2/README.md
rename to ragconnect.tests/src/test/01-input/read1write2/README.md
diff --git a/ros2rag.tests/src/test/01-input/read1write2/Test.jadd b/ragconnect.tests/src/test/01-input/read1write2/Test.jadd
similarity index 100%
rename from ros2rag.tests/src/test/01-input/read1write2/Test.jadd
rename to ragconnect.tests/src/test/01-input/read1write2/Test.jadd
diff --git a/ros2rag.tests/src/test/01-input/read1write2/Test.ros2rag b/ragconnect.tests/src/test/01-input/read1write2/Test.ragconnect
similarity index 100%
rename from ros2rag.tests/src/test/01-input/read1write2/Test.ros2rag
rename to ragconnect.tests/src/test/01-input/read1write2/Test.ragconnect
diff --git a/ros2rag.tests/src/test/01-input/read1write2/Test.relast b/ragconnect.tests/src/test/01-input/read1write2/Test.relast
similarity index 100%
rename from ros2rag.tests/src/test/01-input/read1write2/Test.relast
rename to ragconnect.tests/src/test/01-input/read1write2/Test.relast
diff --git a/ros2rag.tests/src/test/01-input/read2write1/Test.jadd b/ragconnect.tests/src/test/01-input/read2write1/Test.jadd
similarity index 100%
rename from ros2rag.tests/src/test/01-input/read2write1/Test.jadd
rename to ragconnect.tests/src/test/01-input/read2write1/Test.jadd
diff --git a/ros2rag.tests/src/test/01-input/read2write1/Test.ros2rag b/ragconnect.tests/src/test/01-input/read2write1/Test.ragconnect
similarity index 100%
rename from ros2rag.tests/src/test/01-input/read2write1/Test.ros2rag
rename to ragconnect.tests/src/test/01-input/read2write1/Test.ragconnect
diff --git a/ros2rag.tests/src/test/01-input/read2write1/Test.relast b/ragconnect.tests/src/test/01-input/read2write1/Test.relast
similarity index 100%
rename from ros2rag.tests/src/test/01-input/read2write1/Test.relast
rename to ragconnect.tests/src/test/01-input/read2write1/Test.relast
diff --git a/ros2rag.tests/src/test/02-after-ros2rag/.gitignore b/ragconnect.tests/src/test/03-after-relast/.gitignore
similarity index 100%
rename from ros2rag.tests/src/test/02-after-ros2rag/.gitignore
rename to ragconnect.tests/src/test/03-after-relast/.gitignore
diff --git a/ros2rag.tests/src/test/03-after-relast/.gitignore b/ragconnect.tests/src/test/java-gen/.gitignore
similarity index 100%
rename from ros2rag.tests/src/test/03-after-relast/.gitignore
rename to ragconnect.tests/src/test/java-gen/.gitignore
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/AbstractMqttTest.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/AbstractMqttTest.java
similarity index 100%
rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/AbstractMqttTest.java
rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/AbstractMqttTest.java
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java
similarity index 100%
rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java
rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java
similarity index 100%
rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java
rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Errors.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Errors.java
similarity index 98%
rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Errors.java
rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Errors.java
index a0fd5e7682f1accef3333eaf72261a6593e1c4d6..be45a8080cc251191c62fcbc3b1793129a45dee3 100644
--- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Errors.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Errors.java
@@ -2,7 +2,7 @@ package org.jastadd.ros2rag.tests;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.jastadd.ros2rag.compiler.Compiler;
+import org.jastadd.ragconnect.compiler.Compiler;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java
similarity index 100%
rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java
rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java
similarity index 100%
rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java
rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java
similarity index 100%
rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java
rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java b/ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java
similarity index 100%
rename from ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java
rename to ragconnect.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java
diff --git a/ragconnect.tests/src/test/proto/config.proto b/ragconnect.tests/src/test/proto/config.proto
new file mode 100644
index 0000000000000000000000000000000000000000..38cb5d0a25b02c96dcbdf30f685212ea972feee6
--- /dev/null
+++ b/ragconnect.tests/src/test/proto/config.proto
@@ -0,0 +1,7 @@
+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
new file mode 100644
index 0000000000000000000000000000000000000000..6630631f16e00493be3f50307c9092e56184e9c6
--- /dev/null
+++ b/ragconnect.tests/src/test/proto/robot_state.proto
@@ -0,0 +1,37 @@
+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
new file mode 100644
index 0000000000000000000000000000000000000000..4a7f375e1ae37ba386f45e1149dc38990d0c7a0e
--- /dev/null
+++ b/ragconnect.tests/src/test/proto/trajectory.proto
@@ -0,0 +1,33 @@
+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/ros2rag.base/src/main/jastadd/parser/Preamble.parser b/ros2rag.base/src/main/jastadd/parser/Preamble.parser
deleted file mode 100644
index 43fa51e769eed054371cecae2cde354b44e115a3..0000000000000000000000000000000000000000
--- a/ros2rag.base/src/main/jastadd/parser/Preamble.parser
+++ /dev/null
@@ -1,7 +0,0 @@
-%header {:
-package org.jastadd.ros2rag.parser;
-import org.jastadd.ros2rag.ast.*;
-:};
-
-%goal goal;
-%goal ros2rag;
diff --git a/ros2rag.base/src/main/jastadd/scanner/Header.flex b/ros2rag.base/src/main/jastadd/scanner/Header.flex
deleted file mode 100644
index 974aa01fe70d15edbd4c80ac67169a18fe95f9e8..0000000000000000000000000000000000000000
--- a/ros2rag.base/src/main/jastadd/scanner/Header.flex
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.jastadd.ros2rag.scanner;
-
-import org.jastadd.ros2rag.parser.Ros2RagParser.Terminals;
-%%
-
-%public
-%final
-%class Ros2RagScanner
-%extends beaver.Scanner
-
-%type beaver.Symbol
-%function nextToken
-%yylexthrow beaver.Scanner.Exception
-%scanerror Ros2RagScanner.ScannerError
-
-%line
-%column
diff --git a/ros2rag.common/build.gradle b/ros2rag.common/build.gradle
index 6d0657ba2384835d8ffd8cd8f283535753f96822..28d38267854756aed20a50250814e51ff090afa9 100644
--- a/ros2rag.common/build.gradle
+++ b/ros2rag.common/build.gradle
@@ -28,8 +28,6 @@ test {
 }
 
 protobuf {
-    // create strange directories, so use default here
-//    generatedFilesBaseDir = "$projectDir/src/gen/java"
     protoc {
         // The artifact spec for the Protobuf Compiler
         artifact = 'com.google.protobuf:protoc:3.0.0'
diff --git a/ros2rag.goal/build.gradle b/ros2rag.goal/build.gradle
index c124190b772948fa6bdcff959c4fdc68769d793a..d325acd2ebfef7b7ed1655b19e5f05db9b910395 100644
--- a/ros2rag.goal/build.gradle
+++ b/ros2rag.goal/build.gradle
@@ -21,9 +21,9 @@ configurations {
 sourceSets.main.java.srcDir "src/gen/java"
 
 dependencies {
-    implementation project (':ros2rag.base')
+    implementation project (':ragconnect.base')
     implementation project (':ros2rag.common')
-    baseRuntimeClasspath project (':ros2rag.base')
+    baseRuntimeClasspath project (':ragconnect.base')
     api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15'
 
     jastadd2 "org.jastadd:jastadd:2.3.4"
@@ -32,19 +32,19 @@ dependencies {
 // Input files for relast
 def relastFiles = ["src/gen/jastadd/Grammar.relast"]
 
-// phases: Ros2Rag -> RelAst -> JastAdd
-// phase: Ros2Rag
-task ros2rag(type: JavaExec) {
+// phases: ragConnect -> RelAst -> JastAdd
+// phase: ragConnect
+task ragConnect(type: JavaExec) {
     classpath = configurations.baseRuntimeClasspath
 
     group = 'Build'
-    main = 'org.jastadd.ros2rag.compiler.Compiler'
+    main = 'org.jastadd.ragconnect.compiler.Compiler'
 
     args([
             '--verbose',
             '--outputDir=src/gen/jastadd',
             '--inputGrammar=src/main/jastadd/GoalModel.relast',
-            '--inputRos2Rag=src/main/jastadd/GoalModel.ros2rag',
+            '--inputRagConnect=src/main/jastadd/GoalModel.connect',
             '--rootNode=GoalModel'
     ])
 }
@@ -119,4 +119,4 @@ jastadd {
 
 // Workflow configuration for phases
 generateAst.dependsOn relastToJastAdd
-relastToJastAdd.dependsOn ros2rag
+relastToJastAdd.dependsOn ragConnect
diff --git a/ros2rag.goal/src/main/jastadd/GoalModel.ros2rag b/ros2rag.goal/src/main/jastadd/GoalModel.connect
similarity index 100%
rename from ros2rag.goal/src/main/jastadd/GoalModel.ros2rag
rename to ros2rag.goal/src/main/jastadd/GoalModel.connect
diff --git a/ros2rag.receiverstub/build.gradle b/ros2rag.receiverstub/build.gradle
index db37ca24aa4b861c2153967a3092f38f685a5dfa..73d331a982f1c3229058eb7cc71b1b893a38970c 100644
--- a/ros2rag.receiverstub/build.gradle
+++ b/ros2rag.receiverstub/build.gradle
@@ -1,3 +1,4 @@
+apply plugin: 'jastadd'
 apply plugin: 'application'
 
 mainClassName = 'de.tudresden.inf.st.ros2rag.receiverstub.ReceiverMain'
@@ -8,11 +9,76 @@ repositories {
 
 buildscript {
     repositories.jcenter()
+    dependencies {
+        classpath 'org.jastadd:jastaddgradle:1.13.3'
+    }
 }
 
 sourceSets.main.java.srcDir "src/gen/java"
 
+configurations {
+    baseRuntimeClasspath
+}
+
 dependencies {
-    implementation project(':ros2rag.starter')
+    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"
+}
+
+task ragConnect(type: JavaExec) {
+    classpath = configurations.baseRuntimeClasspath
+
+    group = 'Build'
+    main = 'org.jastadd.ragconnect.compiler.Compiler'
+
+    args([
+            '--verbose',
+            '--outputDir=src/gen/jastadd',
+            '--inputGrammar=src/main/jastadd/Receiver.ast',
+            '--inputRagConnect=src/main/jastadd/Receiver.connect',
+            '--rootNode=Receiver'
+    ])
+}
+
+// phase: JastAdd
+jastadd {
+    configureModuleBuild()
+    modules {
+        //noinspection GroovyAssignabilityCheck
+        module("receiver") {
+
+            java {
+                basedir "src/"
+                include "main/**/*.java"
+                include "gen/**/*.java"
+            }
+
+            jastadd {
+                basedir "src/"
+                include "main/jastadd/Receiver.ast"
+                include "gen/jastadd/**/*.jadd"
+            }
+        }
+    }
+    cleanGen.doFirst {
+        delete "src/gen/java/de"
+        delete "src/gen-res/BuildInfo.properties"
+    }
+    preprocessParser.doFirst {
+        args += ["--no-beaver-symbol"]
+    }
+    module = "receiver"
+    astPackage = 'de.tudresden.inf.st.ros2rag.receiverstub.ast'
+    genDir = 'src/gen/java'
+    buildInfoDir = 'src/gen-res'
+    // jastaddOptions = ["--lineColumnNumbers", "--visitCheck=true", "--rewrite=cnta", "--cache=all"]
+    // default options are: '--rewrite=cnta', '--safeLazy', '--visitCheck=false', '--cacheCycle=false'
+    extraJastAddOptions = ["--lineColumnNumbers", '--List=JastAddList']
 }
+
+// Workflow configuration for phases
+generateAst.dependsOn ragConnect
diff --git a/ros2rag.receiverstub/src/main/jastadd/Receiver.ast b/ros2rag.receiverstub/src/main/jastadd/Receiver.ast
new file mode 100644
index 0000000000000000000000000000000000000000..6990d9fd4828b80622d0b4e0767eac2a79481e18
--- /dev/null
+++ b/ros2rag.receiverstub/src/main/jastadd/Receiver.ast
@@ -0,0 +1 @@
+Receiver;
diff --git a/ros2rag.receiverstub/src/main/jastadd/Receiver.connect b/ros2rag.receiverstub/src/main/jastadd/Receiver.connect
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/ros2rag.receiverstub/src/main/java/de/tudresden/inf/st/ros2rag/receiverstub/ReceiverMain.java b/ros2rag.receiverstub/src/main/java/de/tudresden/inf/st/ros2rag/receiverstub/ReceiverMain.java
index 0ea8aa94ea831952b846cb99bd8451d64ebca12c..c56175a3c4401006c807343ce111236746805ebf 100644
--- a/ros2rag.receiverstub/src/main/java/de/tudresden/inf/st/ros2rag/receiverstub/ReceiverMain.java
+++ b/ros2rag.receiverstub/src/main/java/de/tudresden/inf/st/ros2rag/receiverstub/ReceiverMain.java
@@ -4,7 +4,7 @@ import com.google.protobuf.InvalidProtocolBufferException;
 import config.Config.RobotConfig;
 import de.tudresden.inf.st.ros2rag.common.DataConfiguration.ActualConfiguration;
 import de.tudresden.inf.st.ros2rag.common.Util;
-import de.tudresden.inf.st.ros2rag.starter.ast.MqttHandler;
+import de.tudresden.inf.st.ros2rag.receiverstub.ast.MqttHandler;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
diff --git a/ros2rag.tests/.gitignore b/ros2rag.safety/.gitignore
similarity index 100%
rename from ros2rag.tests/.gitignore
rename to ros2rag.safety/.gitignore
diff --git a/ros2rag.starter/build.gradle b/ros2rag.safety/build.gradle
similarity index 90%
rename from ros2rag.starter/build.gradle
rename to ros2rag.safety/build.gradle
index 88f304aa3177f09de185f0bafe0e507e80a2d919..f6578202df8290088369a7653a8bbb7b948443c0 100644
--- a/ros2rag.starter/build.gradle
+++ b/ros2rag.safety/build.gradle
@@ -21,9 +21,9 @@ configurations {
 sourceSets.main.java.srcDir "src/gen/java"
 
 dependencies {
-    implementation project (':ros2rag.base')
+    implementation project (':ragconnect.base')
     implementation project (':ros2rag.common')
-    baseRuntimeClasspath project (':ros2rag.base')
+    baseRuntimeClasspath project (':ragconnect.base')
     api group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15'
 
     jastadd2 "org.jastadd:jastadd:2.3.4"
@@ -38,13 +38,13 @@ task ros2rag(type: JavaExec) {
     classpath = configurations.baseRuntimeClasspath
 
     group = 'Build'
-    main = 'org.jastadd.ros2rag.compiler.Compiler'
+    main = 'org.jastadd.ragconnect.compiler.Compiler'
 
     args([
             '--verbose',
             '--outputDir=src/gen/jastadd',
-            '--inputGrammar=src/main/jastadd/RobotModel.relast',
-            '--inputRos2Rag=src/main/jastadd/Definitions.ros2rag',
+            '--inputGrammar=src/main/jastadd/SafetyModel.relast',
+            '--inputRagConnect=src/main/jastadd/SafetyModel.connect',
             '--rootNode=Model'
     ])
 }
diff --git a/ros2rag.starter/src/main/jastadd/Computation.jrag b/ros2rag.safety/src/main/jastadd/Computation.jrag
similarity index 100%
rename from ros2rag.starter/src/main/jastadd/Computation.jrag
rename to ros2rag.safety/src/main/jastadd/Computation.jrag
diff --git a/ros2rag.starter/src/main/jastadd/Navigation.jrag b/ros2rag.safety/src/main/jastadd/Navigation.jrag
similarity index 100%
rename from ros2rag.starter/src/main/jastadd/Navigation.jrag
rename to ros2rag.safety/src/main/jastadd/Navigation.jrag
diff --git a/ros2rag.starter/src/main/jastadd/Definitions.ros2rag b/ros2rag.safety/src/main/jastadd/SafetyModel.connect
similarity index 100%
rename from ros2rag.starter/src/main/jastadd/Definitions.ros2rag
rename to ros2rag.safety/src/main/jastadd/SafetyModel.connect
diff --git a/ros2rag.starter/src/main/jastadd/RobotModel.jadd b/ros2rag.safety/src/main/jastadd/SafetyModel.jadd
similarity index 100%
rename from ros2rag.starter/src/main/jastadd/RobotModel.jadd
rename to ros2rag.safety/src/main/jastadd/SafetyModel.jadd
diff --git a/ros2rag.starter/src/main/jastadd/RobotModel.relast b/ros2rag.safety/src/main/jastadd/SafetyModel.relast
similarity index 100%
rename from ros2rag.starter/src/main/jastadd/RobotModel.relast
rename to ros2rag.safety/src/main/jastadd/SafetyModel.relast
diff --git a/ros2rag.starter/src/main/java/de/tudresden/inf/st/ros2rag/starter/StarterMain.java b/ros2rag.safety/src/main/java/de/tudresden/inf/st/ros2rag/starter/StarterMain.java
similarity index 100%
rename from ros2rag.starter/src/main/java/de/tudresden/inf/st/ros2rag/starter/StarterMain.java
rename to ros2rag.safety/src/main/java/de/tudresden/inf/st/ros2rag/starter/StarterMain.java
diff --git a/ros2rag.starter/src/main/resources/log4j2.xml b/ros2rag.safety/src/main/resources/log4j2.xml
similarity index 100%
rename from ros2rag.starter/src/main/resources/log4j2.xml
rename to ros2rag.safety/src/main/resources/log4j2.xml
diff --git a/ros2rag.senderstub/build.gradle b/ros2rag.senderstub/build.gradle
index 063f22ec23add73ccaaf1c50fbab95b2510c425c..4996963f3cd48d81554a3ee91a860d2b88f18751 100644
--- a/ros2rag.senderstub/build.gradle
+++ b/ros2rag.senderstub/build.gradle
@@ -1,3 +1,4 @@
+apply plugin: 'jastadd'
 apply plugin: 'application'
 
 mainClassName = 'de.tudresden.inf.st.ros2rag.senderstub.SenderMain'
@@ -8,11 +9,76 @@ repositories {
 
 buildscript {
     repositories.jcenter()
+    dependencies {
+        classpath 'org.jastadd:jastaddgradle:1.13.3'
+    }
 }
 
 sourceSets.main.java.srcDir "src/gen/java"
 
+configurations {
+    baseRuntimeClasspath
+}
+
 dependencies {
-    implementation project(':ros2rag.starter')
+    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"
+}
+
+task ragConnect(type: JavaExec) {
+    classpath = configurations.baseRuntimeClasspath
+
+    group = 'Build'
+    main = 'org.jastadd.ragconnect.compiler.Compiler'
+
+    args([
+            '--verbose',
+            '--outputDir=src/gen/jastadd',
+            '--inputGrammar=src/main/jastadd/Sender.ast',
+            '--inputRagConnect=src/main/jastadd/Sender.connect',
+            '--rootNode=Sender'
+    ])
+}
+
+// phase: JastAdd
+jastadd {
+    configureModuleBuild()
+    modules {
+        //noinspection GroovyAssignabilityCheck
+        module("receiver") {
+
+            java {
+                basedir "src/"
+                include "main/**/*.java"
+                include "gen/**/*.java"
+            }
+
+            jastadd {
+                basedir "src/"
+                include "main/jastadd/Sender.ast"
+                include "gen/jastadd/**/*.jadd"
+            }
+        }
+    }
+    cleanGen.doFirst {
+        delete "src/gen/java/de"
+        delete "src/gen-res/BuildInfo.properties"
+    }
+    preprocessParser.doFirst {
+        args += ["--no-beaver-symbol"]
+    }
+    module = "receiver"
+    astPackage = 'de.tudresden.inf.st.ros2rag.senderstub.ast'
+    genDir = 'src/gen/java'
+    buildInfoDir = 'src/gen-res'
+    // jastaddOptions = ["--lineColumnNumbers", "--visitCheck=true", "--rewrite=cnta", "--cache=all"]
+    // default options are: '--rewrite=cnta', '--safeLazy', '--visitCheck=false', '--cacheCycle=false'
+    extraJastAddOptions = ["--lineColumnNumbers", '--List=JastAddList']
 }
+
+// Workflow configuration for phases
+generateAst.dependsOn ragConnect
diff --git a/ros2rag.senderstub/src/main/jastadd/Sender.ast b/ros2rag.senderstub/src/main/jastadd/Sender.ast
new file mode 100644
index 0000000000000000000000000000000000000000..1510af62c83e12b04bafcf810209367a505b3d70
--- /dev/null
+++ b/ros2rag.senderstub/src/main/jastadd/Sender.ast
@@ -0,0 +1 @@
+Sender;
diff --git a/ros2rag.senderstub/src/main/jastadd/Sender.connect b/ros2rag.senderstub/src/main/jastadd/Sender.connect
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/ros2rag.senderstub/src/main/java/de/tudresden/inf/st/ros2rag/senderstub/SenderMain.java b/ros2rag.senderstub/src/main/java/de/tudresden/inf/st/ros2rag/senderstub/SenderMain.java
index e767cdd92c57d713597ddf69c414a0308f24f1e4..63e29964de2cb6ddaa8e44948a110af2474148b7 100644
--- a/ros2rag.senderstub/src/main/java/de/tudresden/inf/st/ros2rag/senderstub/SenderMain.java
+++ b/ros2rag.senderstub/src/main/java/de/tudresden/inf/st/ros2rag/senderstub/SenderMain.java
@@ -1,6 +1,6 @@
 package de.tudresden.inf.st.ros2rag.senderstub;
 
-import de.tudresden.inf.st.ros2rag.starter.ast.MqttHandler;
+import de.tudresden.inf.st.ros2rag.senderstub.ast.MqttHandler;
 import robot.RobotStateOuterClass.RobotState;
 
 import java.nio.file.Files;
diff --git a/ros2rag.tests/src/test/java-gen/.gitignore b/ros2rag.tests/src/test/java-gen/.gitignore
deleted file mode 100644
index d6b7ef32c8478a48c3994dcadc86837f4371184d..0000000000000000000000000000000000000000
--- a/ros2rag.tests/src/test/java-gen/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore
diff --git a/ros2rag.tests/src/test/proto b/ros2rag.tests/src/test/proto
deleted file mode 120000
index bb7d2bae29902b994e92987325a878a0fe318c69..0000000000000000000000000000000000000000
--- a/ros2rag.tests/src/test/proto
+++ /dev/null
@@ -1 +0,0 @@
-../../../ros2rag.common/proto/
\ No newline at end of file
diff --git a/safety.sh b/safety.sh
new file mode 100755
index 0000000000000000000000000000000000000000..369bcfd4bd24301758961d656b6e4661151b0efd
--- /dev/null
+++ b/safety.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+./gradlew :ros2rag.safety:installDist && \
+	./ros2rag.safety/build/install/ros2rag.safety/bin/ros2rag.safety $@
diff --git a/settings.gradle b/settings.gradle
index 9235870b25a07e39bdaed474d79643bc80928795..cc56321647f48ec49cd042b9a2ae609a13cf5398 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,9 +1,9 @@
 rootProject.name = 'ros2rag'
 
 include 'relast.preprocessor'
-include 'ros2rag.base'
-include 'ros2rag.tests'
-include 'ros2rag.starter'
+include 'ragconnect.base'
+include 'ragconnect.tests'
+include 'ros2rag.safety'
 include 'ros2rag.senderstub'
 include 'ros2rag.receiverstub'
 include 'ros2rag.goal'
diff --git a/starter.sh b/starter.sh
deleted file mode 100755
index e3bb9b9e8e3bb6684b32edb0b5eec17c00529048..0000000000000000000000000000000000000000
--- a/starter.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env bash
-./gradlew :ros2rag.starter:installDist && \
-	./ros2rag.starter/build/install/ros2rag.starter/bin/ros2rag.starter $@