diff --git a/src/main/jastadd/Navigation.jrag b/src/main/jastadd/Navigation.jrag
index ce2029496eebf41a537d8f72554e8ddb2021a675..49b86d0e08ba75d817cf2e53255f8ae0c2ae9edf 100644
--- a/src/main/jastadd/Navigation.jrag
+++ b/src/main/jastadd/Navigation.jrag
@@ -15,6 +15,10 @@ aspect Navigation {
   syn boolean Component.isTypeComponent() = false;
   eq TypeComponent.isTypeComponent() = true;
 
+  // --- asTypeComponent (should be in preprocessor) ---
+  syn TypeComponent Component.asTypeComponent() = null;
+  eq TypeComponent.asTypeComponent() = this;
+
   // --- isWriteToMqttDefinition ---
   syn boolean UpdateDefinition.isWriteToMqttDefinition() = false;
   eq WriteToMqttDefinition.isWriteToMqttDefinition() = true;
@@ -38,4 +42,10 @@ aspect Navigation {
   // --- isDefaultMappingDefinition ---
   syn boolean MappingDefinition.isDefaultMappingDefinition() = false;
   eq DefaultMappingDefinition.isDefaultMappingDefinition() = true;
+
+  // --- allTokenComponents ---
+  coll java.util.Set<TokenComponent> Program.allTokenComponents() [new java.util.HashSet<>()] root Program;
+  TokenComponent contributes this
+    to Program.allTokenComponents()
+    for program();
 }
diff --git a/src/main/jastadd/backend/Generation.jadd b/src/main/jastadd/backend/Generation.jadd
index 7a134eceef421988a9de954ffa86c3778a891069..82c1ae0fb08f342d296bb3395dfa86499c282a55 100644
--- a/src/main/jastadd/backend/Generation.jadd
+++ b/src/main/jastadd/backend/Generation.jadd
@@ -101,6 +101,9 @@ aspect AspectGeneration {
     for (DependencyDefinition def : getDependencyDefinitionList()) {
       def.generateAspect(sb);
     }
+    for (TokenComponent token : getProgram().allTokenComponents()) {
+      token.generateAspect(sb);
+    }
 
     sb.append("}\n");
   }
@@ -235,27 +238,40 @@ aspect AspectGeneration {
       .append(dependencyMethod()).append("(").append(sourceParentTypeName).append(" source) {\n");
     sb.append(ind(2)).append("add").append(internalRelationPrefix()).append("Source(source);\n");
     sb.append(ind(1)).append("}\n\n");
+  }
+
+  void TokenComponent.generateAspect(StringBuilder sb) {
+    if (getDependencySourceDefinitionList().isEmpty()) { return; }
 
+    String parentTypeName = containingTypeDecl().getName();
     // virtual setter
-    sb.append(ind(1)).append("public ").append(sourceParentTypeName).append(" ")
-      .append(sourceParentTypeName).append(".set").append(getSource().getName()).append("(");
-    getSource().getJavaTypeUse().generateAbstractGrammar(sb);
+    sb.append(ind(1)).append("public ").append(parentTypeName).append(" ")
+      .append(parentTypeName).append(".set").append(getName()).append("(");
+    getJavaTypeUse().generateAbstractGrammar(sb);
     sb.append(" value) {\n");
-    sb.append(ind(2)).append("set").append(internalTokenName()).append("(value);\n");
-    sb.append(ind(2)).append("for (").append(targetParentTypeName).append(" target : get")
-      .append(internalRelationPrefix()).append("TargetList()) {\n");
-    sb.append(ind(3)).append("if (target.").append(targetUpdateDefinition().updateMethod()).append("()) {\n");
-    sb.append(ind(4)).append("target.").append(targetUpdateDefinition().writeMethod()).append("();\n");
-    sb.append(ind(3)).append("}\n");
-    sb.append(ind(2)).append("}\n");
+    sb.append(ind(2)).append("set").append(internalName()).append("(value);\n");
+
+    for (DependencyDefinition dependencyDefinition : getDependencySourceDefinitionList()) {
+      String targetParentTypeName = dependencyDefinition.getTarget().containingTypeDecl().getName();
+      sb.append(ind(2)).append("for (").append(targetParentTypeName).append(" target : get")
+        .append(dependencyDefinition.internalRelationPrefix()).append("TargetList()) {\n");
+      sb.append(ind(3)).append("if (target.")
+        .append(dependencyDefinition.targetUpdateDefinition().updateMethod())
+        .append("()) {\n");
+      sb.append(ind(4)).append("target.")
+        .append(dependencyDefinition.targetUpdateDefinition().writeMethod())
+        .append("();\n");
+      sb.append(ind(3)).append("}\n");
+      sb.append(ind(2)).append("}\n");
+    }
     sb.append(ind(2)).append("return this;\n");
     sb.append(ind(1)).append("}\n\n");
 
     // virtual getter
     sb.append(ind(1)).append("public ");
-    getSource().getJavaTypeUse().generateAbstractGrammar(sb);
-    sb.append(" ").append(sourceParentTypeName).append(".get").append(getSource().getName()).append("() {\n");
-    sb.append(ind(2)).append("return get").append(internalTokenName()).append("();\n");
+    getJavaTypeUse().generateAbstractGrammar(sb);
+    sb.append(" ").append(parentTypeName).append(".get").append(getName()).append("() {\n");
+    sb.append(ind(2)).append("return get").append(internalName()).append("();\n");
     sb.append(ind(1)).append("}\n\n");
   }
 }