diff --git a/.gitmodules b/.gitmodules
index 9971a6482e1a133c7c7d1aeb85778a9563ec59b1..0cf1e8a6d073c7c58b0881fe53f5642e6a1022e7 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,3 +1,6 @@
 [submodule "relast-preprocessor"]
 	path = relast-preprocessor
 	url = ../relast-preprocessor.git
+[submodule "ragconnect.base/src/main/jastadd/mustache"]
+	path = ragconnect.base/src/main/jastadd/mustache
+	url = ../mustache
diff --git a/ragconnect.base/build.gradle b/ragconnect.base/build.gradle
index 5fd73e5ac109155cd84315d3890e059353db3ef2..153a3be2b1c37d31784bc0d4075b77a53b4f0a87 100644
--- a/ragconnect.base/build.gradle
+++ b/ragconnect.base/build.gradle
@@ -51,7 +51,7 @@ task newVersion() {
     }
 }
 
-File genSrc = file("src/gen/java");
+File genSrc = file("src/gen/java")
 sourceSets.main.java.srcDir genSrc
 idea.module.generatedSourceDirs += genSrc
 
@@ -67,16 +67,20 @@ jar {
     archiveBaseName = 'ragconnect'
 }
 
+File preprocessorGrammar = file('../relast-preprocessor/src/main/jastadd/RelAst.relast')
+File ragConnectGrammar = file('./src/main/jastadd/RagConnect.relast')
+File intermediateGrammar = file('./src/main/jastadd/intermediate/MustacheNodes.relast')
+File mustacheGrammar = file('./src/main/jastadd/mustache/Mustache.relast')
 task relast(type: JavaExec) {
     group = 'Build'
     main = "-jar"
 
     args = [
             "../libs/relast.jar",
-            "../relast-preprocessor/src/main/jastadd/RelAst.relast",
-            "./src/main/jastadd/RagConnect.relast",
-            "./src/main/jastadd/MustacheNodes.relast",
-            "./src/main/jastadd/YAML.relast",
+            preprocessorGrammar,
+            ragConnectGrammar,
+            intermediateGrammar,
+            mustacheGrammar,
             "--listClass=java.util.ArrayList",
             "--jastAddList=JastAddList",
             "--useJastAddNames",
@@ -86,10 +90,10 @@ task relast(type: JavaExec) {
     ]
 
     inputs.files("../libs/relast.jar",
-            "../relast-preprocessor/src/main/jastadd/RelAst.relast",
-            "./src/main/jastadd/RagConnect.relast",
-            "./src/main/jastadd/MustacheNodes.relast",
-            "./src/main/jastadd/YAML.relast")
+            preprocessorGrammar,
+            ragConnectGrammar,
+            intermediateGrammar,
+            mustacheGrammar)
     outputs.files("./src/gen/jastadd/RagConnect.ast",
             "./src/gen/jastadd/RagConnect.jadd",
             "./src/gen/jastadd/RagConnectRefResolver.jadd",
diff --git a/ragconnect.base/src/main/jastadd/backend/Configuration.jadd b/ragconnect.base/src/main/jastadd/Configuration.jadd
similarity index 100%
rename from ragconnect.base/src/main/jastadd/backend/Configuration.jadd
rename to ragconnect.base/src/main/jastadd/Configuration.jadd
diff --git a/ragconnect.base/src/main/jastadd/Printing.jrag b/ragconnect.base/src/main/jastadd/Printing.jrag
index 74607aeb7737e1e43c9565b799693889a648a9df..89b9b82a9abea9786979b3864449f529b57bbd96 100644
--- a/ragconnect.base/src/main/jastadd/Printing.jrag
+++ b/ragconnect.base/src/main/jastadd/Printing.jrag
@@ -1,6 +1,4 @@
 aspect Printing {
-  String ASTNode.PRINT_INDENT = "  ";
-
   syn String MappingDefinitionType.prettyPrint();
   eq JavaMappingDefinitionType.prettyPrint() = getType().getName();
   eq JavaArrayMappingDefinitionType.prettyPrint() = getType().getName() + "[]";
@@ -10,66 +8,4 @@ aspect Printing {
     generateAbstractGrammar(sb);
     return sb.toString();
   }
-
-  syn String Document.prettyPrint() {
-    StringBuilder sb = new StringBuilder();
-    sb.append("# RagConnect created at ").append(java.time.Instant.now()).append("\n");
-    for (ComplexElement element : getComplexElementList()) {
-      element.prettyPrint(sb, false, "");
-    }
-    if (sb.charAt(sb.length() - 1) != '\n') {
-      sb.append("\n");
-    }
-    return sb.toString();
-  }
-  syn StringBuilder Element.prettyPrint(StringBuilder sb, boolean printIndent, String indent);
-  eq ValueElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
-    sb.append(getValue());
-    return sb;
-  }
-  eq StringElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
-    sb.append("\"").append(getValue()).append("\"");
-    return sb;
-  }
-  eq ListElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
-    if (isEmpty()) {
-      sb.append("[]");
-    } else {
-      for (Element element : getElementList()) {
-        sb.append(indent).append("- ");
-        element.prettyPrint(sb, false, indent + PRINT_INDENT);
-        sb.append("\n");
-      }
-      // delete last newline
-      sb.deleteCharAt(sb.length() - 1);
-    }
-    return sb;
-  }
-  eq KeyValuePair.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
-    if (printIndent) sb.append(indent);
-    sb.append(getKey()).append(": ");
-    if (getValue().isComplex() && !getValue().isEmpty()) {
-      sb.append("\n");
-      getValue().prettyPrint(sb, true, indent + PRINT_INDENT);  //);
-    } else {
-      getValue().prettyPrint(sb, false, indent);
-    }
-    return sb;
-  }
-  eq MappingElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
-    if (isEmpty()) {
-      sb.append("{}");
-    } else {
-      boolean first = true;
-      for (KeyValuePair pair : getKeyValuePairList()) {
-        if (!first || printIndent) sb.append(indent);
-        first = false;
-        pair.prettyPrint(sb, false, indent);  // + PRINT_INDENT
-        sb.append("\n");
-      }
-      // delete last newline
-      sb.deleteCharAt(sb.length() - 1);
-    }
-    return sb;
-  }
 }
diff --git a/ragconnect.base/src/main/jastadd/YAML.jrag b/ragconnect.base/src/main/jastadd/YAML.jrag
deleted file mode 100644
index 93dd0f34b7b7b0505cf0970b6541fa3ae5bee7fa..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/YAML.jrag
+++ /dev/null
@@ -1,31 +0,0 @@
-aspect Navigation {
-  eq Document.getChild().program() = null;
-  eq Document.getChild().ragconnect() = null;
-  eq Document.getChild().containedFile() = null;
-  eq Document.getChild().containedFileName() = getFileName();
-
-  syn boolean Element.isComplex() = false;
-  eq ComplexElement.isComplex() = true;
-
-  syn boolean Element.isEmpty() = false;
-  eq MappingElement.isEmpty() = getNumKeyValuePair() == 0;
-  eq ListElement.isEmpty() = getNumElement() == 0;
-}
-
-aspect Helper {
-  public static ValueElement ValueElement.of(int value) {
-    return new ValueElement(String.valueOf(value));
-  }
-  public static ValueElement ValueElement.of(boolean value) {
-    return new ValueElement(String.valueOf(value));
-  }
-  public static ValueElement ValueElement.of(String value) {
-    return new ValueElement(value);
-  }
-  public static StringElement StringElement.of(String value) {
-    return new StringElement(value);
-  }
-  public void MappingElement.addKeyValuePair(String key, Element value) {
-    addKeyValuePair(new KeyValuePair(key, value));
-  }
-}
diff --git a/ragconnect.base/src/main/jastadd/YAML.relast b/ragconnect.base/src/main/jastadd/YAML.relast
deleted file mode 100644
index 94f4ab20fdc3838348bd53b812b3d1477cae3558..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/jastadd/YAML.relast
+++ /dev/null
@@ -1,9 +0,0 @@
-Document ::= <FileName> ComplexElement* ;
-abstract Element ;
-abstract ComplexElement : Element ;
-MappingElement : ComplexElement ::= KeyValuePair* ;
-KeyValuePair : ComplexElement ::= <Key> Value:Element ;
-ListElement : ComplexElement ::= Element* ;
-abstract SimpleElement : Element ;
-ValueElement : SimpleElement ::= <Value> ;
-StringElement : SimpleElement ::= <Value> ;
diff --git a/ragconnect.base/src/main/jastadd/backend/Generation.jadd b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
similarity index 100%
rename from ragconnect.base/src/main/jastadd/backend/Generation.jadd
rename to ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
diff --git a/ragconnect.base/src/main/jastadd/backend/Mappings.jrag b/ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
similarity index 100%
rename from ragconnect.base/src/main/jastadd/backend/Mappings.jrag
rename to ragconnect.base/src/main/jastadd/intermediate/Mappings.jrag
diff --git a/ragconnect.base/src/main/jastadd/MustacheNodes.relast b/ragconnect.base/src/main/jastadd/intermediate/MustacheNodes.relast
similarity index 100%
rename from ragconnect.base/src/main/jastadd/MustacheNodes.relast
rename to ragconnect.base/src/main/jastadd/intermediate/MustacheNodes.relast
diff --git a/ragconnect.base/src/main/jastadd/backend/MustacheNodesToYAML.jrag b/ragconnect.base/src/main/jastadd/intermediate2mustache/MustacheNodesToYAML.jrag
similarity index 96%
rename from ragconnect.base/src/main/jastadd/backend/MustacheNodesToYAML.jrag
rename to ragconnect.base/src/main/jastadd/intermediate2mustache/MustacheNodesToYAML.jrag
index 2894d3a8a531a190e8146121dc8e7c97f2cecc91..67fc12fe1fe146459262338ad77779e619ebe300 100644
--- a/ragconnect.base/src/main/jastadd/backend/MustacheNodesToYAML.jrag
+++ b/ragconnect.base/src/main/jastadd/intermediate2mustache/MustacheNodesToYAML.jrag
@@ -60,7 +60,7 @@ aspect MustacheNodesToYAML {
     }
     root.addKeyValuePair("TokenComponents", tokenComponents);
 
-    doc.addComplexElement(root);
+    doc.setRootElement(root);
     return doc;
   }
 
@@ -151,5 +151,11 @@ aspect MustacheNodesToYAML {
     }
     return innerMappingDefinitions;
   }
+}
 
+aspect Navigation {
+  eq Document.getChild().program() = null;
+  eq Document.getChild().ragconnect() = null;
+  eq Document.getChild().containedFile() = null;
+  eq Document.getChild().containedFileName() = getFileName();
 }
diff --git a/ragconnect.base/src/main/jastadd/mustache b/ragconnect.base/src/main/jastadd/mustache
new file mode 160000
index 0000000000000000000000000000000000000000..2bf869031ffc69bdb88dafd2cb4464a26502ae2b
--- /dev/null
+++ b/ragconnect.base/src/main/jastadd/mustache
@@ -0,0 +1 @@
+Subproject commit 2bf869031ffc69bdb88dafd2cb4464a26502ae2b
diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java
index ee9ed046348efeaa4b12dbc816c55414d93289cf..b04e4776d3c23d7f11d1c49b237c4227e4c67b30 100644
--- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java
@@ -82,7 +82,7 @@ public class SimpleMain {
     firstLevel.addKeyValuePair(goalPoses);
 
     root.setValue(firstLevel);
-    doc.addComplexElement(root);
+    doc.setRootElement(root);
 
     System.out.println(doc.prettyPrint());
   }