diff --git a/ragconnect.base/src/main/jastadd/Analysis.jrag b/ragconnect.base/src/main/jastadd/Analysis.jrag
index 79f37b38b3839982f784f1dd79b094a663aaa921..3b99df81692ece3c0cf151b01d7ce0cccd7c5bfd 100644
--- a/ragconnect.base/src/main/jastadd/Analysis.jrag
+++ b/ragconnect.base/src/main/jastadd/Analysis.jrag
@@ -98,10 +98,18 @@ aspect Analysis {
   eq ContextFreeTypePortTarget.hasAttributeResetMethod() = false;
 
   // --- needProxyToken ---
-  syn boolean TokenComponent.needProxyToken() = !getDependencySourceDefinitionList().isEmpty() ||
-          getTokenPortTargetList().stream()
-                  .map(PortTarget::containingPortDefinition)
-                  .anyMatch(PortDefinition::shouldNotResetValue);
+  syn boolean TokenComponent.needProxyToken() {
+    for (Component comp : meOwnedByOthers()) {
+      TokenComponent tokenComp = comp.asTokenComponent();
+      if (!tokenComp.getDependencySourceDefinitionList().isEmpty() ||
+              tokenComp.getTokenPortTargetList().stream()
+                      .map(PortTarget::containingPortDefinition)
+                      .anyMatch(PortDefinition::shouldNotResetValue)) {
+        return true;
+      }
+    }
+    return false;
+  }
 
   // --- effectiveUsedAt ---
   coll Set<PortDefinition> MappingDefinition.effectiveUsedAt()
diff --git a/ragconnect.base/src/main/jastadd/Intermediate.jadd b/ragconnect.base/src/main/jastadd/Intermediate.jadd
index b847dc7251eefc0eaac7ca456111374d0af1dd02..5cd7019bf8e36feef613a40970eabb9729e09ba5 100644
--- a/ragconnect.base/src/main/jastadd/Intermediate.jadd
+++ b/ragconnect.base/src/main/jastadd/Intermediate.jadd
@@ -358,7 +358,14 @@ aspect MustacheRagConnect {
   eq ContextFreeTypePortTarget.impliedPortDefinitions() {
     JastAddList<PortDefinition> result = super.impliedPortDefinitions();
     PortDefinition containingDef = containingPortDefinition();
+    Set<TypeComponent> seenTypeComponents = new HashSet<>();
     for (TypeComponent typeComponent : getTypeDecl().occurencesInProductionRules()) {
+      // only process each once
+      if (seenTypeComponents.contains(typeComponent)) {
+        continue;
+      }
+      seenTypeComponents.add(typeComponent);
+
       List<PortDefinition> defsForTypeComponent = lookupGivenTypePortDefinitions(typeComponent);
       if (!defsForTypeComponent.stream().anyMatch(containingDef::matchesType)) {
         // there is no user-defined port definition for this typeComponent yet
@@ -630,9 +637,12 @@ aspect MustacheTokenComponent {
   syn String TokenComponent.javaType() = effectiveJavaTypeUse().prettyPrint();
 
   syn PortDefinition TokenComponent.normalTokenSendDef() {
-    for (PortTarget target : getTokenPortTargetList()) {
-      if (target.isTokenPortTarget() && target.containingPortDefinition().shouldNotResetValue()) {
-        return target.containingPortDefinition();
+    for (Component comp : meOwnedByOthers()) {
+      TokenComponent tokenComp = comp.asTokenComponent();
+      for (PortTarget target : tokenComp.getTokenPortTargetList()) {
+        if (target.isTokenPortTarget() && target.containingPortDefinition().shouldNotResetValue()) {
+          return target.containingPortDefinition();
+        }
       }
     }
     return null;
@@ -670,6 +680,10 @@ aspect MustacheTypeDecl {
   syn String TypeComponent.parentTypeName() = containingTypeDecl().getName();
   syn String TypeComponent.disconnectMethodName() {
     List<TypePortTarget> typePortTargets = getTypePortTargets();
+    while (typePortTargets.isEmpty() && getRealComponent() != null) {
+      // get for "real" typeComponent (of super-type) and use its getTypePortTargets
+      typePortTargets = getRealComponent().asTypeComponent().getTypePortTargets();
+    }
     if (typePortTargets.isEmpty()) {
       return "MISSING_PORT";
     } else {
diff --git a/ragconnect.base/src/main/jastadd/NameResolution.jrag b/ragconnect.base/src/main/jastadd/NameResolution.jrag
index eb589e10774f0149ca868061073fddd91d558ccb..18a35f7295b63225f7695c045604df713950fbe0 100644
--- a/ragconnect.base/src/main/jastadd/NameResolution.jrag
+++ b/ragconnect.base/src/main/jastadd/NameResolution.jrag
@@ -197,7 +197,9 @@ aspect RelastNameResolution {
   syn nta JastAddList<Component> TypeDecl.allComponentsAsOwnedByMe() {
     JastAddList<Component> result = new JastAddList<>();
     for (Component comp : allComponents()) {
-      result.add(comp.treeCopy());
+      Component newComp = comp.treeCopy();
+      newComp.setRealComponent(comp);
+      result.add(newComp);
     }
     return result;
   }
@@ -214,7 +216,7 @@ aspect RelastNameResolution {
   syn boolean Component.matches(Component other) = false;
   eq TokenComponent.matches(Component other) {
     if (!other.isTokenComponent()) { return false; }
-    return getName().equals(other.getName()) && getJavaTypeUse().prettyPrint().equals(other.asTokenComponent().getJavaTypeUse().prettyPrint());
+    return getName().equals(other.getName()) && (getJavaTypeUse() == null && other.asTokenComponent().getJavaTypeUse() == null || getJavaTypeUse().prettyPrint().equals(other.asTokenComponent().getJavaTypeUse().prettyPrint()));
   }
   eq TypeComponent.matches(Component other) = matchesNameAndType(other);
   eq NormalComponent.matches(Component other) {
diff --git a/ragconnect.base/src/main/jastadd/Navigation.jrag b/ragconnect.base/src/main/jastadd/Navigation.jrag
index 8b23c000fb8136af504d6dc452a42d5dd6ae82ca..ffa4596e54ca19295c1c886eecf2276e38e16497 100644
--- a/ragconnect.base/src/main/jastadd/Navigation.jrag
+++ b/ragconnect.base/src/main/jastadd/Navigation.jrag
@@ -175,4 +175,25 @@ aspect RagConnectNavigation {
 
   // --- isListComponent --- (defined in PP, but only on TypeComponent)
   syn boolean Component.isListComponent() = false;
+
+  syn Set<Component> Component.meOwnedByOthers() {
+    Set<Component> result = new HashSet<>();
+    Deque<TypeDecl> todo = new ArrayDeque<>();
+    todo.add(containingTypeDecl());
+    while (!todo.isEmpty()) {
+      TypeDecl current = todo.pop();
+      todo.addAll(current.getSubTypeList());
+
+      for (Component comp : current.allComponentsAsOwnedByMe()) {
+        if (comp.matches(this)) {
+          result.add(comp);
+        }
+      }
+    }
+    return result;
+  }
+}
+aspect RelastNavigation {
+  // TODO only token-components from the nta "owned-by-me" must be added to Program.allTokenComponents
+  //TypeDecl contributes nta allComponentsAsOwnedByMe() to Program.allTokenComponents();
 }
diff --git a/ragconnect.base/src/main/jastadd/RagConnect.relast b/ragconnect.base/src/main/jastadd/RagConnect.relast
index 7282bb3fda5771c3b1ea87a4bfae235c3950b640..60f08491d4ac721c4dedb7a37280b1cdcdd385a3 100644
--- a/ragconnect.base/src/main/jastadd/RagConnect.relast
+++ b/ragconnect.base/src/main/jastadd/RagConnect.relast
@@ -47,3 +47,5 @@ Configuration ::=
 <EvaluationCounter:boolean>
 <ExperimentalJastAdd329:boolean>;
 rel Configuration.RootNode -> TypeDecl ;
+
+rel Component.RealComponent? -> Component ;
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/JavaTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/JavaTest.java
index 81d2817c5a1453bb82728edb496d1b41042d31ba..dfac385b2161cf4fff96aad5d05985438a03f242 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/JavaTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/JavaTest.java
@@ -150,7 +150,10 @@ public class JavaTest extends RagConnectTest {
 
     model.ragconnectJavaPush(TOPIC_RECEIVE_NTA, ExposingASTNode.INSTANCE.aToBytes(createA("12")));
     checker.put(TOPIC_RECEIVE_NTA, "12").check();
+  }
 
+  @AfterEach
+  public void printEvaluationSummary() {
     System.out.println(model.ragconnectEvaluationCounterSummary());
   }