diff --git a/src/main/jastadd/backend/API.jadd b/src/main/jastadd/backend/API.jadd
index 84db4dfe33eaa39cfbe91b38ac1d62d65452b959..321d38ffc90667832a294dec54cf217ef248a2f2 100644
--- a/src/main/jastadd/backend/API.jadd
+++ b/src/main/jastadd/backend/API.jadd
@@ -53,11 +53,11 @@ aspect BackendAPI {
     }
     sb.append("() {\n");
     if (resolverHelper | serializer) {
-      sb.append(ind(2) + "if (" + getImplAttributeField() + " != null && " + getImplAttributeField() + ".is$Unresolved()) {\n");
-        sb.append(ind(3) + "if (" + getImplAttributeField() + ".as$Unresolved().getUnresolved$ResolveOpposite()) {\n");
-          sb.append(ind(4) + "set" + nameCapitalized() + "(resolve" + nameCapitalized() + "ByToken(" + getImplAttributeField() + ".as$Unresolved().getUnresolved$Token()));\n");
+      sb.append(ind(2) + "if (" + getImplAttributeField() + " != null && " + getImplAttributeField() + "." + isUnresolvedMethod + "()) {\n");
+        sb.append(ind(3) + "if (" + getImplAttributeField() + "." + asUnresolvedMethod + "().get" + unresolvedPrefix + "ResolveOpposite()) {\n");
+          sb.append(ind(4) + "set" + nameCapitalized() + "(resolve" + nameCapitalized() + resolvePostfix + "(" + getImplAttributeField() + "." + asUnresolvedMethod + "().get" + unresolvedPrefix + "Token()));\n");
         sb.append(ind(3) + "} else {\n");
-          sb.append(ind(4) + "set" + getImplAttributeName() + "(resolve" + nameCapitalized() + "ByToken(" + getImplAttributeField() + ".as$Unresolved().getUnresolved$Token()));\n");
+          sb.append(ind(4) + "set" + getImplAttributeName() + "(resolve" + nameCapitalized() + resolvePostfix + "(" + getImplAttributeField() + "." + asUnresolvedMethod + "().get" + unresolvedPrefix + "Token()));\n");
         sb.append(ind(3) + "}\n");
       sb.append(ind(2) + "}\n");
     }
diff --git a/src/main/jastadd/backend/AbstractGrammar.jadd b/src/main/jastadd/backend/AbstractGrammar.jadd
index a9728d231ef25162218719dc08a47853003abbdb..57c6d25bac5733fc65e788f5f0bd0356ceedf24e 100644
--- a/src/main/jastadd/backend/AbstractGrammar.jadd
+++ b/src/main/jastadd/backend/AbstractGrammar.jadd
@@ -1,6 +1,7 @@
 aspect BackendAbstractGrammar {
 
-  public static String ASTNode.listClass = "ArrayList";
+  public static String ASTNode.listInterface = "java.util.List";
+  public static String ASTNode.listClass = "java.util.ArrayList";
   public static String ASTNode.jastAddListType = "List";
 
   public static boolean ASTNode.resolverHelper = false;
@@ -27,37 +28,37 @@ aspect BackendAbstractGrammar {
     } else {
       sb.append(ind(1));
     }
-    sb.append("class " + "Unresolved$" + getID() + " extends " + getID() + "  implements Unresolved$Node {\n");
+    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 getUnresolved$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 setUnresolved$Token(String token) {\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 getUnresolved$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 setUnresolved$ResolveOpposite(boolean resolveOpposite) {\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) + "Unresolved$Node " + getID() + ".as$Unresolved() {\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) + "Unresolved$Node Unresolved$" + getID() + ".as$Unresolved() {\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() + ".is$Unresolved() {\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 Unresolved$" + getID() + ".is$Unresolved() {\n");
+    sb.append(ind(1) + "boolean " + unresolvedPrefix + getID() + "." + isUnresolvedMethod + "() {\n");
     sb.append(ind(2) + "return true;\n");
     sb.append(ind(1) + "}\n");
   }
@@ -119,7 +120,7 @@ aspect BackendAbstractGrammar {
     return "<" + getImplAttributeName() + ":" + ofTypeDecl() + ">";
   }
   public String ManyRelationComponent.generateAbstractGrammar() {
-    return "<" + getImplAttributeName() + ":" + ASTNode.listClass + "<" + ofTypeDecl() + ">>";
+    return "<" + getImplAttributeName() + ":" + ASTNode.listInterface + "<" + ofTypeDecl() + ">>";
   }
 
   public String RelationComponent.getImplAttributeName() {
@@ -128,11 +129,11 @@ aspect BackendAbstractGrammar {
 
   public String RelationComponent.getImplAttributeField() {
     //  tt.bind("TypeInSignature", ASTNode.convTypeNameToSignature(type()));
-    return "token" + ofTypeDecl() + "__impl_" + getID();
+    return "token" + org.jastadd.ast.AST.ASTNode.convTypeNameToSignature(ofTypeDecl().toString()) + "__impl_" + getID();
   }
 
   public String ManyRelationComponent.getImplAttributeField() {
     //  tt.bind("TypeInSignature", ASTNode.convTypeNameToSignature(type()));
-    return "token" + listClass + "_" + ofTypeDecl() + "___impl_" + getID();
+    return "token" + org.jastadd.ast.AST.ASTNode.convTypeNameToSignature(ASTNode.listInterface) + "_" + ofTypeDecl() + "___impl_" + getID();
   }
 }
diff --git a/src/main/jastadd/backend/Backend.jadd b/src/main/jastadd/backend/Backend.jadd
index c751488eb18df1a1e59b4a93edebf341bcdea0c0..96164f9918271f71479c97112b49a7c44fe3e6ee 100644
--- a/src/main/jastadd/backend/Backend.jadd
+++ b/src/main/jastadd/backend/Backend.jadd
@@ -6,7 +6,6 @@ aspect BackendAspect {
   }
 
   public void Program.generateAspect(StringBuilder sb) {
-    sb.append("import java.util.ArrayList;\n");
     sb.append("import java.util.Collections;\n");
     sb.append("import java.time.Instant;\n");
     sb.append("import java.time.Period;\n");
diff --git a/src/main/jastadd/backend/BidirectionalAPI.jadd b/src/main/jastadd/backend/BidirectionalAPI.jadd
index 4015d240356896604e5bbc1a97f421a495985006..1db4171fd9be25a24dd5d72ce5ba1089362eff86 100644
--- a/src/main/jastadd/backend/BidirectionalAPI.jadd
+++ b/src/main/jastadd/backend/BidirectionalAPI.jadd
@@ -46,7 +46,7 @@ aspect BackendBidirectionalAPI {
       String getMethodDecl = "java.util.List<" + ofTypeDecl() + "> " + getTypeUse().decl() + "." + name() + "()";
       sb.append("public " + getMethodDecl + " {\n");
     }
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> l = get" + getImplAttributeName() + "();\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + ofTypeDecl() + "> l = get" + getImplAttributeName() + "();\n");
     // resolve the entire list
     if (resolverHelper | serializer) {
       sb.append(ind(2) + "if (l != null) {\n");
@@ -55,9 +55,9 @@ 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() + "ByToken(element." + asUnresolvedMethod + "()." + getUnresolvedTokenMethod + "(), i);\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(6) + ASTNode.listClass + "<" + getTypeUse().decl() + "> otherList = resolvedElement." + otherSide().getImplAttributeField() + ";\n");
+      sb.append(ind(6) + ASTNode.listInterface + "<" + getTypeUse().decl() + "> otherList = resolvedElement." + otherSide().getImplAttributeField() + ";\n");
       sb.append(ind(6) + "if (otherList == null) {\n");
       sb.append(ind(7) + "otherList = new " + listClass + "<>();\n");
       sb.append(ind(6) + "}\n");
@@ -79,11 +79,11 @@ aspect BackendBidirectionalAPI {
     String addMethodDecl1 = "void " + getTypeUse().decl() + ".add" + (useJastAddNames ? "" : "To") + nameCapitalized() + "(" + ofTypeDecl() + " o)";
     sb.append(ind(1) + "public " + addMethodDecl1 + " {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
     sb.append(ind(2) + "if (list == null) {\n");
     sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n");
     sb.append(ind(2) + "}\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + otherSide().ofTypeDecl() + "> list2 = o." + otherSide().getImplAttributeField() + ";\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + otherSide().ofTypeDecl() + "> list2 = o." + otherSide().getImplAttributeField() + ";\n");
     sb.append(ind(2) + "if (list2 == null) {\n");
     sb.append(ind(3) + "list2 = new "+ ASTNode.listClass + "<>();\n");
     sb.append(ind(2) + "}\n");
@@ -97,11 +97,11 @@ aspect BackendBidirectionalAPI {
     String addMethodDecl2 = "void " + getTypeUse().decl() + ".add" + (useJastAddNames ? "" : "To") + nameCapitalized() + "(int index, " + ofTypeDecl() + " o)";
     sb.append(ind(1) + "public " + addMethodDecl2 + " {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
     sb.append(ind(2) + "if (list == null) {\n");
     sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n");
     sb.append(ind(2) + "}\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + otherSide().ofTypeDecl() + "> list2 = o." + otherSide().getImplAttributeField() + ";\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + otherSide().ofTypeDecl() + "> list2 = o." + otherSide().getImplAttributeField() + ";\n");
     sb.append(ind(2) + "if (list2 == null) {\n");
     sb.append(ind(3) + "list2 = new "+ ASTNode.listClass + "<>();\n");
     sb.append(ind(2) + "}\n");
@@ -115,9 +115,9 @@ aspect BackendBidirectionalAPI {
     String removeMethodDecl = "void " + getTypeUse().decl() + ".remove" + (useJastAddNames ? "" : "From") + nameCapitalized() + "(" + ofTypeDecl() + " o)";
     sb.append(ind(1) + "public " + removeMethodDecl + " {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
     sb.append(ind(2) + "if (list != null && list.remove(o)) {\n");
-    sb.append(ind(3) + ASTNode.listClass + "<" + otherSide().ofTypeDecl() + "> list2 = o." + otherSide().getImplAttributeField() + ";\n");
+    sb.append(ind(3) + ASTNode.listInterface + "<" + otherSide().ofTypeDecl() + "> list2 = o." + otherSide().getImplAttributeField() + ";\n");
     sb.append(ind(3) + "if (list2 != null) list2.remove(this);\n");
     sb.append(ind(3) + "set" + getImplAttributeName() + "(list);\n");
     sb.append(ind(3) + "o.set" + otherSide().getImplAttributeName() + "(list2);\n");
@@ -143,7 +143,7 @@ aspect BackendBidirectionalAPI {
       String getMethodDecl = "java.util.List<" + ofTypeDecl() + "> " + getTypeUse().decl() + "." + name() + "()";
       sb.append("public " + getMethodDecl + " {\n");
     }
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> l = get" + getImplAttributeName() + "();\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + ofTypeDecl() + "> l = get" + getImplAttributeName() + "();\n");
     // resolve the entire list
     if (resolverHelper | serializer) {
       sb.append(ind(2) + "if (l != null) {\n");
@@ -152,7 +152,7 @@ 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() + globallyResolvePostfix + "(element." + asUnresolvedMethod + "()." + getUnresolvedTokenMethod + "(), i);\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(6) + getTypeUse().decl() + " oldTarget = resolvedElement." + otherSide().getImplAttributeField() + ";\n");
       sb.append(ind(6) + "if (oldTarget != null && oldTarget != this) {\n");
@@ -183,11 +183,11 @@ aspect BackendBidirectionalAPI {
     sb.append(ind(1) + "public " + addMethodDecl1 + " {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
     sb.append(ind(2) + "if (o != null && o." + otherSide().getImplAttributeField() + " != null) {\n");
-    sb.append(ind(3) + ASTNode.listClass + "<" + ofTypeDecl() + "> list2 = o." + otherSide().getImplAttributeField() + "." + getImplAttributeField() + ";\n");
+    sb.append(ind(3) + ASTNode.listInterface + "<" + ofTypeDecl() + "> list2 = o." + otherSide().getImplAttributeField() + "." + getImplAttributeField() + ";\n");
     sb.append(ind(3) + "if (list2.remove(o))\n");
     sb.append(ind(4) + "o." + otherSide().getImplAttributeField()  + ".set" + getImplAttributeName() + "(list2);\n");
     sb.append(ind(2) + "}\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
     sb.append(ind(2) + "if (list == null) {\n");
     sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n");
     sb.append(ind(2) + "}\n");
@@ -201,11 +201,11 @@ aspect BackendBidirectionalAPI {
     sb.append(ind(1) + "public " + addMethodDecl2 + " {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
     sb.append(ind(2) + "if (o != null && o." + otherSide().getImplAttributeField() + " != null) {\n");
-    sb.append(ind(3) + ASTNode.listClass + "<" + ofTypeDecl() + "> list2 = o." + otherSide().getImplAttributeField() + "." + getImplAttributeField() + ";\n");
+    sb.append(ind(3) + ASTNode.listInterface + "<" + ofTypeDecl() + "> list2 = o." + otherSide().getImplAttributeField() + "." + getImplAttributeField() + ";\n");
     sb.append(ind(3) + "if (list2.remove(o))\n");
     sb.append(ind(4) + "o." + otherSide().getImplAttributeField() + ".set" + getImplAttributeName() + "(list2);\n");
     sb.append(ind(2) + "}\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
     sb.append(ind(2) + "if (list == null) {\n");
     sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n");
     sb.append(ind(2) + "}\n");
@@ -218,7 +218,7 @@ aspect BackendBidirectionalAPI {
     String removeMethodDecl = "void " + getTypeUse().decl() + ".remove" + (useJastAddNames ? "" : "From") + nameCapitalized() + "(" + ofTypeDecl() + " o)";
     sb.append(ind(1) + "public " + removeMethodDecl + " {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
     sb.append(ind(2) + "if (list != null && list.remove(o)) {\n");
     sb.append(ind(3) + "set" + getImplAttributeName() + "(list);\n");
     sb.append(ind(3) + "if (o." + otherSide().getImplAttributeField() + " == this) {\n");
@@ -236,7 +236,7 @@ aspect BackendBidirectionalAPI {
       sb.append(ind(2) + "assertNotNull(o);\n");
     }
     sb.append(ind(2) + "if (" + getImplAttributeField() + " != null) {\n");
-    sb.append(ind(3) + ASTNode.listClass + "<" + getTypeUse().decl() + "> list2 = " + getImplAttributeField() + "." + otherSide().getImplAttributeField() + ";\n");
+    sb.append(ind(3) + ASTNode.listInterface + "<" + getTypeUse().decl() + "> list2 = " + getImplAttributeField() + "." + otherSide().getImplAttributeField() + ";\n");
     sb.append(ind(3) + "list2.remove(this);\n");
     sb.append(ind(3) + getImplAttributeField() + "." + "set" + otherSide().getImplAttributeName() + "(list2);\n");
     sb.append(ind(2) + "}\n");
@@ -246,7 +246,7 @@ aspect BackendBidirectionalAPI {
     if (isOpt()) {
       sb.append(ind(2) + "if (o != null) {\n");
     }
-    sb.append(ind(ind) + ASTNode.listClass + "<" + getTypeUse().decl() + "> list = o." + otherSide().getImplAttributeField() + ";\n");
+    sb.append(ind(ind) + ASTNode.listInterface + "<" + getTypeUse().decl() + "> list = o." + otherSide().getImplAttributeField() + ";\n");
     sb.append(ind(ind) + "if (list == null) {\n");
     sb.append(ind(ind+1) + "list = new " + ASTNode.listClass + "<>();\n");
     sb.append(ind(ind) + "}\n");
diff --git a/src/main/jastadd/backend/DirectedAPI.jadd b/src/main/jastadd/backend/DirectedAPI.jadd
index 26a6896781877baf4d48505f689a4fc66e5a3245..e5e315e1fff49fd759af0f4c0789b9d3a32c807b 100644
--- a/src/main/jastadd/backend/DirectedAPI.jadd
+++ b/src/main/jastadd/backend/DirectedAPI.jadd
@@ -30,7 +30,7 @@ aspect BackendDirectedAPI {
       String getMethodDecl = "java.util.List<" + ofTypeDecl() + "> " + getTypeUse().decl() + "." + name() + "()";
       sb.append("public " + getMethodDecl + " {\n");
     }
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> l = get" + getImplAttributeName() + "();\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + ofTypeDecl() + "> l = get" + getImplAttributeName() + "();\n");
     // resolve the entire list
     if (resolverHelper | serializer) {
       sb.append(ind(2) + "if (l != null) {\n");
@@ -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 = resolve" + nameCapitalized() + "ByToken(element." + asUnresolvedMethod + "()." + getUnresolvedTokenMethod + "(), i);\n");
+      sb.append(ind(5) + ofTypeDecl() + " resolvedElement = " + resolvePrefix + "" + nameCapitalized() + "" + resolvePostfix + "(element." + asUnresolvedMethod + "()." + getUnresolvedTokenMethod + "(), i);\n");
       sb.append(ind(5) + "l.set(i, resolvedElement);\n");
       sb.append(ind(4) + "}\n");
       sb.append(ind(3) + "}\n");
@@ -55,7 +55,7 @@ aspect BackendDirectedAPI {
     String addMethodDecl1 = "void " + getTypeUse().decl() + ".add" + (useJastAddNames ? "" : "To") + nameCapitalized() + "(" + ofTypeDecl() + " o)";
     sb.append(ind(1) + "public " + addMethodDecl1 + " {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
     sb.append(ind(2) + "if (list == null) {\n");
     sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n");
     sb.append(ind(2) + "}\n");
@@ -67,7 +67,7 @@ aspect BackendDirectedAPI {
     String addMethodDecl2 = "void " + getTypeUse().decl() + ".add" + (useJastAddNames ? "" : "To") + nameCapitalized() + "(int index, " + ofTypeDecl() + " o)";
     sb.append(ind(1) + "public " + addMethodDecl2 + " {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
     sb.append(ind(2) + "if (list == null) {\n");
     sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n");
     sb.append(ind(2) + "}\n");
@@ -79,7 +79,7 @@ aspect BackendDirectedAPI {
     String removeMethodDecl = "void " + getTypeUse().decl() + ".remove" + (useJastAddNames ? "" : "From") + nameCapitalized() + "(" + ofTypeDecl() + " o)";
     sb.append(ind(1) + "public " + removeMethodDecl + " {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
+    sb.append(ind(2) + ASTNode.listInterface + "<" + ofTypeDecl() + "> list = " + getImplAttributeField() + ";\n");
     sb.append(ind(2) + "if (list != null && list.remove(o)) {\n");
     sb.append(ind(3) + "set" + getImplAttributeName() + "(list);\n");
     sb.append(ind(2) + "}\n");
diff --git a/src/main/jastadd/backend/LowerBoundCheck.jadd b/src/main/jastadd/backend/LowerBoundCheck.jadd
index e7690cacca84527435dc09e7e6a1ff6991089795..12c57b676dccb4b706c2e0b694407f3844a26479 100644
--- a/src/main/jastadd/backend/LowerBoundCheck.jadd
+++ b/src/main/jastadd/backend/LowerBoundCheck.jadd
@@ -6,7 +6,7 @@ aspect LowerBoundCheck {
 
     sb.append(ind(1) + "public java.util.List<Pair<ASTNode, String>> "
       + "ASTNode.getLowerBoundsViolations() {\n");
-    sb.append(ind(2) + "ArrayList<Pair<ASTNode, String>> list = new ArrayList<>();\n");
+    sb.append(ind(2) + "" + ASTNode.listInterface + "<Pair<ASTNode, String>> list = new " + ASTNode.listClass + "<>();\n");
     sb.append(ind(2) + "computeLowerBoundsViolations(list);\n");
     sb.append(ind(2) + "return list;\n");
     sb.append(ind(1) + "}\n");
diff --git a/src/main/jastadd/backend/NameResolution.jadd b/src/main/jastadd/backend/NameResolution.jadd
index 13aa310e9b89b4a6b02a16aef50381b93450b97a..e4fa19c13455d60127a12c77ec310cf081d12e1d 100644
--- a/src/main/jastadd/backend/NameResolution.jadd
+++ b/src/main/jastadd/backend/NameResolution.jadd
@@ -8,8 +8,9 @@ aspect NameResolutionHelper {
   protected static final String ASTNode.createReferenceMethod = "createReference";
   protected static final String ASTNode.createRefMethod = "createRef";
   protected static final String ASTNode.createRefDirectionMethod = "createRefDirection";
+  protected static final String ASTNode.resolvePrefix = "resolve";
   protected static final String ASTNode.globallyResolvePrefix = "globallyResolve";
-  protected static final String ASTNode.globallyResolvePostfix = "ByToken";
+  protected static final String ASTNode.resolvePostfix = "ByToken";
   protected static final String ASTNode.resolveAllMethod = "resolveAll";
   protected static final String ASTNode.treeResolveAllMethod = "treeResolveAll";
 
@@ -87,7 +88,7 @@ aspect NameResolutionHelper {
 
   public void RelationComponent.generateContextDependentRefCreation(StringBuilder sb) {
     sb.append(ind(1) + "// context-dependent reference creation\n");
-    sb.append(ind(1) + "syn String " + getTypeUse().decl() + ".createRefTo" + nameCapitalized() + "(" + ofTypeDecl() + " target) {\n");
+    sb.append(ind(1) + "syn String " + getTypeUse().decl() + "." + createRefMethod + "To" + nameCapitalized() + "(" + ofTypeDecl() + " target) {\n");
     sb.append(ind(2) + "// default to context-independent reference creation\n");
     sb.append(ind(2) + "return target." + createReferenceMethod + "();\n");
     sb.append(ind(1) + "}\n");
@@ -161,8 +162,8 @@ aspect NameResolutionHelper {
 
   public void TypeDecl.generateContextIndependentNameResolution(StringBuilder sb) {
     sb.append(ind(1) + "// context-independent name resolution\n");
-    sb.append(ind(1) + "uncache ASTNode." + globallyResolvePrefix + getID() + globallyResolvePostfix + "(String id);\n");
-    sb.append(ind(1) + "syn " + getID() + " ASTNode." + globallyResolvePrefix + getID() + globallyResolvePostfix + "(String id) {\n");
+    sb.append(ind(1) + "uncache ASTNode." + globallyResolvePrefix + getID() + resolvePostfix + "(String id);\n");
+    sb.append(ind(1) + "syn " + getID() + " ASTNode." + globallyResolvePrefix + getID() + resolvePostfix + "(String id) {\n");
     if (serializer && !manualReferences) {
       if (jsonPointer) {
         sb.append(ind(2) + "return (" + getID() + ") resolveJsonPointer(id);\n");
@@ -206,30 +207,30 @@ aspect NameResolutionHelper {
   public void ManyRelationComponent.generateContextDependentNameResolution(StringBuilder sb) {
 
     if (serializer && !resolverHelper) {
-      sb.append(ind(1) + ofTypeDecl() + " " + getTypeUse().decl() + ".resolve" + nameCapitalized() + globallyResolvePostfix + "(String id, int position) {\n");
+      sb.append(ind(1) + ofTypeDecl() + " " + getTypeUse().decl() + ".resolve" + nameCapitalized() + resolvePostfix + "(String id, int position) {\n");
         sb.append(ind(2) + "return (" + ofTypeDecl() + ") " + globallyResolvePrefix + "ASTNodeByUID(id);\n");
       sb.append(ind(1) + "}\n");
     } else {
       sb.append(ind(1) + "// context-dependent name resolution\n");
-      sb.append(ind(1) + "uncache " + getTypeUse().decl() + ".resolve" + nameCapitalized() + globallyResolvePostfix + "(String id, int position);\n");
-      sb.append(ind(1) + "syn " + ofTypeDecl() + " " + getTypeUse().decl() + ".resolve" + nameCapitalized() + globallyResolvePostfix + "(String id, int position) {\n");
+      sb.append(ind(1) + "uncache " + getTypeUse().decl() + ".resolve" + nameCapitalized() + resolvePostfix + "(String id, int position);\n");
+      sb.append(ind(1) + "syn " + ofTypeDecl() + " " + getTypeUse().decl() + ".resolve" + nameCapitalized() + resolvePostfix + "(String id, int position) {\n");
         sb.append(ind(2) + "// default to context-independent name resolution\n");
-        sb.append(ind(2) + "return " + globallyResolvePrefix + ofTypeDecl() + globallyResolvePostfix + "(id);\n");
+        sb.append(ind(2) + "return " + globallyResolvePrefix + ofTypeDecl() + resolvePostfix + "(id);\n");
       sb.append(ind(1) + "}\n");
     }
   }
 
   public void RelationComponent.generateDirectedContextDependentNameResolution(StringBuilder sb) {
     if (serializer && !resolverHelper) {
-      sb.append(ind(1) + ofTypeDecl() + " " + getTypeUse().decl() + ".resolve" + nameCapitalized() + globallyResolvePostfix + "(String id) {\n");
+      sb.append(ind(1) + ofTypeDecl() + " " + getTypeUse().decl() + ".resolve" + nameCapitalized() + resolvePostfix + "(String id) {\n");
         sb.append(ind(2) + "return (" + ofTypeDecl() + ") " + globallyResolvePrefix + "ASTNodeByUID(id);\n");
       sb.append(ind(1) + "}\n");
     } else {
       sb.append(ind(1) + "// context-dependent name resolution\n");
-      sb.append(ind(1) + "uncache " + getTypeUse().decl() + ".resolve" + nameCapitalized() + globallyResolvePostfix + "(String id);\n");
-      sb.append(ind(1) + "syn " + ofTypeDecl() + " " + getTypeUse().decl() + ".resolve" + nameCapitalized() + globallyResolvePostfix + "(String id) {\n");
+      sb.append(ind(1) + "uncache " + getTypeUse().decl() + ".resolve" + nameCapitalized() + resolvePostfix + "(String id);\n");
+      sb.append(ind(1) + "syn " + ofTypeDecl() + " " + getTypeUse().decl() + ".resolve" + nameCapitalized() + resolvePostfix + "(String id) {\n");
         sb.append(ind(2) + "// default to context-independent name resolution\n");
-        sb.append(ind(2) + "return " + globallyResolvePrefix + ofTypeDecl() + globallyResolvePostfix + "(id);\n");
+        sb.append(ind(2) + "return " + globallyResolvePrefix + ofTypeDecl() + resolvePostfix + "(id);\n");
       sb.append(ind(1) + "}\n");
     }
   }
diff --git a/src/main/jastadd/backend/Serializer.jadd b/src/main/jastadd/backend/Serializer.jadd
index 90ba24e30df96ba67eb8d3bec543347648d58879..9e89e7f54ca786727178ebb8d4817ce49170d3fd 100644
--- a/src/main/jastadd/backend/Serializer.jadd
+++ b/src/main/jastadd/backend/Serializer.jadd
@@ -209,7 +209,7 @@ aspect Serializer {
       if (jsonPointer) {
         sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "().jsonPointer());\n");
       } else if (manualReferences) {
-        sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", createRefTo" + getID() + "(" + getID() + "()));\n");
+        sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", " + createRefMethod + "To" + getID() + "(" + getID() + "()));\n");
       } else {
         sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", get" + getID() + "().unique$Id());\n");
       }
@@ -217,7 +217,7 @@ aspect Serializer {
       if (jsonPointer) {
         sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", " + getID() + "().jsonPointer());\n");
       } else if (manualReferences) {
-        sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", createRefTo" + getID() + "(" + getID() + "()));\n");
+        sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", " + createRefMethod + "To" + getID() + "(" + getID() + "()));\n");
       } else {
         sb.append(ind(indent) + "g.writeStringField(\"" + getID() + "\", " + getID() + "().unique$Id());\n");
       }
@@ -238,7 +238,7 @@ aspect Serializer {
       if (jsonPointer) {
         sb.append(ind(indent + 1) + "g.writeStringField(\"" + getID() + "\", " + getID() + "().jsonPointer());\n");
       } else if (manualReferences) {
-        sb.append(ind(indent + 1) + "g.writeStringField(\"" + getID() + "\", " + "createRefTo" + getID() + "(" + getID()  + "()));\n");
+        sb.append(ind(indent + 1) + "g.writeStringField(\"" + getID() + "\", " + "" + createRefMethod + "To" + getID() + "(" + getID()  + "()));\n");
       } else {
         sb.append(ind(indent + 1) + "g.writeStringField(\"" + getID() + "\", " + getID() + "().unique$Id());\n");
       }
@@ -256,7 +256,7 @@ aspect Serializer {
     if (jsonPointer) {
       sb.append(ind(indent + 1) + "g.writeString(child.jsonPointer());\n");
     }  else if (manualReferences) {
-      sb.append(ind(indent + 1) + "g.writeString(createRefTo" + getID() + "(child));\n");
+      sb.append(ind(indent + 1) + "g.writeString(" + createRefMethod + "To" + getID() + "(child));\n");
     }else {
       sb.append(ind(indent + 1) + "g.writeString(child.unique$Id());\n");
     }
@@ -565,11 +565,11 @@ aspect Serializer {
     sb.append(ind(1) + "  return null;\n");
     sb.append(ind(1) + "}\n");
     sb.append("\n");
-    sb.append(ind(1) + "ASTNode ASTNode.globallyResolveASTNodeByUID(String uid) {\n");
+    sb.append(ind(1) + "ASTNode ASTNode." + globallyResolvePrefix + "ASTNodeByUID(String uid) {\n");
     sb.append(ind(2) + "if (getParent() == null) {\n");
     sb.append(ind(3) + "return uid$Map().get(uid).get();\n");
     sb.append(ind(2) + "} else {\n");
-    sb.append(ind(3) + "return getParent().globallyResolveASTNodeByUID(uid);\n");
+    sb.append(ind(3) + "return getParent()." + globallyResolvePrefix + "ASTNodeByUID(uid);\n");
     sb.append(ind(2) + "}\n");
     sb.append(ind(1) + "}\n");
     sb.append("\n");
@@ -616,18 +616,18 @@ aspect Serializer {
   }
 
   public void OneRelationComponent.deserialize(StringBuilder sb, int indent) {
-    sb.append(ind(indent) + "element.set" + nameCapitalized() + "(" + ofTypeDecl().getID() + ".createRefDirection(relations.get(\"" + getID() + "\").asText()));\n");
+    sb.append(ind(indent) + "element.set" + nameCapitalized() + "(" + ofTypeDecl().getID() + "." + createRefMethod + "Direction(relations.get(\"" + getID() + "\").asText()));\n");
     sb.append(ind(indent - 1) + "} else {\n");
     sb.append(ind(indent) + "throw new DeserializationException(\"deserializer of missing mandatory relation child " + getID() + "\");\n");
   }
 
   public void OptionalRelationComponent.deserialize(StringBuilder sb, int indent) {
-    sb.append(ind(indent) + "element.set" + nameCapitalized() + "(" + ofTypeDecl().getID() + ".createRefDirection(relations.get(\"" + getID() + "\").asText()));\n");
+    sb.append(ind(indent) + "element.set" + nameCapitalized() + "(" + ofTypeDecl().getID() + "." + createRefMethod + "Direction(relations.get(\"" + getID() + "\").asText()));\n");
   }
 
   public void ManyRelationComponent.deserialize(StringBuilder sb, int indent) {
     sb.append(ind(indent) + "for (" + jsonNodeType + " child : relations.get(\"" + getID() + "\")) {\n");
-    sb.append(ind(indent + 1) + "element.add" + (useJastAddNames?"":"To") + nameCapitalized() + "(" + ofTypeDecl().getID() + ".createRefDirection(child.asText()));\n");
+    sb.append(ind(indent + 1) + "element.add" + (useJastAddNames?"":"To") + nameCapitalized() + "(" + ofTypeDecl().getID() + "." + createRefMethod + "Direction(child.asText()));\n");
     sb.append(ind(indent) + "}\n");
   }
 }