diff --git a/build.gradle b/build.gradle
index fbb0d4f951ded7b126db7c7e46fb3c57ef514c6a..db9f3380a3a243bc376cd56697d83fb4c37febbe 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,6 +6,7 @@ buildscript {
 }
 
 plugins {
+    id 'com.github.ben-manes.versions' version '0.36.0'
     id 'java'
     id 'idea'
     id 'application'
@@ -49,16 +50,18 @@ idea.module.generatedSourceDirs += genSrc
 
 dependencies {
 //    implementation fileTree(include: ['dumpAst2uml.jar'], dir: 'libs')
-    implementation group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.15'
-    implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.2'
-    implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.2'
+    implementation group: 'org.fusesource.mqtt-client', name: 'mqtt-client', version: '1.16'
+    implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.14.0'
+    implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.14.0'
     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'
     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.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/')
+//    ragconnectClasspath group: 'de.tudresden.inf.st', name: 'ragconnect', version: '0.2.4'
+    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/')
 }
 
 // Input files for relast
@@ -88,7 +91,11 @@ task ragConnect(type: JavaExec) {
             'src/main/jastadd/MinimalModel.relast',
             'src/main/jastadd/MinimalModel.connect',
             '--logReads',
-            '--rootNode=A'
+            '--logWrites',
+            '--verbose',
+            '--rootNode=A',
+            '--incremental=param,debug',
+            "--tracing=cache,flush"
     ])
 
 }
@@ -103,6 +110,7 @@ task relastToJastAdd(type: JavaExec) {
             "--useJastAddNames",
             "--listClass=java.util.ArrayList",
             "--jastAddList=JastAddList",
+            "--serializer=jackson",
             "--resolverHelper",
             "--file"]
     +
@@ -161,13 +169,10 @@ jastadd {
     extraJastAddOptions = [
             '--lineColumnNumbers',
             '--List=JastAddList',
-//            '--incremental=param',
-//            '--cache=all',
-//            '--tracing=api,flush',
-
-//            "--flush=full",
-//            "--incremental=param,debug",
-//            "--tracing=cache,flush",
+            '--cache=all',
+            "--flush=full",
+            "--incremental=param,debug",
+            "--tracing=cache,flush",
     ]
 }
 
diff --git a/src/main/jastadd/MinimalModel.connect b/src/main/jastadd/MinimalModel.connect
index fa4c12e6d75c88efcba1fca0a737f82984f12e37..c7f1af635e09d9b999c72930ae2a1e70639a24ac 100644
--- a/src/main/jastadd/MinimalModel.connect
+++ b/src/main/jastadd/MinimalModel.connect
@@ -2,6 +2,8 @@ receive A.Input ;
 send A.OutputOnA ;
 send B.OutputOnB using Transformation ;
 send C.OutputOnC using Transformation ;
+send tree A.D ;
+receive tree A.Reading ;
 
 // mapping definitions
 Transformation maps String s to String {:
diff --git a/src/main/jastadd/MinimalModel.jrag b/src/main/jastadd/MinimalModel.jrag
index 27abf8f6a15176c0101b8203f8a77e59ab79a4b2..c684edbe07795bb53e1131bdbaf533cd584da553 100644
--- a/src/main/jastadd/MinimalModel.jrag
+++ b/src/main/jastadd/MinimalModel.jrag
@@ -8,4 +8,6 @@ aspect Computation {
   syn String C.getOutputOnC() = "c" + input();
   inh String C.input();
   eq A.getC().input() = getInput();
+
+  syn D A.getD() = new D().setID("dd" + getInput());
 }
diff --git a/src/main/jastadd/MinimalModel.relast b/src/main/jastadd/MinimalModel.relast
index c9c68e91e6cf70dc11096b566e523aec71ca1ad3..1df3cc07e098d21ac34238697ba7afdeecdd5067 100644
--- a/src/main/jastadd/MinimalModel.relast
+++ b/src/main/jastadd/MinimalModel.relast
@@ -1,3 +1,4 @@
-A ::= <Input:String> /<OutputOnA:String>/ B* C* ;
+A ::= <Input:String> /<OutputOnA:String>/ B* C* /D/ Reading:D ;
 B ::= /<OutputOnB:String>/ ;
 C ::= /<OutputOnC:String>/ ;
+D ::= <ID: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 88649c62e96b7ea21c7fc2bd1052059032fe3c5a..542ff536c5571c748dfd31e3ed012070a855a46f 100644
--- a/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java
+++ b/src/main/java/de/tudresden/inf/st/mrc/MinimalMain.java
@@ -2,15 +2,13 @@ package de.tudresden.inf.st.mrc;
 
 import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper;
 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.ByteArrayOutputStream;
 import java.io.IOException;
 import java.nio.file.Paths;
 import java.time.Instant;
-import java.util.ArrayList;
-import java.util.List;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
 
@@ -49,11 +47,22 @@ public class MinimalMain {
 //  static MinimalReceiver receiver = null;
 
   public static void main(String[] args) throws Exception {
-    boolean success;
     publisher = new MqttHandler("publisher").setHost("localhost");
     publisher.waitUntilReady(2, SECONDS);
     publisher.publish("---", ("Start at " + Instant.now()).getBytes());
 
+//    mainIncremental();
+    mainTree();
+  }
+
+  private static void mainIncremental() throws Exception {
+    // byte[] -> bool: input[0] == (byte) 1;
+    // bool -> byte[]: java.nio.ByteBuffer.allocate(1).put((byte) 1).array();
+
+
+
+    boolean success;
+
     A normalA = addNewA(true);
 //    enableTracing(normalA);
     B b1 = normalA.getB(0);
@@ -79,9 +88,6 @@ public class MinimalMain {
     aWithNoDependency.getC(0).connectOutputOnC("mqtt://localhost/aNoDep/c1/out", true);
     aWithNoDependency.getC(1).connectOutputOnC("mqtt://localhost/aNoDep/c2/out", false);
 
-    // stimulated incremental evaluation
-    aWithNoDependency.getC(0).getOutputOnC();
-
     Dumper.read(normalA).dumpAsPNG(Paths.get("image.png"));
 
     describedWait(1, "Publish 2");
@@ -94,22 +100,16 @@ public class MinimalMain {
     publisher.publish(TOPIC_FOR_INPUT, "22".getBytes());
     publisher.publish(TOPIC_FOR_INPUT, "23".getBytes());
 
-//    aWithNoDependency.getC(0).getOutputOnC();
-
     describedWait(2, "Disconnect normalA");
-//    success = normalA.disconnectInput(TOPIC_URI_FOR_INPUT);
-//    logger.info("disconnect success: {}", success);
+    success = normalA.disconnectInput(TOPIC_URI_FOR_INPUT);
+    logger.info("disconnect success: {}", success);
 
     describedWait(2, "Publish 4");
-//    receiver.reset();
     publisher.publish(TOPIC_FOR_INPUT, "4".getBytes());
 
-//    describedWait(1, "Print latest attributes");
-//    logger.info("latest attributes = {}", receiver.latestAttributes);
-
     describedWait(1, "Disconnect aNoDep");
-//    success = aWithNoDependency.disconnectInput(TOPIC_URI_FOR_INPUT);
-//    logger.info("disconnect success: {}", success);
+    success = aWithNoDependency.disconnectInput(TOPIC_URI_FOR_INPUT);
+    logger.info("disconnect success: {}", success);
 
     describedWait(1, "Publish 6");
     publisher.publish(TOPIC_FOR_INPUT, "6".getBytes());
@@ -165,6 +165,57 @@ public class MinimalMain {
     return result;
   }
 
+  private static void testTree() throws IOException, SerializationException, DeserializationException {
+    A root = new A();
+    root.setInput("123");
+
+
+    java.io.ByteArrayOutputStream outputStream = new java.io.ByteArrayOutputStream();
+    {
+      com.fasterxml.jackson.core.JsonFactory factory = new com.fasterxml.jackson.core.JsonFactory();
+      com.fasterxml.jackson.core.JsonGenerator generator = factory.createGenerator(outputStream, com.fasterxml.jackson.core.JsonEncoding.UTF8);
+      root.serialize(generator);
+      generator.flush();
+    }
+    String content = outputStream.toString();
+    System.out.println(content);
+
+    com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper();
+    com.fasterxml.jackson.core.JsonFactory factory = new com.fasterxml.jackson.core.JsonFactory();
+    com.fasterxml.jackson.core.JsonParser parser = factory.createParser(content);
+    A result = A.deserialize((com.fasterxml.jackson.databind.JsonNode)mapper.readTree(parser));
+    parser.close();
+    logger.info("result.getInput() = " + result.getInput());
+    logger.info("result.getD().getID() = " + result.getD().getID());
+  }
+
+  private static void mainTree() throws IOException, InterruptedException {
+    String uriString = "mqtt://localhost/normalA/d/out";
+
+    A sender = new A();
+    sender.setInput("123");
+    sender.ragconnectSetupMqttWaitUntilReady(2, SECONDS);
+
+    A receiver = new A();
+    receiver.ragconnectSetupMqttWaitUntilReady(2, SECONDS);
+    receiver.connectReading(uriString);
+
+    sender.connectOutputOnA("mqtt://localhost/normalA/out", true);
+    sender.connectD(uriString, true);
+
+    describedWait(1, "initial value");
+    logger.info("receiver.getReading().getID() = " + receiver.getReading().getID());
+
+    sender.getD().setID("abc");
+    describedWait(1, "after setID (does not work)");
+    logger.info("receiver.getReading().getID() = " + receiver.getReading().getID());
+
+    sender.setInput("def");
+    describedWait(1, "after setInput");
+    logger.info("receiver.getReading().getID() = " + receiver.getReading().getID());
+  }
+
+
 //  private static void enableTracing(ASTNode<?> node) {
 //    if (node.trace().getReceiver() != null && node.trace().getReceiver() instanceof MinimalReceiver) {
 //      System.out.println("*** receiver already set up ***");