diff --git a/ragconnect.base/build.gradle b/ragconnect.base/build.gradle
index 9f50cbed06dbbb00df8337605a771a0e9cb3722b..e212a394a62cd29887daa30973dfc9ceb39af6be 100644
--- a/ragconnect.base/build.gradle
+++ b/ragconnect.base/build.gradle
@@ -27,9 +27,6 @@ repositories {
 
 dependencies {
     implementation project(':relast-preprocessor')
-    implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: "${log4j_version}"
-    implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: "${log4j_version}"
-    implementation group: 'org.apache.logging.log4j', name: 'log4j-jul', version: "${log4j_version}"
     implementation group: 'com.github.spullara.mustache.java', name: 'compiler', version: "${mustache_java_version}"
 //    runtimeOnly group: 'org.jastadd', name: 'jastadd', version: '2.3.5'
     runtimeOnly fileTree(include: ['jastadd2.jar'], dir: '../libs')
@@ -68,14 +65,12 @@ idea.module.generatedSourceDirs += genSrc
 jar {
     manifest {
         attributes "Main-Class": 'org.jastadd.ragconnect.compiler.Compiler'
-
-        // Log4J + Java 11 compatibility, see https://stackoverflow.com/q/53049346/2493208
-        attributes "Multi-Release": true
     }
 
     from {
         configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
     }
+    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
 
     archiveBaseName = 'ragconnect'
 }
diff --git a/ragconnect.base/src/main/jastadd/Configuration.jadd b/ragconnect.base/src/main/jastadd/Configuration.jadd
index 3f1101e968b21126de73ea17c4e3ae1cee74800a..e7e1268df443a278496a499c59e896d1ee27c80a 100644
--- a/ragconnect.base/src/main/jastadd/Configuration.jadd
+++ b/ragconnect.base/src/main/jastadd/Configuration.jadd
@@ -6,4 +6,5 @@ aspect Configuration {
   public static boolean ASTNode.usesMqtt;
   public static boolean ASTNode.usesRest;
   public static boolean ASTNode.incrementalOptionActive;
+  public static boolean ASTNode.experimentalJastAdd329;
 }
diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
index 2cb02ee8065fe3cfcd04717fc7012bd6c67c4721..449c1d85145fffb939ae02c5e24cd753bc670590 100644
--- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
+++ b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/Compiler.java
@@ -3,11 +3,11 @@ package org.jastadd.ragconnect.compiler;
 import beaver.Parser;
 import org.jastadd.option.BooleanOption;
 import org.jastadd.option.ValueOption;
-import org.jastadd.relast.compiler.AbstractCompiler;
-import org.jastadd.relast.compiler.CompilerException;
 import org.jastadd.ragconnect.ast.*;
 import org.jastadd.ragconnect.parser.RagConnectParser;
 import org.jastadd.ragconnect.scanner.RagConnectScanner;
+import org.jastadd.relast.compiler.AbstractCompiler;
+import org.jastadd.relast.compiler.CompilerException;
 
 import java.io.*;
 import java.nio.file.Files;
@@ -15,6 +15,8 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.StandardCopyOption;
 import java.util.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 public class Compiler extends AbstractCompiler {
 
@@ -26,10 +28,13 @@ public class Compiler extends AbstractCompiler {
   private BooleanOption optionLogReads;
   private BooleanOption optionLogWrites;
   private BooleanOption optionLogIncremental;
+  private BooleanOption optionExperimentalJastAdd329;
 
   private static final String OPTION_PROTOCOL_MQTT = "mqtt";
   private static final String OPTION_PROTOCOL_REST = "rest";
 
+  private final static Logger LOGGER = Logger.getLogger(Compiler.class.getName());
+
   public Compiler() {
     super("ragconnect", true);
   }
@@ -44,8 +49,11 @@ public class Compiler extends AbstractCompiler {
       getConfiguration().printHelp(System.out);
       return 0;
     }
+    if (optionVerbose.value()) {
+      LOGGER.setLevel(Level.FINE);
+    }
 
-    printMessage("Running RagConnect " + readVersion());
+    LOGGER.info(() -> "Running RagConnect " + readVersion());
 
     if (!getConfiguration().outputDir().exists()) {
       try {
@@ -62,9 +70,9 @@ public class Compiler extends AbstractCompiler {
     RagConnect ragConnect = parseProgram(getConfiguration().getFiles());
 
     if (!ragConnect.errors().isEmpty()) {
-      System.err.println("Errors:");
+      LOGGER.severe("Errors:");
       for (ErrorMessage e : ragConnect.errors()) {
-        System.err.println(e);
+        LOGGER.severe(e.toString());
       }
       System.exit(1);
     }
@@ -77,7 +85,7 @@ public class Compiler extends AbstractCompiler {
       return 0;
     }
 
-    printMessage("Writing output files");
+    LOGGER.fine("Writing output files");
     final List<String> handlers = new ArrayList<>();
     if (ASTNode.usesMqtt) {
       handlers.add("MqttHandler.jadd");
@@ -108,12 +116,11 @@ public class Compiler extends AbstractCompiler {
   }
 
   public static void main(String[] args) {
-    System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
     System.setProperty("mustache.debug", "true");
     try {
       new Compiler().run(args);
     } catch (CompilerException e) {
-      e.printStackTrace();
+      LOGGER.log(Level.SEVERE, e.getMessage(), e);
       System.exit(1);
     }
   }
@@ -138,12 +145,6 @@ public class Compiler extends AbstractCompiler {
     }
   }
 
-  private void printMessage(String message) {
-    if (optionVerbose.value()) {
-      System.out.println(message);
-    }
-  }
-
   private void writeToFile(Path path, String str) throws CompilerException {
     try (BufferedWriter writer = Files.newBufferedWriter(path)) {
       writer.append(str);
@@ -179,6 +180,9 @@ public class Compiler extends AbstractCompiler {
     optionLogIncremental = addOption(
         new BooleanOption("logIncremental", "Enable logging for observer in incremental dependency tracking.")
             .defaultValue(false));
+    optionExperimentalJastAdd329 = addOption(
+        new BooleanOption("experimental-jastadd-329", "Use trace events INC_FLUSH_START and INC_FLUSH_END (JastAdd issue #329).")
+            .defaultValue(false));
   }
 
   private RagConnect parseProgram(Collection<String> files) throws CompilerException {
@@ -214,10 +218,10 @@ public class Compiler extends AbstractCompiler {
       }
     }
     if (!atLeastOneGrammar) {
-      System.err.println("No grammar file specified! (*.ast, *.relast)");
+      LOGGER.severe(() -> "No grammar file specified! (*.ast, *.relast)");
     }
     if (!atLeastOneRagConnect) {
-      System.err.println("No ragconnect file specified! (*.connect, *.ragconnect)");
+      LOGGER.severe(() -> "No ragconnect file specified! (*.connect, *.ragconnect)");
     }
     if (!atLeastOneGrammar && !atLeastOneRagConnect) {
       System.exit(1);
@@ -231,10 +235,11 @@ public class Compiler extends AbstractCompiler {
     ASTNode.loggingEnabledForReads = optionLogReads.value();
     ASTNode.loggingEnabledForWrites = optionLogWrites.value();
     ASTNode.loggingEnabledForIncremental = optionLogIncremental.value();
+    ASTNode.experimentalJastAdd329 = optionExperimentalJastAdd329.value();
 
     // reuse "--incremental" option of JastAdd
     ASTNode.incrementalOptionActive = getConfiguration().incremental() && getConfiguration().traceFlush();
-    printMessage("ASTNode.incrementalOptionActive = " + ASTNode.incrementalOptionActive);
+    LOGGER.fine(() -> "ASTNode.incrementalOptionActive = " + ASTNode.incrementalOptionActive);
 
     ASTNode.usesMqtt = optionProtocols.hasValue(OPTION_PROTOCOL_MQTT);
     ASTNode.usesRest = optionProtocols.hasValue(OPTION_PROTOCOL_REST);
@@ -247,7 +252,7 @@ public class Compiler extends AbstractCompiler {
       RagConnectParser parser = new RagConnectParser();
       GrammarFile grammarFile = (GrammarFile) parser.parse(scanner);
       if (optionVerbose.value()) {
-        grammarFile.dumpTree(System.out);
+        LOGGER.fine(grammarFile::dumpTree);
       }
       program.addGrammarFile(grammarFile);
       grammarFile.setFileName(toBaseName(filename));
diff --git a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java b/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java
deleted file mode 100644
index 83c282f205af2ff337c3eea7d2b1b7fda8e3cc47..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/java/org/jastadd/ragconnect/compiler/SimpleMain.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.jastadd.ragconnect.compiler;
-
-import org.jastadd.ragconnect.ast.Document;
-import org.jastadd.ragconnect.ast.ListElement;
-import org.jastadd.ragconnect.ast.MappingElement;
-
-/**
- * Testing Ros2Rag without parser.
- *
- * @author rschoene - Initial contribution
- */
-public class SimpleMain {
-
-  private static void printManualYAML() {
-    Document doc = new Document();
-    MappingElement root = new MappingElement();
-    MappingElement firstLevel = new MappingElement();
-    firstLevel.put("server", "tcp://localhost:1883");
-    firstLevel.put("robot_speed_factor", ".7");
-
-    MappingElement theTopics = new MappingElement();
-    theTopics.put("robotConfig", "robotconfig");
-    theTopics.put("trajectory", "trajectory");
-    theTopics.put("nextStep", "ros2rag/nextStep");
-    firstLevel.put("topics", theTopics);
-
-    firstLevel.put("zone_size", "0.5");
-
-    ListElement theZones = new ListElement();
-    theZones.add("1 1");
-    theZones.add("0 1");
-    theZones.add("-1 1");
-    firstLevel.put("zones", theZones);
-
-    MappingElement pandaParts = new MappingElement();
-    MappingElement thePanda = new MappingElement();
-    thePanda.put("Link0", "panda_link0");
-    thePanda.put("Link1", "panda_link1");
-    thePanda.put("Link2", "panda_link2");
-    thePanda.put("Link3", "panda_link3");
-    thePanda.put("Link4", "panda_link4");
-    thePanda.put("Link5", "panda_link5");
-    thePanda.put("Link6", "panda_link6");
-    thePanda.put("RightFinger", "panda_rightfinger");
-    thePanda.put("LeftFinger", "panda_leftfinger");
-    pandaParts.put("panda", thePanda);
-    firstLevel.put("parts", pandaParts);
-
-    MappingElement endEffectorParts = new MappingElement();
-    MappingElement endEffector = new MappingElement();
-    endEffector.put("EndEffector", "panda_hand");
-    endEffectorParts.put("panda", endEffector);
-    firstLevel.put("end_effectors", endEffectorParts);
-
-    ListElement theGoalPoses = new ListElement();
-    theGoalPoses.add(makePose("0.4 0.4 0.3"));
-    theGoalPoses.add(makePose("-0.4 0.4 0.3"));
-    theGoalPoses.add(makePose("-0.4 -0.4 0.3"));
-    theGoalPoses.add(makePose("0.4 0.4 0.3"));
-    theGoalPoses.add(makePose("-0.4 0.4 0.3"));
-    theGoalPoses.add(makePose("0.4 0.4 0.3"));
-    firstLevel.put("goal_poses", theGoalPoses);
-
-    root.put("panda_mqtt_connector", firstLevel);
-    doc.setRootElement(root);
-
-    System.out.println(doc.prettyPrint());
-  }
-
-  private static MappingElement makePose(String position) {
-    MappingElement goalPose = new MappingElement();
-    goalPose.put("position", position);
-    goalPose.put("orientation", "1 1 0 0");
-    goalPose.put("work", "20000");
-    return goalPose;
-  }
-
-  public static void main(String[] args) {
-    printManualYAML();
-  }
-}
diff --git a/ragconnect.base/src/main/resources/log4j2.xml b/ragconnect.base/src/main/resources/log4j2.xml
deleted file mode 100644
index 98cfd73c75df58d8598521bc10b043e214ec4ad8..0000000000000000000000000000000000000000
--- a/ragconnect.base/src/main/resources/log4j2.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="INFO">
-    <Appenders>
-        <Console name="Console" target="SYSTEM_OUT">
-            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
-        </Console>
-    </Appenders>
-    <Loggers>
-        <Root level="info">
-            <AppenderRef ref="Console"/>
-        </Root>
-    </Loggers>
-</Configuration>
\ No newline at end of file
diff --git a/ragconnect.base/src/main/resources/ragconnect.mustache b/ragconnect.base/src/main/resources/ragconnect.mustache
index 876833ac45635939ca65e62a7f336d084175d861..50cd5cece4429e3529c64f5896548e50bbe564b0 100644
--- a/ragconnect.base/src/main/resources/ragconnect.mustache
+++ b/ragconnect.base/src/main/resources/ragconnect.mustache
@@ -68,6 +68,7 @@ aspect RagConnectObserver {
       }
     }
 
+{{#experimentalJastAdd329}}
     class RagConnectObserverStartEntry {
       final ASTNode node;
       final String attributeString;
@@ -78,12 +79,16 @@ aspect RagConnectObserver {
         this.flushIncToken = flushIncToken;
       }
     }
+{{/experimentalJastAdd329}}
 
     ASTState.Trace.Receiver oldReceiver;
 
     java.util.List<RagConnectObserverEntry> observedNodes = new java.util.ArrayList<>();
+
+{{#experimentalJastAdd329}}
     java.util.Set<RagConnectObserverEntry> entryQueue = new java.util.HashSet<>();
     RagConnectObserverStartEntry startEntry = null;
+{{/experimentalJastAdd329}}
 
     RagConnectObserver(ASTNode node) {
       // set the receiver. potentially dangerous because overriding existing receiver!
@@ -103,6 +108,7 @@ aspect RagConnectObserver {
     @Override
     public void accept(ASTState.Trace.Event event, ASTNode node, String attribute, Object params, Object value) {
       oldReceiver.accept(event, node, attribute, params, value);
+{{#experimentalJastAdd329}}
       // react to INC_FLUSH_START and remember entry
       if (event == ASTState.Trace.Event.INC_FLUSH_START && startEntry == null) {
         {{#loggingEnabledForIncremental}}
@@ -130,6 +136,7 @@ aspect RagConnectObserver {
         return;
       }
 
+{{/experimentalJastAdd329}}
       // ignore all other events but INC_FLUSH_ATTR
       if (event != ASTState.Trace.Event.INC_FLUSH_ATTR) {
         return;
@@ -145,7 +152,12 @@ aspect RagConnectObserver {
           {{#loggingEnabledForIncremental}}
           System.out.println("** observer hit: " + entry.node + " on " + entry.attributeString);
           {{/loggingEnabledForIncremental}}
+{{#experimentalJastAdd329}}
           entryQueue.add(entry);
+{{/experimentalJastAdd329}}
+{{^experimentalJastAdd329}}
+          entry.attributeCall.run();
+{{/experimentalJastAdd329}}
         }
       }
     }
diff --git a/ragconnect.tests/build.gradle b/ragconnect.tests/build.gradle
index 37babe8b3dc2ea4620ea5a8e12c13b0c8084ceef..485a59d61efefe9f77592c1f62ca485db087da98 100644
--- a/ragconnect.tests/build.gradle
+++ b/ragconnect.tests/build.gradle
@@ -36,8 +36,8 @@ repositories {
 dependencies {
     implementation project(':ragconnect.base')
 
-//    runtimeOnly group: 'org.jastadd', name: 'jastadd', version: '2.3.5'
-    runtimeOnly fileTree(include: ['jastadd2.jar'], dir: '../libs')
+    runtimeOnly group: 'org.jastadd', name: 'jastadd', version: '2.3.5'
+//    runtimeOnly fileTree(include: ['jastadd2.jar'], dir: '../libs')
 
     testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.4.0'
     testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.4.0'
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java
index cf5e02f956ae55258f08458bcb88130e1afca4b0..cd4c9989f9217ac2693566419dfc2138503f7921 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/DefaultOnlyReadTest.java
@@ -2,7 +2,6 @@ package org.jastadd.ragconnect.tests;
 
 import defaultOnlyRead.ast.A;
 import defaultOnlyRead.ast.BoxedTypes;
-import defaultOnlyRead.ast.MqttHandler;
 import defaultOnlyRead.ast.NativeTypes;
 import org.junit.jupiter.api.Test;
 
@@ -10,9 +9,9 @@ import java.io.IOException;
 import java.nio.file.Paths;
 import java.util.concurrent.TimeUnit;
 
-import static org.jastadd.ragconnect.tests.TestUtils.*;
+import static org.jastadd.ragconnect.tests.TestUtils.mqttUri;
+import static org.jastadd.ragconnect.tests.TestUtils.testJaddContainReferenceToJackson;
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Test case "defaultOnlyRead".
diff --git a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java
index 3ecdf1f373a23b68023132962ae2829389cd9468..53d737c27c858c4f1dc27e77a42d8f50dda29dec 100644
--- a/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java
+++ b/ragconnect.tests/src/test/java/org/jastadd/ragconnect/tests/TestUtils.java
@@ -31,8 +31,8 @@ public class TestUtils {
 
   public static String getSecondMqttHost() {
     if (System.getenv("GITLAB_CI") != null) {
-      // we are in the CI, so use "mqtt_different_port" as host
-      return "mqtt_different_port";
+      // we are in the CI, so use "mqtt_different_port" as host and 55883 as port
+      return "mqtt_different_port:55883";
     } {
       // else no second local mqtt broker
       return null;