From 70506fc333a8e2b205e4ebd643cf484c23523876 Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Thu, 2 Dec 2021 14:26:50 +0100
Subject: [PATCH] working on concise grammar

- reorder attributes in Generation.jadd to match mustache files and types
- fixed yaml generation (tested locally only)
---
 .../src/main/jastadd/Analysis.jrag            |  10 -
 .../src/main/jastadd/Configuration.jadd       |   6 -
 .../src/main/jastadd/Navigation.jrag          |  36 --
 .../main/jastadd/intermediate/Generation.jadd | 428 ++++++++++++------
 .../main/jastadd/intermediate/Mappings.jrag   |   6 +-
 .../MustacheNodesToYAML.jrag                  | 390 ++++++++--------
 .../src/main/resources/ListAspect.mustache    |   8 +-
 .../src/main/resources/handler.mustache       |  14 +-
 .../resources/mappingApplication.mustache     |   4 +-
 .../main/resources/mappingDefinition.mustache |   4 +-
 .../src/main/resources/ragconnect.mustache    |  48 +-
 .../main/resources/receiveDefinition.mustache |  16 +-
 .../main/resources/sendDefinition.mustache    |  20 +-
 .../main/resources/tokenComponent.mustache    |   4 +-
 14 files changed, 546 insertions(+), 448 deletions(-)

diff --git a/ragconnect.base/src/main/jastadd/Analysis.jrag b/ragconnect.base/src/main/jastadd/Analysis.jrag
index c968752..66e6a5a 100644
--- a/ragconnect.base/src/main/jastadd/Analysis.jrag
+++ b/ragconnect.base/src/main/jastadd/Analysis.jrag
@@ -58,9 +58,6 @@ aspect Analysis {
     }
   }
 
-  // --- shouldSendValue ---
-  syn boolean EndpointDefinition.shouldSendValue() = getSend() && getEndpointTarget().entityIsNormalAttribute();
-
   syn boolean EndpointTarget.entityIsNormalAttribute();
   eq TokenEndpointTarget.entityIsNormalAttribute() = !getToken().getNTA();
   eq TypeEndpointTarget.entityIsNormalAttribute() = !getType().getNTA();
@@ -76,11 +73,4 @@ aspect Analysis {
     to MappingDefinition.effectiveUsedAt()
     for each effectiveMappings();
 
-  // --- typeIsList ---
-  syn boolean EndpointDefinition.typeIsList() = getEndpointTarget().typeIsList();
-  syn boolean EndpointTarget.typeIsList() = false;
-  eq TypeEndpointTarget.typeIsList() {
-    return getType().isListComponent();
-  }
-
 }
diff --git a/ragconnect.base/src/main/jastadd/Configuration.jadd b/ragconnect.base/src/main/jastadd/Configuration.jadd
index 72a3e9d..9a4645b 100644
--- a/ragconnect.base/src/main/jastadd/Configuration.jadd
+++ b/ragconnect.base/src/main/jastadd/Configuration.jadd
@@ -1,9 +1,3 @@
 aspect ConfigurationShortcuts {
-  syn boolean RagConnect.loggingEnabledForReads() = getConfiguration().getLoggingEnabledForReads();
-  syn boolean RagConnect.loggingEnabledForWrites() = getConfiguration().getLoggingEnabledForWrites();
-  syn boolean RagConnect.loggingEnabledForIncremental() = getConfiguration().getLoggingEnabledForIncremental();
   syn TypeDecl RagConnect.rootNode() = getConfiguration().getRootNode();
-  syn String RagConnect.JastAddList() = getConfiguration().getJastAddList();
-  syn boolean RagConnect.incrementalOptionActive() = getConfiguration().getIncrementalOptionActive();
-  syn boolean RagConnect.experimentalJastAdd329() = getConfiguration().getExperimentalJastAdd329();
 }
diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag
index 369ba4f..7419f3d 100644
--- a/ragconnect.base/src/main/jastadd/Navigation.jrag
+++ b/ragconnect.base/src/main/jastadd/Navigation.jrag
@@ -72,14 +72,6 @@ aspect RagConnectNavigation {
 //    return containedFile().getFileName();
   }
 
-  //--- allEndpointDefinitionList ---
-  syn List<EndpointDefinition> RagConnect.allEndpointDefinitionList() {
-    List<EndpointDefinition> result = new ArrayList<>();
-    for (ConnectSpecification spec : getConnectSpecificationFileList()) {
-      spec.getEndpointDefinitionList().forEach(result::add);
-    }
-    return result;
-  }
 
   //--- allEndpointTargetList ---
   syn List<EndpointTarget> RagConnect.allEndpointTargetList() {
@@ -90,14 +82,6 @@ aspect RagConnectNavigation {
     return result;
   }
 
-  //--- allDependencyDefinitionList ---
-  syn List<DependencyDefinition> RagConnect.allDependencyDefinitionList() {
-    List<DependencyDefinition> result = new ArrayList<>();
-    for (ConnectSpecification spec : getConnectSpecificationFileList()) {
-      spec.getDependencyDefinitionList().forEach(result::add);
-    }
-    return result;
-  }
 
   //--- givenMappingDefinitionList ---
   syn List<MappingDefinition> RagConnect.givenMappingDefinitionList() {
@@ -108,26 +92,6 @@ aspect RagConnectNavigation {
     return result;
   }
 
-  // --- targetEndpointDefinition ---
-  syn EndpointDefinition DependencyDefinition.targetEndpointDefinition() {
-    // resolve definition in here, as we do not need resolveMethod in any other place (yet)
-    for (EndpointDefinition endpointDefinition : ragconnect().allEndpointDefinitionList()) {
-      if (!endpointDefinition.getSend()) {
-        continue;
-      }
-      EndpointTarget endpointTarget = endpointDefinition.getEndpointTarget();
-      if (endpointTarget.isTokenEndpointTarget() &&
-          endpointTarget.asTokenEndpointTarget().getToken().equals(this.getTarget())) {
-        return endpointDefinition;
-      }
-      if (endpointTarget.isTypeEndpointTarget() &&
-          endpointTarget.asTypeEndpointTarget().getType().equals(this.getTarget())) {
-        return endpointDefinition;
-      }
-    }
-    return null;
-  }
-
   // --- effectiveJavaTypeUse (should be in preprocessor) ---
   syn lazy JavaTypeUse TokenComponent.effectiveJavaTypeUse() = hasJavaTypeUse() ? getJavaTypeUse() : new SimpleJavaTypeUse("String");
 
diff --git a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
index 2e0c4a9..3729453 100644
--- a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
+++ b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
@@ -3,7 +3,37 @@ Design considerations
 - InnerMappingDefinition needed for iteration attribute (first, last) - not possible with list-relation
 - no complete intermediate structure, but instead single nodes where applicable/needed
 */
-aspect AttributesForMustache {
+aspect SharedMustache {
+  // === RagConnect ===
+  syn boolean RagConnect.configIncrementalOptionActive() = getConfiguration().getIncrementalOptionActive();
+
+  syn boolean RagConnect.configLoggingEnabledForIncremental() = getConfiguration().getLoggingEnabledForIncremental();
+
+  syn boolean RagConnect.configExperimentalJastAdd329() = getConfiguration().getExperimentalJastAdd329();
+
+  syn String RagConnect.rootNodeName() = getConfiguration().getRootNode().getName();
+
+  // === EndpointDefinition ===
+  syn String EndpointDefinition.lastResult() = lastDefinition().outputVarName();
+}
+
+aspect MustacheDependencyDefinition {
+  // === DependencyDefinition ===
+  syn String DependencyDefinition.dependencyMethodName() = "add" + capitalize(getID());
+
+  syn String DependencyDefinition.internalRelationPrefix() = "_internal_" + getID();
+
+  syn String DependencyDefinition.sourceParentTypeName() = getSource().containingTypeDecl().getName();
+
+  syn String DependencyDefinition.targetParentTypeName() = getTarget().containingTypeDecl().getName();
+}
+
+aspect MustacheHandler {
+  // === RagConnect ===
+  syn String RagConnect.closeMethodName() = "ragconnectCloseConnections";
+
+  syn boolean RagConnect.hasRootTypeComponents() = !rootTypeComponents().isEmpty();
+
   syn List<TypeComponent> RagConnect.rootTypeComponents() {
     List<TypeComponent> result = new ArrayList<>();
     for (Component child : rootNode().getComponentList()) {
@@ -13,14 +43,22 @@ aspect AttributesForMustache {
     }
     return result;
   }
-  syn boolean RagConnect.hasRootTypeComponents() = !rootTypeComponents().isEmpty();
 
-  syn String RagConnect.closeMethodName() = "ragconnectCloseConnections";
+  // === Handler ===
+  syn String Handler.attributeName() = "_" + getUniqueName() + "Handler";
+
+  syn String Handler.constructionSnippet() = "new " + getClassName() + "(\"Handler for " + ragconnect().rootNodeName() + ".\" + this.hashCode())";
 
-  syn String Handler.AttributeName() = "_" + getUniqueName() + "Handler";
-  syn String Handler.FieldName() = "_" + getUniqueName() + "Handler";
-  syn String Handler.SetupWaitUntilReadyMethodName() = "ragconnectSetup" + capitalize(getUniqueName()) + "WaitUntilReady";
-  syn String Handler.ConstructionSnippet() = "new " + getClassName() + "(\"Handler for " + ragconnect().rootNodeName() + ".\" + this.hashCode())";
+  syn String Handler.fieldName() = "_" + getUniqueName() + "Handler";
+
+  syn String Handler.setupWaitUntilReadyMethodName() = "ragconnectSetup" + capitalize(getUniqueName()) + "WaitUntilReady";
+}
+
+aspect MustacheHandleUri { /* empty */ }
+
+aspect MustacheListAspect {
+  // === RagConnect ===
+  syn String RagConnect.configJastAddList() = getConfiguration().getJastAddList();
 
   syn boolean RagConnect.hasTreeListEndpoints() {
     for (EndpointDefinition endpointDef : allEndpointDefinitionList()) {
@@ -30,6 +68,7 @@ aspect AttributesForMustache {
     }
     return false;
   }
+
   syn Set<TypeDecl> RagConnect.typesForReceivingListEndpoints() {
     Set<TypeDecl> result = new HashSet<>();
     for (EndpointDefinition endpointDef : allEndpointDefinitionList()) {
@@ -39,53 +78,10 @@ aspect AttributesForMustache {
     }
     return result;
   }
+}
 
-  syn String EndpointDefinition.preemptiveExpectedValue() = toMustache().preemptiveExpectedValue();
-  syn String EndpointDefinition.preemptiveReturn() = toMustache().preemptiveReturn();
-  syn String EndpointDefinition.firstInputVarName() = toMustache().firstInputVarName();
-  syn String EndpointDefinition.updateMethodName() = toMustache().updateMethodName();
-  syn String EndpointDefinition.writeMethodName() = toMustache().writeMethodName();
-
-  syn String EndpointDefinition.parentTypeName() = getEndpointTarget().parentTypeName();
-  syn String EndpointDefinition.entityName() = getEndpointTarget().entityName();
-  syn String EndpointDefinition.getterMethodName() = getEndpointTarget().getterMethodName();
-
-  syn String EndpointDefinition.uniqueSuffix() = getSend() ? "Send" : "Receive";
-
-  syn String EndpointDefinition.connectParameterName() = "uriString";
-  syn String EndpointDefinition.connectMethodName() = "connect" + entityName();
-  syn String EndpointDefinition.internalConnectMethodName() = "_internal_" + connectMethodName();
-
-  syn String EndpointDefinition.disconnectMethodName() {
-    // if both (send and receive) are defined for an endpoint, ensure methods with different names
-    String extra;
-    if (getEndpointTarget().isTokenEndpointTarget()) {
-      extra = lookupTokenEndpointDefinitions(token()).size() > 1 ? uniqueSuffix() : "";
-    } else if (getEndpointTarget().isTypeEndpointTarget()) {
-      extra = lookupTypeEndpointDefinitions(type()).size() > 1 ? uniqueSuffix() : "";
-    } else {
-      extra = "";
-    }
-    return "disconnect" + extra + entityName();
-  }
-  // token and type are potentially dangerous because asXEndpointTarget can return null
-  syn TokenComponent EndpointDefinition.token() = getEndpointTarget().asTokenEndpointTarget().getToken();
-  syn TypeComponent EndpointDefinition.type() = getEndpointTarget().asTypeEndpointTarget().getType();
-  syn String EndpointDefinition.tokenName() = token().getName();
-  syn String MEndpointDefinition.tokenName() = getEndpointDefinition().tokenName();
-  syn String EndpointDefinition.typeName() = type().getName();
-  syn String MEndpointDefinition.typeName() = getEndpointDefinition().typeName();
-  syn String EndpointDefinition.typeDeclName() = type().getTypeDecl().getName();
-
-  syn MInnerMappingDefinition EndpointDefinition.lastDefinition() = toMustache().lastDefinition();
-  syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1);
-  syn String EndpointDefinition.lastDefinitionToType() = lastDefinition().toType();
-  syn String EndpointDefinition.lastResult() = lastDefinition().outputVarName();
-
-  inh boolean MInnerMappingDefinition.isLast();
-  eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() = i == getNumInnerMappingDefinition() - 1;
-  eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() = i == 0 ? firstInputVarName() : getInnerMappingDefinition(i - 1).outputVarName();
-
+aspect MustacheMappingApplicationAndDefinition {
+  // === EndpointDefinition ===
   syn String EndpointDefinition.condition() {
     // TODO [OLD] probably, this has to be structured in a better way
     if (lastDefinition().getMappingDefinition().getToType().isArray()) {
@@ -108,46 +104,215 @@ aspect AttributesForMustache {
     return preemptiveExpectedValue() + " != null ? " + preemptiveExpectedValue() + ".equals(" + lastResult() + ") : " + lastResult() + " == null";
   }
 
-  syn String EndpointDefinition.senderName() = getEndpointTarget().senderName(); // only needed for send endpoints
-  syn String EndpointTarget.senderName();
-  eq TokenEndpointTarget.senderName() = "_sender_" + getToken().getName();
-  eq TypeEndpointTarget.senderName() = "_sender_" + getType().getName();
-  syn String EndpointDefinition.lastValue() = senderName() + ".lastValue"; // only needed for send endpoints
-  syn String MEndpointDefinition.lastValue() = getEndpointDefinition().lastValue();
+  syn JastAddList<MInnerMappingDefinition> EndpointDefinition.innerMappingDefinitions() = toMustache().getInnerMappingDefinitionList();
+
+  syn String EndpointDefinition.lastDefinitionToType() = lastDefinition().toType();
+
+  syn String EndpointDefinition.preemptiveReturn() = toMustache().preemptiveReturn();
+
+  // === (MInner)MappingDefinition ===
+  syn String MappingDefinition.fromType() = getFromType().prettyPrint();
+
+  inh boolean MInnerMappingDefinition.isLast();
+  eq MEndpointDefinition.getInnerMappingDefinition(int i).isLast() {
+    return i == getNumInnerMappingDefinition() - 1;
+  }
+
+  inh String MInnerMappingDefinition.inputVarName();
+  eq MEndpointDefinition.getInnerMappingDefinition(int i).inputVarName() {
+    return i == 0
+        ? firstInputVarName()
+        : getInnerMappingDefinition(i - 1).outputVarName();
+  }
+
+  syn String MInnerMappingDefinition.methodName() = getMappingDefinition().methodName();
+  syn String MappingDefinition.methodName() = "_apply_" + getID();
+
+  syn String MInnerMappingDefinition.outputVarName() = "result" + methodName();  // we do not need "_" in between here, because methodName begins with one
+
+  syn String MInnerMappingDefinition.toType() = getMappingDefinition().toType();
+  syn String MappingDefinition.toType() = getToType().prettyPrint();
+
+  // === attributes needed for computing above ones ===
+  syn String EndpointDefinition.preemptiveExpectedValue() = toMustache().preemptiveExpectedValue();
+  syn String EndpointDefinition.firstInputVarName() = toMustache().firstInputVarName();
+
+  syn String MEndpointDefinition.preemptiveExpectedValue();
+  syn String MEndpointDefinition.preemptiveReturn();
+  syn String MEndpointDefinition.firstInputVarName();
+
+  eq MTokenReceiveDefinition.firstInputVarName() = "message";
+  eq MTokenReceiveDefinition.preemptiveExpectedValue() = getterMethodName() + "()";
+  eq MTokenReceiveDefinition.preemptiveReturn() = "return;";
+
+  eq MTokenSendDefinition.firstInputVarName() = getterMethodName() + "()";
+  eq MTokenSendDefinition.preemptiveExpectedValue() = lastValue();
+  eq MTokenSendDefinition.preemptiveReturn() = "return false;";
+
+  eq MTypeReceiveDefinition.firstInputVarName() = "message";
+  eq MTypeReceiveDefinition.preemptiveExpectedValue() = getterMethodName() + "()";
+  eq MTypeReceiveDefinition.preemptiveReturn() = "return;";
+
+  eq MTypeSendDefinition.firstInputVarName() = getterMethodName() + "()";
+  eq MTypeSendDefinition.preemptiveExpectedValue() = lastValue();
+  eq MTypeSendDefinition.preemptiveReturn() = "return false;";
+
+  syn String MEndpointDefinition.parentTypeName() = getEndpointDefinition().parentTypeName();
+
+  syn String MEndpointDefinition.getterMethodName() = getEndpointDefinition().getterMethodName();
+}
+
+aspect MustacheRagConnect {
+  // === RagConnect ===
+  syn List<DependencyDefinition> RagConnect.allDependencyDefinitionList() {
+    List<DependencyDefinition> result = new ArrayList<>();
+    for (ConnectSpecification spec : getConnectSpecificationFileList()) {
+      spec.getDependencyDefinitionList().forEach(result::add);
+    }
+    return result;
+  }
+
+  syn List<EndpointDefinition> RagConnect.allEndpointDefinitionList() {
+    List<EndpointDefinition> result = new ArrayList<>();
+    for (ConnectSpecification spec : getConnectSpecificationFileList()) {
+      spec.getEndpointDefinitionList().forEach(result::add);
+    }
+    return result;
+  }
+
+  // > allMappingDefinitions in Mappings.jrag
+
+  syn List<TokenComponent> RagConnect.tokenComponentsThatNeedProxy() {
+    List<TokenComponent> result = new ArrayList<>();
+    for (TokenComponent token : getProgram().allTokenComponents()) {
+      if (token.needProxyToken()) {
+        result.add(token);
+      }
+    }
+    return result;
+  }
+
+  // === MappingDefinition ===
+  syn boolean MappingDefinition.isUsed() = !effectiveUsedAt().isEmpty();
+}
+
+aspect MustacheReceiveAndSendAndHandleUri {
+  // === EndpointDefinition ===
+  syn String EndpointDefinition.connectMethodName() = "connect" + entityName();
+
+  syn String EndpointDefinition.connectParameterName() = "uriString";
+
+  syn String EndpointDefinition.disconnectMethodName() {
+    // if both (send and receive) are defined for an endpoint, ensure methods with different names
+    String extra;
+    if (getEndpointTarget().isTokenEndpointTarget()) {
+      extra = lookupTokenEndpointDefinitions(token()).size() > 1 ? uniqueSuffix() : "";
+    } else if (getEndpointTarget().isTypeEndpointTarget()) {
+      extra = lookupTypeEndpointDefinitions(type()).size() > 1 ? uniqueSuffix() : "";
+    } else {
+      extra = "";
+    }
+    return "disconnect" + extra + entityName();
+  }
+
+  syn String EndpointDefinition.entityName() = getEndpointTarget().entityName();
 
+  syn String EndpointDefinition.getterMethodName() = getEndpointTarget().getterMethodName();
+
+  syn String EndpointDefinition.parentTypeName() = getEndpointTarget().parentTypeName();
+
+  // === attributes needed for computing above ones ===
   syn String EndpointTarget.getterMethodName();
   syn String EndpointTarget.parentTypeName();
   syn String EndpointTarget.entityName();
+
   eq TokenEndpointTarget.getterMethodName() = "get" + getToken().getName();
   eq TokenEndpointTarget.parentTypeName() = getToken().containingTypeDecl().getName();
   eq TokenEndpointTarget.entityName() = getToken().getName();
+
   eq TypeEndpointTarget.getterMethodName() = "get" + getType().getName() + (typeIsList() ? "List" : "");
   eq TypeEndpointTarget.parentTypeName() = getType().containingTypeDecl().getName();
   eq TypeEndpointTarget.entityName() = getType().getName() + (typeIsList() && !containingEndpointDefinition().getIndexBasedListAccess() ? "List" : "");
 
-  // only for token + send
-  syn String EndpointDefinition.tokenResetMethodName() = getterMethodName() + "_reset";
+}
+
+aspect MustacheReceiveDefinition {
+  // === RagConnect ===
+  syn boolean RagConnect.configLoggingEnabledForReads() = getConfiguration().getLoggingEnabledForReads();
+
+  // === EndpointDefinition ===
+  syn boolean EndpointDefinition.hasTypeEndpointTarget() = getEndpointTarget().isTypeEndpointTarget();
+
+  syn String EndpointDefinition.idTokenName() = "InternalRagconnectTopicInList";
+
+  syn String EndpointDefinition.internalConnectMethodName() = "_internal_" + connectMethodName();
 
-  // only for type + receive
   syn String EndpointDefinition.resolveInListMethodName() = "_ragconnect_resolve" + entityName() + "InList";
 
-  // --- MappingDefinition ---
-  syn String MappingDefinition.toType() = getToType().prettyPrint();
-  syn String MappingDefinition.methodName() = "_apply_" + getID();
-  syn String MappingDefinition.fromType() = getFromType().prettyPrint();
-  syn boolean MappingDefinition.isUsed() = !effectiveUsedAt().isEmpty();
+  syn boolean EndpointDefinition.typeIsList() = getEndpointTarget().typeIsList();
 
-  // --- DependencyDefinition ---
-  syn String DependencyDefinition.targetParentTypeName() = getTarget().containingTypeDecl().getName();
-  syn String DependencyDefinition.dependencyMethodName() = "add" + capitalize(getID());
-  syn String DependencyDefinition.sourceParentTypeName() = getSource().containingTypeDecl().getName();
-  syn String DependencyDefinition.internalRelationPrefix() = "_internal_" + getID();
+  // === attributes needed for computing above ones ===
+  syn boolean EndpointTarget.typeIsList() = false;
+  eq TypeEndpointTarget.typeIsList() {
+    return getType().isListComponent();
+  }
+
+  syn String EndpointDefinition.uniqueSuffix() = getSend() ? "Send" : "Receive";
+}
+
+aspect MustacheSendDefinition {
+  // === RagConnect ===
+  syn boolean RagConnect.configLoggingEnabledForWrites() = getConfiguration().getLoggingEnabledForWrites();
+
+  // === EndpointDefinition ===
+  syn String EndpointDefinition.lastValue() = senderName() + ".lastValue";
+
+  syn String EndpointDefinition.senderName() = getEndpointTarget().senderName();
+
+  syn boolean EndpointDefinition.shouldSendValue() = getSend() && getEndpointTarget().entityIsNormalAttribute();
+
+  syn String EndpointDefinition.tokenResetMethodName() = getterMethodName() + "_reset";
+
+  syn String EndpointDefinition.updateMethodName() = toMustache().updateMethodName();
+
+  syn String EndpointDefinition.writeMethodName() = toMustache().writeMethodName();
+
+  // === attributes needed for computing above ones ===
+  syn String EndpointTarget.senderName();
+  eq TokenEndpointTarget.senderName() = "_sender_" + getToken().getName();
+  eq TypeEndpointTarget.senderName() = "_sender_" + getType().getName();
+
+  syn String MEndpointDefinition.updateMethodName();
+  syn String MEndpointDefinition.writeMethodName();
+
+  // MTokenReceiveDefinition
+  eq MTokenReceiveDefinition.updateMethodName() = null;
+  eq MTokenReceiveDefinition.writeMethodName() = null;
+
+  // MTokenSendDefinition
+  eq MTokenSendDefinition.updateMethodName() = "_update_" + tokenName();
+  eq MTokenSendDefinition.writeMethodName() = "_writeLastValue_" + tokenName();
+
+  // MTypeReceiveDefinition
+  eq MTypeReceiveDefinition.updateMethodName() = null;
+  eq MTypeReceiveDefinition.writeMethodName() = null;
+
+  // MTypeSendDefinition
+  eq MTypeSendDefinition.updateMethodName() = "_update_" + typeName();
+  eq MTypeSendDefinition.writeMethodName() = "_writeLastValue_" + typeName();
+
+  syn String EndpointDefinition.tokenName() = token().getName();
+  syn String MEndpointDefinition.tokenName() = getEndpointDefinition().tokenName();
+
+  syn String EndpointDefinition.typeName() = type().getName();
+  syn String MEndpointDefinition.typeName() = getEndpointDefinition().typeName();
+}
+
+aspect MustacheTokenComponent {
+  // === TokenComponent ===
+  syn String TokenComponent.internalName() = needProxyToken() ? "_internal_" + getName() : getName();
 
-  // --- TokenComponent ---
-  syn String TokenComponent.parentTypeName() = containingTypeDecl().getName();
   syn String TokenComponent.javaType() = effectiveJavaTypeUse().prettyPrint();
-  syn String TokenComponent.internalName() = needProxyToken() ? "_internal_" + getName() : externalName();
-  syn String TokenComponent.externalName() = getName();
 
   syn EndpointDefinition TokenComponent.normalTokenSendDef() {
     for (EndpointTarget target : getTokenEndpointTargetList()) {
@@ -158,6 +323,43 @@ aspect AttributesForMustache {
     return null;
   }
 
+  syn String TokenComponent.parentTypeName() = containingTypeDecl().getName();
+
+  // > see MustacheDependencyDefinition for internalRelationPrefix, targetParentTypeName
+
+  // === DependencyDefinition ===
+  syn EndpointDefinition DependencyDefinition.targetEndpointDefinition() {
+    // resolve definition in here, as we do not need resolveMethod in any other place (yet)
+    for (EndpointDefinition endpointDefinition : ragconnect().allEndpointDefinitionList()) {
+      if (!endpointDefinition.getSend()) {
+        continue;
+      }
+      EndpointTarget endpointTarget = endpointDefinition.getEndpointTarget();
+      if (endpointTarget.isTokenEndpointTarget() &&
+          endpointTarget.asTokenEndpointTarget().getToken().equals(this.getTarget())) {
+        return endpointDefinition;
+      }
+      if (endpointTarget.isTypeEndpointTarget() &&
+          endpointTarget.asTypeEndpointTarget().getType().equals(this.getTarget())) {
+        return endpointDefinition;
+      }
+    }
+    return null;
+  }
+
+  // > see MustacheSend for updateMethodName, writeMethodName
+}
+
+aspect AttributesForMustache {
+  syn String MEndpointDefinition.lastValue() = getEndpointDefinition().lastValue();
+
+  // token and type are potentially dangerous because asXEndpointTarget can return null
+  syn TokenComponent EndpointDefinition.token() = getEndpointTarget().asTokenEndpointTarget().getToken();
+  syn TypeComponent EndpointDefinition.type() = getEndpointTarget().asTypeEndpointTarget().getType();
+
+  syn MInnerMappingDefinition EndpointDefinition.lastDefinition() = toMustache().lastDefinition();
+  syn MInnerMappingDefinition MEndpointDefinition.lastDefinition() = getInnerMappingDefinition(getNumInnerMappingDefinition() - 1);
+
   syn nta MEndpointDefinition EndpointDefinition.toMustache() {
     final MEndpointDefinition result;
     if (getEndpointTarget().isTokenEndpointTarget()) {
@@ -183,72 +385,6 @@ aspect AttributesForMustache {
     }
     return result;
   }
-
-  syn List<TokenComponent> RagConnect.tokenComponentsThatNeedProxy() {
-    List<TokenComponent> result = new ArrayList<>();
-    for (TokenComponent token : getProgram().allTokenComponents()) {
-      if (token.needProxyToken()) {
-        result.add(token);
-      }
-    }
-    return result;
-  }
-
-  syn JastAddList<MInnerMappingDefinition> EndpointDefinition.innerMappingDefinitions() = toMustache().getInnerMappingDefinitionList();
-  syn boolean EndpointDefinition.hasTypeEndpointTarget() = getEndpointTarget().isTypeEndpointTarget();
-
-  // === OldStuff (copied unchanged, but should work) ===
-  // --- EndpointDefinition ---
-  syn String EndpointDefinition.idTokenName() = "InternalRagconnectTopicInList";
-
-  // --- MEndpointDefinition ---
-  syn String MEndpointDefinition.preemptiveExpectedValue();
-  syn String MEndpointDefinition.preemptiveReturn();
-  syn String MEndpointDefinition.firstInputVarName();
-  syn String MEndpointDefinition.parentTypeName() = getEndpointDefinition().parentTypeName();
-  syn String MEndpointDefinition.entityName() = getEndpointDefinition().entityName();
-  syn String MEndpointDefinition.updateMethodName();
-  syn String MEndpointDefinition.writeMethodName();
-  syn String MEndpointDefinition.getterMethodName() = getEndpointDefinition().getterMethodName();
-
-  // --- MInnerMappingDefinition ---
-  inh String MInnerMappingDefinition.inputVarName();
-  syn String MInnerMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint();
-  syn String MInnerMappingDefinition.methodName() = getMappingDefinition().methodName();
-  syn String MInnerMappingDefinition.outputVarName() = "result" + methodName();  // we do not need "_" in between here, because methodName begins with one
-
-  // --- MTokenReceiveDefinition ---
-  eq MTokenReceiveDefinition.preemptiveExpectedValue() = getterMethodName() + "()";
-  eq MTokenReceiveDefinition.preemptiveReturn() = "return;";
-  eq MTokenReceiveDefinition.firstInputVarName() = "message";
-  eq MTokenReceiveDefinition.updateMethodName() = null;
-  eq MTokenReceiveDefinition.writeMethodName() = null;
-
-  // --- MTokenSendDefinition ---
-  eq MTokenSendDefinition.preemptiveExpectedValue() = lastValue();
-  eq MTokenSendDefinition.preemptiveReturn() = "return false;";
-  eq MTokenSendDefinition.firstInputVarName() = getterMethodName() + "()";
-  eq MTokenSendDefinition.updateMethodName() = "_update_" + tokenName();
-  eq MTokenSendDefinition.writeMethodName() = "_writeLastValue_" + tokenName();
-
-  // MTypeReceiveDefinition
-  eq MTypeReceiveDefinition.preemptiveExpectedValue() = getterMethodName() + "()";
-  eq MTypeReceiveDefinition.preemptiveReturn() = "return;";
-  eq MTypeReceiveDefinition.firstInputVarName() = "message";
-  eq MTypeReceiveDefinition.updateMethodName() = null;
-  eq MTypeReceiveDefinition.writeMethodName() = null;
-
-  // MTypeSendDefinition
-  eq MTypeSendDefinition.preemptiveExpectedValue() = lastValue();
-  eq MTypeSendDefinition.preemptiveReturn() = "return false;";
-  eq MTypeSendDefinition.firstInputVarName() = getterMethodName() + "()";
-  eq MTypeSendDefinition.updateMethodName() = "_update_" + typeName();
-  eq MTypeSendDefinition.writeMethodName() = "_writeLastValue_" + typeName();
-}
-
-aspect AspectGeneration {
-  // --- rootNodeName ---
-  syn String RagConnect.rootNodeName() = getConfiguration().getRootNode().getName();
 }
 
 aspect GrammarGeneration {
@@ -272,14 +408,6 @@ aspect GrammarGeneration {
     return result;
   }
 
-  //  coll java.util.Map<TypeDecl, TokenComponent> RagConnect.additionalTokens() [new java.util.HashMap<>()] with put root RagConnect;
-
-  //  TypeEndpointDefinition contributes getTokenToCreate()
-  //    when typeIsList() && !getUseList()
-  //    to RagConnect.additionalTokens()
-  ////    for ragconnect()
-  //    ;
-
   syn java.util.Map<TypeDecl, TokenComponent> RagConnect.additionalTokens() {
     java.util.Map<TypeDecl, TokenComponent> result = new java.util.HashMap<>();
     for (EndpointDefinition def : allEndpointDefinitionList()) {
diff --git a/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag b/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
index e41821f..093f4cc 100644
--- a/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
+++ b/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
@@ -68,18 +68,18 @@ aspect DefaultMappings {
   }
 
   syn nta DefaultMappingDefinition RagConnect.defaultBytesToListTreeMapping(String typeName) {
-    return treeDefaultMappingDefinition("byte[]", JastAddList() + "<" + typeName + ">",
+    return treeDefaultMappingDefinition("byte[]", configJastAddList() + "<" + typeName + ">",
         "String content = new String(input);\n" +
             "com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper();\n" +
             "com.fasterxml.jackson.core.JsonFactory factory = new com.fasterxml.jackson.core.JsonFactory();\n" +
             "com.fasterxml.jackson.core.JsonParser parser = factory.createParser(content);\n" +
-            JastAddList() + "<" + typeName + ">" + " result = " + typeName + ".deserializeList((com.fasterxml.jackson.databind.node.ArrayNode)mapper.readTree(parser));\n" +
+            configJastAddList() + "<" + typeName + ">" + " result = " + typeName + ".deserializeList((com.fasterxml.jackson.databind.node.ArrayNode)mapper.readTree(parser));\n" +
             "parser.close();\n" +
             "return result;"
     );
   }
   syn nta DefaultMappingDefinition RagConnect.defaultListTreeToBytesMapping() {
-    return treeDefaultMappingDefinition(JastAddList(), "byte[]",
+    return treeDefaultMappingDefinition(configJastAddList(), "byte[]",
         "java.io.ByteArrayOutputStream outputStream = new java.io.ByteArrayOutputStream();\n" +
             "com.fasterxml.jackson.core.JsonFactory factory = new com.fasterxml.jackson.core.JsonFactory();\n" +
             "com.fasterxml.jackson.core.JsonGenerator generator = factory.createGenerator(outputStream, com.fasterxml.jackson.core.JsonEncoding.UTF8);\n" +
diff --git a/ragconnect.base/src/main/jastadd/intermediate2mustache/MustacheNodesToYAML.jrag b/ragconnect.base/src/main/jastadd/intermediate2mustache/MustacheNodesToYAML.jrag
index 07a27c5..cfe83bb 100644
--- a/ragconnect.base/src/main/jastadd/intermediate2mustache/MustacheNodesToYAML.jrag
+++ b/ragconnect.base/src/main/jastadd/intermediate2mustache/MustacheNodesToYAML.jrag
@@ -1,184 +1,206 @@
- aspect MustacheNodesToYAML {
-   syn Document RagConnect.toYAML() {
-     Document doc = new Document();
-     MappingElement root = new MappingElement();
-     root.put("rootNodeName", rootNodeName());
-     root.put("closeMethodName", closeMethodName());
-     root.put("loggingEnabledForReads", loggingEnabledForReads());
-     root.put("loggingEnabledForWrites", loggingEnabledForWrites());
-
-     // rootTypeComponents
-     ListElement rootTypeComponents = new ListElement();
-     for (TypeComponent comp : rootTypeComponents()) {
-       MappingElement inner = new MappingElement();
-       rootTypeComponents.addElement(inner);
-     }
-     root.put("RootTypeComponents", rootTypeComponents);
-
-     // allEndpointDefinitionList
-     ListElement endpointDefinitions = new ListElement();
-     for (EndpointDefinition def : allEndpointDefinitionList()) {
-       endpointDefinitions.addElement(def.toYAML());
-     }
-     root.put("allEndpointDefinitionList", endpointDefinitions);
-
-     // allMappingDefinitions
-     ListElement mappingDefinitions = new ListElement();
-     for (MappingDefinition def : allMappingDefinitions()) {
-       mappingDefinitions.addElement(def.toYAML());
-     }
-     root.put("allMappingDefinitions", mappingDefinitions);
-
-     // allDependencyDefinitionList
-     ListElement dependencyDefinitions = new ListElement();
-     for (DependencyDefinition def : allDependencyDefinitionList()) {
-       dependencyDefinitions.addElement(def.toYAML());
-     }
-     root.put("allDependencyDefinitionList", dependencyDefinitions);
-
-     // tokenComponentsThatNeedProxy
-     ListElement tokenComponents = new ListElement();
-     for (TokenComponent comp : tokenComponentsThatNeedProxy()) {
-       tokenComponents.addElement(comp.toYAML());
-     }
-     root.put("tokenComponentsThatNeedProxy", tokenComponents);
-
-     // Handlers
-     ListElement handlers = new ListElement();
-     for (Handler handler : getHandlerList()) {
-       handlers.add(handler.toYAML()
-//                           .put("rootTypeComponents", rootTypeComponents.treeCopy())
-//                           .put("hasRootTypeComponents", hasRootTypeComponents())
-       );
-     }
-     root.put("Handlers", handlers);
-     root.put("mqttHandler", mqttHandler().toYAML());
-     root.put("restHandler", restHandler().toYAML());
-
-     doc.setRootElement(root);
-     return doc;
-   }
-
-   syn MappingElement EndpointDefinition.toYAML() {
-     MappingElement result = new MappingElement();
-     result.put("AlwaysApply", getAlwaysApply());
-     result.put("IndexBasedListAccess", getIndexBasedListAccess());
-     result.put("WithAdd", getWithAdd());
-     result.put("Send", getSend());
-     result.put("preemptiveExpectedValue", preemptiveExpectedValue());
-     result.put("preemptiveReturn", preemptiveReturn());
-     result.put("firstInputVarName", firstInputVarName());
-     result.put("updateMethodName", updateMethodName());
-     result.put("writeMethodName", writeMethodName());
-     result.put("parentTypeName", parentTypeName());
-     result.put("entityName", entityName());
-     result.put("getterMethodName", getterMethodName());
-     result.put("uniqueSuffix", uniqueSuffix());
-     result.put("connectParameterName", connectParameterName());
-     result.put("connectMethodName", connectMethodName());
-     result.put("internalConnectMethodName", internalConnectMethodName());
-     result.put("disconnectMethodName", disconnectMethodName());
-     result.put("typeDeclName", typeDeclName());
-     result.put("lastDefinition", lastDefinition().getMappingDefinition().toYAML().treeCopy());
-     result.put("lastDefinitionToType", lastDefinitionToType());
-     result.put("lastResult", lastResult());
-     result.put("condition", sanitizeValueForYAML(condition()));
-     result.put("senderName", senderName());
-     result.put("lastValue", lastValue());
-     result.put("tokenResetMethodName", tokenResetMethodName());
-     result.put("resolveInListMethodName", resolveInListMethodName());
-     result.put("idTokenName", idTokenName());
-     result.put("InnerMappingDefinitions", innerMappingDefinitionsAsListElement());
-     getEndpointTarget().addToYAML(result);
-     return result;
-   }
-
-   abstract void EndpointTarget.addToYAML(MappingElement result);
-
-   void TokenEndpointTarget.addToYAML(MappingElement result) {
-     result.put("tokenName", containingEndpointDefinition().tokenName());
-   }
-
-   void TypeEndpointTarget.addToYAML(MappingElement result) {
-     result.put("typeName", containingEndpointDefinition().typeName());
-     result.put("typeIsList", typeIsList());
-   }
-
-   void UntypedEndpointTarget.addToYAML(MappingElement result) {
-   }
-
-   syn Element MappingDefinition.toYAML() {
-     MappingElement result = new MappingElement();
-     result.put("toType", toType());
-     result.put("methodName", methodName());
-     result.put("fromType", fromType());
-     result.put("fromVariableName", getFromVariableName());
-     result.put("content", sanitizeValueForYAML(getContent()));
-     return result;
-   }
-
-   syn Element DependencyDefinition.toYAML() {
-     MappingElement result = new MappingElement();
-     result.put("targetParentTypeName", targetParentTypeName());
-     result.put("dependencyMethodName", dependencyMethodName());
-     result.put("sourceParentTypeName", sourceParentTypeName());
-     result.put("internalRelationPrefix", internalRelationPrefix());
-     return result;
-   }
-
-   syn Element TokenComponent.toYAML() {
-     MappingElement result = new MappingElement();
-     result.put("parentTypeName", parentTypeName());
-     result.put("name", getName());
-     result.put("javaType", javaType());
-     result.put("internalName", internalName());
-     ListElement dependencyDefinitions = new ListElement();
-     for (DependencyDefinition def : getDependencySourceDefinitionList()) {
-       MappingElement inner = new MappingElement();
-       inner.put("targetParentTypeName", def.targetParentTypeName());
-       inner.put("internalRelationPrefix", def.internalRelationPrefix());
-       MappingElement targetEndpointDefinition = new MappingElement();
-     targetEndpointDefinition.put("updateMethodName", def.targetEndpointDefinition().updateMethodName());
-     targetEndpointDefinition.put("writeMethodName", def.targetEndpointDefinition().writeMethodName());
-       inner.put("targetEndpointDefinition", targetEndpointDefinition);
-       dependencyDefinitions.addElement(inner);
-     }
-     result.put("DependencyDefinitions", dependencyDefinitions);
-     return result;
-   }
-
-   ListElement EndpointDefinition.innerMappingDefinitionsAsListElement() {
-     ListElement innerMappingDefinitions = new ListElement();
-     for (MInnerMappingDefinition def : innerMappingDefinitions()) {
-       MappingElement inner = new MappingElement();
-       inner.put("toType", def.toType());
-       inner.put("methodName", def.methodName());
-       inner.put("inputVarName", def.inputVarName());
-       inner.put("outputVarName", def.outputVarName());
-       inner.put("last", def.isLast());
-       innerMappingDefinitions.addElement(inner);
-     }
-     return innerMappingDefinitions;
-   }
-
-   syn MappingElement Handler.toYAML() {
-     MappingElement result = new MappingElement();
-     result.put("ClassName", getClassName());
-     result.put("ConstructionSnippet", ConstructionSnippet());
-     result.put("AttributeName", AttributeName());
-     result.put("FieldName", FieldName());
-     result.put("InUse", getInUse());
-     return result;
-   }
-
-   protected String ASTNode.sanitizeValueForYAML(String value) {
-     return value.replace("\"", "\\\"").replace("\n", "\\n");
-   }
- }
-
- aspect Navigation {
-   eq Document.getChild().program() = null;
-   eq Document.getChild().ragconnect() = null;
-   eq Document.getChild().containedFile() = null;
-   eq Document.containedFileName() = getFileName();
- }
+aspect MustacheNodesToYAML {
+  syn Document RagConnect.toYAML() {
+    Document doc = new Document();
+    MappingElement root = new MappingElement();
+    // grammar children
+    ListElement handlersElement = new ListElement();
+    for (Handler handler : getHandlerList()) {
+      handlersElement.add(handler.toYAML());
+    }
+    root.put("Handlers" , handlersElement);
+
+    // shared
+    root.put("configIncrementalOptionActive" , configIncrementalOptionActive());
+    root.put("configLoggingEnabledForIncremental" , configLoggingEnabledForIncremental());
+    root.put("configExperimentalJastAdd329" , configExperimentalJastAdd329());
+    root.put("rootNodeName" , rootNodeName());
+
+    // handler
+    root.put("closeMethodName" , closeMethodName());
+    root.put("hasRootTypeComponents" , hasRootTypeComponents());
+    ListElement rootTypeComponentsElement = new ListElement();
+    for (TypeComponent comp : rootTypeComponents()) {
+      rootTypeComponentsElement.addElement(comp.toYAML());
+    }
+    root.put("rootTypeComponents" , rootTypeComponentsElement);
+
+    // listAspect
+    root.put("configJastAddList" , configJastAddList());
+    root.put("hasTreeListEndpoints" , hasTreeListEndpoints());
+    ListElement typesForReceivingListEndpointsElement = new ListElement();
+    for (TypeDecl typeDecl : typesForReceivingListEndpoints()) {
+      typesForReceivingListEndpointsElement.addElement(typeDecl.toYAML());
+    }
+    root.put("typesForReceivingListEndpoints" , typesForReceivingListEndpointsElement);
+
+    // ragconnect
+    ListElement dependencyDefinitionsElement = new ListElement();
+    for (DependencyDefinition def : allDependencyDefinitionList()) {
+      dependencyDefinitionsElement.addElement(def.toYAML());
+    }
+    root.put("allDependencyDefinitionList" , dependencyDefinitionsElement);
+    ListElement endpointDefinitionsElement = new ListElement();
+    for (EndpointDefinition def : allEndpointDefinitionList()) {
+      endpointDefinitionsElement.addElement(def.toYAML());
+    }
+    root.put("allEndpointDefinitionList" , endpointDefinitionsElement);
+    ListElement mappingDefinitionsElement = new ListElement();
+    for (MappingDefinition def : allMappingDefinitions()) {
+      mappingDefinitionsElement.addElement(def.toYAML());
+    }
+    root.put("allMappingDefinitions" , mappingDefinitionsElement);
+    ListElement tokenComponentsElement = new ListElement();
+    for (TokenComponent comp : tokenComponentsThatNeedProxy()) {
+      tokenComponentsElement.addElement(comp.toYAML());
+    }
+    root.put("tokenComponentsThatNeedProxy" , tokenComponentsElement);
+
+    // receive
+    root.put("configLoggingEnabledForReads" , configLoggingEnabledForReads());
+
+    // send
+    root.put("configLoggingEnabledForWrites" , configLoggingEnabledForWrites());
+
+    // from Handlers.jrag
+    root.put("mqttHandler" , mqttHandler().toYAML());
+    root.put("restHandler" , restHandler().toYAML());
+
+    doc.setRootElement(root);
+    return doc;
+  }
+
+  syn MappingElement EndpointDefinition.toYAML() {
+    MappingElement result = new MappingElement();
+    // grammar children
+    result.put("AlwaysApply" , getAlwaysApply());
+    result.put("IndexBasedListAccess" , getIndexBasedListAccess());
+    result.put("WithAdd" , getWithAdd());
+    result.put("Send" , getSend());
+
+    // shared
+    result.put("lastResult" , lastResult());
+
+    // mapping
+    result.put("condition" , sanitizeValueForYAML(condition()));
+    ListElement innerMappingDefinitions = new ListElement();
+    for (MInnerMappingDefinition def : innerMappingDefinitions()) {
+      innerMappingDefinitions.addElement(def.toYAML());
+    }
+    result.put("innerMappingDefinitions" , innerMappingDefinitions);
+    result.put("lastDefinitionToType" , lastDefinitionToType());
+    result.put("preemptiveReturn" , preemptiveReturn());
+
+    // receive + send
+    result.put("connectMethodName" , connectMethodName());
+    result.put("connectParameterName" , connectParameterName());
+    result.put("disconnectMethodName" , disconnectMethodName());
+    result.put("entityName" , entityName());
+    result.put("getterMethodName" , getterMethodName());
+    result.put("parentTypeName" , parentTypeName());
+
+    if (getSend()) {
+      result.put("lastValue" , lastValue());
+      result.put("senderName" , senderName());
+      result.put("shouldSendValue" , shouldSendValue());
+      result.put("tokenResetMethodName" , tokenResetMethodName());
+      result.put("updateMethodName" , updateMethodName());
+      result.put("writeMethodName" , writeMethodName());
+    } else {
+      result.put("hasTypeEndpointTarget" , hasTypeEndpointTarget());
+      result.put("idTokenName" , idTokenName());
+      result.put("internalConnectMethodName" , internalConnectMethodName());
+      result.put("resolveInListMethodName" , resolveInListMethodName());
+      result.put("typeIsList" , getEndpointTarget().typeIsList());
+    }
+    return result;
+  }
+
+  void UntypedEndpointTarget.addToYAML(MappingElement result) {
+    // empty
+  }
+
+  syn Element MInnerMappingDefinition.toYAML() {
+    MappingElement result = new MappingElement();
+    result.put("last" , isLast());
+    result.put("inputVarName" , inputVarName());
+    result.put("methodName" , methodName());
+    result.put("outputVarName" , outputVarName());
+    result.put("toType" , toType());
+    return result;
+  }
+
+  syn Element MappingDefinition.toYAML() {
+    MappingElement result = new MappingElement();
+    // grammar children
+    result.put("FromVariableName" , getFromVariableName());
+    result.put("Content" , sanitizeValueForYAML(getContent()));
+
+    // mapping
+    result.put("fromType" , fromType());
+    result.put("methodName" , methodName());
+    result.put("toType" , toType());
+
+    // ragconnect
+    result.put("isUsed" , isUsed());
+    return result;
+  }
+
+  syn Element DependencyDefinition.toYAML() {
+    MappingElement result = new MappingElement();
+    // dependencyDefinition
+    result.put("dependencyMethodName" , dependencyMethodName());
+    result.put("internalRelationPrefix" , internalRelationPrefix());
+    result.put("sourceParentTypeName" , sourceParentTypeName());
+    result.put("targetParentTypeName" , targetParentTypeName());
+
+    // tokenComponent
+    result.put("targetEndpointDefinition" , targetEndpointDefinition().toYAML());
+    return result;
+  }
+
+  syn Element TokenComponent.toYAML() {
+    MappingElement result = new MappingElement();
+    result.put("Name" , getName());
+    ListElement dependencySourceDefinitions = new ListElement();
+    for (DependencyDefinition def : getDependencySourceDefinitionList()) {
+      dependencySourceDefinitions.add(def.toYAML());
+    }
+    result.put("DependencySourceDefinitions" , dependencySourceDefinitions);
+
+    result.put("javaType" , javaType());
+    result.put("normalTokenSendDef" , normalTokenSendDef().toYAML());
+    result.put("parentTypeName" , parentTypeName());
+    return result;
+  }
+
+  syn MappingElement Handler.toYAML() {
+    MappingElement result = new MappingElement();
+    result.put("ClassName" , getClassName());
+    result.put("InUse" , getInUse());
+
+    result.put("attributeName" , attributeName());
+    result.put("constructionSnippet" , constructionSnippet());
+    result.put("fieldName" , fieldName());
+    result.put("setupWaitUntilReadyMethodName" , setupWaitUntilReadyMethodName());
+    return result;
+  }
+
+  syn MappingElement TypeComponent.toYAML() {
+    return new MappingElement().put("Name", getName());
+  }
+
+  syn MappingElement TypeDecl.toYAML() {
+    return new MappingElement().put("Name", getName());
+  }
+
+  protected StringElement ASTNode.sanitizeValueForYAML(String value) {
+    return StringElement.of(value.replace("\"" , "\\\"").replace("\n" , "\\n"));
+  }
+}
+
+aspect Navigation {
+  eq Document.getChild().program() = null;
+  eq Document.getChild().ragconnect() = null;
+  eq Document.getChild().containedFile() = null;
+  eq Document.containedFileName() = getFileName();
+}
diff --git a/ragconnect.base/src/main/resources/ListAspect.mustache b/ragconnect.base/src/main/resources/ListAspect.mustache
index 764b544..31eaf5a 100644
--- a/ragconnect.base/src/main/resources/ListAspect.mustache
+++ b/ragconnect.base/src/main/resources/ListAspect.mustache
@@ -1,5 +1,5 @@
 {{#hasTreeListEndpoints}}
-public void {{JastAddList}}.serialize(com.fasterxml.jackson.core.JsonGenerator g) throws SerializationException {
+public void {{configJastAddList}}.serialize(com.fasterxml.jackson.core.JsonGenerator g) throws SerializationException {
   try {
     g.writeStartArray();
     for (T child : this) {
@@ -7,13 +7,13 @@ public void {{JastAddList}}.serialize(com.fasterxml.jackson.core.JsonGenerator g
     }
     g.writeEndArray();
   } catch (java.io.IOException e) {
-    throw new SerializationException("unable to serialize {{JastAddList}}", e);
+    throw new SerializationException("unable to serialize {{configJastAddList}}", e);
   }
 }
 
 {{#typesForReceivingListEndpoints}}
-public static {{JastAddList}}<{{Name}}> {{Name}}.deserializeList(com.fasterxml.jackson.databind.node.ArrayNode node) throws DeserializationException {
-  {{JastAddList}}<{{Name}}> result = new {{JastAddList}}<>();
+public static {{configJastAddList}}<{{Name}}> {{Name}}.deserializeList(com.fasterxml.jackson.databind.node.ArrayNode node) throws DeserializationException {
+  {{configJastAddList}}<{{Name}}> result = new {{configJastAddList}}<>();
   for (java.util.Iterator<com.fasterxml.jackson.databind.JsonNode> it = node.elements(); it.hasNext();) {
     com.fasterxml.jackson.databind.JsonNode element = it.next();
     result.add(deserialize(element));
diff --git a/ragconnect.base/src/main/resources/handler.mustache b/ragconnect.base/src/main/resources/handler.mustache
index 32d7986..37923f4 100644
--- a/ragconnect.base/src/main/resources/handler.mustache
+++ b/ragconnect.base/src/main/resources/handler.mustache
@@ -1,24 +1,24 @@
 aspect RagConnectHandler {
 {{#Handlers}}
   {{#InUse}}
-  private {{ClassName}} {{rootNodeName}}.{{FieldName}} = {{{ConstructionSnippet}}};
-  {{#hasRootTypeComponents}}inh {{ClassName}} ASTNode.{{AttributeName}}();{{/hasRootTypeComponents}}
+  private {{ClassName}} {{rootNodeName}}.{{fieldName}} = {{{constructionSnippet}}};
+  {{#hasRootTypeComponents}}inh {{ClassName}} ASTNode.{{attributeName}}();{{/hasRootTypeComponents}}
   {{#rootTypeComponents}}
-  eq {{rootNodeName}}.get{{name}}().{{AttributeName}}() = {{FieldName}};
+  eq {{rootNodeName}}.get{{Name}}().{{attributeName}}() = {{fieldName}};
   {{/rootTypeComponents}}
-  syn {{ClassName}} {{rootNodeName}}.{{AttributeName}}() = {{FieldName}};
+  syn {{ClassName}} {{rootNodeName}}.{{attributeName}}() = {{fieldName}};
   {{/InUse}}
 {{/Handlers}}
   public void {{rootNodeName}}.{{closeMethodName}}() {
     {{#Handlers}}
-    {{#InUse}}{{FieldName}}.close();{{/InUse}}
+    {{#InUse}}{{fieldName}}.close();{{/InUse}}
     {{/Handlers}}
   }
 
 {{#mqttHandler}}
   {{#InUse}}
-  public void {{rootNodeName}}.{{SetupWaitUntilReadyMethodName}}(long time, java.util.concurrent.TimeUnit unit) {
-    {{FieldName}}.setupWaitUntilReady(time, unit);
+  public void {{rootNodeName}}.{{setupWaitUntilReadyMethodName}}(long time, java.util.concurrent.TimeUnit unit) {
+    {{fieldName}}.setupWaitUntilReady(time, unit);
   }
   {{/InUse}}
 {{/mqttHandler}}
diff --git a/ragconnect.base/src/main/resources/mappingApplication.mustache b/ragconnect.base/src/main/resources/mappingApplication.mustache
index 934e45c..836e8d4 100644
--- a/ragconnect.base/src/main/resources/mappingApplication.mustache
+++ b/ragconnect.base/src/main/resources/mappingApplication.mustache
@@ -10,8 +10,8 @@ try {
   e.printStackTrace();
   {{preemptiveReturn}}
 }
-{{^alwaysApply}}
+{{^AlwaysApply}}
 if ({{{condition}}}) {
   {{preemptiveReturn}}
 }
-{{/alwaysApply}}
+{{/AlwaysApply}}
diff --git a/ragconnect.base/src/main/resources/mappingDefinition.mustache b/ragconnect.base/src/main/resources/mappingDefinition.mustache
index 09f161f..5be93e4 100644
--- a/ragconnect.base/src/main/resources/mappingDefinition.mustache
+++ b/ragconnect.base/src/main/resources/mappingDefinition.mustache
@@ -1,3 +1,3 @@
-protected static {{{toType}}} ASTNode.{{methodName}}({{{fromType}}} {{fromVariableName}}) throws Exception {
-  {{{content}}}
+protected static {{{toType}}} ASTNode.{{methodName}}({{{fromType}}} {{FromVariableName}}) throws Exception {
+  {{{Content}}}
 }
diff --git a/ragconnect.base/src/main/resources/ragconnect.mustache b/ragconnect.base/src/main/resources/ragconnect.mustache
index b1ee1b2..c3b5071 100644
--- a/ragconnect.base/src/main/resources/ragconnect.mustache
+++ b/ragconnect.base/src/main/resources/ragconnect.mustache
@@ -31,7 +31,7 @@ aspect RagConnect {
   {{> ListAspect}}
 
   public void {{rootNodeName}}.ragconnectCheckIncremental() {
-  {{#incrementalOptionActive}}
+  {{#configIncrementalOptionActive}}
     // check if --tracing is active
     trace().getReceiver();
     // check if tracing of INC_FLUSH_ATTR is possible, i.e., if --tracing=flush
@@ -40,11 +40,11 @@ aspect RagConnect {
     mayHaveRewrite();
     // check if --incremental is active
     Object checkIncremental = inc_throwAway_visited;
-  {{/incrementalOptionActive}}
+  {{/configIncrementalOptionActive}}
   }
 }
 
-{{#incrementalOptionActive}}
+{{#configIncrementalOptionActive}}
 aspect RagConnectObserver {
 
   class RagConnectObserver implements ASTState.Trace.Receiver {
@@ -63,7 +63,7 @@ aspect RagConnectObserver {
       }
     }
 
-{{#experimentalJastAdd329}}
+{{#configExperimentalJastAdd329}}
     class RagConnectObserverStartEntry {
       final ASTNode node;
       final String attributeString;
@@ -74,16 +74,16 @@ aspect RagConnectObserver {
         this.flushIncToken = flushIncToken;
       }
     }
-{{/experimentalJastAdd329}}
+{{/configExperimentalJastAdd329}}
 
     ASTState.Trace.Receiver oldReceiver;
 
     java.util.List<RagConnectObserverEntry> observedNodes = new java.util.ArrayList<>();
 
-{{#experimentalJastAdd329}}
+{{#configExperimentalJastAdd329}}
     java.util.Set<RagConnectObserverEntry> entryQueue = new java.util.HashSet<>();
     RagConnectObserverStartEntry startEntry = null;
-{{/experimentalJastAdd329}}
+{{/configExperimentalJastAdd329}}
 
     RagConnectObserver(ASTNode node) {
       // set the receiver. potentially dangerous because overriding existing receiver!
@@ -92,9 +92,9 @@ aspect RagConnectObserver {
     }
 
     void add(RagConnectToken connectToken, ASTNode node, String attributeString, Runnable attributeCall) {
-      {{#loggingEnabledForIncremental}}
+      {{#configLoggingEnabledForIncremental}}
       System.out.println("** observer add: " + node + " on " + attributeString);
-      {{/loggingEnabledForIncremental}}
+      {{/configLoggingEnabledForIncremental}}
       observedNodes.add(new RagConnectObserverEntry(connectToken, node, attributeString, attributeCall));
     }
     void remove(RagConnectToken connectToken) {
@@ -103,12 +103,12 @@ aspect RagConnectObserver {
     @Override
     public void accept(ASTState.Trace.Event event, ASTNode node, String attribute, Object params, Object value) {
       oldReceiver.accept(event, node, attribute, params, value);
-{{#experimentalJastAdd329}}
+{{#configExperimentalJastAdd329}}
       // react to INC_FLUSH_START and remember entry
       if (event == ASTState.Trace.Event.INC_FLUSH_START && startEntry == null) {
-        {{#loggingEnabledForIncremental}}
+        {{#configLoggingEnabledForIncremental}}
         System.out.println("** observer start: " + node + " on " + attribute);
-        {{/loggingEnabledForIncremental}}
+        {{/configLoggingEnabledForIncremental}}
         startEntry = new RagConnectObserverStartEntry(node, attribute, value);
         return;
       }
@@ -122,37 +122,37 @@ aspect RagConnectObserver {
         RagConnectObserverEntry[] entriesToProcess = entryQueue.toArray(new RagConnectObserverEntry[entryQueue.size()]);
         entryQueue.clear();
         startEntry = null;
-        {{#loggingEnabledForIncremental}}
+        {{#configLoggingEnabledForIncremental}}
         System.out.println("** observer process (" + entriesToProcess.length + "): " + node + " on " + attribute);
-        {{/loggingEnabledForIncremental}}
+        {{/configLoggingEnabledForIncremental}}
         for (RagConnectObserverEntry entry : entriesToProcess) {
           entry.attributeCall.run();
         }
         return;
       }
 
-{{/experimentalJastAdd329}}
+{{/configExperimentalJastAdd329}}
       // ignore all other events but INC_FLUSH_ATTR
       if (event != ASTState.Trace.Event.INC_FLUSH_ATTR) {
         return;
       }
 
-      {{#loggingEnabledForIncremental}}
+      {{#configLoggingEnabledForIncremental}}
       System.out.println("** observer check INC_FLUSH_ATTR event: " + node + " on " + attribute);
-      {{/loggingEnabledForIncremental}}
+      {{/configLoggingEnabledForIncremental}}
       // iterate through list, if matching pair. could maybe be more efficient.
       for (RagConnectObserverEntry entry : observedNodes) {
         if (entry.node.equals(node) && entry.attributeString.equals(attribute)) {
           // hit. call the attribute/nta-token
-          {{#loggingEnabledForIncremental}}
+          {{#configLoggingEnabledForIncremental}}
           System.out.println("** observer hit: " + entry.node + " on " + entry.attributeString);
-          {{/loggingEnabledForIncremental}}
-{{#experimentalJastAdd329}}
+          {{/configLoggingEnabledForIncremental}}
+{{#configExperimentalJastAdd329}}
           entryQueue.add(entry);
-{{/experimentalJastAdd329}}
-{{^experimentalJastAdd329}}
+{{/configExperimentalJastAdd329}}
+{{^configExperimentalJastAdd329}}
           entry.attributeCall.run();
-{{/experimentalJastAdd329}}
+{{/configExperimentalJastAdd329}}
         }
       }
     }
@@ -167,4 +167,4 @@ aspect RagConnectObserver {
     return _ragConnectObserverInstance;
   }
 }
-{{/incrementalOptionActive}}
+{{/configIncrementalOptionActive}}
diff --git a/ragconnect.base/src/main/resources/receiveDefinition.mustache b/ragconnect.base/src/main/resources/receiveDefinition.mustache
index e457306..25dd2a4 100644
--- a/ragconnect.base/src/main/resources/receiveDefinition.mustache
+++ b/ragconnect.base/src/main/resources/receiveDefinition.mustache
@@ -26,9 +26,9 @@ private int {{parentTypeName}}.{{resolveInListMethodName}}(String topic) {
 public boolean {{parentTypeName}}.{{connectMethodName}}(String {{connectParameterName}}{{#typeIsList}}{{#IndexBasedListAccess}}{{^WithAdd}}, int index{{/WithAdd}}{{/IndexBasedListAccess}}{{/typeIsList}}) throws java.io.IOException {
   java.util.function.BiConsumer<String, byte[]> consumer = (topic, message) -> {
     {{> mappingApplication}}
-{{#loggingEnabledForReads}}
+{{#configLoggingEnabledForReads}}
     System.out.println("[Receive] " + {{connectParameterName}} + " -> {{entityName}} = " + {{lastResult}});
-{{/loggingEnabledForReads}}
+{{/configLoggingEnabledForReads}}
 {{#hasTypeEndpointTarget}}
     {{lastResult}}.treeResolveAll();
  {{#typeIsList}}
@@ -71,9 +71,9 @@ public boolean {{parentTypeName}}.{{connectMethodName}}(String {{connectParamete
 public boolean {{parentTypeName}}.{{connectMethodName}}(String {{connectParameterName}}) throws java.io.IOException {
   java.util.function.BiConsumer<String, byte[]> consumer = (topic, message) -> {
     {{> mappingApplication}}
-{{#loggingEnabledForReads}}
+{{#configLoggingEnabledForReads}}
     System.out.println("[Receive] " + {{connectParameterName}} + " (" + topic + ") -> {{entityName}} = " + {{lastResult}});
-{{/loggingEnabledForReads}}
+{{/configLoggingEnabledForReads}}
     {{lastResult}}.set{{idTokenName}}(topic);
     int resolvedIndex = {{resolveInListMethodName}}(topic);
     if (resolvedIndex == -1) {
@@ -95,14 +95,14 @@ private boolean {{parentTypeName}}.{{internalConnectMethodName}}(String {{connec
   {{#mqttHandler}}
   {{#InUse}}
     case "mqtt":
-      success = {{AttributeName}}().newConnection(connectToken, consumer);
+      success = {{attributeName}}().newConnection(connectToken, consumer);
       break;
   {{/InUse}}
   {{/mqttHandler}}
   {{#restHandler}}
   {{#InUse}}
     case "rest":
-      success = {{AttributeName}}().newPUTConnection(connectToken, input -> {
+      success = {{attributeName}}().newPUTConnection(connectToken, input -> {
         // TODO wildcard-topic not supported yet
         consumer.accept("", input.getBytes());
       });
@@ -130,13 +130,13 @@ public boolean {{parentTypeName}}.{{disconnectMethodName}}(String {{connectParam
   switch (scheme) {
   {{#mqttHandler}}
   {{#InUse}}
-    case "mqtt": disconnectingMethod = {{AttributeName}}()::disconnect;
+    case "mqtt": disconnectingMethod = {{attributeName}}()::disconnect;
     break;
   {{/InUse}}
   {{/mqttHandler}}
   {{#restHandler}}
   {{#InUse}}
-    case "rest": disconnectingMethod = {{AttributeName}}()::disconnect;
+    case "rest": disconnectingMethod = {{attributeName}}()::disconnect;
     break;
   {{/InUse}}
   {{/restHandler}}
diff --git a/ragconnect.base/src/main/resources/sendDefinition.mustache b/ragconnect.base/src/main/resources/sendDefinition.mustache
index bc7bc5a..3c29e92 100644
--- a/ragconnect.base/src/main/resources/sendDefinition.mustache
+++ b/ragconnect.base/src/main/resources/sendDefinition.mustache
@@ -8,12 +8,12 @@ public boolean {{parentTypeName}}.{{connectMethodName}}(String {{connectParamete
   {{#mqttHandler}}
   {{#InUse}}
     case "mqtt":
-      final MqttHandler handler = {{AttributeName}}().resolveHandler(uri);
-      final String topic = {{AttributeName}}().extractTopic(uri);
+      final MqttHandler handler = {{attributeName}}().resolveHandler(uri);
+      final String topic = {{attributeName}}().extractTopic(uri);
       {{senderName}}.add(() -> {
-        {{#loggingEnabledForWrites}}
+        {{#configLoggingEnabledForWrites}}
         System.out.println("[Send] {{entityName}} = " + {{getterMethodName}}() + " -> " + {{connectParameterName}});
-        {{/loggingEnabledForWrites}}
+        {{/configLoggingEnabledForWrites}}
         handler.publish(topic, {{lastValue}});
         }, connectToken);
       {{updateMethodName}}();
@@ -27,7 +27,7 @@ public boolean {{parentTypeName}}.{{connectMethodName}}(String {{connectParamete
   {{#restHandler}}
   {{#InUse}}
     case "rest":
-      success = {{AttributeName}}().newGETConnection(connectToken, () -> {
+      success = {{attributeName}}().newGETConnection(connectToken, () -> {
         {{updateMethodName}}();
         return new String({{lastValue}});
       });
@@ -40,13 +40,13 @@ public boolean {{parentTypeName}}.{{connectMethodName}}(String {{connectParamete
   }
   if (success) {
     connectTokenMap.add(this, false, connectToken);
-    {{#incrementalOptionActive}}
+    {{#configIncrementalOptionActive}}
     _ragConnectObserver().add(connectToken, this, "{{getterMethodName}}", () -> {
       if (this.{{updateMethodName}}()) {
         this.{{writeMethodName}}();
       }
     });
-    {{/incrementalOptionActive}}
+    {{/configIncrementalOptionActive}}
   }
   return success;
 }
@@ -58,9 +58,9 @@ public boolean {{parentTypeName}}.{{disconnectMethodName}}(String {{connectParam
     System.err.println("Disconnect called without connection for sending " + this + ".{{entityName}} to '" + {{connectParameterName}} + "'!");
     return false;
   }
-  {{#incrementalOptionActive}}
+  {{#configIncrementalOptionActive}}
   connectTokens.forEach(token -> _ragConnectObserver().remove(token));
-  {{/incrementalOptionActive}}
+  {{/configIncrementalOptionActive}}
   RagConnectDisconnectHandlerMethod disconnectingMethod;
   switch (scheme) {
   {{#mqttHandler}}
@@ -73,7 +73,7 @@ public boolean {{parentTypeName}}.{{disconnectMethodName}}(String {{connectParam
   {{#restHandler}}
   {{#InUse}}
     case "rest":
-      disconnectingMethod = {{AttributeName}}()::disconnect;
+      disconnectingMethod = {{attributeName}}()::disconnect;
       break;
   {{/InUse}}
   {{/restHandler}}
diff --git a/ragconnect.base/src/main/resources/tokenComponent.mustache b/ragconnect.base/src/main/resources/tokenComponent.mustache
index f0a79a8..3b0ae62 100644
--- a/ragconnect.base/src/main/resources/tokenComponent.mustache
+++ b/ragconnect.base/src/main/resources/tokenComponent.mustache
@@ -1,4 +1,4 @@
-public {{parentTypeName}} {{parentTypeName}}.set{{name}}({{javaType}} value) {
+public {{parentTypeName}} {{parentTypeName}}.set{{Name}}({{javaType}} value) {
   set{{internalName}}(value);
   {{#DependencySourceDefinitions}}
   for ({{targetParentTypeName}} target : get{{internalRelationPrefix}}TargetList()) {
@@ -17,6 +17,6 @@ public {{parentTypeName}} {{parentTypeName}}.set{{name}}({{javaType}} value) {
   return this;
 }
 
-public {{javaType}} {{parentTypeName}}.get{{name}}() {
+public {{javaType}} {{parentTypeName}}.get{{Name}}() {
   return get{{internalName}}();
 }
-- 
GitLab