diff --git a/build.gradle b/build.gradle
index a34e4f04292d23b7ab6a2b0a5258c72c2b8d7061..80c65d30c2d5724b157ada6c6b262e6e3fec3ac3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -56,7 +56,7 @@ dependencies {
     grammar2umlClasspath group: 'de.tudresden.inf.st', name: 'grammar2uml', version: '0.1.1'
 
 //    ragconnectClasspath group: 'de.tudresden.inf.st', name: 'ragconnect', version: '0.2.4'
-    ragconnectClasspath fileTree(include: ['ragconnect-0.2.4.jar'], dir: '/data/git/jastadd-ragconnect/ragconnect.base/build/libs')
+    ragconnectClasspath fileTree(include: ['ragconnect-0.2.5.jar'], dir: '/data/git/jastadd-ragconnect/ragconnect.base/build/libs')
 //    jastadd2 "org.jastadd:jastadd:2.3.4"
     jastadd2 fileTree(include: ['jastadd2.jar'], dir: '/data/git/jastadd-2/')
 }
@@ -87,6 +87,7 @@ task ragConnect(type: JavaExec) {
             '--o=src/gen/jastadd',
             'src/main/jastadd/MinimalModel.relast',
             'src/main/jastadd/MinimalModel.connect',
+            '--logReads',
             '--rootNode=A'
     ])
 
@@ -160,13 +161,13 @@ jastadd {
     extraJastAddOptions = [
             '--lineColumnNumbers',
             '--List=JastAddList',
-//            '--incremental=param',
-//            '--cache=all',
+            '--incremental=param',
+            '--cache=all',
 //            '--tracing=api,flush',
-//
-//            "--flush=full",
+
+            "--flush=full",
 //            "--incremental=param,debug",
-            "--tracing=api",
+            "--tracing=cache,flush",
     ]
 }
 
diff --git a/src/main/jastadd/MinimalModel.connect b/src/main/jastadd/MinimalModel.connect
index 4ce1402504c37038a81d91205e44660eb5b53181..fa4c12e6d75c88efcba1fca0a737f82984f12e37 100644
--- a/src/main/jastadd/MinimalModel.connect
+++ b/src/main/jastadd/MinimalModel.connect
@@ -1,6 +1,7 @@
 receive A.Input ;
 send A.OutputOnA ;
 send B.OutputOnB using Transformation ;
+send C.OutputOnC using Transformation ;
 
 // mapping definitions
 Transformation maps String s to String {:
@@ -10,3 +11,4 @@ Transformation maps String s to String {:
 // dependency definitions
 A.OutputOnA canDependOn A.Input as dependencyA ;
 B.OutputOnB canDependOn A.Input as dependencyB ;
+C.OutputOnC canDependOn A.Input as dependencyC ;
diff --git a/src/main/jastadd/MinimalModel.jrag b/src/main/jastadd/MinimalModel.jrag
index 4cb9dbf4def3102924b530c58ece410e73fa255b..27abf8f6a15176c0101b8203f8a77e59ab79a4b2 100644
--- a/src/main/jastadd/MinimalModel.jrag
+++ b/src/main/jastadd/MinimalModel.jrag
@@ -4,4 +4,8 @@ aspect Computation {
   syn String B.getOutputOnB() = "b" + input();
   inh String B.input();
   eq A.getB().input() = getInput();
+
+  syn String C.getOutputOnC() = "c" + input();
+  inh String C.input();
+  eq A.getC().input() = getInput();
 }
diff --git a/src/main/jastadd/MinimalModel.relast b/src/main/jastadd/MinimalModel.relast
index 9009e2787814bb8020d1459fc5d9758f9cc1ca06..c9c68e91e6cf70dc11096b566e523aec71ca1ad3 100644
--- a/src/main/jastadd/MinimalModel.relast
+++ b/src/main/jastadd/MinimalModel.relast
@@ -1,2 +1,3 @@
-A ::= <Input:String> /<OutputOnA:String>/ B* ;
+A ::= <Input:String> /<OutputOnA:String>/ B* C* ;
 B ::= /<OutputOnB:String>/ ;
+C ::= /<OutputOnC:String>/ ;
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 9b72db0ffaea26d6f02c8a539e20f43e3775ba27..dd729a1716cbc17ae2392621b87ac9b6ca42e9f2 100644
--- a/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java
+++ b/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java
@@ -1,16 +1,18 @@
 package de.tudresden.inf.st.mrc;
 
 import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper;
-import de.tudresden.inf.st.mrc.ast.A;
-import de.tudresden.inf.st.mrc.ast.B;
-import de.tudresden.inf.st.mrc.ast.MqttHandler;
+import de.tudresden.inf.st.mrc.ast.*;
+import de.tudresden.inf.st.mrc.ast.ASTState.Trace.Receiver;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import java.io.IOException;
 import java.nio.file.Paths;
-import java.util.Scanner;
-import java.util.concurrent.TimeUnit;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
 
 /**
  * Minimal main.
@@ -23,13 +25,36 @@ public class MinimalMain {
   private static final String TOPIC_URI_FOR_INPUT = "mqtt://localhost/" + TOPIC_FOR_INPUT;
   private static MqttHandler publisher;
 
+  static class MinimalReceiver implements Receiver {
+    List<String> latestAttributes;
+    Receiver oldReceiver;
+
+    MinimalReceiver(Receiver oldReceiver) {
+      this.oldReceiver = oldReceiver;
+      reset();
+    }
+
+    void reset() {
+      latestAttributes = new ArrayList<>();
+    }
+
+    @SuppressWarnings("rawtypes")
+    @Override
+    public void accept(ASTState.Trace.Event event, ASTNode node, String attribute, Object params, Object value) {
+      oldReceiver.accept(event, node, attribute, params, value);
+      logger.info("event: {}, node: {}, attribute: {}, params: {}, value: {},", event, node, attribute, params, value);
+      latestAttributes.add(attribute);
+    }
+  }
+  static MinimalReceiver receiver = null;
+
   public static void main(String[] args) throws Exception {
     publisher = new MqttHandler("publisher").setHost("localhost");
-    publisher.waitUntilReady(2, TimeUnit.SECONDS);
-    publisher.publish("---", "---".getBytes());
+    publisher.waitUntilReady(2, SECONDS);
+    publisher.publish("---", ("Start at " + Instant.now()).getBytes());
 
-    A normalA = addNewA();
-    enableTracing(normalA);
+    A normalA = addNewA(true);
+//    enableTracing(normalA);
     B b1 = normalA.getB(0);
     B b2 = normalA.getB(1);
 
@@ -45,55 +70,80 @@ public class MinimalMain {
     b1.connectOutputOnB("mqtt://localhost/normalA/b1/out", true);
     b2.connectOutputOnB("mqtt://localhost/normalA/b2/out", false);
 
-    A aWithNoDependency = addNewA();
-    enableTracing(aWithNoDependency);
+    A aWithNoDependency = addNewA(false);
+//    enableTracing(aWithNoDependency);
 
     aWithNoDependency.connectInput(TOPIC_URI_FOR_INPUT);
     aWithNoDependency.connectOutputOnA("mqtt://localhost/aNoDep/out", true);
-    aWithNoDependency.getB(0).connectOutputOnB("mqtt://localhost/aNoDep/b1/out", true);
-    aWithNoDependency.getB(1).connectOutputOnB("mqtt://localhost/aNoDep/b2/out", false);
+    aWithNoDependency.getC(0).connectOutputOnC("mqtt://localhost/aNoDep/c1/out", true);
+    aWithNoDependency.getC(1).connectOutputOnC("mqtt://localhost/aNoDep/c2/out", false);
 
     // stimulated incremental evaluation
-    aWithNoDependency.getB(0).getOutputOnB();
+    aWithNoDependency.getC(0).getOutputOnC();
+
+    Dumper.read(normalA).dumpAsPNG(Paths.get("image.png"));
+
+    describedWait(1, "Publish 2");
+    publisher.publish(TOPIC_FOR_INPUT, "2".getBytes());
+
+//    aWithNoDependency.getC(0).getOutputOnC();
+
+    describedWait(2, "Disconnect normalA");
+    try {
+      boolean success = normalA.disconnectInput(TOPIC_URI_FOR_INPUT);
+      logger.info("disconnect success: " + success);
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+
+//    aWithNoDependency.getC(0).getOutputOnC();
+
+    describedWait(2, "Publish 4");
+//    receiver.reset();
+    publisher.publish(TOPIC_FOR_INPUT, "4".getBytes());
 
-    Dumper.read(normalA).dumpAsPNG(Paths.get("images.png"));
+//    aWithNoDependency.getC(0).getOutputOnC();
 
-    waitAndRun(1, "Publish 2", () -> publisher.publish(TOPIC_FOR_INPUT, "2".getBytes()));
-    waitAndRun(2, "Disconnect normalA", () -> {
-      try {
-        boolean success = normalA.disconnectInput(TOPIC_URI_FOR_INPUT);
-        System.out.println("disconnect success: " + success);
-      } catch (IOException e) {
-        e.printStackTrace();
-      }
-    });
-    waitAndRun(3, "Publish 4", () -> publisher.publish(TOPIC_FOR_INPUT, "4".getBytes()));
+//    describedWait(1, "Print latest attributes");
+//    logger.info("latest attributes = {}", receiver.latestAttributes);
 
 //    while (true) {}
 //    System.out.println("[Enter] to exit");
 //    Scanner scanner = new Scanner(System.in);
 //    scanner.nextLine();
-    Thread.sleep(6);
+//    SECONDS.sleep(15);
   }
 
-  private static void waitAndRun(long seconds, String description, Runnable runnable) throws InterruptedException {
-    Thread.sleep(seconds);
-    System.out.println(description);
+  private static void describedWait(long seconds, String description) throws InterruptedException {
+    SECONDS.sleep(seconds);
+    logger.info("--- {} ---", description);
     publisher.publish("---", description.getBytes());
-    runnable.run();
   }
 
-  private static A addNewA() {
+  private static A addNewA(boolean useB) {
     A result = new A();
     result.setInput("1");
-    B b1 = new B();
-    B b2 = new B();
-    result.addB(b1);
-    result.addB(b2);
+    if (useB) {
+      B b1 = new B();
+      B b2 = new B();
+      result.addB(b1);
+      result.addB(b2);
+    } else {
+      C c1 = new C();
+      C c2 = new C();
+      result.addC(c1);
+      result.addC(c2);
+    }
     return result;
   }
 
-  private static void enableTracing(A a) {
-    a.trace().setReceiver((event, node, attribute, params, value) -> logger.info("event: {}, node: {}, attribute: {}, params: {}, value: {},", event, node, attribute, params, value));
+  private static void enableTracing(ASTNode<?> node) {
+    if (node.trace().getReceiver() != null && node.trace().getReceiver() instanceof MinimalReceiver) {
+      System.out.println("*** receiver already set up ***");
+    } else {
+      System.out.println("*** activate receiver ***");
+      receiver = new MinimalReceiver(node.trace().getReceiver());
+      node.trace().setReceiver(receiver);
+    }
   }
 }