diff --git a/build.gradle b/build.gradle
index ae22d051ebfedf9a99740f119d21ae32b995f224..b496f6f6f2cfbe5c90442dc8c77dc3eb2c1a2df6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -18,17 +18,9 @@ mainClassName = 'de.tudresden.inf.st.mrc.MinimalMain'
 
 repositories {
     jcenter()
-//    maven {
-//        name "gitlab-maven"
-//        url "https://git-st.inf.tu-dresden.de/api/v4/groups/jastadd/-/packages/maven"
-//    }
     maven {
-        name "gitlab-maven-ragconnect"
-        url "https://git-st.inf.tu-dresden.de/api/v4/projects/708/packages/maven"
-    }
-    maven {
-        name "gitlab-maven-relast2uml"
-        url "https://git-st.inf.tu-dresden.de/api/v4/projects/679/packages/maven"
+        name "gitlab-maven"
+        url "https://git-st.inf.tu-dresden.de/api/v4/groups/jastadd/-/packages/maven"
     }
 }
 
@@ -56,6 +48,7 @@ dependencies {
     implementation group: 'de.tudresden.inf.st', name: 'dumpAstWithPlantuml', version: '0.3.5'
     implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.12.1'
     implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.1'
+    implementation group: 'de.tudresden.inf.st', name: 'dumpAst', version: '0.3.5'
     grammar2umlClasspath group: 'de.tudresden.inf.st', name: 'grammar2uml', version: '0.1.1'
 
 //    ragconnectClasspath group: 'de.tudresden.inf.st', name: 'ragconnect', version: '0.2.4'
diff --git a/src/main/jastadd/MinimalModel.jrag b/src/main/jastadd/MinimalModel.jrag
index 41315d6c159c63b7ee136693ec4afec62345e2ed..c2ec7bfe085b719077e6c895b6adda29db820758 100644
--- a/src/main/jastadd/MinimalModel.jrag
+++ b/src/main/jastadd/MinimalModel.jrag
@@ -17,14 +17,14 @@ aspect Computation {
       result.addFoxtrot(new Foxtrot().setID(i));
       result.addGolf(new Golf().setID(i));
     }
-    // rel Alfa.MyBravo -> Bravo ;
-    result.setMyBravo(getBravo(getInput()));
-    // rel Alfa.MultiBravo* -> Bravo ;
-    result.addMultiBravo(getBravo(getInput()));
-    result.addMultiBravo(getBravo((getInput() + 1)));
+//    // rel Alfa.MyBravo -> Bravo ;
+//    result.setMyBravo(getBravo(getInput()));
+//    // rel Alfa.MultiBravo* -> Bravo ;
+//    result.addMultiBravo(getBravo(getInput()));
+//    result.addMultiBravo(getBravo((getInput() + 1)));
 
-    // rel Alfa.MidiDelta <-> Delta.MidiAlfa? ;
-    result.setMidiDelta(getDelta(getInput()));
+//    // rel Alfa.MidiDelta <-> Delta.MidiAlfa? ;
+//    result.setMidiDelta(getDelta(getInput()));
 
     // rel Alfa.MyEcho -> Echo ;
     result.setMyEcho(result.getEcho(getInput()));
@@ -38,13 +38,24 @@ aspect Computation {
     // rel Alfa.MidiGolf <-> Golf.MidiAlfa? ;
     result.setMidiGolf(result.getGolf(getInput()));
 
-    // rel Alfa.MyHotel -> Hotel ;
-    result.setMyHotel(getSenderSubTree().getHotel(getInput()));
-    // rel Alfa.MultiHotel* -> Hotel ;
-    result.addMultiHotel(getSenderSubTree().getHotel(getInput()));
-    result.addMultiHotel(getSenderSubTree().getHotel((getInput() + 1)));
+//    // rel Alfa.MyHotel -> Hotel ;
+//    result.setMyHotel(getSenderSubTree().getHotel(getInput()));
+//    // rel Alfa.MultiHotel* -> Hotel ;
+//    result.addMultiHotel(getSenderSubTree().getHotel(getInput()));
+//    result.addMultiHotel(getSenderSubTree().getHotel((getInput() + 1)));
+
+    // rel Alfa.Myself -> Alfa ;
+    result.setMyself(result);
+    // rel Echo.MyFoxtrot -> Foxtrot ;
+    result.getEcho(getInput()).setMyFoxtrot(result.getFoxtrot(getInput()));
+//    // rel Foxtrot.MyHotel -> Hotel ;
+//    result.getFoxtrot(getInput()).setMyHotel(getSenderSubTree().getHotel(getInput()));
+
     return result;
   }
+
+  syn boolean ASTNode.isNameable() = false;
+  eq Nameable.isNameable() = true;
 }
 
 aspect NameResolution {
diff --git a/src/main/jastadd/MinimalModel.relast b/src/main/jastadd/MinimalModel.relast
index f5852950d9a9d0d99c84070ae4cfd429760510cd..b7288d4820b477f8bcc3d34e04dd07bdf8d2aca1 100644
--- a/src/main/jastadd/MinimalModel.relast
+++ b/src/main/jastadd/MinimalModel.relast
@@ -22,15 +22,19 @@ Foxtrot : Nameable ;
 Golf : Nameable ;
 Hotel : Nameable ;
 
-rel Alfa.MyBravo -> Bravo ;
+rel Alfa.MyBravo? -> Bravo ;
 rel Alfa.MultiBravo* -> Bravo ;
 // # relation into NTA not possible
 //rel Charlie.MyAlfa -> Alfa ;
 // # bidi relation from/into NTA probably not a good idea
-rel Alfa.MidiDelta <-> Delta.MidiAlfa? ;
+rel Alfa.MidiDelta? <-> Delta.MidiAlfa? ;
 rel Alfa.MyEcho -> Echo ;
 rel Alfa.MultiEcho* -> Echo ;
 rel Foxtrot.MyAlfa? -> Alfa ;
 rel Alfa.MidiGolf <-> Golf.MidiAlfa? ;
-rel Alfa.MyHotel -> Hotel ;
+rel Alfa.MyHotel? -> Hotel ;
 rel Alfa.MultiHotel* -> Hotel ;
+
+rel Alfa.Myself -> Alfa ;
+rel Echo.MyFoxtrot? -> Foxtrot ;
+rel Foxtrot.MyHotel? -> Hotel ;
diff --git a/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java b/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java
index d29074e58a857b2c0463eb1915a005239eaaffcc..e966c30a3dfad4a20ea19e8f1a68e9908898116c 100644
--- a/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java
+++ b/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java
@@ -9,7 +9,9 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.nio.file.Paths;
 import java.time.Instant;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
@@ -237,24 +239,27 @@ public class MinimalMain {
     ReceiverRoot receiverRoot = createReceiverRoot();
     root2ForReceiver.addReceiverRoot(receiverRoot);
     receiverRoot.connectAlfa(mqttUriString);
-    
+
+    Dumper.read(senderRoot).includeNonterminalAttributes("Alfa").dumpAsPNG(Paths.get("00-initial-sender.png"));
+    Dumper.read(receiverRoot).dumpAsPNG(Paths.get("00-initial-receiver.png"));
+
     senderRoot.setInput(1);
     describedWait(1, "after setting input to 1");
-    printSender(senderRoot);
-    printReceiver(receiverRoot);
+    printAlfa(true, senderRoot, receiverRoot);
+    printAlfa(false, senderRoot, receiverRoot);
+    Dumper.read(senderRoot).includeNonterminalAttributes("Alfa").dumpAsPNG(Paths.get("01-after-1-sender.png"));
+    Dumper.read(receiverRoot).dumpAsPNG(Paths.get("01-after-1-receiver.png"));
+    printAlfa(true, senderRoot, receiverRoot);
+    printAlfa(false, senderRoot, receiverRoot);
 
     senderRoot.setInput(2);
     describedWait(1, "after setting input to 2");
-    printSender(senderRoot);
-    printReceiver(receiverRoot);
-  }
-
-  private static void printSender(SenderRoot senderRoot) {
-    printAlfa("sender", senderRoot.getAlfa(), senderRoot::getDeltaList);
-  }
-
-  private static void printReceiver(ReceiverRoot receiverRoot) {
-    printAlfa("receiver", receiverRoot.getAlfa(), receiverRoot::getDeltaList);
+    printAlfa(true, senderRoot, receiverRoot);
+    printAlfa(false, senderRoot, receiverRoot);
+    Dumper.read(senderRoot).includeNonterminalAttributes("Alfa").dumpAsPNG(Paths.get("02-after-2-sender.png"));
+    Dumper.read(receiverRoot).dumpAsPNG(Paths.get("02-after-2-receiver.png"));
+    printAlfa(true, senderRoot, receiverRoot);
+    printAlfa(false, senderRoot, receiverRoot);
   }
 
   private static SenderRoot createSenderRoot() {
@@ -285,58 +290,107 @@ public class MinimalMain {
   interface AddBravo { void accept(Bravo b); }
   interface AddCharlie { void accept(Charlie b); }
   interface AddDelta { void accept(Delta b); }
-  interface GetDeltaList { Iterable<Delta> get(); }
   interface AddHotel { void accept(Hotel b); }
 
-  private static void printAlfa(String name, Alfa alfa, GetDeltaList getDeltaList) {
-    StringBuilder sbDelta = new StringBuilder();
-    for (Delta delta : getDeltaList.get()) {
-      sbDelta.append(delta.getID())
-          .append("->")
-          .append(delta.hasMidiAlfa() ? delta.getMidiAlfa().getID() : "/")
-          .append(", ");
-    }
-    String deltaList = sbDelta.toString();
-    StringBuilder sbFoxtrot = new StringBuilder();
-    for (Foxtrot foxtrot : alfa.getFoxtrotList()) {
-      sbFoxtrot.append(foxtrot.getID())
-          .append("->")
-          .append(foxtrot.hasMyAlfa() ? foxtrot.getMyAlfa().getID() : "/")
-          .append(", ");
+  private static void printAlfa(boolean isSender, SenderRoot senderRoot, ReceiverRoot receiverRoot) {
+    final String name;
+    final String tick;
+    final Alfa alfa;
+    final Iterable<Delta> deltaList;
+    final Iterable<Hotel> hotelList;
+    if (isSender) {
+      name = "sender";
+      tick = " >-";
+      alfa = senderRoot.getAlfa();
+      deltaList = senderRoot.getDeltaList();
+      hotelList = senderRoot.getSenderSubTree().getHotelList();
+    } else {
+      name = "receiver";
+      tick = " <-";
+      alfa = receiverRoot.getAlfa();
+      deltaList = receiverRoot.getDeltaList();
+      hotelList = receiverRoot.getReceiverSubTree().getHotelList();
     }
-    String foxtrotList = sbFoxtrot.toString();
+    // also dump AST
+    StringBuilder sb = new StringBuilder();
+    printNode(alfa.getParent(), "", sb);
+    logger.info("\n{}", sb.toString());
+
     logger.info("Checking Alfa\n" +
         "{}: {} in {}\n" +
-        " |- MyBravo: {}\n" +
-        " |- MultiBravoList: {}\n" +
-        " |- MidiDelta: {} (MidiDelta.getMidiAlfa(): {})\n" +
-        " |- DeltaList: {}\n" +
-        " |- MyEcho: {}\n" +
-        " |- MultiEchoList: {}\n" +
-        " |- FoxtrotList (id -> alfa.id): {}\n" +
-        " |- MidiGolf: {} (MidiGolf.getMidiAlfa(): {})\n" +
-        " |- MyHotel: {}\n" +
-        " |- MultiHotelList: {}" +
+        tick + " Myself: {}\n" +
+//        tick + " MyBravo: {}\n" +
+//        tick + " MultiBravoList: {}\n" +
+//        tick + " MidiDelta: {} (MidiDelta.getMidiAlfa(): {})\n" +
+//        tick + " DeltaList: {}\n" +
+        tick + " MyEcho: {}\n" +
+        tick + " EchoList.MyFoxtrot: {}\n" +
+        tick + " MultiEchoList: {}\n" +
+        tick + " FoxtrotList.MyAlfa: {}\n" +
+        tick + " FoxtrotList.MyHotel: {}\n" +
+        tick + " MidiGolf: {} (MidiGolf.getMidiAlfa(): {})\n" +
+        tick + " GolfList (id -> alfa.id): {}\n" +
+//        tick + " MyHotel: {}\n" +
+//        tick + " MultiHotelList: {}\n" +
+//        tick + " HotelList: {}" +
         "{}", // just to make swapping of params easier (all have a comma at the end)
         name, alfa, alfa.getParent(),
-        alfa.getMyBravo().getID(),
-        printNameableList(alfa.getMultiBravoList()),
-        alfa.getMidiDelta().getID(), alfa.getMidiDelta().getMidiAlfa(),
-        deltaList,
-        alfa.getMyEcho().getID(),
+        nameAndHash(alfa.getMyself()),
+//        nameAndHash(alfa.getMyBravo()),
+//        printNameableList(alfa.getMultiBravoList()),
+//        nameAndHash(alfa.getMidiDelta()), alfa.getMidiDelta().getMidiAlfa(),
+//        printOptionalList(deltaList, Delta::hasMidiAlfa, Delta::getMidiAlfa),
+        nameAndHash(alfa.getMyEcho()),
+        printOptionalList(alfa.getEchoList(), Echo::hasMyFoxtrot, Echo::getMyFoxtrot),
         printNameableList(alfa.getMultiEchoList()),
-        foxtrotList,
-        alfa.getMidiGolf().getID(), alfa.getMidiGolf().getMidiAlfa(),
-        alfa.getMyHotel().getID(),
-        printNameableList(alfa.getMultiHotelList()),
+        printOptionalList(alfa.getFoxtrotList(), Foxtrot::hasMyAlfa, Foxtrot::getMyAlfa),
+        printOptionalList(alfa.getFoxtrotList(), Foxtrot::hasMyHotel, Foxtrot::getMyHotel),
+        nameAndHash(alfa.getMidiGolf()), nameAndHash(alfa.getMidiGolf().getMidiAlfa()),
+        printOptionalList(alfa.getGolfList(), Golf::hasMidiAlfa, Golf::getMidiAlfa),
+//        nameAndHash(alfa.getMyHotel()),
+//        printNameableList(alfa.getMultiHotelList()),
+//        printNameableList(toList(hotelList)),
         ""
     );
   }
-  
+
+  private static List<? extends Nameable> toList(Iterable<Hotel> hotelList) {
+    List<Hotel> result = new ArrayList<>();
+    hotelList.forEach(result::add);
+    return result;
+  }
+
   private static String printNameableList(List<? extends Nameable> nameableList) {
-    return nameableList.stream().map(nameable -> Integer.toString(nameable.getID())).collect(Collectors.joining(",", "[", "]"));
+    return nameableList.stream().map(MinimalMain::nameAndHash).collect(Collectors.joining(",", "[", "]"));
+  }
+
+  private static <T extends Nameable> String printOptionalList(Iterable<T> tIterable, Function<T, Boolean> hasChild, Function<T, Nameable> getChild) {
+    StringBuilder sb = new StringBuilder();
+    for (T t : tIterable) {
+      sb.append(nameAndHash(t))
+          .append(" -> ")
+          .append(hasChild.apply(t) ? nameAndHash(getChild.apply(t)) : "/")
+          .append(", ");
+    }
+    return sb.toString();
+  }
+
+  private static String nameAndHash(Nameable nameable) {
+    return nameable.getID() + " (@" + Integer.toHexString(nameable.hashCode()) + ")";
   }
 
+  private static void printNode(ASTNode<?> node, String indent, StringBuilder sb) {
+    if (node.isNameable()) {
+      sb.append(indent)
+          .append("- ")
+          .append(node.getClass().getSimpleName())
+          .append(nameAndHash((Nameable) node))
+          .append("\n");
+    }
+    for (ASTNode<?> child : node.astChildren()) {
+      printNode(child, node instanceof JastAddList ? indent : indent + " |", sb);
+    }
+  }
 
 //  private static void enableTracing(ASTNode<?> node) {
 //    if (node.trace().getReceiver() != null && node.trace().getReceiver() instanceof MinimalReceiver) {