diff --git a/.gitignore b/.gitignore
index ccfb92b6f71c4cb7fbdf983c55c90585009e9da4..ebd336ce88ef400785e2e031caed1b95cdbc4c93 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,5 @@ src/gen-res
 build/
 out/
 logs/
+/after.png
+/before.png
diff --git a/build.gradle b/build.gradle
index 190d15209f35c53d8820ede939c6bcb0dd3791a0..5b94d55fc88260e98edcba2c4343fa1cdf8bf048 100644
--- a/build.gradle
+++ b/build.gradle
@@ -82,7 +82,7 @@ dependencies {
 
     implementation 'com.google.code.gson:gson:2.9.0'
 
-    jastadd2 "org.jastadd:jastadd:2.3.5"
+    jastadd2 "org.jastadd:jastadd2:2.3.5-dresden-6"
     relast group: 'org.jastadd', name: 'relast', version: "${relast_version}"
     ecore files("libs/ecore2relast-0.1.jar")
 
@@ -119,6 +119,9 @@ dependencies {
     ragconnectClasspath 'de.tudresden.inf.st:ragconnect:1.0.0-alpha-214'
     // ragconnectClasspath fileTree(include: ['ragconnect.base-fatjar-1.0.0-alpha.jar'], dir: './libs')
 
+    // vis
+    implementation group: 'de.tudresden.inf.st', name: 'dumpAst', version: '1.2.1-77'
+
     // testing
     testImplementation('org.junit.jupiter:junit-jupiter:5.8.2')
 
@@ -213,7 +216,11 @@ task ragConnect(type: JavaExec) {
             '--rootNode=PetriNet',
             '--List=JastAddList',
             '--incremental=param',
-            '--tracing=flush'
+            '--tracing=flush',
+            '--experimental-jastadd-329',
+            '--logReads',
+            '--logWrites',
+            '--logIncremental'
     ])
 
 }
@@ -269,11 +276,11 @@ jastadd {
     parser.genDir = "src/gen/java/de/tudresden/inf/st/pnml/jastadd/parser"
 
 //  default options are: '--rewrite=cnta', '--safeLazy', '--visitCheck=false', '--cacheCycle=false'
-    extraJastAddOptions = ['--List=JastAddList', '--incremental=param', '--tracing=flush']
+    extraJastAddOptions = ['--List=JastAddList', '--cache=all', '--incremental=param', '--tracing=flush']
 }
 
 ragConnect.dependsOn ecoreToRelast
 relastToJastAdd.dependsOn ragConnect
 generateAst.dependsOn relastToJastAdd
 
-compileJava.dependsOn generateExpressionBeaver
\ No newline at end of file
+compileJava.dependsOn generateExpressionBeaver
diff --git a/src/main/jastadd/engine/connection/Dineros.connect b/src/main/jastadd/engine/connection/Dineros.connect
index bdb8f6589a1eeea0d2efddc7eedddc9c942c605d..695a151c33485b6d1d1c75f3bb0bf4579ba32a84 100644
--- a/src/main/jastadd/engine/connection/Dineros.connect
+++ b/src/main/jastadd/engine/connection/Dineros.connect
@@ -1,5 +1,5 @@
 receive InputSignalBinding.InputSignalValue using InputSignalTransformation;
-send OutputSignalBinding.OutputSignalValue using OutputSignalTransformation;
+send OutputSignalBinding.outputSignalValue(String) using OutputSignalTransformation;
 
 // mapping definitions
 OutputSignalTransformation maps String s to String {:
diff --git a/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java b/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java
index 57767c62c7097f6d2a9ad8c2850764991c25ebe9..c66309546526a15fb698b853ad488b608097feed 100644
--- a/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java
+++ b/src/main/java/de/tudresden/inf/st/pnml/engine/Main.java
@@ -1,5 +1,6 @@
 package de.tudresden.inf.st.pnml.engine;
 
+import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper;
 import de.tudresden.inf.st.pnml.engine.execution.DefaultFinalTransitionCallback;
 import de.tudresden.inf.st.pnml.engine.execution.TransitionCallback;
 import de.tudresden.inf.st.pnml.engine.ros.DiNeRosDefaultNode;
@@ -18,15 +19,16 @@ import org.ros.node.topic.Publisher;
 import org.xml.sax.SAXException;
 import rosjava_srv.StringServiceRequest;
 import rosjava_srv.StringServiceResponse;
-import std_msgs.String;
 
 import javax.xml.parsers.ParserConfigurationException;
 import java.io.IOException;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
 
 import java.net.URI;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 public class Main {
 
@@ -51,16 +53,18 @@ public class Main {
 
         PetriNetInitializer.initOutputSignalConnections(petriNet, "localhost", "mqtt");
 
+        dump(bm, "before");
+
         System.out.println("Output Signal Values BEFORE: ");
         for(Place p : petriNet.allPlaces()){
             for(OutputSignalBinding osb : p.asOutputSignalPlace().getOutputSignalBindingList()){
-                System.out.println(osb.getOutputSignalID() + " : " + osb.getOutputSignalValue());
+                System.out.println(osb.getOutputSignalID() + " : " + osb.outputSignalValue());
             }
         }
 
         try {
             System.out.println("Sleeping for 2s");
-            Thread.sleep(2000);
+            TimeUnit.SECONDS.sleep(2);
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
@@ -76,14 +80,16 @@ public class Main {
 
             for ( OutputSignalBinding b : p.asOutputSignalPlace().getOutputSignalBindingList()){
                 System.out.println("New Num: " + bm.resolveBalloonPlace(p).getNumBalloonMarking());
-                System.out.println("New Value: " + b.getOutputSignalValue());
+                System.out.println("New Value: " + b.outputSignalValue());
             }
         }
 
+        dump(bm, "after");
+
         System.out.println("Output Signal Values AFTER: ");
         for(Place p : petriNet.allPlaces()){
             for(OutputSignalBinding osb : p.asOutputSignalPlace().getOutputSignalBindingList()){
-                System.out.println(osb.getOutputSignalID() + " : " + osb.getOutputSignalValue());
+                System.out.println(osb.getOutputSignalID() + " : " + osb.outputSignalValue());
             }
         }
 
@@ -91,6 +97,32 @@ public class Main {
         System.out.println(bm.print());
     }
 
+    private static void dump(BalloonMarking balloonMarking, String filename) throws IOException {
+        Dumper.read(balloonMarking)
+            .includeChildWhen((parentNode, childNode, contextName) -> {
+//                System.out.println("encountered " + parentNode + "." + contextName);
+                switch (contextName) {
+                    case "AnnotationGraphics":
+                    case "NodeGraphics":
+                    case "Toolspecific":
+                        return false;
+                    default:
+                        return true;
+                }
+            })
+            .includeAttributeWhen((node, attributeName, isNTA, value) -> {
+//                System.out.println("encountered " + node + "." + attributeName);
+                switch (attributeName) {
+                    case "outputSignalValue":
+                    case "OutputSignalBinding":
+                        return true;
+                    default:
+                        return false;
+                }
+            })
+            .dumpAsPNG(Paths.get(filename + ".png"));
+    }
+
     @SuppressWarnings("unused")
     private static void isTest() throws IOException {
         java.lang.String pnmlPath = "../pnml-relast-engine/src/main/resources/nets/is-test-2.pnml";
@@ -293,7 +325,7 @@ public class Main {
             e.printStackTrace();
         }
 
-        for (Map.Entry<InputSignalTransition, Publisher<String>> entry : diNeRosNode.getDinerosPublishers().entrySet()) {
+        for (Map.Entry<InputSignalTransition, Publisher<std_msgs.String>> entry : diNeRosNode.getDinerosPublishers().entrySet()) {
             System.out.println("Firing publisher of:" + entry.getKey().getId());
             diNeRosNode.firePublisherTransition(entry.getKey());
         }