diff --git a/Mustache.relast b/Mustache.relast
index 94f4ab20fdc3838348bd53b812b3d1477cae3558..98b475bc84944c01621daab3f1bb8612dbd5589d 100644
--- a/Mustache.relast
+++ b/Mustache.relast
@@ -1,4 +1,4 @@
-Document ::= <FileName> ComplexElement* ;
+Document ::= <FileName> [RootElement:ComplexElement] ;
 abstract Element ;
 abstract ComplexElement : Element ;
 MappingElement : ComplexElement ::= KeyValuePair* ;
diff --git a/Navigation.jrag b/Navigation.jrag
index 8a147930c42af69e2f828ae63b73eeaa9c565e33..5ad8611944c1eb4623978d603da80121f5ee843a 100644
--- a/Navigation.jrag
+++ b/Navigation.jrag
@@ -1,9 +1,4 @@
 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;
 
diff --git a/Printing.jrag b/Printing.jrag
index 74607aeb7737e1e43c9565b799693889a648a9df..8da958d1e5eb4fd31fbfddd642bf58cf58d2fb02 100644
--- a/Printing.jrag
+++ b/Printing.jrag
@@ -1,37 +1,40 @@
 aspect Printing {
   String ASTNode.PRINT_INDENT = "  ";
 
-  syn String MappingDefinitionType.prettyPrint();
-  eq JavaMappingDefinitionType.prettyPrint() = getType().getName();
-  eq JavaArrayMappingDefinitionType.prettyPrint() = getType().getName() + "[]";
-
-  syn String JavaTypeUse.prettyPrint() {
-    StringBuilder sb = new StringBuilder();
-    generateAbstractGrammar(sb);
-    return sb.toString();
+  public String Document.prettyPrint() {
+    return prettyPrint(true);
   }
 
-  syn String Document.prettyPrint() {
+  public String Document.prettyPrint(boolean prependCreationComment) {
     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 (prependCreationComment) {
+      sb.append("# RagConnect created at ").append(java.time.Instant.now()).append("\n");
     }
-    if (sb.charAt(sb.length() - 1) != '\n') {
+    if (hasRootElement()) {
+      getRootElement().prettyPrint(sb, false, "");
+    }
+    if (sb.length() > 0 && 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) {
+
+  abstract protected StringBuilder Element.prettyPrint(StringBuilder sb, boolean printIndent, String indent);
+
+  @Override
+  protected StringBuilder ValueElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
     sb.append(getValue());
     return sb;
   }
-  eq StringElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
+
+  @Override
+  protected StringBuilder StringElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
     sb.append("\"").append(getValue()).append("\"");
     return sb;
   }
-  eq ListElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
+
+  @Override
+  protected StringBuilder ListElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
     if (isEmpty()) {
       sb.append("[]");
     } else {
@@ -45,18 +48,23 @@ aspect Printing {
     }
     return sb;
   }
-  eq KeyValuePair.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
+
+  @Override
+  protected StringBuilder KeyValuePair.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
     if (printIndent) sb.append(indent);
-    sb.append(getKey()).append(": ");
+    sb.append(getKey()).append(":");
     if (getValue().isComplex() && !getValue().isEmpty()) {
       sb.append("\n");
       getValue().prettyPrint(sb, true, indent + PRINT_INDENT);  //);
     } else {
+      sb.append(" ");
       getValue().prettyPrint(sb, false, indent);
     }
     return sb;
   }
-  eq MappingElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
+
+  @Override
+  protected StringBuilder MappingElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
     if (isEmpty()) {
       sb.append("{}");
     } else {