diff --git a/src/main/jastadd/Backend.jadd b/src/main/jastadd/Backend.jadd
index 87e74b97f14952b4a7abe3492ca498a1b4642b2c..1425ec6c2aa96282f66b006a259bc3537a058e40 100644
--- a/src/main/jastadd/Backend.jadd
+++ b/src/main/jastadd/Backend.jadd
@@ -114,6 +114,16 @@ aspect BackendAbstractGrammar {
   public String RelationComponent.getImplAttributeName() {
     return "_impl_" + getID();
   }
+
+  public String RelationComponent.getImplAttributeField() {
+    //  tt.bind("TypeInSignature", ASTNode.convTypeNameToSignature(type()));
+    return "token" + ofTypeDecl() + "__impl_" + getID();
+  }
+
+  public String ManyRelationComponent.getImplAttributeField() {
+    //  tt.bind("TypeInSignature", ASTNode.convTypeNameToSignature(type()));
+    return "token" + listClass + "_" + ofTypeDecl() + "___impl_" + getID();
+  }
 }
 
 aspect BackendAspect {
@@ -274,7 +284,7 @@ aspect BackendDirectedAPI {
     }
     sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
+    sb.append(ind(2) + ASTNode.listClass + "<" + 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");
@@ -289,7 +299,7 @@ aspect BackendDirectedAPI {
     }
     sb.append(nameCapitalized() + "(int index, " + ofTypeDecl() + " o) {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
+    sb.append(ind(2) + ASTNode.listClass + "<" + 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");
@@ -304,7 +314,7 @@ aspect BackendDirectedAPI {
     }
     sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
+    sb.append(ind(2) + ASTNode.listClass + "<" + 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");
@@ -320,11 +330,11 @@ aspect BackendDirectedAPI {
     }
     sb.append("() {\n");
     if (resolverHelper | serializer) {
-      sb.append(ind(2) + "if (get" + getImplAttributeName() + "() != null && get" + getImplAttributeName() + "().is$Unresolved()) {\n");
-        sb.append(ind(3) + "if (get" + getImplAttributeName() + "().as$Unresolved().getUnresolved$ResolveOpposite()) {\n");
-          sb.append(ind(4) + "set" + nameCapitalized() + "(resolve" + nameCapitalized() + "ByToken(get" + getImplAttributeName() + "().as$Unresolved().getUnresolved$Token()));\n");
+      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(3) + "} else {\n");
-          sb.append(ind(4) + "set" + getImplAttributeName() + "(resolve" + nameCapitalized() + "ByToken(get" + getImplAttributeName() + "().as$Unresolved().getUnresolved$Token()));\n");
+          sb.append(ind(4) + "set" + getImplAttributeName() + "(resolve" + nameCapitalized() + "ByToken(" + getImplAttributeField() + ".as$Unresolved().getUnresolved$Token()));\n");
         sb.append(ind(3) + "}\n");
       sb.append(ind(2) + "}\n");
     }
@@ -405,15 +415,15 @@ aspect BackendBidirectionalAPI {
       sb.append(ind(2) + "assertNotNull(o);\n");
     }
     // unset the old opposite
-    sb.append(ind(2) + "if (get" + getImplAttributeName() + "() != null) {\n");
-    sb.append(ind(3) + "get" + getImplAttributeName() + "().set" + otherSide().getImplAttributeName() + "(null);\n");
+    sb.append(ind(2) + "if (" + getImplAttributeField() + " != null) {\n");
+    sb.append(ind(3) + "" + getImplAttributeField() + ".set" + otherSide().getImplAttributeName() + "(null);\n");
     sb.append(ind(2) + "}\n");
     if (resolverHelper | serializer) {
-      sb.append(ind(2) + "if (o != null && !o.is$Unresolved() && o.get" + otherSide().getImplAttributeName() + "() != null) {\n");
+      sb.append(ind(2) + "if (o != null && !o.is$Unresolved() && o." + otherSide().getImplAttributeField() + " != null) {\n");
     } else {
-      sb.append(ind(2) + "if (o != null && o.get" + otherSide().getImplAttributeName() + "() != null) {\n");
+      sb.append(ind(2) + "if (o != null && o." + otherSide().getImplAttributeField() + " != null) {\n");
     }
-    sb.append(ind(3) + "o.get" + otherSide().getImplAttributeName() + "().set" + getImplAttributeName() + "(null);\n");
+    sb.append(ind(3) + "o." + otherSide().getImplAttributeField() + ".set" + getImplAttributeName() + "(null);\n");
     sb.append(ind(2) + "}\n");
     sb.append(ind(2) + "set" + getImplAttributeName() + "(o);\n");
     if (resolverHelper | serializer) {
@@ -470,7 +480,7 @@ aspect BackendBidirectionalAPI {
             sb.append(ind(5) + "changed = true;\n");
             sb.append(ind(5) + ofTypeDecl() + " resolvedElement = resolve" + nameCapitalized() + "ByToken(element.as$Unresolved().getUnresolved$Token(), i);\n");
             sb.append(ind(5) + "if (resolvedElement != null && element.as$Unresolved().getUnresolved$ResolveOpposite()) {\n");
-              sb.append(ind(6) + ASTNode.listClass + "<" + toTypeDecl() + "> otherList = resolvedElement.get" + opposite.getImplAttributeName() + "();\n");
+              sb.append(ind(6) + ASTNode.listClass + "<" + toTypeDecl() + "> otherList = resolvedElement." + opposite.getImplAttributeField() + ";\n");
               sb.append(ind(6) + "if (otherList == null) {\n");
                 sb.append(ind(7) + "otherList = new " + listClass + "<>();\n");
               sb.append(ind(6) + "}\n");
@@ -495,12 +505,11 @@ aspect BackendBidirectionalAPI {
     }
     sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
+    sb.append(ind(2) + ASTNode.listClass + "<" + 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.get"
-      + otherSide().getImplAttributeName() + "();\n");
+    sb.append(ind(2) + ASTNode.listClass + "<" + 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");
@@ -517,12 +526,12 @@ aspect BackendBidirectionalAPI {
     }
     sb.append(nameCapitalized() + "(int index, " + ofTypeDecl() + " o) {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
+    sb.append(ind(2) + ASTNode.listClass + "<" + 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.get"
-    + otherSide().getImplAttributeName() + "();\n");
+    sb.append(ind(2) + ASTNode.listClass + "<" + 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");
@@ -539,10 +548,10 @@ aspect BackendBidirectionalAPI {
     }
     sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
+    sb.append(ind(2) + ASTNode.listClass + "<" + 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.get"
-      + otherSide().getImplAttributeName() + "();\n");
+    sb.append(ind(3) + ASTNode.listClass + "<" + 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");
@@ -577,9 +586,9 @@ aspect BackendBidirectionalAPI {
             sb.append(ind(5) + "changed = true;\n");
             sb.append(ind(5) + ofTypeDecl() + " resolvedElement = resolve" + nameCapitalized() + "ByToken(element.as$Unresolved().getUnresolved$Token(), i);\n");
             sb.append(ind(5) + "if (element.as$Unresolved().getUnresolved$ResolveOpposite()) {\n");
-              sb.append(ind(6) + toTypeDecl() + " oldTarget = resolvedElement.get" + opposite.getImplAttributeName() + "();\n");
+              sb.append(ind(6) + toTypeDecl() + " oldTarget = resolvedElement." + opposite.getImplAttributeField() + ";\n");
               sb.append(ind(6) + "if (oldTarget != null && oldTarget != this) {\n");
-                sb.append(ind(7) + "oldTarget.get" + getImplAttributeName() + "().remove(resolvedElement);\n");
+                sb.append(ind(7) + "oldTarget." + getImplAttributeField() + ".remove(resolvedElement);\n");
               sb.append(ind(6) + "}\n");
               sb.append(ind(6) + "if (oldTarget == this) {\n");
                 sb.append(ind(7) + "l.remove(i);\n");
@@ -608,14 +617,14 @@ aspect BackendBidirectionalAPI {
     }
     sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + "if (o != null && o.get" + otherSide().getImplAttributeName() + "() != null) {\n");
-    sb.append(ind(3) + ASTNode.listClass + "<" + ofTypeDecl() + "> list2 = o.get"
-      + otherSide().getImplAttributeName() + "().get" + getImplAttributeName() + "();\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) + "if (list2.remove(o))\n");
-    sb.append(ind(4) + "o.get" + otherSide().getImplAttributeName()
-      + "().set" + getImplAttributeName() + "(list2);\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 = get" + getImplAttributeName() + "();\n");
+    sb.append(ind(2) + ASTNode.listClass + "<" + 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");
@@ -631,12 +640,12 @@ aspect BackendBidirectionalAPI {
     }
     sb.append(nameCapitalized() + "(int index, " + ofTypeDecl() + " o) {\n");
       sb.append(ind(2) + "assertNotNull(o);\n");
-      sb.append(ind(2) + "if (o != null && o.get" + otherSide().getImplAttributeName() + "() != null) {\n");
-        sb.append(ind(3) + ASTNode.listClass + "<" + ofTypeDecl() + "> list2 = o.get" + otherSide().getImplAttributeName() + "().get" + getImplAttributeName() + "();\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) + "if (list2.remove(o))\n");
-          sb.append(ind(4) + "o.get" + otherSide().getImplAttributeName() + "().set" + getImplAttributeName() + "(list2);\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 = get" + getImplAttributeName() + "();\n");
+      sb.append(ind(2) + ASTNode.listClass + "<" + 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");
@@ -652,10 +661,10 @@ aspect BackendBidirectionalAPI {
     }
     sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n");
     sb.append(ind(2) + "assertNotNull(o);\n");
-    sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n");
+    sb.append(ind(2) + ASTNode.listClass + "<" + 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.get" + otherSide().getImplAttributeName() + "() == this) {\n");
+    sb.append(ind(3) + "if (o." + otherSide().getImplAttributeField() + " == this) {\n");
     sb.append(ind(4) + "o.set" + otherSide().getImplAttributeName() + "(null);\n");
     sb.append(ind(3) + "}\n");
     sb.append(ind(2) + "}\n");
@@ -672,11 +681,11 @@ aspect BackendBidirectionalAPI {
     if (!isOpt) {
       sb.append(ind(2) + "assertNotNull(o);\n");
     }
-    sb.append(ind(2) + "if (get" + getImplAttributeName() + "() != null) {\n");
-    sb.append(ind(3) + ASTNode.listClass + "<" + toTypeDecl() + "> list2 = get" + getImplAttributeName()
-      + "()." + "get" + otherSide().getImplAttributeName() + "();\n");
+    sb.append(ind(2) + "if (" + getImplAttributeField() + " != null) {\n");
+    sb.append(ind(3) + ASTNode.listClass + "<" + toTypeDecl() + "> list2 = " + getImplAttributeField()
+      + "." + otherSide().getImplAttributeField() + ";\n");
     sb.append(ind(3) + "list2.remove(this);\n");
-    sb.append(ind(3) + "get" + getImplAttributeName() + "()." + "set"
+    sb.append(ind(3) + getImplAttributeField() + "." + "set"
       + otherSide().getImplAttributeName() + "(list2);\n");
     sb.append(ind(2) + "}\n");
     sb.append(ind(2) + "set" + getImplAttributeName() + "(o);\n");
@@ -685,8 +694,8 @@ aspect BackendBidirectionalAPI {
     if (isOpt) {
       sb.append(ind(2) + "if (o != null) {\n");
     }
-    sb.append(ind(ind) + ASTNode.listClass + "<" + toTypeDecl() + "> list = o.get"
-      + otherSide().getImplAttributeName() + "();\n");
+    sb.append(ind(ind) + ASTNode.listClass + "<" + toTypeDecl() + "> 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");
@@ -1203,7 +1212,7 @@ aspect Serializer {
     sb.append(ind(3) + "com.fasterxml.jackson.core.JsonFactory factory = mapper.getFactory();\n");
     sb.append(ind(3) + "com.fasterxml.jackson.core.JsonParser parser = factory.createParser(file);\n");
     sb.append(ind(3) + getID() + " result = deserialize((com.fasterxml.jackson.databind.JsonNode)mapper.readTree(parser));\n");
-    sb.append(ind(3) + "result.resolveAll();\n");
+    sb.append(ind(3) + "result.treeResolveAll();\n");
     sb.append(ind(3) + "return result;\n");
     sb.append(ind(2) + "} catch (java.io.IOException e) {\n");
     sb.append(ind(3) + "throw new DeserializationException(\"unable to deserialize \" + file.getAbsolutePath(), e);\n");