diff --git a/gradle.properties b/gradle.properties
index 4f0ee66dd8bd5c1e752d4d9e1e0b6889e087c15e..08db7214a1bd07bb1e3c104d563211783404e6f6 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,5 +1,5 @@
 relast_version = 0.3.0-137
-relast2uml_version = 1.0.0
+relast2uml_version = 1.0.2-68
 jupyter_version = 5.8.2
 assertj_version = 3.22.0
 grammar2uml_version = 0.2.1
diff --git a/material/2022-05-31-research-discussion.odp b/material/2022-05-31-research-discussion.odp
index d02f6f8c376adc42b302a736ea19017932c5b493..b994241547651755158e533c4400f49d31247cb2 100644
Binary files a/material/2022-05-31-research-discussion.odp and b/material/2022-05-31-research-discussion.odp differ
diff --git a/material/overview.drawio b/material/overview.drawio
index ca260e737ff4c34b6b2357b58dd8ee029fca997e..3dd4ab3ff9738e76a29c83aac23d46f786ca49e5 100644
--- a/material/overview.drawio
+++ b/material/overview.drawio
@@ -1 +1 @@
-<mxfile host="Electron" modified="2022-05-30T15:22:45.891Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/18.1.3 Chrome/100.0.4896.143 Electron/18.2.3 Safari/537.36" etag="In4-8qNJInGg5Ttx52PO" version="18.1.3" type="device"><diagram id="xllGRi-CdCWfJc1u12WW" name="Page-1">7Vpdb6M4FP01fSzyF8Z+bDvT3dmdSiN1pdE+VQ44gBZwFpxJZn79XggQwHTazoZ2qk6ktsm1+eg591yfa3JGr/L9b6XaJDcm0tkZQdH+jL47I0QKDL/rwNdDwBf8EIjLNDqE8DFwm37TbRC10W0a6Wo00RqT2XQzDoamKHRoRzFVlmY3nrY22fiqGxVrJ3AbqqyNkmP0cxrZpJ2LEToO/K7TOGkvLfx2IFfd5DZQJSoyu0GIvj+jV6Ux9vAu31/prMauw+Vw3PU9o/3tlrqwjzngm/n75g8/+ZNEHxVOgg/nH9TqnASH03xR2bb9j9u7tV87CEqzLSJdnwWd0ctdklp9u1FhPboDziGW2DyDTxjerk1hWxYxh8/t6XVp9f7eG8c9HJBG2uTall9hSnuAaAFsM4h00O+OfAQdyMmACtZNVG0OxP2pjzDBmxapJ6BGHdAudaK+pGZbfgc9/DB6NU4pJN9FlsYFxKzZjDElNQXrNMuuTGbK5go0UlqsQ4hXtjT/6MEID4VerU/Dgs8mNDCXhj42pIGSpWjADg1XgJTe25cgwdciYnMkCLKi/ERSwJI+TMKcFpYjwb+fhOvPpoRyS3gGd3G5Kkec8H+3deVrcD2vGmAvYALmm32DVTcO7+L6Lywvea5cfXVsfVQrnX0yVWpTU7O2Mtaa/F46B3xDYd7UJ8v3cb2EeStVpaGnwq3Vd7ZMVRHX17psljTk+TNFbpILCAmF0FwuIOQHzUh9hi4e6bXaZvY0GULwOEMo8T2OnSTBdCZJcMA8KhfKE+7kyY1pqHqD6eEjvZ5PD/zu8mrJ9ODcH6UHo24B6b3NMDeCpeqHfNiAdAxUaY31Re3qnm5EGjPYWTjksS7UzkEeYqeBmMoxxEQ+skYvt066C2WnPdTr5qjCg6A+qbLSrp6ayj7WxyiLC1PoScq3IdUKLAQc4cSu8vI0ihopzTE7NqELuMwAHQtlx1zgMsdnjeZSxJEfFUeUltANHUpdZbb13f9PwUDpGL8cARE8nhA0tFnV3sY59U9Uw4TDFPVnV7k5lS1WyDA7BVk7Xdklihv03QRxIbnv44AwPOGmsbSnsB+B9MiEG0k9LhxuKKNeIJ+zCrqt7l9QuIrq7dQ4hviDBQ77c+3DYqQIh5RbnasCQIPoRaOK10LQEnpiaGLnpXxpxlzDFgJHttyGtqpP7TgJtdnoInotLC5jJSh/nJVYjDbiesDqKLS0WJsyP2TvHIV9pOfUQuuzghao6obguNVx+luhmqOH+6nn5fkRljHNm03vIR1t6F2ax3DZLAUqr8Ms3dypst7ICU2+AbLLWuC3Zm13ANAdJmIPP96miJcBl5JJJyVmwBUzFo94/lLwulu/jYn41T+RgD5M1nM2T8T1478q3glE2fnofmVjHnFNyfMWPXcT2iHk9fTJmJ2oUSaTpwV0ZnF61ha5u/7PwBNjtXMWPhOAC/HllKbp5kXdU0eqSvqnSKdwD1R6YkwRlh72HZYw3G/gEiUWW+Z+IqJOICh5qp2nAHl4QlggPUoeJSuMF6t/bhf9YnRRJjlH3Bfc92UgHF15CMoSQwQLhJnEPsV0TJdECyiNSWjJJgYFCw+7zOGgj462pcDokqXkRt3mzOHv6aY91oUuFVz8+j0Ekrs4M6upax/h7Dy3Wuop1PQbHbI37AMixIyExGIrk+vr71VQZLarH34MNY/pIP2bxX+qKSpASoJDFiMWSOaWQAzFJYBiFDDBuGTiRAUPE9mbu34HCs/5PVhKPT6nm8CTeCnSXIcPrluXRZ30U0Ov12t93w5VmKgi1m9oh2oiQCqlJ4cvNsPvs24yPsJ/vJZdDI4n1S7A/YOPAcDdU+MhvlL0D1OeADF8PH6rsBkbfDWTvv8P</diagram></mxfile>
\ No newline at end of file
+<mxfile host="Electron" modified="2022-06-10T07:40:44.173Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/18.1.3 Chrome/100.0.4896.143 Electron/18.2.3 Safari/537.36" etag="r6BY6nRAQaejeYnjVoee" version="18.1.3" type="device"><diagram id="xllGRi-CdCWfJc1u12WW" name="Page-1">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</diagram></mxfile>
\ No newline at end of file
diff --git a/material/overview.drawio-full.png b/material/overview.drawio-full.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1f9b10fa0ff88f130c1040a884227da0ce93c5c
Binary files /dev/null and b/material/overview.drawio-full.png differ
diff --git a/material/overview.drawio.png b/material/overview.drawio.png
new file mode 100644
index 0000000000000000000000000000000000000000..a1827b8dc9f04c7804d469134989a5352016096a
Binary files /dev/null and b/material/overview.drawio.png differ
diff --git a/src/main/jastadd/cleanup/Cleanup.jrag b/src/main/jastadd/cleanup/Cleanup.jrag
index 62540f0f837a6e3f3f780dec537888b2b7149076..8aa80f487df93e2daec08013e2ef435d6ec0f5b1 100644
--- a/src/main/jastadd/cleanup/Cleanup.jrag
+++ b/src/main/jastadd/cleanup/Cleanup.jrag
@@ -42,4 +42,5 @@ aspect CleanupAttributes {
   syn Tidy Tidy.containingTidy() = this;
   inh Tidy ASTNode.containingTidy();
   eq Tidy.getChild().containingTidy() = this;
+  eq World.getChild().containingTidy() = null; // fallback
 }
diff --git a/src/main/jastadd/cleanup/Tracing.jadd b/src/main/jastadd/cleanup/Tracing.jadd
new file mode 100644
index 0000000000000000000000000000000000000000..a5174dbc10ef2ffe5b25cce087ac8ff28c5c0082
--- /dev/null
+++ b/src/main/jastadd/cleanup/Tracing.jadd
@@ -0,0 +1,70 @@
+aspect Tracing {
+
+  refine
+  public void Pose.setX(double x) {
+    World.printContextOf("Pose.setX()-BEFORE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR);
+    refined(x);
+    World.printContextOf("Pose.setX()-AFTER", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR);
+    World.printContextOf("Pose.setX()-DONE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR);
+  }
+
+  refine
+  public void Pose.setY(double y) {
+    World.printContextOf("Pose.setY()-BEFORE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR);
+    refined(y);
+    World.printContextOf("Pose.setY()-AFTER", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR);
+    World.printContextOf("Pose.setY()-DONE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR);
+  }
+
+  refine
+  public void Pose.setZ(double z) {
+    World.printContextOf("Pose.setZ()-BEFORE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR);
+    refined(z);
+    World.printContextOf("Pose.setZ()-AFTER", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR);
+    World.printContextOf("Pose.setZ()-DONE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR);
+  }
+
+  // this is probably never called because each child overrides the setter method
+  refine
+  public void PhysicalObject.setPose(Pose p) {
+    World.printContextOf("PhysicalObject.setPose()-BEFORE", getPose(), de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR);
+    refined(p);
+    World.printContextOf("PhysicalObject.setPose()-AFTER", getPose(), de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR);
+    World.printContextOf("PhysicalObject.setPose()-DONE", getPose(), de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR);
+  }
+
+  refine
+  public void MovableObject.setPose(Pose p) {
+    World.printContextOf("MovableObject.setPose()-BEFORE", getPose(), de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR);
+    refined(p);
+    World.printContextOf("MovableObject.setPose()-AFTER", getPose(), de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR);
+    World.printContextOf("MovableObject.setPose()-DONE", getPose(), de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR);
+  }
+
+  refine
+  public void Robot.setIsIdle(boolean b) {
+    World.printContextOf("Robot.setIsIdle()-BEFORE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR);
+    refined(b);
+    World.printContextOf("Robot.setIsIdle()-AFTER", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR);
+    World.printContextOf("Robot.setIsIdle()-DONE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR);
+  }
+
+  refine RelAstAPI
+  public Robot Robot.setAttachedItem(MovableObject o) {
+    World.printContextOf("Robot.setAttachedItem()-BEFORE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR);
+    var result = refined(o);
+    World.printContextOf("Robot.setAttachedItem()-AFTER", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR);
+    World.printContextOf("Robot.setAttachedItem()-DONE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR);
+    return result;
+  }
+
+  refine RelAstAPI
+  public MovableObject MovableObject.setAttachedRobot(Robot r) {
+    World.printContextOf("MovableObject.setAttachedRobot()-BEFORE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR);
+    var result = refined(r);
+    World.printContextOf("MovableObject.setAttachedRobot()-AFTER", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR);
+    World.printContextOf("MovableObject.setAttachedRobot()-DONE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR);
+    return result;
+  }
+
+}
diff --git a/src/main/jastadd/common/MotionGrammar.jadd b/src/main/jastadd/common/MotionGrammar.jadd
new file mode 100644
index 0000000000000000000000000000000000000000..07164d9fbf8d77f9026821f71fb26dab3c8ad406
--- /dev/null
+++ b/src/main/jastadd/common/MotionGrammar.jadd
@@ -0,0 +1,11 @@
+aspect Parser {
+  public de.tudresden.inf.st.mg.common.MotionGrammarParser ASTNode.parser;
+  public de.tudresden.inf.st.mg.common.MotionGrammarParser ASTNode.getParser() {
+    if (parser == null) {
+      return (getParent() != null) ? getParent().getParser() : null;
+    } else {
+      return parser;
+    }
+  }
+
+}
diff --git a/src/main/jastadd/common/MotionGrammar.jrag b/src/main/jastadd/common/MotionGrammar.jrag
new file mode 100644
index 0000000000000000000000000000000000000000..9cbc6b5f52b08adf26b9447aafad5cf035a4692a
--- /dev/null
+++ b/src/main/jastadd/common/MotionGrammar.jrag
@@ -0,0 +1,5 @@
+aspect Navigation {
+  inh World ASTNode.containingWorld();
+  eq World.getChild().containingWorld() = this;
+  eq MotionGrammarElement.getChild().containingWorld() = null;
+}
diff --git a/src/main/jastadd/common/Tracing.jadd b/src/main/jastadd/common/Tracing.jadd
new file mode 100644
index 0000000000000000000000000000000000000000..8188384459e935e10ddebd48e7a8a804fc40f02c
--- /dev/null
+++ b/src/main/jastadd/common/Tracing.jadd
@@ -0,0 +1,28 @@
+aspect Tracing {
+
+  public static void World.printContextOf(String step, ASTNode<?> highlightNode, String highlightColor) {
+
+    final String DEFAULT_COLOR = de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR;
+
+    World world;
+    try {
+      world = highlightNode.containingWorld();
+    } catch (NullPointerException e) {
+      // the element is not in a full AST (yet?), so we don't print it
+      return;
+    }
+    String worldName = world.getClass().getSimpleName();
+
+    try {
+      de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper.read(world)
+          .setNameMethod(o -> o == null ? "null" : o.getClass().getSimpleName())
+          .includeRelationsFor(".*", ".*")
+          .setBackgroundColorMethod(n -> (n == highlightNode ? highlightColor : DEFAULT_COLOR))
+          .excludeTokens("Q.") // FIXME remove domain-specific code
+          .dumpAsPNG(de.tudresden.inf.st.mg.common.MotionGrammarConfig.astDiagramDir.resolve("Context-" + worldName + "-" + new java.text.SimpleDateFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(new java.util.Date()) + "-" + step + ".png"));
+    } catch (java.io.IOException e) {
+      e.printStackTrace();
+    }
+  }
+
+}
diff --git a/src/main/java/de/tudresden/inf/st/mg/LoadWorldParser.java b/src/main/java/de/tudresden/inf/st/mg/LoadWorldParser.java
index 3638eb4971643f63f880434d762e7b9a0da6dc82..e7a17ec6ebabaa3b95f02399be6db0949314d8fa 100644
--- a/src/main/java/de/tudresden/inf/st/mg/LoadWorldParser.java
+++ b/src/main/java/de/tudresden/inf/st/mg/LoadWorldParser.java
@@ -28,10 +28,12 @@ public final class LoadWorldParser extends MotionGrammarParser<T> {
     // try to parse a T
     if (peekFull()) {
       result = new T2();
+      result.parser = this;
       parent.setChild(result, index);
       parseT2(parent, index);
     } else if (peekLoad()) {
       result = new T1();
+      result.parser = this;
       parent.setChild(result, index);
       parseT1(parent, index);
     } else {
diff --git a/src/main/java/de/tudresden/inf/st/mg/RobotParser.java b/src/main/java/de/tudresden/inf/st/mg/RobotParser.java
index 0af51f88a7ba60e32aad9b5e6263b49b88c932b6..2d3840a1db44f47e6a653c41c1dab509b0cdc8e7 100644
--- a/src/main/java/de/tudresden/inf/st/mg/RobotParser.java
+++ b/src/main/java/de/tudresden/inf/st/mg/RobotParser.java
@@ -33,6 +33,7 @@ public final class RobotParser extends MotionGrammarParser<Tidy> {
   @Override
   protected void parse(ASTNode<?> parent, int index) throws ParseException {
     Tidy result = new Tidy();
+    result.parser = this;
     parent.setChild(result, index);
 
     while (true) {
@@ -66,6 +67,7 @@ public final class RobotParser extends MotionGrammarParser<Tidy> {
 
   private void parseMoveObjectToCorrectPlace(ASTNode<?> parent, int index) throws ParseException {
     MoveObjectToCorrectPlace result = new MoveObjectToCorrectPlace();
+    result.parser = this;
     parent.setChild(result, index);
 
     parseObjectAtWrongPlace(result, 0, parent.containingTidy());
@@ -79,6 +81,7 @@ public final class RobotParser extends MotionGrammarParser<Tidy> {
 
   private void parseWaitForEmptyTable(ASTNode<?> parent, int index) throws ParseException {
     WaitForEmptyTable result = new WaitForEmptyTable();
+    result.parser = this;
     parent.setChild(result, index);
 
     parseNotEmptyTable(result, 0);
@@ -91,6 +94,7 @@ public final class RobotParser extends MotionGrammarParser<Tidy> {
 
   private void parseDropObjectAtRightPlace(ASTNode<?> parent, int index) throws ParseException {
     DropObjectAtRightPlace result = new DropObjectAtRightPlace();
+    result.parser = this;
     parent.setChild(result, index);
 
     parseRobotIsReadyToDrop(result, 0);
@@ -123,6 +127,7 @@ public final class RobotParser extends MotionGrammarParser<Tidy> {
 
   private void parsePickUpObject(ASTNode<?> parent, int index) throws ParseException {
     PickUpObject result = new PickUpObject();
+    result.parser = this;
     parent.setChild(result, index);
 
     parseRobotIsReadyToPick(result, 0);
@@ -138,10 +143,12 @@ public final class RobotParser extends MotionGrammarParser<Tidy> {
     // try to parse a RobotIsReadyToPickToken
     if (peekRobotIsReadyToPickToken()) {
       result = new RobotIsReallyReadyToPick();
+      result.parser = this;
       parent.setChild(result, index);
       parseRobotIsReallyReadyToPick(parent, index);
     } else if (peekRobotIsNotReadyToPickToken()) {
       result = new RobotIsNotReadyToPick();
+      result.parser = this;
       parent.setChild(result, index);
       parseRobotIsNotReadyToPick(parent, index);
     } else {
@@ -233,10 +240,12 @@ public final class RobotParser extends MotionGrammarParser<Tidy> {
     // try to parse a RobotIsReadyToDropToken
     if (peekRobotIsReadyToDropToken()) {
       result = new RobotIsReallyReadyToDrop();
+      result.parser = this;
       parent.setChild(result, index);
       parseRobotIsReallyReadyToDrop(parent, index);
     } else if (peekRobotIsNotReadyToDropToken()) {
       result = new RobotIsNotReadyToDrop();
+      result.parser = this;
       parent.setChild(result, index);
       parseRobotIsNotReadyToDrop(parent, index);
     } else {
diff --git a/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarConfig.java b/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..7cef061ee29c6ef139a989679834d3e5d72ab783
--- /dev/null
+++ b/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarConfig.java
@@ -0,0 +1,17 @@
+package de.tudresden.inf.st.mg.common;
+
+import java.nio.file.Path;
+
+public class MotionGrammarConfig {
+
+  private MotionGrammarConfig() {
+    // hide the constructor
+  }
+
+  public static Path astDiagramDir;
+  public static final String DEFAULT_COLOR = "cccccc";
+  public static final String ADD_COLOR = "47ba4c";
+  public static final String REMOVE_COLOR = "de4a2c";
+
+
+}
diff --git a/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java b/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java
index 706c7a980464f168bcda52ac87594123c6caa7b2..ad983acecb7db8680339693582897390af5001f0 100644
--- a/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java
+++ b/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java
@@ -7,6 +7,7 @@ import de.tudresden.inf.st.mg.jastadd.model.*;
 
 import java.io.IOException;
 import java.nio.file.Path;
+import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
@@ -17,10 +18,9 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
   protected final Map<String, ASTNode<?>> contexts_ = new HashMap<>();
   protected ASTNode<T> rootContainer_;
   private int timeStep_;
-  protected Path astDiagramDir_;
 
   public void setDebugDiagramDir(Path p) {
-    astDiagramDir_ = p;
+    MotionGrammarConfig.astDiagramDir = p;
   }
 
   /**
@@ -31,7 +31,7 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
    */
   protected void printAST(String step, ASTNode<?> highlightNode) {
 
-    if (astDiagramDir_ == null) {
+    if (MotionGrammarConfig.astDiagramDir == null) {
       return;
     }
 
@@ -42,13 +42,6 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
 
     try {
 
-      for (var contextEntry : contexts_.entrySet()) {
-//        System.out.println("REL: " + ((RobotScene) (contextEntry.getValue())).getRobot().getAttachedItem());
-        Dumper.read(contextEntry.getValue())
-                .setNameMethod(o -> o == null ? "null" : o.getClass().getSimpleName())
-                .includeRelationsFor(".*", ".*")
-                .dumpAsPNG(astDiagramDir_.resolve("Context-" + contextEntry.getKey() + "-" + String.format("%03d", timeStep_) + "-" + step + ".png"));
-      }
       // TODO remove this once the issue in relast2uml has been resolved
       if (rootContainer_.getChild(0) != null) {
         Dumper.read(rootContainer_.getChild(0))
@@ -62,11 +55,10 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
                   }
                   return result + o.getClass().getSimpleName();
                 })
+                .customPreamble("title " + step)
                 .skinParam(SkinParamBooleanSetting.Shadowing, false)
                 .skinParam(SkinParamStringSetting.backgroundColor, "white")
-//                .dumpAsSource(astDiagramDir_.resolve("AST-" + String.format("%03d", timeStep_) + "-" + step + ".puml"))
-//                .dumpAsSVG(astDiagramDir_.resolve("AST-" + String.format("%03d", timeStep_) + "-" + step + ".svg"));
-                .dumpAsPNG(astDiagramDir_.resolve("AST-" + String.format("%03d", timeStep_) + "-" + step + ".png"));
+                .dumpAsPNG(MotionGrammarConfig.astDiagramDir.resolve("AST-" + String.format("%03d", timeStep_) + "-" + new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(new java.util.Date()) + "-" + step + ".png"));
       }
       timeStep_++;
     } catch (IOException e) {
diff --git a/src/test/java/de/tudresden/inf/st/mg/ParserTest.java b/src/test/java/de/tudresden/inf/st/mg/ParserTest.java
index b88ce99baeda404224b2f9a5f54864aa3281d57e..3950d514953d3a6a8970a02b50388bc0ccb7e5bf 100644
--- a/src/test/java/de/tudresden/inf/st/mg/ParserTest.java
+++ b/src/test/java/de/tudresden/inf/st/mg/ParserTest.java
@@ -52,17 +52,17 @@ public class ParserTest {
   @Test
   void runTidyParser() throws MotionGrammarParser.ParseException {
 
-// for some reason, the best random seed value here is 1 and not 0???
-World world = RobotScene.initialWorld(new Random(1));
+    // for some reason, the best random seed value here is 1 and not 0???
+    World world = RobotScene.initialWorld(new Random(1));
 
-// create a parser using the world
-RobotParser parser = new RobotParser(world);
-parser.setDebugDiagramDir(TIDY_AST_DIAGRAM_DIR);
+    // create a parser using the world
+    RobotParser parser = new RobotParser(world);
+    parser.setDebugDiagramDir(TIDY_AST_DIAGRAM_DIR);
 
-// parse (synchonously, long-running)
-var result = parser.parse();
+    // parse (synchonously, long-running)
+    var result = parser.parse();
 
-assertThat(result).isNotNull().isInstanceOf(Tidy.class);
+    assertThat(result).isNotNull().isInstanceOf(Tidy.class);
   }
 
 }