diff --git a/build.gradle b/build.gradle
index d4a75cf60a5d4b4f1b75b8cef947428da08bec4a..c986f2a61adf610a9c2e5fdc7fd20eb193a9a46a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -74,6 +74,7 @@ task relast(type: JavaExec) {
             "../relast.preprocessor/src/main/jastadd/RelAst.relast",
             "./src/main/jastadd/RagConnect.relast",
             "./src/main/jastadd/MustacheNodes.relast",
+            "./src/main/jastadd/YAML.relast",
             "--listClass=java.util.ArrayList",
             "--jastAddList=JastAddList",
             "--useJastAddNames",
@@ -83,9 +84,10 @@ task relast(type: JavaExec) {
     ]
 
     inputs.files("../libs/relast.jar",
-            "../relast.preprocessor/src/main/jastadd/RelAST.relast",
+            "../relast.preprocessor/src/main/jastadd/RelAst.relast",
             "./src/main/jastadd/RagConnect.relast",
-            "./src/main/jastadd/MustacheNodes.relast")
+            "./src/main/jastadd/MustacheNodes.relast",
+            "./src/main/jastadd/YAML.relast")
     outputs.files("./src/gen/jastadd/RagConnect.ast",
             "./src/gen/jastadd/RagConnect.jadd",
             "./src/gen/jastadd/RagConnectRefResolver.jadd",
diff --git a/src/main/jastadd/Navigation.jrag b/src/main/jastadd/Navigation.jrag
index 481de3d1c960de76e962c2c8fb087e63b5bd9104..752fc36aea4c59348874c1a08134696a9543b6cb 100644
--- a/src/main/jastadd/Navigation.jrag
+++ b/src/main/jastadd/Navigation.jrag
@@ -15,6 +15,7 @@ aspect Navigation {
   eq MRagConnect.getChild().containedFile() = null;
 
   // --- containedFileName ---
+  eq Grammar.getChild().containedFileName() = null;  // should be in PP
   eq RagConnect.getChild().containedFileName() = getFileName();
   eq MRagConnect.getChild().containedFileName() = null;
 
diff --git a/src/main/jastadd/Printing.jrag b/src/main/jastadd/Printing.jrag
new file mode 100644
index 0000000000000000000000000000000000000000..96484151a05b4aea9707dfa60f71e2fb82e2a842
--- /dev/null
+++ b/src/main/jastadd/Printing.jrag
@@ -0,0 +1,60 @@
+aspect Printing {
+  String ASTNode.PRINT_INDENT = "  ";
+  syn String Document.prettyPrint() {
+    StringBuilder sb = new StringBuilder("#start\n");
+    for (ComplexElement element : getComplexElementList()) {
+      element.prettyPrint(sb, false, "");
+    }
+    if (sb.charAt(sb.length() - 1) != '\n') {
+      sb.append("\n");
+    }
+    sb.append("#end");
+    return sb.toString();
+  }
+  syn StringBuilder Element.prettyPrint(StringBuilder sb, boolean printIndent, String indent);
+  eq StringElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
+    sb.append(getValue());
+    return sb;
+  }
+  eq QuotedStringElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
+    sb.append("\"").append(getValue()).append("\"");
+    return sb;
+  }
+  eq ListElement.prettyPrint(StringBuilder sb, boolean printIndent, String indent) {
+    for (Element element : getElementList()) {
+      sb.append(indent).append("- ");
+      element.prettyPrint(sb, false, indent + PRINT_INDENT);
+      sb.append("\n");
+    }
+    if (getNumElement() > 0) {
+      // 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()) {
+      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) {
+    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");
+    }
+    if (!first) {
+      // delete last newline
+      sb.deleteCharAt(sb.length() - 1);
+    }
+    return sb;
+  }
+}
diff --git a/src/main/jastadd/YAML.relast b/src/main/jastadd/YAML.relast
new file mode 100644
index 0000000000000000000000000000000000000000..47a875edd39b90f1a582a9fa92e9a0178b61ac18
--- /dev/null
+++ b/src/main/jastadd/YAML.relast
@@ -0,0 +1,9 @@
+Document ::= <FileName> ComplexElement* ;
+abstract Element ;
+abstract ComplexElement : Element ;
+MappingElement : ComplexElement ::= KeyValuePair* ;
+KeyValuePair : ComplexElement ::= <Key> Value:Element ;
+ListElement : ComplexElement ::= Element* ;
+abstract SimpleElement : Element ;
+StringElement : SimpleElement ::= <Value> ;
+QuotedStringElement : SimpleElement ::= <Value> ;
diff --git a/src/main/jastadd/YAML_Navigation.jrag b/src/main/jastadd/YAML_Navigation.jrag
new file mode 100644
index 0000000000000000000000000000000000000000..36240f5f6aadd744745bbaf57029023a9bd2e631
--- /dev/null
+++ b/src/main/jastadd/YAML_Navigation.jrag
@@ -0,0 +1,10 @@
+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/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java b/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java
new file mode 100644
index 0000000000000000000000000000000000000000..800ae6cf9b02911ab6eedd3525e8e985d62ceddf
--- /dev/null
+++ b/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java
@@ -0,0 +1,95 @@
+package org.jastadd.ragconnect.compiler;
+
+import org.jastadd.ragconnect.ast.*;
+
+/**
+ * Testing Ros2Rag without parser.
+ *
+ * @author rschoene - Initial contribution
+ */
+public class SimpleMain {
+
+  private static void printManualYAML() {
+    Document doc = new Document();
+    KeyValuePair root = new KeyValuePair();
+    root.setKey("panda_mqtt_connector");
+    MappingElement firstLevel = new MappingElement();
+    firstLevel.addKeyValuePair(new KeyValuePair("server", new QuotedStringElement("tcp://localhost:1883")));
+    firstLevel.addKeyValuePair(new KeyValuePair("robot_speed_factor", new StringElement(".7")));
+
+    KeyValuePair topics = new KeyValuePair();
+    topics.setKey("topics");
+    MappingElement theTopics = new MappingElement();
+    theTopics.addKeyValuePair(new KeyValuePair("robotConfig", new QuotedStringElement("robotconfig")));
+    theTopics.addKeyValuePair(new KeyValuePair("trajectory", new QuotedStringElement("trajectory")));
+    theTopics.addKeyValuePair(new KeyValuePair("nextStep", new QuotedStringElement("ros2rag/nextStep")));
+    topics.setValue(theTopics);
+    firstLevel.addKeyValuePair(topics);
+
+    firstLevel.addKeyValuePair(new KeyValuePair("zone_size", new StringElement("0.5")));
+
+    KeyValuePair zones = new KeyValuePair();
+    zones.setKey("zones");
+    ListElement theZones = new ListElement();
+    theZones.addElement(new QuotedStringElement("1 1"));
+    theZones.addElement(new QuotedStringElement("0 1"));
+    theZones.addElement(new QuotedStringElement("-1 1"));
+    zones.setValue(theZones);
+    firstLevel.addKeyValuePair(zones);
+
+    KeyValuePair parts = new KeyValuePair();
+    parts.setKey("end_effectors");
+    KeyValuePair pandaParts = new KeyValuePair();
+    pandaParts.setKey("panda");
+    MappingElement thePanda = new MappingElement();
+    thePanda.addKeyValuePair(new KeyValuePair("Link0", new QuotedStringElement("panda_link0")));
+    thePanda.addKeyValuePair(new KeyValuePair("Link1", new QuotedStringElement("panda_link1")));
+    thePanda.addKeyValuePair(new KeyValuePair("Link2", new QuotedStringElement("panda_link2")));
+    thePanda.addKeyValuePair(new KeyValuePair("Link3", new QuotedStringElement("panda_link3")));
+    thePanda.addKeyValuePair(new KeyValuePair("Link4", new QuotedStringElement("panda_link4")));
+    thePanda.addKeyValuePair(new KeyValuePair("Link5", new QuotedStringElement("panda_link5")));
+    thePanda.addKeyValuePair(new KeyValuePair("Link6", new QuotedStringElement("panda_link6")));
+    thePanda.addKeyValuePair(new KeyValuePair("RightFinger", new QuotedStringElement("panda_rightfinger")));
+    thePanda.addKeyValuePair(new KeyValuePair("LeftFinger", new QuotedStringElement("panda_leftfinger")));
+    pandaParts.setValue(thePanda);
+    parts.setValue(pandaParts);
+    firstLevel.addKeyValuePair(parts);
+
+    KeyValuePair end_effectors = new KeyValuePair();
+    end_effectors.setKey("end_effectors");
+    KeyValuePair endEffectorParts = new KeyValuePair();
+    endEffectorParts.setKey("panda");
+    endEffectorParts.setValue(new KeyValuePair("EndEffector", new QuotedStringElement("panda_hand")));
+    end_effectors.setValue(endEffectorParts);
+    firstLevel.addKeyValuePair(end_effectors);
+
+    KeyValuePair goalPoses = new KeyValuePair();
+    goalPoses.setKey("goal_poses");
+    ListElement theGoalPoses = new ListElement();
+    addPose(theGoalPoses, "0.4 0.4 0.3");
+    addPose(theGoalPoses, "-0.4 0.4 0.3");
+    addPose(theGoalPoses, "-0.4 -0.4 0.3");
+    addPose(theGoalPoses, "0.4 0.4 0.3");
+    addPose(theGoalPoses, "-0.4 0.4 0.3");
+    addPose(theGoalPoses, "0.4 0.4 0.3");
+    goalPoses.setValue(theGoalPoses);
+    firstLevel.addKeyValuePair(goalPoses);
+
+    root.setValue(firstLevel);
+    doc.addComplexElement(root);
+
+    System.out.println(doc.prettyPrint());
+  }
+
+  private static void addPose(ListElement theGoalPoses, String position) {
+    MappingElement goalPose1 = new MappingElement();
+    goalPose1.addKeyValuePair(new KeyValuePair("position", new QuotedStringElement(position)));
+    goalPose1.addKeyValuePair(new KeyValuePair("orientation", new QuotedStringElement("1 1 0 0")));
+    goalPose1.addKeyValuePair(new KeyValuePair("work", new QuotedStringElement("20000")));
+    theGoalPoses.addElement(goalPose1);
+  }
+
+  public static void main(String[] args) {
+    printManualYAML();
+  }
+}