diff --git a/src/main/jastadd/backend/AbstractGrammar.jadd b/src/main/jastadd/backend/AbstractGrammar.jadd
index 24a92be879f8910ea480bb2c02c989ca2bf6ad0c..b067019d21a52f64e9000c1decd9cbf6bcb080aa 100644
--- a/src/main/jastadd/backend/AbstractGrammar.jadd
+++ b/src/main/jastadd/backend/AbstractGrammar.jadd
@@ -23,47 +23,6 @@ aspect BackendAbstractGrammar {
     }
   }
 
-  public void TypeDecl.generateUnresolvedClass(StringBuilder sb) {
-    if (getAbstract()) {
-      sb.append(ind(1) + "abstract ");
-    } else {
-      sb.append(ind(1));
-    }
-    sb.append("class " + unresolvedPrefix + getID() + " extends " + getID() + "  implements " + unresolvedPrefix + "Node {\n");
-
-    sb.append(ind(2) + "private String unresolved$Token;\n");
-    sb.append(ind(2) + "public String get" + unresolvedPrefix + "Token() {\n");
-    sb.append(ind(3) + "return unresolved$Token;\n");
-    sb.append(ind(2) + "}\n");
-    sb.append(ind(2) + "void set" + unresolvedPrefix + "Token(String token) {\n");
-    sb.append(ind(3) + "this.unresolved$Token = token;\n");
-    sb.append(ind(2) + "}\n");
-
-    sb.append(ind(2) + "private boolean unresolved$ResolveOpposite;\n");
-    sb.append(ind(2) + "public boolean get" + unresolvedPrefix + "ResolveOpposite() {\n");
-    sb.append(ind(3) + "return unresolved$ResolveOpposite;\n");
-    sb.append(ind(2) + "}\n");
-    sb.append(ind(2) + "void set" + unresolvedPrefix + "ResolveOpposite(boolean resolveOpposite) {\n");
-    sb.append(ind(3) + "this.unresolved$ResolveOpposite = resolveOpposite;\n");
-    sb.append(ind(2) + "}\n");
-
-    sb.append(ind(1) + "}\n");
-
-    sb.append(ind(1) + unresolvedPrefix + "Node " + getID() + "." + asUnresolvedMethod + "() {\n");
-    sb.append(ind(2) + "return null;\n");
-    sb.append(ind(1) + "}\n");
-    sb.append(ind(1) + unresolvedPrefix + "Node " + unresolvedPrefix + getID() + "." + asUnresolvedMethod + "() {\n");
-    sb.append(ind(2) + "return this;\n");
-    sb.append(ind(1) + "}\n");
-
-    sb.append(ind(1) + "boolean " + getID() + "." + isUnresolvedMethod + "() {\n");
-    sb.append(ind(2) + "return false;\n");
-    sb.append(ind(1) + "}\n");
-    sb.append(ind(1) + "boolean " + unresolvedPrefix + getID() + "." + isUnresolvedMethod + "() {\n");
-    sb.append(ind(2) + "return true;\n");
-    sb.append(ind(1) + "}\n");
-  }
-
   public void TypeDecl.generateAbstractGrammar(StringBuilder sb) {
     if (getAbstract()) {
       sb.append("abstract ");
diff --git a/src/main/jastadd/backend/BidirectionalAPI.jadd b/src/main/jastadd/backend/BidirectionalAPI.jadd
index a2cb558e92da745a348c4f3913a524774e1db720..3ee8f6d4fa5588f36949d770aa7a27560811689f 100644
--- a/src/main/jastadd/backend/BidirectionalAPI.jadd
+++ b/src/main/jastadd/backend/BidirectionalAPI.jadd
@@ -55,8 +55,8 @@ aspect BackendBidirectionalAPI {
       sb.append(ind(4) + ofTypeDecl() + " element = l.get(i);\n");
       sb.append(ind(4) + "if (element." + isUnresolvedMethod + "()) {\n");
       sb.append(ind(5) + "changed = true;\n");
-      sb.append(ind(5) + ofTypeDecl() + " resolvedElement = resolve" + nameCapitalized() + "" + resolvePostfix + "(element." + asUnresolvedMethod + "()." + getUnresolvedTokenMethod + "(), i);\n");
-      sb.append(ind(5) + "if (resolvedElement != null && element." + asUnresolvedMethod + "()." + getUnresolvedResolveOppositeMethod + "()) {\n");
+      sb.append(ind(5) + ofTypeDecl() + " resolvedElement = resolve" + nameCapitalized() + "" + resolvePostfix + "(element." + asUnresolvedMethod + "().get" + unresolvedTokenMethod + "(), i);\n");
+      sb.append(ind(5) + "if (resolvedElement != null && element." + asUnresolvedMethod + "().get" + unresolvedResolveOppositeMethod + "()) {\n");
       sb.append(ind(6) + ASTNode.listInterface + "<" + getTypeUse().decl() + "> otherList = resolvedElement." + opposite().getImplAttributeField() + ";\n");
       sb.append(ind(6) + "if (otherList == null) {\n");
       sb.append(ind(7) + "otherList = new " + listClass + "<>();\n");
@@ -152,8 +152,8 @@ aspect BackendBidirectionalAPI {
       sb.append(ind(4) + ofTypeDecl() + " element = l.get(i);\n");
       sb.append(ind(4) + "if (element." + isUnresolvedMethod + "()) {\n");
       sb.append(ind(5) + "changed = true;\n");
-      sb.append(ind(5) + ofTypeDecl() + " resolvedElement = resolve" + nameCapitalized() + resolvePostfix + "(element." + asUnresolvedMethod + "()." + getUnresolvedTokenMethod + "(), i);\n");
-      sb.append(ind(5) + "if (element." + asUnresolvedMethod + "()." + getUnresolvedResolveOppositeMethod + "()) {\n");
+      sb.append(ind(5) + ofTypeDecl() + " resolvedElement = resolve" + nameCapitalized() + resolvePostfix + "(element." + asUnresolvedMethod + "().get" + unresolvedTokenMethod + "(), i);\n");
+      sb.append(ind(5) + "if (element." + asUnresolvedMethod + "().get" + unresolvedResolveOppositeMethod + "()) {\n");
       sb.append(ind(6) + getTypeUse().decl() + " oldTarget = resolvedElement." + opposite().getImplAttributeField() + ";\n");
       sb.append(ind(6) + "if (oldTarget != null && oldTarget != this) {\n");
       sb.append(ind(7) + "oldTarget." + getImplAttributeField() + ".remove(resolvedElement);\n");
diff --git a/src/main/jastadd/backend/DirectedAPI.jadd b/src/main/jastadd/backend/DirectedAPI.jadd
index b8d114831838365ae80dc5ec0c881e85d0cf3f25..3cbc9f0985fec33ccd79b36eb6831af1a6b4fce7 100644
--- a/src/main/jastadd/backend/DirectedAPI.jadd
+++ b/src/main/jastadd/backend/DirectedAPI.jadd
@@ -39,7 +39,7 @@ aspect BackendDirectedAPI {
       sb.append(ind(4) + ofTypeDecl() + " element = l.get(i);\n");
       sb.append(ind(4) + "if (element." + isUnresolvedMethod + "()) {\n");
       sb.append(ind(5) + "changed = true;\n");
-      sb.append(ind(5) + ofTypeDecl() + " resolvedElement = " + resolvePrefix + "" + nameCapitalized() + "" + resolvePostfix + "(element." + asUnresolvedMethod + "()." + getUnresolvedTokenMethod + "(), i);\n");
+      sb.append(ind(5) + ofTypeDecl() + " resolvedElement = " + resolvePrefix + "" + nameCapitalized() + "" + resolvePostfix + "(element." + asUnresolvedMethod + "().get" + unresolvedTokenMethod + "(), i);\n");
       sb.append(ind(5) + "l.set(i, resolvedElement);\n");
       sb.append(ind(4) + "}\n");
       sb.append(ind(3) + "}\n");
diff --git a/src/main/jastadd/backend/NameResolution.jadd b/src/main/jastadd/backend/NameResolution.jadd
index e4fa19c13455d60127a12c77ec310cf081d12e1d..9b47dc1cee3a14f4ad114c8028b0f446392ad064 100644
--- a/src/main/jastadd/backend/NameResolution.jadd
+++ b/src/main/jastadd/backend/NameResolution.jadd
@@ -3,8 +3,8 @@ aspect NameResolutionHelper {
   protected static final String ASTNode.unresolvedPrefix = "Unresolved$";
   protected static final String ASTNode.isUnresolvedMethod = "is$Unresolved";
   protected static final String ASTNode.asUnresolvedMethod = "as$Unresolved";
-  protected static final String ASTNode.getUnresolvedTokenMethod = "get" + unresolvedPrefix + "Token";
-  protected static final String ASTNode.getUnresolvedResolveOppositeMethod = "get" + unresolvedPrefix + "ResolveOpposite";
+  protected static final String ASTNode.unresolvedTokenMethod = unresolvedPrefix + "Token";
+  protected static final String ASTNode.unresolvedResolveOppositeMethod = unresolvedPrefix + "ResolveOpposite";
   protected static final String ASTNode.createReferenceMethod = "createReference";
   protected static final String ASTNode.createRefMethod = "createRef";
   protected static final String ASTNode.createRefDirectionMethod = "createRefDirection";
@@ -13,6 +13,48 @@ aspect NameResolutionHelper {
   protected static final String ASTNode.resolvePostfix = "ByToken";
   protected static final String ASTNode.resolveAllMethod = "resolveAll";
   protected static final String ASTNode.treeResolveAllMethod = "treeResolveAll";
+  protected static final String ASTNode.unresolvedNodeInterface = unresolvedPrefix + "Node$Interface";
+
+  public void TypeDecl.generateUnresolvedClass(StringBuilder sb) {
+    if (getAbstract()) {
+      sb.append(ind(1) + "abstract ");
+    } else {
+      sb.append(ind(1));
+    }
+    sb.append("class " + unresolvedPrefix + getID() + " extends " + getID() + "  implements " + unresolvedNodeInterface + " {\n");
+
+    sb.append(ind(2) + "private String unresolved$Token;\n");
+    sb.append(ind(2) + "public String get" + unresolvedTokenMethod + "() {\n");
+    sb.append(ind(3) + "return unresolved$Token;\n");
+    sb.append(ind(2) + "}\n");
+    sb.append(ind(2) + "void set" + unresolvedTokenMethod + "(String token) {\n");
+    sb.append(ind(3) + "this.unresolved$Token = token;\n");
+    sb.append(ind(2) + "}\n");
+
+    sb.append(ind(2) + "private boolean unresolved$ResolveOpposite;\n");
+    sb.append(ind(2) + "public boolean get" + unresolvedResolveOppositeMethod + "() {\n");
+    sb.append(ind(3) + "return unresolved$ResolveOpposite;\n");
+    sb.append(ind(2) + "}\n");
+    sb.append(ind(2) + "void set" + unresolvedResolveOppositeMethod + "(boolean resolveOpposite) {\n");
+    sb.append(ind(3) + "this.unresolved$ResolveOpposite = resolveOpposite;\n");
+    sb.append(ind(2) + "}\n");
+
+    sb.append(ind(1) + "}\n");
+
+    sb.append(ind(1) + unresolvedNodeInterface + " " + getID() + "." + asUnresolvedMethod + "() {\n");
+    sb.append(ind(2) + "return null;\n");
+    sb.append(ind(1) + "}\n");
+    sb.append(ind(1) + unresolvedNodeInterface + " " + unresolvedPrefix + getID() + "." + asUnresolvedMethod + "() {\n");
+    sb.append(ind(2) + "return this;\n");
+    sb.append(ind(1) + "}\n");
+
+    sb.append(ind(1) + "boolean " + getID() + "." + isUnresolvedMethod + "() {\n");
+    sb.append(ind(2) + "return false;\n");
+    sb.append(ind(1) + "}\n");
+    sb.append(ind(1) + "boolean " + unresolvedPrefix + getID() + "." + isUnresolvedMethod + "() {\n");
+    sb.append(ind(2) + "return true;\n");
+    sb.append(ind(1) + "}\n");
+  }
 
   public String Program.generateRewriteToSuperTypeStub() {
     StringBuilder sb = new StringBuilder();
@@ -124,9 +166,9 @@ aspect NameResolutionHelper {
 
     sb.append("aspect RefResolverHelpers {\n\n");
 
-    sb.append(ind(1) + "interface " + unresolvedPrefix + "Node {\n");
-    sb.append(ind(2) + "String " + getUnresolvedTokenMethod + "();\n");
-    sb.append(ind(2) + "boolean " + getUnresolvedResolveOppositeMethod + "();\n");
+    sb.append(ind(1) + "interface " + unresolvedNodeInterface + " {\n");
+    sb.append(ind(2) + "String get" + unresolvedTokenMethod + "();\n");
+    sb.append(ind(2) + "boolean get" + unresolvedResolveOppositeMethod + "();\n");
     sb.append(ind(1) + "}\n\n");
 
     for (TypeDecl td: getTypeDecls()) {