diff --git a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
index a6bcbad077f4c7841eefd3c80edb8c9e0bea2f37..444f0214af4821f704a3307227c9f1b04b072e47 100644
--- a/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
+++ b/ragconnect.base/src/main/jastadd/intermediate/Generation.jadd
@@ -62,7 +62,6 @@ aspect AttributesForMustache {
   syn String MEndpointDefinition.lastDefinitionToType() = lastDefinition().toType();
   syn String MEndpointDefinition.lastResult() = lastDefinition().outputVarName();
   syn String MEndpointDefinition.condition() {
-    // TODO check which case is valid for type endpoints
     if (lastDefinition().mappingDef().getToType().isArray()) {
       return "java.util.Arrays.equals(" + preemptiveExpectedValue() + ", " + lastResult() + ")";
     }
@@ -130,7 +129,6 @@ aspect AttributesForMustache {
 
   syn String MTypeSendDefinition.sender() = "_sender_" + typeName();
   syn String MTypeSendDefinition.lastValue() = "_lastValue" + typeName();
-  // TODO check if this is correct (type does not have token)
   syn String MTypeSendDefinition.tokenResetMethod() = "get" + typeName() + "_reset";
   syn boolean MTypeSendDefinition.shouldSendValue() = endpointDef().asTypeEndpointDefinition().shouldSendValue();
 
diff --git a/ragconnect.tests/src/test/01-input/tree/Test.jadd b/ragconnect.tests/src/test/01-input/tree/Test.jadd
index 200e169a97cc0f735f4c00faac435e9528930bae..c9e47ed7d9c0402992882e3d60a78f08044bf063 100644
--- a/ragconnect.tests/src/test/01-input/tree/Test.jadd
+++ b/ragconnect.tests/src/test/01-input/tree/Test.jadd
@@ -65,6 +65,14 @@ aspect Computation {
   eq Nameable.isNameable() = true;
 }
 
+aspect Testing {
+  class ReceiverRoot implements org.jastadd.ragconnect.tests.AbstractTreeTest.TestWrapperReceiverRoot {}
+  class Alfa implements org.jastadd.ragconnect.tests.AbstractTreeTest.TestWrapperAlfa {}
+  class Bravo implements org.jastadd.ragconnect.tests.AbstractTreeTest.TestWrapperBravo {}
+  class Charlie implements org.jastadd.ragconnect.tests.AbstractTreeTest.TestWrapperCharlie {}
+  class Delta implements org.jastadd.ragconnect.tests.AbstractTreeTest.TestWrapperDelta {}
+}
+
 aspect NameResolution {
   @Override
   protected String Nameable.customID() {
diff --git a/ragconnect.tests/src/test/01-input/treeAllowedTokens/Test.connect b/ragconnect.tests/src/test/01-input/treeAllowedTokens/Test.connect
index 4037c28f3cae5f9400598c9fdd5e4614ed318929..d872ce56c59097e678e6cff0b25ec422130b6129 100644
--- a/ragconnect.tests/src/test/01-input/treeAllowedTokens/Test.connect
+++ b/ragconnect.tests/src/test/01-input/treeAllowedTokens/Test.connect
@@ -5,3 +5,22 @@ receive SenderRoot.Input1WhenFlagIsTrue ;
 receive SenderRoot.Input1WhenFlagIsFalse ;
 receive SenderRoot.Input2 ;
 receive SenderRoot.Input3 ;
+
+send tree SenderRoot.AlfaPrimitive using Alfa2String ;
+receive tree ReceiverRoot.AlfaPrimitive using String2Alfa ;
+
+Alfa2String maps Alfa alfa to String {:
+  StringBuilder sb = new StringBuilder();
+  sb.append(alfa.getID()).append(":").append(alfa.getStringValue()).append(";");
+  return sb.toString();
+:}
+
+String2Alfa maps String s to Alfa {:
+  int colonIndex = s.indexOf(":");
+  int id = Integer.parseInt(s.substring(0, colonIndex));
+  String value = s.substring(colonIndex + 1, s.length() - 1);
+  Alfa result = new Alfa();
+  result.setID(id);
+  result.setStringValue(value);
+  return result;
+:}
diff --git a/ragconnect.tests/src/test/01-input/treeAllowedTokens/Test.jadd b/ragconnect.tests/src/test/01-input/treeAllowedTokens/Test.jadd
index 6aab08be91ac6efc740cdd747739c62474f6903f..e5f8750c50a076498fea4398899fbebb5999620e 100644
--- a/ragconnect.tests/src/test/01-input/treeAllowedTokens/Test.jadd
+++ b/ragconnect.tests/src/test/01-input/treeAllowedTokens/Test.jadd
@@ -21,6 +21,12 @@ aspect Computation {
     return result;
   }
 
+  syn Alfa SenderRoot.getAlfaPrimitive() {
+    Alfa result = new Alfa();
+    result.setStringValue(getInput2());
+    return result;
+  }
+
   syn boolean ASTNode.isNameable() = false;
   eq Nameable.isNameable() = true;
 }
@@ -28,6 +34,10 @@ aspect Computation {
 aspect Enum {
   public enum MyEnum { FALSE, TRUE; }
 }
+aspect Testing {
+  class ReceiverRoot implements org.jastadd.ragconnect.tests.AbstractTreeAllowedTokensTest.TestWrapperReceiverRoot {}
+  class Alfa implements org.jastadd.ragconnect.tests.AbstractTreeAllowedTokensTest.TestWrapperAlfa {}
+}
 
 aspect NameResolution {
   // this should most likely be generated
diff --git a/ragconnect.tests/src/test/01-input/treeAllowedTokens/Test.relast b/ragconnect.tests/src/test/01-input/treeAllowedTokens/Test.relast
index 96a658a4ca9aa12def59f58837d561b197d82aec..591ebb22441a29b5a8561b0ea539367a44d9d2e8 100644
--- a/ragconnect.tests/src/test/01-input/treeAllowedTokens/Test.relast
+++ b/ragconnect.tests/src/test/01-input/treeAllowedTokens/Test.relast
@@ -1,8 +1,8 @@
 Root ::= SenderRoot* ReceiverRoot* ;
 
 Nameable ::= <ID:int> ;
-SenderRoot : Nameable ::= <Flag:boolean> <Input1WhenFlagIsTrue:int> <Input1WhenFlagIsFalse:int> <Input2:String> <Input3:double> /Alfa/ ;
+SenderRoot : Nameable ::= <Flag:boolean> <Input1WhenFlagIsTrue:int> <Input1WhenFlagIsFalse:int> <Input2:String> <Input3:double> /Alfa/ /AlfaPrimitive:Alfa/ ;
 
-ReceiverRoot : Nameable ::= Alfa ;
+ReceiverRoot : Nameable ::= Alfa AlfaPrimitive:Alfa ;
 
 Alfa : Nameable ::= <BooleanValue:boolean> <IntValue:int> <ShortValue:short> <LongValue:long> <FloatValue:float> <DoubleValue:double> <CharValue:char> <StringValue:String> <InstantValue:java.time.Instant> <PeriodValue:java.time.Period> <EnumValue:MyEnum> ;
diff --git a/ragconnect.tests/src/test/01-input/treeAllowedTokens/TestDependencies.connect b/ragconnect.tests/src/test/01-input/treeAllowedTokens/TestDependencies.connect
index a6a2ff73ca4f5ebc45a9ca552ef5b40c8abdd90f..afa4a832ca4bde7ca584c8b1d8f0fa69ee0955a8 100644
--- a/ragconnect.tests/src/test/01-input/treeAllowedTokens/TestDependencies.connect
+++ b/ragconnect.tests/src/test/01-input/treeAllowedTokens/TestDependencies.connect
@@ -3,3 +3,5 @@ SenderRoot.Alfa canDependOn SenderRoot.Input1WhenFlagIsTrue as Input1WhenFlagIsT
 SenderRoot.Alfa canDependOn SenderRoot.Input1WhenFlagIsFalse as Input1WhenFlagIsFalseDependency ;
 SenderRoot.Alfa canDependOn SenderRoot.Input2 as Input2Dependency ;
 SenderRoot.Alfa canDependOn SenderRoot.Input3 as Input3Dependency ;
+
+SenderRoot.AlfaPrimitive canDependOn SenderRoot.Input2 as PrimitiveInput2Dependency ;
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/AbstractTreeAllowedTokensTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/AbstractTreeAllowedTokensTest.java
index 9aa9fd1dd6ed9696c87fc55ec320a88bb5ca0f04..e87a298fe92e0019fa7da2012d6630590d7a348e 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/AbstractTreeAllowedTokensTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/AbstractTreeAllowedTokensTest.java
@@ -1,5 +1,11 @@
 package org.jastadd.ragconnect.tests;
 
+import java.io.IOException;
+import java.time.Instant;
+import java.time.Period;
+
+import static org.junit.jupiter.api.Assertions.*;
+
 /**
  * Base class for test cases "tree allowed tokens manual" and "tree allowed tokens incremental".
  *
@@ -12,92 +18,133 @@ public abstract class AbstractTreeAllowedTokensTest extends AbstractMqttTest {
   protected static final String TOPIC_INPUT2 = "input2";
   protected static final String TOPIC_INPUT3 = "input3";
   protected static final String TOPIC_ALFA = "alfa";
+  protected static final String TOPIC_ALFA_PRIMITIVE = "primitive";
 
   protected static final String INSTANT_A = "1999-12-03T10:15:30Z";
   protected static final String INSTANT_B = "2011-12-03T10:15:30Z";
   protected static final String INSTANT_C = "2012-12-03T10:15:30Z";
 
+  protected TestWrapperReceiverRoot receiverRoot;
+
+  public interface TestWrapperReceiverRoot {
+    TestWrapperAlfa getAlfa();
+    TestWrapperAlfa getAlfaPrimitive();
+    boolean connectAlfa(String mqttUri) throws IOException;
+    boolean connectAlfaPrimitive(String mqttUri) throws IOException;
+  }
+  public interface TestWrapperAlfa {
+    boolean getBooleanValue();
+    int getIntValue();
+    short getShortValue();
+    long getLongValue();
+    float getFloatValue();
+    double getDoubleValue();
+    String getStringValue();
+    char getCharValue();
+    Instant getInstantValue();
+    Period getPeriodValue();
+  }
 
   @Override
   protected void communicateSendInitialValue() throws InterruptedException {
     checkTree(1, false, 0, INSTANT_A, 0);
+    checkPrimitiveTree(1, INSTANT_A);
 
     // flag: false. sendInput1WhenFalse(2)
     sendInput1WhenFalse(2);
     checkTree(2, false, 2, INSTANT_A, 0);
+    checkPrimitiveTree(1, INSTANT_A);
 
     // flag: false. setFlag(false) -> no change
     setFlag(false);
     checkTree(2, false, 2, INSTANT_A, 0);
+    checkPrimitiveTree(1, INSTANT_A);
 
     // flag: false. setFlag(true)
     setFlag(true);
     checkTree(3, true, 0, INSTANT_A, 0);
+    checkPrimitiveTree(1, INSTANT_A);
 
     // flag: true. sendInput1WhenFalse(3) -> no change
     sendInput1WhenFalse(3);
     checkTree(3, true, 0, INSTANT_A, 0);
+    checkPrimitiveTree(1, INSTANT_A);
 
     // flag: true. sendInput1WhenTrue(4)
     sendInput1WhenTrue(4);
     checkTree(4, true, 4, INSTANT_A, 0);
+    checkPrimitiveTree(1, INSTANT_A);
 
     // sendInput2(INSTANT_B)
     sendInput2(INSTANT_B);
     checkTree(5, true, 4, INSTANT_B, 0);
+    checkPrimitiveTree(2, INSTANT_B);
 
     // sendInput2(INSTANT_B) -> no change
     sendInput2(INSTANT_B);
     checkTree(5, true, 4, INSTANT_B, 0);
+    checkPrimitiveTree(2, INSTANT_B);
 
     // sendInput3(5.1)
     sendInput3(5.1);
     checkTree(6, true, 4, INSTANT_B, 5.1);
+    checkPrimitiveTree(2, INSTANT_B);
 
     // sendInput3(5.1) -> no change
     sendInput3(5.1);
     checkTree(6, true, 4, INSTANT_B, 5.1);
+    checkPrimitiveTree(2, INSTANT_B);
   }
 
   @Override
   protected void communicateOnlyUpdatedValue() throws InterruptedException {
     checkTree(0, false, null, null, 0);
+    checkPrimitiveTree(0, null);
 
     // flag: false. sendInput1WhenFalse(12)
     sendInput1WhenFalse(12);
     checkTree(1, false, 12, INSTANT_A, 0);
+    checkPrimitiveTree(0, null);
 
     // flag: false. setFlag(false) -> no change
     setFlag(false);
     checkTree(1, false, 12, INSTANT_A, 0);
+    checkPrimitiveTree(0, null);
 
     // flag: false. setFlag(true)
     setFlag(true);
     checkTree(2, true, 0, INSTANT_A, 0);
+    checkPrimitiveTree(0, null);
 
     // flag: true. sendInput1WhenFalse(13) -> no change
     sendInput1WhenFalse(13);
     checkTree(2, true, 0, INSTANT_A, 0);
+    checkPrimitiveTree(0, null);
 
     // flag: true. sendInput1WhenTrue(14)
     sendInput1WhenTrue(14);
     checkTree(3, true, 14, INSTANT_A, 0);
+    checkPrimitiveTree(0, null);
 
     // sendInput2(INSTANT_C)
     sendInput2(INSTANT_C);
     checkTree(4, true, 14, INSTANT_C, 0);
+    checkPrimitiveTree(1, INSTANT_C);
 
     // sendInput2(INSTANT_C) -> no change
     sendInput2(INSTANT_C);
     checkTree(4, true, 14, INSTANT_C, 0);
+    checkPrimitiveTree(1, INSTANT_C);
 
     // sendInput3(15.1)
     sendInput3(15.1);
     checkTree(5, true, 14, INSTANT_C, 15.1);
+    checkPrimitiveTree(1, INSTANT_C);
 
     // sendInput3(15.1) -> no change
     sendInput3(15.1);
     checkTree(5, true, 14, INSTANT_C, 15.1);
+    checkPrimitiveTree(1, INSTANT_C);
   }
 
   protected void sendInput1WhenFalse(int value) {
@@ -118,12 +165,52 @@ public abstract class AbstractTreeAllowedTokensTest extends AbstractMqttTest {
 
   protected abstract void setFlag(boolean value);
 
-  protected abstract void checkTree(int expectedCount, boolean expectedBooleanValue, Integer expectedIntValue, String expectedStringValue, double expectedDoubleValue) throws InterruptedException;
+  protected void checkTree(int expectedCount, boolean expectedBooleanValue, Integer expectedIntValue, String expectedStringValue, double expectedDoubleValue) throws InterruptedException {
+    TestUtils.waitForMqtt();
+
+    assertEquals(expectedCount, data.numberOfTrees);
+    if (expectedStringValue == null) {
+      assertNull(receiverRoot.getAlfa());
+    } else {
+      assertNotNull(receiverRoot.getAlfa());
+      TestWrapperAlfa alfa = receiverRoot.getAlfa();
+
+      assertEquals(expectedBooleanValue, alfa.getBooleanValue());
+      assertEquals(expectedIntValue, alfa.getIntValue());
+      assertEquals(expectedIntValue.shortValue(), alfa.getShortValue());
+      assertEquals(expectedIntValue.longValue(), alfa.getLongValue());
+
+      assertEquals(expectedDoubleValue, alfa.getFloatValue(), TestUtils.DELTA);
+      assertEquals(expectedDoubleValue, alfa.getDoubleValue(), TestUtils.DELTA);
+
+      assertEquals(expectedStringValue, alfa.getStringValue());
+      assertEquals(expectedStringValue.charAt(0), alfa.getCharValue());
+      assertEquals(Instant.parse(expectedStringValue), alfa.getInstantValue());
+      assertEquals(Period.of(0, 0, expectedIntValue), alfa.getPeriodValue());
+
+      checkMyEnum(alfa, expectedBooleanValue);
+    }
+  }
+
+  protected void checkPrimitiveTree(int expectedCount, String expectedStringValue) {
+    assertEquals(expectedCount, data.numberOfPrimitiveTrees);
+    if (expectedStringValue == null) {
+      assertNull(receiverRoot.getAlfaPrimitive());
+    } else {
+      assertNotNull(receiverRoot.getAlfaPrimitive());
+
+      TestWrapperAlfa alfaPrimitive = receiverRoot.getAlfaPrimitive();
+      assertEquals(expectedStringValue, alfaPrimitive.getStringValue());
+    }
+  }
+
+  protected abstract void checkMyEnum(TestWrapperAlfa alfa, boolean expectedBooleanValue);
 
   protected ReceiverData data;
 
   protected static class ReceiverData {
     int numberOfTrees = 0;
+    int numberOfPrimitiveTrees = 0;
   }
 
 }
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/AbstractTreeTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/AbstractTreeTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..069f622c84cf95508575143b3b9d23288f42bc4a
--- /dev/null
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/AbstractTreeTest.java
@@ -0,0 +1,206 @@
+package org.jastadd.ragconnect.tests;
+
+import java.io.IOException;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * Base class for test cases "tree manual" and "tree incremental".
+ *
+ * @author rschoene - Initial contribution
+ */
+public abstract class AbstractTreeTest extends AbstractMqttTest {
+  protected static final String TOPIC_ALFA = "alfa";
+  protected ReceiverData data;
+  protected TestWrapperReceiverRoot receiverRoot;
+
+  public interface TestWrapperReceiverRoot {
+    TestWrapperAlfa getAlfa();
+    boolean connectAlfa(String mqttUri) throws IOException;
+  }
+  public interface TestWrapperAlfa {
+    TestWrapperBravo getBravo(int i);
+    int getNumBravo();
+    int getNumCharlie();
+    int getNumDelta();
+
+    TestWrapperAlfa getMyself();
+    TestWrapperBravo getMyBravo();
+    boolean hasOptionalBravo();
+    TestWrapperBravo getOptionalBravo();
+    TestWrapperCharlie getCharlie(int i);
+    TestWrapperDelta getDelta(int i);
+    <T extends TestWrapperBravo> List<T> getMultiBravoList();
+  }
+  public interface TestWrapperBravo {
+
+    TestWrapperCharlie getMyCharlie();
+    boolean hasOptionalCharlie();
+    TestWrapperCharlie getOptionalCharlie();
+    <T extends TestWrapperCharlie> List<T> getMultiCharlieList();
+    boolean hasSingleBi1Delta();
+    TestWrapperDelta getSingleBi1Delta();
+    <T extends TestWrapperDelta> List<T> getMultiBi2DeltaList();
+    <T extends TestWrapperDelta> List<T> getMultiBi3DeltaList();
+  }
+  public interface TestWrapperCharlie {
+    boolean hasMyAlfa();
+    TestWrapperAlfa getMyAlfa();
+  }
+  public interface TestWrapperDelta {
+    boolean hasSingleBack1Alfa();
+    TestWrapperAlfa getSingleBack1Alfa();
+    boolean hasSingleBack2Alfa();
+    TestWrapperAlfa getSingleBack2Alfa();
+    <T extends TestWrapperAlfa> List<T> getMultiBack3AlfaList();
+    boolean hasSingleBack1Bravo();
+    TestWrapperBravo getSingleBack1Bravo();
+    TestWrapperBravo getSingleBack2Bravo();
+    boolean hasSingleBack2Bravo();
+    <T extends TestWrapperBravo> List<T> getMultiBack3BravoList();
+  }
+
+  @Override
+  protected void communicateSendInitialValue() throws InterruptedException {
+    checkTree(1, 0);
+
+    setInput(1);
+    checkTree(2, 1);
+
+    setInput(1);
+    checkTree(2, 1);
+
+    setInput(2);
+    checkTree(3, 2);
+  }
+
+  @Override
+  protected void communicateOnlyUpdatedValue() throws InterruptedException {
+    checkTree(0, null);
+
+    setInput(1);
+    checkTree(1, 1);
+
+    setInput(1);
+    checkTree(1, 1);
+
+    setInput(2);
+    checkTree(2, 2);
+  }
+
+  protected abstract void setInput(int input);
+
+  protected void checkTree(int expectedCount, Integer expectedInput) throws InterruptedException {
+    TestUtils.waitForMqtt();
+
+    assertEquals(expectedCount, data.numberOfTrees);
+    if (expectedInput == null) {
+      assertNull(receiverRoot.getAlfa());
+    } else {
+      assertNotNull(receiverRoot.getAlfa());
+      TestWrapperAlfa alfa = receiverRoot.getAlfa();
+      assertEquals(4, alfa.getNumBravo());
+      assertEquals(4, alfa.getNumCharlie());
+      assertEquals(4, alfa.getNumDelta());
+
+      TestWrapperBravo inputBravo = alfa.getBravo(expectedInput);
+      TestWrapperCharlie inputCharlie = alfa.getCharlie(expectedInput);
+      TestWrapperDelta inputDelta = alfa.getDelta(expectedInput);
+
+      // Alfa -> Alfa
+      assertEquals(alfa, alfa.getMyself());
+
+      // Alfa -> Bravo
+      assertEquals(inputBravo, alfa.getMyBravo());
+      assertTrue(alfa.hasOptionalBravo());
+      assertEquals(inputBravo, alfa.getOptionalBravo());
+      assertThat(alfa.getMultiBravoList()).containsExactly(
+          inputBravo, alfa.getBravo(expectedInput + 1));
+
+      // Charlie -> Alfa
+      for (int i = 0; i < 4; i++) {
+        TestWrapperCharlie Charlie = alfa.getCharlie(i);
+        if (i == expectedInput) {
+          assertTrue(Charlie.hasMyAlfa());
+          assertEquals(alfa, Charlie.getMyAlfa());
+        } else {
+          assertFalse(Charlie.hasMyAlfa());
+        }
+      }
+
+      // Alfa <-> Delta
+      for (int i = 0; i < 4; i++) {
+        TestWrapperDelta Delta = alfa.getDelta(i);
+        if (i == expectedInput) {
+          assertTrue(Delta.hasSingleBack1Alfa());
+          assertEquals(alfa, Delta.getSingleBack1Alfa());
+        } else {
+          assertFalse(Delta.hasSingleBack1Alfa());
+        }
+        if (i == expectedInput || i == expectedInput + 1) {
+          assertTrue(Delta.hasSingleBack2Alfa());
+          assertEquals(alfa, Delta.getSingleBack2Alfa());
+          assertThat(Delta.getMultiBack3AlfaList()).containsExactly(alfa);
+        } else {
+          assertFalse(Delta.hasSingleBack2Alfa());
+          assertThat(Delta.getMultiBack3AlfaList()).isEmpty();
+        }
+      }
+
+      // Bravo -> Charlie
+      for (int i = 0; i < 4; i++) {
+        TestWrapperBravo Bravo = alfa.getBravo(i);
+
+        if (i == expectedInput) {
+          assertEquals(inputCharlie, Bravo.getMyCharlie());
+          assertTrue(Bravo.hasOptionalCharlie());
+          assertEquals(inputCharlie, Bravo.getOptionalCharlie());
+          assertThat(Bravo.getMultiCharlieList()).containsExactly(
+              inputCharlie, alfa.getCharlie(expectedInput + 1));
+        } else {
+          assertEquals(alfa.getCharlie(0), Bravo.getMyCharlie());
+          assertFalse(Bravo.hasOptionalCharlie());
+          assertThat(Bravo.getMultiCharlieList()).isEmpty();
+        }
+      }
+
+      // Bravo <-> Delta
+      for (int i = 0; i < 4; i++) {
+        TestWrapperBravo Bravo = alfa.getBravo(i);
+        TestWrapperDelta Delta = alfa.getDelta(i);
+
+        if (i == expectedInput) {
+          assertTrue(Bravo.hasSingleBi1Delta());
+          assertTrue(Delta.hasSingleBack1Bravo());
+          assertEquals(inputDelta, Bravo.getSingleBi1Delta());
+          assertEquals(inputBravo, Delta.getSingleBack1Bravo());
+          assertThat(Bravo.getMultiBi2DeltaList()).containsExactly(
+              inputDelta, alfa.getDelta(expectedInput + 1));
+        } else {
+          assertFalse(Bravo.hasSingleBi1Delta());
+          assertFalse(Delta.hasSingleBack1Bravo());
+          assertThat(Bravo.getMultiBi2DeltaList()).isEmpty();
+        }
+        if (i == expectedInput || i == expectedInput + 1) {
+          assertThat(Bravo.getMultiBi3DeltaList()).containsExactly(
+              inputDelta, alfa.getDelta(expectedInput + 1));
+          assertTrue(Delta.hasSingleBack2Bravo());
+          assertEquals(inputBravo, Delta.getSingleBack2Bravo());
+          assertThat(Delta.getMultiBack3BravoList()).containsExactly(
+              inputBravo, alfa.getBravo(expectedInput + 1));
+        } else {
+          assertThat(Bravo.getMultiBi3DeltaList()).isEmpty();
+          assertFalse(Delta.hasSingleBack2Bravo());
+          assertThat(Delta.getMultiBack3BravoList()).isEmpty();
+        }
+      }
+    }
+  }
+
+  protected static class ReceiverData {
+    int numberOfTrees = 0;
+  }
+
+}
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeAllowedTokensIncrementalTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeAllowedTokensIncrementalTest.java
index fa1d4fede0703e431b585420f70ce242bb59f2aa..5dd1b1504701b0c5499e7277b8287e1b66a9e5a5 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeAllowedTokensIncrementalTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeAllowedTokensIncrementalTest.java
@@ -1,28 +1,28 @@
 package org.jastadd.ragconnect.tests;
 
+import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import treeAllowedTokensInc.ast.*;
 
 import java.io.IOException;
 import java.nio.file.Paths;
-import java.time.Instant;
-import java.time.Period;
 import java.util.concurrent.TimeUnit;
 
 import static org.jastadd.ragconnect.tests.TestUtils.mqttUri;
 import static org.jastadd.ragconnect.tests.TestUtils.testJaddContainReferenceToJackson;
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Test case "tree allowed tokens incremental"
  *
  * @author rschoene - Initial contribution
  */
+@Tag("SpecificTest")
 public class TreeAllowedTokensIncrementalTest extends AbstractTreeAllowedTokensTest {
 
   private Root model;
   private SenderRoot senderRoot;
-  private ReceiverRoot receiverRoot;
   private MqttHandler handler;
 
   @Test
@@ -41,7 +41,7 @@ public class TreeAllowedTokensIncrementalTest extends AbstractTreeAllowedTokensT
     model.addSenderRoot(senderRoot);
 
     receiverRoot = new ReceiverRoot();
-    model.addReceiverRoot(receiverRoot);
+    model.addReceiverRoot((ReceiverRoot) receiverRoot);
   }
 
   @Override
@@ -55,6 +55,7 @@ public class TreeAllowedTokensIncrementalTest extends AbstractTreeAllowedTokensT
 
     data = new ReceiverData();
     handler.newConnection(TOPIC_ALFA, bytes -> data.numberOfTrees += 1);
+    handler.newConnection(TOPIC_ALFA_PRIMITIVE, bytes -> data.numberOfPrimitiveTrees += 1);
 
     // connect. important: first receiver, then sender. to not miss initial value.
     senderRoot.connectInput1WhenFlagIsFalse(mqttUri(TOPIC_INPUT1FALSE));
@@ -62,7 +63,9 @@ public class TreeAllowedTokensIncrementalTest extends AbstractTreeAllowedTokensT
     senderRoot.connectInput2(mqttUri(TOPIC_INPUT2));
     senderRoot.connectInput3(mqttUri(TOPIC_INPUT3));
     receiverRoot.connectAlfa(mqttUri(TOPIC_ALFA));
+    receiverRoot.connectAlfaPrimitive(mqttUri(TOPIC_ALFA_PRIMITIVE));
     senderRoot.connectAlfa(mqttUri(TOPIC_ALFA), writeCurrentValue);
+    senderRoot.connectAlfaPrimitive(mqttUri(TOPIC_ALFA_PRIMITIVE), writeCurrentValue);
   }
 
   @Override
@@ -79,30 +82,8 @@ public class TreeAllowedTokensIncrementalTest extends AbstractTreeAllowedTokensT
     senderRoot.setFlag(value);
   }
 
-  protected void checkTree(int expectedCount, boolean expectedBooleanValue, Integer expectedIntValue, String expectedStringValue, double expectedDoubleValue) throws InterruptedException {
-    TestUtils.waitForMqtt();
-
-    assertEquals(expectedCount, data.numberOfTrees);
-    if (expectedIntValue == null) {
-      assertNull(receiverRoot.getAlfa());
-    } else {
-      assertNotNull(receiverRoot.getAlfa());
-      Alfa alfa = receiverRoot.getAlfa();
-
-      assertEquals(expectedBooleanValue, alfa.getBooleanValue());
-      assertEquals(expectedIntValue, alfa.getIntValue());
-      assertEquals(expectedIntValue.shortValue(), alfa.getShortValue());
-      assertEquals(expectedIntValue.longValue(), alfa.getLongValue());
-
-      assertEquals(expectedDoubleValue, alfa.getFloatValue(), TestUtils.DELTA);
-      assertEquals(expectedDoubleValue, alfa.getDoubleValue(), TestUtils.DELTA);
-
-      assertEquals(expectedStringValue, alfa.getStringValue());
-      assertEquals(expectedStringValue.charAt(0), alfa.getCharValue());
-      assertEquals(Instant.parse(expectedStringValue), alfa.getInstantValue());
-      assertEquals(Period.of(0, 0, expectedIntValue), alfa.getPeriodValue());
-
-      assertEquals(expectedBooleanValue ? MyEnum.TRUE : MyEnum.FALSE, alfa.getEnumValue());
-    }
+  @Override
+  protected void checkMyEnum(TestWrapperAlfa alfa, boolean expectedBooleanValue) {
+    assertEquals(expectedBooleanValue ? MyEnum.TRUE : MyEnum.FALSE, ((Alfa) alfa).getEnumValue());
   }
 }
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeAllowedTokensManualTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeAllowedTokensManualTest.java
index a8e7f4a0474e435f31c552d919976c1c11ff3bab..c3b91a04f45a47250f2cdf557575c5c48ac09c05 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeAllowedTokensManualTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeAllowedTokensManualTest.java
@@ -22,7 +22,6 @@ public class TreeAllowedTokensManualTest extends AbstractTreeAllowedTokensTest {
 
   private Root model;
   private SenderRoot senderRoot;
-  private ReceiverRoot receiverRoot;
   private MqttHandler handler;
 
   @Test
@@ -41,7 +40,7 @@ public class TreeAllowedTokensManualTest extends AbstractTreeAllowedTokensTest {
     model.addSenderRoot(senderRoot);
 
     receiverRoot = new ReceiverRoot();
-    model.addReceiverRoot(receiverRoot);
+    model.addReceiverRoot((ReceiverRoot) receiverRoot);
   }
 
   @Override
@@ -57,9 +56,11 @@ public class TreeAllowedTokensManualTest extends AbstractTreeAllowedTokensTest {
     senderRoot.addInput1WhenFlagIsTrueDependency(senderRoot);
     senderRoot.addInput2Dependency(senderRoot);
     senderRoot.addInput3Dependency(senderRoot);
+    senderRoot.addPrimitiveInput2Dependency(senderRoot);
 
     data = new ReceiverData();
     handler.newConnection(TOPIC_ALFA, bytes -> data.numberOfTrees += 1);
+    handler.newConnection(TOPIC_ALFA_PRIMITIVE, bytes -> data.numberOfPrimitiveTrees += 1);
 
     // connect. important: first receiver, then sender. to not miss initial value.
     senderRoot.connectInput1WhenFlagIsFalse(mqttUri(TOPIC_INPUT1FALSE));
@@ -67,7 +68,9 @@ public class TreeAllowedTokensManualTest extends AbstractTreeAllowedTokensTest {
     senderRoot.connectInput2(mqttUri(TOPIC_INPUT2));
     senderRoot.connectInput3(mqttUri(TOPIC_INPUT3));
     receiverRoot.connectAlfa(mqttUri(TOPIC_ALFA));
+    receiverRoot.connectAlfaPrimitive(mqttUri(TOPIC_ALFA_PRIMITIVE));
     senderRoot.connectAlfa(mqttUri(TOPIC_ALFA), writeCurrentValue);
+    senderRoot.connectAlfaPrimitive(mqttUri(TOPIC_ALFA_PRIMITIVE), writeCurrentValue);
   }
 
   @Override
@@ -84,30 +87,8 @@ public class TreeAllowedTokensManualTest extends AbstractTreeAllowedTokensTest {
     senderRoot.setFlag(value);
   }
 
-  protected void checkTree(int expectedCount, boolean expectedBooleanValue, Integer expectedIntValue, String expectedStringValue, double expectedDoubleValue) throws InterruptedException {
-    TestUtils.waitForMqtt();
-
-    assertEquals(expectedCount, data.numberOfTrees);
-    if (expectedIntValue == null) {
-      assertNull(receiverRoot.getAlfa());
-    } else {
-      assertNotNull(receiverRoot.getAlfa());
-      Alfa alfa = receiverRoot.getAlfa();
-
-      assertEquals(expectedBooleanValue, alfa.getBooleanValue());
-      assertEquals(expectedIntValue, alfa.getIntValue());
-      assertEquals(expectedIntValue.shortValue(), alfa.getShortValue());
-      assertEquals(expectedIntValue.longValue(), alfa.getLongValue());
-
-      assertEquals(expectedDoubleValue, alfa.getFloatValue(), TestUtils.DELTA);
-      assertEquals(expectedDoubleValue, alfa.getDoubleValue(), TestUtils.DELTA);
-
-      assertEquals(expectedStringValue, alfa.getStringValue());
-      assertEquals(expectedStringValue.charAt(0), alfa.getCharValue());
-      assertEquals(Instant.parse(expectedStringValue), alfa.getInstantValue());
-      assertEquals(Period.of(0, 0, expectedIntValue), alfa.getPeriodValue());
-
-      assertEquals(expectedBooleanValue ? MyEnum.TRUE : MyEnum.FALSE, alfa.getEnumValue());
-    }
+  @Override
+  protected void checkMyEnum(TestWrapperAlfa alfa, boolean expectedBooleanValue) {
+    assertEquals(expectedBooleanValue ? MyEnum.TRUE : MyEnum.FALSE, ((Alfa) alfa).getEnumValue());
   }
 }
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeIncrementalTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeIncrementalTest.java
index d1606497cadf40d9a49a9291dbbbf1db03500eee..e0d7c817e372395adf98565b5a44347335a2eb45 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeIncrementalTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeIncrementalTest.java
@@ -17,14 +17,11 @@ import static org.junit.jupiter.api.Assertions.*;
  *
  * @author rschoene - Initial contribution
  */
-public class TreeIncrementalTest extends AbstractMqttTest {
+public class TreeIncrementalTest extends AbstractTreeTest {
 
-  private static final String TOPIC_ALFA = "alfa";
   private Root model;
   private SenderRoot senderRoot;
-  private ReceiverRoot receiverRoot;
   private MqttHandler handler;
-  private ReceiverData data;
 
   @Test
   public void checkJacksonReference() {
@@ -40,7 +37,7 @@ public class TreeIncrementalTest extends AbstractMqttTest {
     model.addSenderRoot(senderRoot);
 
     receiverRoot = new ReceiverRoot();
-    model.addReceiverRoot(receiverRoot);
+    model.addReceiverRoot((ReceiverRoot) receiverRoot);
   }
 
   @Override
@@ -60,34 +57,6 @@ public class TreeIncrementalTest extends AbstractMqttTest {
     senderRoot.connectAlfa(mqttUri(TOPIC_ALFA), writeCurrentValue);
   }
 
-  @Override
-  protected void communicateSendInitialValue() throws InterruptedException {
-    checkTree(1, 0);
-
-    setInput(1);
-    checkTree(2, 1);
-
-    setInput(1);
-    checkTree(2, 1);
-
-    setInput(2);
-    checkTree(3, 2);
-  }
-
-  @Override
-  protected void communicateOnlyUpdatedValue() throws InterruptedException {
-    checkTree(0, null);
-
-    setInput(1);
-    checkTree(1, 1);
-
-    setInput(1);
-    checkTree(1, 1);
-
-    setInput(2);
-    checkTree(2, 2);
-  }
-
   @Override
   protected void closeConnections() {
     if (handler != null) {
@@ -98,118 +67,7 @@ public class TreeIncrementalTest extends AbstractMqttTest {
     }
   }
 
-  private void setInput(int input) {
+  protected void setInput(int input) {
     senderRoot.setInput(input);
   }
-
-  private void checkTree(int expectedCount, Integer expectedInput) throws InterruptedException {
-    TestUtils.waitForMqtt();
-
-    assertEquals(expectedCount, data.numberOfTrees);
-    if (expectedInput == null) {
-      assertNull(receiverRoot.getAlfa());
-    } else {
-      assertNotNull(receiverRoot.getAlfa());
-      Alfa alfa = receiverRoot.getAlfa();
-      assertEquals(4, alfa.getNumBravo());
-      assertEquals(4, alfa.getNumCharlie());
-      assertEquals(4, alfa.getNumDelta());
-
-      Bravo inputBravo = alfa.getBravo(expectedInput);
-      Charlie inputCharlie = alfa.getCharlie(expectedInput);
-      Delta inputDelta = alfa.getDelta(expectedInput);
-
-      // Alfa -> Alfa
-      assertEquals(alfa, alfa.getMyself());
-
-      // Alfa -> Bravo
-      assertEquals(inputBravo, alfa.getMyBravo());
-      assertTrue(alfa.hasOptionalBravo());
-      assertEquals(inputBravo, alfa.getOptionalBravo());
-      assertThat(alfa.getMultiBravoList()).containsExactly(
-          inputBravo, alfa.getBravo(expectedInput + 1));
-
-      // Charlie -> Alfa
-      for (int i = 0; i < 4; i++) {
-        Charlie Charlie = alfa.getCharlie(i);
-        if (i == expectedInput) {
-          assertTrue(Charlie.hasMyAlfa());
-          assertEquals(alfa, Charlie.getMyAlfa());
-        } else {
-          assertFalse(Charlie.hasMyAlfa());
-        }
-      }
-
-      // Alfa <-> Delta
-      for (int i = 0; i < 4; i++) {
-        Delta Delta = alfa.getDelta(i);
-        if (i == expectedInput) {
-          assertTrue(Delta.hasSingleBack1Alfa());
-          assertEquals(alfa, Delta.getSingleBack1Alfa());
-        } else {
-          assertFalse(Delta.hasSingleBack1Alfa());
-        }
-        if (i == expectedInput || i == expectedInput + 1) {
-          assertTrue(Delta.hasSingleBack2Alfa());
-          assertEquals(alfa, Delta.getSingleBack2Alfa());
-          assertThat(Delta.getMultiBack3AlfaList()).containsExactly(alfa);
-        } else {
-          assertFalse(Delta.hasSingleBack2Alfa());
-          assertThat(Delta.getMultiBack3AlfaList()).isEmpty();
-        }
-      }
-
-      // Bravo -> Charlie
-      for (int i = 0; i < 4; i++) {
-        Bravo Bravo = alfa.getBravo(i);
-
-        if (i == expectedInput) {
-          assertEquals(inputCharlie, Bravo.getMyCharlie());
-          assertTrue(Bravo.hasOptionalCharlie());
-          assertEquals(inputCharlie, Bravo.getOptionalCharlie());
-          assertThat(Bravo.getMultiCharlieList()).containsExactly(
-              inputCharlie, alfa.getCharlie(expectedInput + 1));
-        } else {
-          assertEquals(alfa.getCharlie(0), Bravo.getMyCharlie());
-          assertFalse(Bravo.hasOptionalCharlie());
-          assertThat(Bravo.getMultiCharlieList()).isEmpty();
-        }
-      }
-
-      // Bravo <-> Delta
-      for (int i = 0; i < 4; i++) {
-        Bravo Bravo = alfa.getBravo(i);
-        Delta Delta = alfa.getDelta(i);
-
-        if (i == expectedInput) {
-          assertTrue(Bravo.hasSingleBi1Delta());
-          assertTrue(Delta.hasSingleBack1Bravo());
-          assertEquals(inputDelta, Bravo.getSingleBi1Delta());
-          assertEquals(inputBravo, Delta.getSingleBack1Bravo());
-          assertThat(Bravo.getMultiBi2DeltaList()).containsExactly(
-              inputDelta, alfa.getDelta(expectedInput + 1));
-        } else {
-          assertFalse(Bravo.hasSingleBi1Delta());
-          assertFalse(Delta.hasSingleBack1Bravo());
-          assertThat(Bravo.getMultiBi2DeltaList()).isEmpty();
-        }
-        if (i == expectedInput || i == expectedInput + 1) {
-          assertThat(Bravo.getMultiBi3DeltaList()).containsExactly(
-              inputDelta, alfa.getDelta(expectedInput + 1));
-          assertTrue(Delta.hasSingleBack2Bravo());
-          assertEquals(inputBravo, Delta.getSingleBack2Bravo());
-          assertThat(Delta.getMultiBack3BravoList()).containsExactly(
-              inputBravo, alfa.getBravo(expectedInput + 1));
-        } else {
-          assertThat(Bravo.getMultiBi3DeltaList()).isEmpty();
-          assertFalse(Delta.hasSingleBack2Bravo());
-          assertThat(Delta.getMultiBack3BravoList()).isEmpty();
-        }
-      }
-    }
-  }
-
-  private static class ReceiverData {
-    int numberOfTrees = 0;
-  }
 }
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeManualTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeManualTest.java
index 5cc2da5e03ea6e12e5c2992187b3472f20c3e4ba..060317dfd749f0815af9fe42d1cb9553fe9034ae 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeManualTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TreeManualTest.java
@@ -1,30 +1,29 @@
 package org.jastadd.ragconnect.tests;
 
 import org.junit.jupiter.api.Test;
-import tree.ast.*;
+import tree.ast.MqttHandler;
+import tree.ast.ReceiverRoot;
+import tree.ast.Root;
+import tree.ast.SenderRoot;
 
 import java.io.IOException;
 import java.nio.file.Paths;
 import java.util.concurrent.TimeUnit;
 
-import static org.assertj.core.api.Assertions.assertThat;
 import static org.jastadd.ragconnect.tests.TestUtils.mqttUri;
 import static org.jastadd.ragconnect.tests.TestUtils.testJaddContainReferenceToJackson;
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Test case "tree manual"
  *
  * @author rschoene - Initial contribution
  */
-public class TreeManualTest extends AbstractMqttTest {
+public class TreeManualTest extends AbstractTreeTest {
 
-  private static final String TOPIC_ALFA = "alfa";
   private Root model;
   private SenderRoot senderRoot;
-  private ReceiverRoot receiverRoot;
   private MqttHandler handler;
-  private ReceiverData data;
 
   @Test
   public void checkJacksonReference() {
@@ -40,7 +39,7 @@ public class TreeManualTest extends AbstractMqttTest {
     model.addSenderRoot(senderRoot);
 
     receiverRoot = new ReceiverRoot();
-    model.addReceiverRoot(receiverRoot);
+    model.addReceiverRoot((ReceiverRoot) receiverRoot);
   }
 
   @Override
@@ -61,34 +60,6 @@ public class TreeManualTest extends AbstractMqttTest {
     senderRoot.connectAlfa(mqttUri(TOPIC_ALFA), writeCurrentValue);
   }
 
-  @Override
-  protected void communicateSendInitialValue() throws InterruptedException {
-    checkTree(1, 0);
-
-    setInput(1);
-    checkTree(2, 1);
-
-    setInput(1);
-    checkTree(2, 1);
-
-    setInput(2);
-    checkTree(3, 2);
-  }
-
-  @Override
-  protected void communicateOnlyUpdatedValue() throws InterruptedException {
-    checkTree(0, null);
-
-    setInput(1);
-    checkTree(1, 1);
-
-    setInput(1);
-    checkTree(1, 1);
-
-    setInput(2);
-    checkTree(2, 2);
-  }
-
   @Override
   protected void closeConnections() {
     if (handler != null) {
@@ -99,118 +70,7 @@ public class TreeManualTest extends AbstractMqttTest {
     }
   }
 
-  private void setInput(int input) {
+  protected void setInput(int input) {
     senderRoot.setInput(input);
   }
-
-  private void checkTree(int expectedCount, Integer expectedInput) throws InterruptedException {
-    TestUtils.waitForMqtt();
-
-    assertEquals(expectedCount, data.numberOfTrees);
-    if (expectedInput == null) {
-      assertNull(receiverRoot.getAlfa());
-    } else {
-      assertNotNull(receiverRoot.getAlfa());
-      Alfa alfa = receiverRoot.getAlfa();
-      assertEquals(4, alfa.getNumBravo());
-      assertEquals(4, alfa.getNumCharlie());
-      assertEquals(4, alfa.getNumDelta());
-
-      Bravo inputBravo = alfa.getBravo(expectedInput);
-      Charlie inputCharlie = alfa.getCharlie(expectedInput);
-      Delta inputDelta = alfa.getDelta(expectedInput);
-
-      // Alfa -> Alfa
-      assertEquals(alfa, alfa.getMyself());
-
-      // Alfa -> Bravo
-      assertEquals(inputBravo, alfa.getMyBravo());
-      assertTrue(alfa.hasOptionalBravo());
-      assertEquals(inputBravo, alfa.getOptionalBravo());
-      assertThat(alfa.getMultiBravoList()).containsExactly(
-          inputBravo, alfa.getBravo(expectedInput + 1));
-
-      // Charlie -> Alfa
-      for (int i = 0; i < 4; i++) {
-        Charlie Charlie = alfa.getCharlie(i);
-        if (i == expectedInput) {
-          assertTrue(Charlie.hasMyAlfa());
-          assertEquals(alfa, Charlie.getMyAlfa());
-        } else {
-          assertFalse(Charlie.hasMyAlfa());
-        }
-      }
-
-      // Alfa <-> Delta
-      for (int i = 0; i < 4; i++) {
-        Delta Delta = alfa.getDelta(i);
-        if (i == expectedInput) {
-          assertTrue(Delta.hasSingleBack1Alfa());
-          assertEquals(alfa, Delta.getSingleBack1Alfa());
-        } else {
-          assertFalse(Delta.hasSingleBack1Alfa());
-        }
-        if (i == expectedInput || i == expectedInput + 1) {
-          assertTrue(Delta.hasSingleBack2Alfa());
-          assertEquals(alfa, Delta.getSingleBack2Alfa());
-          assertThat(Delta.getMultiBack3AlfaList()).containsExactly(alfa);
-        } else {
-          assertFalse(Delta.hasSingleBack2Alfa());
-          assertThat(Delta.getMultiBack3AlfaList()).isEmpty();
-        }
-      }
-
-      // Bravo -> Charlie
-      for (int i = 0; i < 4; i++) {
-        Bravo Bravo = alfa.getBravo(i);
-
-        if (i == expectedInput) {
-          assertEquals(inputCharlie, Bravo.getMyCharlie());
-          assertTrue(Bravo.hasOptionalCharlie());
-          assertEquals(inputCharlie, Bravo.getOptionalCharlie());
-          assertThat(Bravo.getMultiCharlieList()).containsExactly(
-              inputCharlie, alfa.getCharlie(expectedInput + 1));
-        } else {
-          assertEquals(alfa.getCharlie(0), Bravo.getMyCharlie());
-          assertFalse(Bravo.hasOptionalCharlie());
-          assertThat(Bravo.getMultiCharlieList()).isEmpty();
-        }
-      }
-
-      // Bravo <-> Delta
-      for (int i = 0; i < 4; i++) {
-        Bravo Bravo = alfa.getBravo(i);
-        Delta Delta = alfa.getDelta(i);
-
-        if (i == expectedInput) {
-          assertTrue(Bravo.hasSingleBi1Delta());
-          assertTrue(Delta.hasSingleBack1Bravo());
-          assertEquals(inputDelta, Bravo.getSingleBi1Delta());
-          assertEquals(inputBravo, Delta.getSingleBack1Bravo());
-          assertThat(Bravo.getMultiBi2DeltaList()).containsExactly(
-              inputDelta, alfa.getDelta(expectedInput + 1));
-        } else {
-          assertFalse(Bravo.hasSingleBi1Delta());
-          assertFalse(Delta.hasSingleBack1Bravo());
-          assertThat(Bravo.getMultiBi2DeltaList()).isEmpty();
-        }
-        if (i == expectedInput || i == expectedInput + 1) {
-          assertThat(Bravo.getMultiBi3DeltaList()).containsExactly(
-              inputDelta, alfa.getDelta(expectedInput + 1));
-          assertTrue(Delta.hasSingleBack2Bravo());
-          assertEquals(inputBravo, Delta.getSingleBack2Bravo());
-          assertThat(Delta.getMultiBack3BravoList()).containsExactly(
-              inputBravo, alfa.getBravo(expectedInput + 1));
-        } else {
-          assertThat(Bravo.getMultiBi3DeltaList()).isEmpty();
-          assertFalse(Delta.hasSingleBack2Bravo());
-          assertThat(Delta.getMultiBack3BravoList()).isEmpty();
-        }
-      }
-    }
-  }
-
-  private static class ReceiverData {
-    int numberOfTrees = 0;
-  }
 }