diff --git a/ragconnect.base/build.gradle b/ragconnect.base/build.gradle
index 953e9c5a0a74d2fac22831166ba9b9b52381ab96..5fd73e5ac109155cd84315d3890e059353db3ef2 100644
--- a/ragconnect.base/build.gradle
+++ b/ragconnect.base/build.gradle
@@ -51,9 +51,9 @@ task newVersion() {
     }
 }
 
-sourceSets.main.java {
-    srcDir "src/gen/java"
-}
+File genSrc = file("src/gen/java");
+sourceSets.main.java.srcDir genSrc
+idea.module.generatedSourceDirs += genSrc
 
 jar {
     manifest {
diff --git a/ragconnect.base/src/main/jastadd/Analysis.jrag b/ragconnect.base/src/main/jastadd/Analysis.jrag
index b62399960f34a4b8c23a8d23762ec195491ce4e3..a1367a9c21bf2f293dd33216ea20a8941f5411b5 100644
--- a/ragconnect.base/src/main/jastadd/Analysis.jrag
+++ b/ragconnect.base/src/main/jastadd/Analysis.jrag
@@ -24,9 +24,17 @@ aspect Analysis {
   }
 
   // --- isAlreadyDefined ---
-  syn boolean TokenEndpointDefinition.isAlreadyDefined() = lookupTokenEndpointDefinitions(getToken()).size() > 1;
+  syn boolean TokenEndpointDefinition.isAlreadyDefined() {
+    return lookupTokenEndpointDefinitions(getToken()).stream()
+      .filter(this::matchesType)
+      .count() > 1;
+  }
   syn boolean DependencyDefinition.isAlreadyDefined() = lookupDependencyDefinition(getSource().containingTypeDecl(), getID()) != this;
 
+  syn boolean TokenEndpointDefinition.matchesType(TokenEndpointDefinition other);
+  eq ReceiveTokenEndpointDefinition.matchesType(TokenEndpointDefinition other) = other.isReceiveTokenEndpointDefinition();
+  eq SendTokenEndpointDefinition.matchesType(TokenEndpointDefinition other) = other.isSendTokenEndpointDefinition();
+
   syn boolean MappingDefinitionType.assignableTo(JavaTypeUse target);
   eq JavaMappingDefinitionType.assignableTo(JavaTypeUse target) = getType().assignableTo(target);
   eq JavaArrayMappingDefinitionType.assignableTo(JavaTypeUse target) {
@@ -54,4 +62,10 @@ aspect Analysis {
       default: return getName();
     }
   }
+
+  // --- shouldSendValue ---
+  syn boolean TokenEndpointDefinition.shouldSendValue() = isSendTokenEndpointDefinition() && !getToken().getNTA();
+
+  // --- needProxyToken ---
+  syn boolean TokenComponent.needProxyToken() = !getDependencySourceDefinitionList().isEmpty() || getTokenEndpointDefinitionList().stream().anyMatch(TokenEndpointDefinition::shouldSendValue);
 }
diff --git a/ragconnect.base/src/main/jastadd/Errors.jrag b/ragconnect.base/src/main/jastadd/Errors.jrag
index fe2fcd59efd365174ca2803affebc34819cf3d7e..88f3aece6a64041a95f2784be4882d01008ff8c5 100644
--- a/ragconnect.base/src/main/jastadd/Errors.jrag
+++ b/ragconnect.base/src/main/jastadd/Errors.jrag
@@ -28,10 +28,6 @@ aspect Errors {
           getToken().effectiveJavaTypeUse())
       to RagConnect.errors();
 
-    SendTokenEndpointDefinition contributes error("Sending target token must be an NTA token!")
-      when !getToken().getNTA()
-      to RagConnect.errors();
-
     SendTokenEndpointDefinition contributes error("Send definition already defined for " + getToken().getName())
       when isAlreadyDefined()
       to RagConnect.errors();
diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag
index 752fc36aea4c59348874c1a08134696a9543b6cb..f6fc20befc6697e63ff4c4bbac16c852c898b78d 100644
--- a/ragconnect.base/src/main/jastadd/Navigation.jrag
+++ b/ragconnect.base/src/main/jastadd/Navigation.jrag
@@ -35,6 +35,10 @@ aspect Navigation {
   syn SendTokenEndpointDefinition EndpointDefinition.asSendTokenEndpointDefinition() = null;
   eq SendTokenEndpointDefinition.asSendTokenEndpointDefinition() = this;
 
+  // --- isReceiveTokenEndpointDefinition ---
+  syn boolean EndpointDefinition.isReceiveTokenEndpointDefinition() = false;
+  eq ReceiveTokenEndpointDefinition.isReceiveTokenEndpointDefinition() = true;
+
   // --- asReceiveTokenEndpointDefinition ---
   syn ReceiveTokenEndpointDefinition EndpointDefinition.asReceiveTokenEndpointDefinition() = null;
   eq ReceiveTokenEndpointDefinition.asReceiveTokenEndpointDefinition() = this;
diff --git a/ragconnect.base/src/main/jastadd/RagConnect.relast b/ragconnect.base/src/main/jastadd/RagConnect.relast
index accc617714ff6bdd24a22831ea84e5d93e6a15b8..9958106ba82c6efe32126c9f7b795ac7c66378e6 100644
--- a/ragconnect.base/src/main/jastadd/RagConnect.relast
+++ b/ragconnect.base/src/main/jastadd/RagConnect.relast
@@ -5,7 +5,7 @@ abstract EndpointDefinition ::= <AlwaysApply:boolean> ;
 rel EndpointDefinition.Mapping* <-> MappingDefinition.UsedAt*;
 
 abstract TokenEndpointDefinition : EndpointDefinition;
-rel TokenEndpointDefinition.Token -> TokenComponent;
+rel TokenEndpointDefinition.Token <-> TokenComponent.TokenEndpointDefinition*;
 
 ReceiveTokenEndpointDefinition : TokenEndpointDefinition;
 SendTokenEndpointDefinition : TokenEndpointDefinition;
diff --git a/ragconnect.base/src/main/jastadd/backend/Generation.jadd b/ragconnect.base/src/main/jastadd/backend/Generation.jadd
index 4b8d357e82e82eb8454451978589434f1ef44505..6b6399287f4d657087cc45d5c905917ac54fea7a 100644
--- a/ragconnect.base/src/main/jastadd/backend/Generation.jadd
+++ b/ragconnect.base/src/main/jastadd/backend/Generation.jadd
@@ -71,6 +71,7 @@ aspect AttributesForMustache {
   syn String MSendDefinition.updateMethod() = "_update_" + tokenName();
   syn String MSendDefinition.writeMethod() = "_writeLastValue_" + tokenName();
   syn String MSendDefinition.tokenResetMethod() = "get" + tokenName() + "_reset";
+  syn boolean MSendDefinition.shouldSendValue() = endpointDef().shouldSendValue();
 
   // --- MMappingDefinition ---
   syn String MMappingDefinition.toType() = getMappingDefinition().getToType().prettyPrint();
@@ -96,8 +97,16 @@ aspect AttributesForMustache {
   syn String MTokenComponent.parentTypeName() = getTokenComponent().containingTypeDecl().getName();
   syn String MTokenComponent.name() = getTokenComponent().getName();
   syn String MTokenComponent.javaType() = getTokenComponent().effectiveJavaTypeUse().prettyPrint();
-  syn String MTokenComponent.internalName() = getTokenComponent().getDependencySourceDefinitionList().isEmpty() ? externalName() : "_internal_" + name();
+  syn String MTokenComponent.internalName() = getTokenComponent().needProxyToken() ? "_internal_" + name() : externalName();
   syn String MTokenComponent.externalName() = name();
+  syn MSendDefinition MTokenComponent.normalTokenSendDef() {
+    for (TokenEndpointDefinition endpointDef : getTokenComponent().getTokenEndpointDefinitionList()) {
+      if (endpointDef.shouldSendValue()) {
+        return endpointDef.asSendTokenEndpointDefinition().toMustache();
+      }
+    }
+    return null;
+  }
 
   // --- toMustache ---
   syn lazy MRagConnect RagConnect.toMustache() {
@@ -118,7 +127,7 @@ aspect AttributesForMustache {
       result.addDependencyDefinition(def.toMustache());
     }
     for (TokenComponent token : getProgram().allTokenComponents()) {
-      if (!token.getDependencySourceDefinitionList().isEmpty()) {
+      if (token.needProxyToken()) {
         result.addTokenComponent(token.toMustache());
       }
     }
diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
index 711169ec2ea7d9c21b48dc52c5a7d2cf4cc8b427..28a3f209ecf5ee4bf436251fe2cff9e71d091bc8 100644
--- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
@@ -216,6 +216,7 @@ public class Compiler extends AbstractCompiler {
     if (!atLeastOneGrammar && !atLeastOneRagConnect) {
       System.exit(1);
     }
+    ragConnect.flushTreeCache();
     ragConnect.treeResolveAll();
     ragConnect.additionalRelations().forEach(ragConnectGrammarPart::addDeclaration);
     ASTNode.loggingEnabledForReads = optionLogReads.value();
@@ -264,15 +265,9 @@ public class Compiler extends AbstractCompiler {
   }
 
   private void mergeRagConnectDefinitions(RagConnect ragConnect, RagConnect ragConnectToIntegrate) {
-    for (EndpointDefinition endpointDefinition : ragConnectToIntegrate.getEndpointDefinitionList()) {
-      ragConnect.addEndpointDefinition(endpointDefinition);
-    }
-    for (MappingDefinition mappingDefinition : ragConnectToIntegrate.getMappingDefinitionList()) {
-      ragConnect.addMappingDefinition(mappingDefinition);
-    }
-    for (DependencyDefinition dependencyDefinition : ragConnectToIntegrate.getDependencyDefinitionList()) {
-      ragConnect.addDependencyDefinition(dependencyDefinition);
-    }
+    ragConnect.setEndpointDefinitionList(ragConnectToIntegrate.getEndpointDefinitionList());
+    ragConnect.setMappingDefinitionList(ragConnectToIntegrate.getMappingDefinitionList());
+    ragConnect.setDependencyDefinitionList(ragConnectToIntegrate.getDependencyDefinitionList());
   }
 
 //  protected void printUsage() {
diff --git a/ragconnect.base/src/main/resources/ragConnectVersion.properties b/ragconnect.base/src/main/resources/ragConnectVersion.properties
index 768893e5c448a618f5fb93070a694b627a2ad362..a2fe0480ef146507acb8df52efc1fb529a9f4c1b 100644
--- a/ragconnect.base/src/main/resources/ragConnectVersion.properties
+++ b/ragconnect.base/src/main/resources/ragConnectVersion.properties
@@ -1,2 +1,2 @@
-#Fri Aug 14 13:28:32 CEST 2020
-version=0.2.1
+#Fri Aug 14 19:22:30 CEST 2020
+version=0.2.2
diff --git a/ragconnect.base/src/main/resources/sendDefinition.mustache b/ragconnect.base/src/main/resources/sendDefinition.mustache
index d6601aaeac7686a06dc59b62f0f0b56aa9642bc7..60f5efcca8f3333d41fc8cc4706a736946a42ab7 100644
--- a/ragconnect.base/src/main/resources/sendDefinition.mustache
+++ b/ragconnect.base/src/main/resources/sendDefinition.mustache
@@ -36,7 +36,9 @@ public boolean {{parentTypeName}}.{{connectMethod}}(String {{connectParameterNam
 }
 
 protected boolean {{parentTypeName}}.{{updateMethod}}() {
+  {{^shouldSendValue}}
   {{tokenResetMethod}}();
+  {{/shouldSendValue}}
   {{> mappingApplication}}
   {{lastValue}} = {{lastResult}};
   // normally we would return true here. unless no connect method was called so far to initialize {{sender}} yet
diff --git a/ragconnect.base/src/main/resources/tokenComponent.mustache b/ragconnect.base/src/main/resources/tokenComponent.mustache
index ec91e68da6493d1c8de97a497e4b1df08e8e6af0..169f5f64fff01ef2c34abeea34266b5a82deaf3a 100644
--- a/ragconnect.base/src/main/resources/tokenComponent.mustache
+++ b/ragconnect.base/src/main/resources/tokenComponent.mustache
@@ -9,6 +9,11 @@ public {{parentTypeName}} {{parentTypeName}}.set{{name}}({{javaType}} value) {
     {{/targetEndpointDefinition}}
   }
   {{/DependencyDefinitions}}
+  {{#normalTokenSendDef}}
+  if ({{updateMethod}}()) {
+    {{writeMethod}}();
+  }
+  {{/normalTokenSendDef}}
   return this;
 }