diff --git a/ros2rag.base/src/main/jastadd/backend/Generation.jadd b/ros2rag.base/src/main/jastadd/backend/Generation.jadd
index e698e405ee6d392d2405b15fe0869432b9b18a59..1b6dfff3386d079e75163c4725681a87904f6786 100644
--- a/ros2rag.base/src/main/jastadd/backend/Generation.jadd
+++ b/ros2rag.base/src/main/jastadd/backend/Generation.jadd
@@ -146,16 +146,23 @@ aspect AspectGeneration {
     sb.append(ind(indent + 1)).append(preemptiveReturnStatement()).append("\n");
     sb.append(ind(indent)).append("}\n");
     if (!getAlwaysApply()) {
-      sb.append(ind(indent)).append("if (").append(preemptiveExpectedValue());
-      if (getToken().isPrimitiveType()) {
-        sb.append(" == ").append(inputVariableName);
-      } else if (effectiveMappings().get(effectiveMappings().size() - 1).isDefaultMappingDefinition()) {
-        sb.append(" != null && ").append(preemptiveExpectedValue()).append(".equals(")
-          .append(inputVariableName).append(")");
+      MappingDefinition lastMapping = effectiveMappings().get(effectiveMappings().size() - 1);
+      sb.append(ind(indent)).append("if (");
+      if (lastMapping.getToType().isArray()) {
+        sb.append("java.util.Arrays.equals(").append(preemptiveExpectedValue())
+          .append(", ").append(inputVariableName).append(")");
       } else {
-        sb.append(" != null ? ").append(preemptiveExpectedValue()).append(".equals(")
-          .append(inputVariableName).append(")").append(" : ")
-          .append(inputVariableName).append(" == null");
+        sb.append(preemptiveExpectedValue());
+        if (getToken().isPrimitiveType() && lastMapping.getToType().isPrimitiveType()) {
+          sb.append(" == ").append(inputVariableName);
+        } else if (lastMapping.isDefaultMappingDefinition()) {
+          sb.append(" != null && ").append(preemptiveExpectedValue()).append(".equals(")
+            .append(inputVariableName).append(")");
+        } else {
+          sb.append(" != null ? ").append(preemptiveExpectedValue()).append(".equals(")
+            .append(inputVariableName).append(")").append(" : ")
+            .append(inputVariableName).append(" == null");
+        }
       }
       sb.append(") { ").append(preemptiveReturnStatement()).append(" }\n");
     }
diff --git a/ros2rag.base/src/main/jastadd/backend/Mappings.jrag b/ros2rag.base/src/main/jastadd/backend/Mappings.jrag
index 7add42fa7e3d3f7c71cb35b5a34c8c5d05b83628..fd40385d9e8879dd188362f6a0acd802652f511e 100644
--- a/ros2rag.base/src/main/jastadd/backend/Mappings.jrag
+++ b/ros2rag.base/src/main/jastadd/backend/Mappings.jrag
@@ -151,6 +151,12 @@ aspect Mappings {
       default: return false;
     }
   }
+  syn boolean MappingDefinitionType.isPrimitiveType() = false;
+  eq JavaMappingDefinitionType.isPrimitiveType() = getType().isPrimitiveType();
+
+  // --- isArray ---
+  syn boolean MappingDefinitionType.isArray() = false;
+  eq JavaArrayMappingDefinitionType.isArray() = true;
 
   // --- suitableDefaultMapping ---
   syn DefaultMappingDefinition UpdateDefinition.suitableDefaultMapping();
diff --git a/ros2rag.tests/src/test/01-input/example/Test.relast b/ros2rag.tests/src/test/01-input/example/Test.relast
index c6b346d5df0db5b333141202a800b5951643eef2..ea347d0ec303a8d3555cd0118d403b53664ffe33 100644
--- a/ros2rag.tests/src/test/01-input/example/Test.relast
+++ b/ros2rag.tests/src/test/01-input/example/Test.relast
@@ -4,7 +4,7 @@ ZoneModel ::= <Size:IntPosition> SafetyZone:Zone* ;
 
 Zone ::= Coordinate* ;
 
-RobotArm ::= Joint* EndEffector <AttributeTestSource:int> /<AppropriateSpeed:double>/ ;
+RobotArm ::= Joint* EndEffector /<AppropriateSpeed:double>/ ;
 
 Joint ::= <Name:String> <CurrentPosition:IntPosition> ;
 
diff --git a/ros2rag.tests/src/test/01-input/example/Test.ros2rag b/ros2rag.tests/src/test/01-input/example/Test.ros2rag
index 9168da25b6d98b26784ef67b64c515be6cecf76c..6421bc828cf2f51c3b57e064bfbb6afdd4635545 100644
--- a/ros2rag.tests/src/test/01-input/example/Test.ros2rag
+++ b/ros2rag.tests/src/test/01-input/example/Test.ros2rag
@@ -5,7 +5,6 @@ write RobotArm.AppropriateSpeed using CreateSpeedMessage, SerializeRobotConfig ;
 
 // --- dependency definitions ---
 RobotArm.AppropriateSpeed canDependOn Joint.CurrentPosition as dependency1 ;
-RobotArm.AppropriateSpeed canDependOn RobotArm.AttributeTestSource as dependency2 ;
 
 // --- mapping definitions ---
 ParseLinkState maps byte[] bytes to panda.Linkstate.PandaLinkState {:
@@ -18,8 +17,7 @@ SerializeRobotConfig maps config.Robotconfig.RobotConfig rc to byte[] {:
 
 LinkStateToIntPosition maps panda.Linkstate.PandaLinkState pls to IntPosition {:
   panda.Linkstate.PandaLinkState.Position p = pls.getPos();
-  { int i = 0; }
-  return IntPosition.of((int) p.getPositionX(), (int) p.getPositionY(), (int) p.getPositionZ());
+  return IntPosition.of((int) (10 * p.getPositionX()), (int) (10 * p.getPositionY()), (int) (10 * p.getPositionZ()));
 :}
 
 CreateSpeedMessage maps double speed to config.Robotconfig.RobotConfig {:
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java
index 3594cfd1a946ba42f65def205aa821354dba50e2..c82e9ca1e1642dbf9589760a03f8d2164a5ff424 100644
--- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java
+++ b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyReadTest.java
@@ -106,7 +106,7 @@ public class DefaultOnlyReadTest extends AbstractMqttTest {
     sender.publish(TOPIC_BOXED_DOUBLE, ByteBuffer.allocate(8).putDouble(expectedDoubleValue).array());
     sender.publish(TOPIC_BOXED_CHARACTER, ByteBuffer.allocate(2).putChar(expectedCharValue).array());
 
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
 
     assertEquals(expectedIntValue, integers.getIntValue());
     assertEquals(expectedShortValue, integers.getShortValue());
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java
index df4a22f5835df09a407595392a4969e7af9ee6f2..a48228e0ad13555016cb86b5de87fe00fcf88fdb 100644
--- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java
+++ b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/DefaultOnlyWriteTest.java
@@ -67,21 +67,21 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
     setupReceiverAndConnect(true);
 
     // check initial value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(1, 1, 1.1, 'a', "ab");
 
     // set new value
     setData("2", "2.2", "cd");
 
     // check new value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(2, 2, 2.2, 'c', "cd");
 
     // set new value
     setData("3", "3.2", "ee");
 
     // check new value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(3, 3, 3.2, 'e', "ee");
   }
 
@@ -92,21 +92,21 @@ public class DefaultOnlyWriteTest extends AbstractMqttTest {
     setupReceiverAndConnect(false);
 
     // check initial value (will be default values)
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(0, null, null, null, null);
 
     // set new value
     setData("2", "2.2", "cd");
 
     // check new value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(1, 2, 2.2, 'c', "cd");
 
     // set new value
     setData("3", "3.2", "ee");
 
     // check new value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(2, 3, 3.2, 'e', "ee");
   }
 
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java
index c22861e996826eaf720a33fe9e0c02f7b110978e..7f8abd9ac7fda8568ea2d1fce3b6c0b33960706a 100644
--- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java
+++ b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/ExampleTest.java
@@ -5,10 +5,9 @@ import config.Robotconfig.RobotConfig;
 import example.ast.*;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
+import panda.Linkstate;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import static org.junit.jupiter.api.Assertions.*;
@@ -22,16 +21,19 @@ public class ExampleTest extends AbstractMqttTest {
 
   private static final String TOPIC_CONFIG = "robot/config";
   private static final String TOPIC_JOINT1 = "robot/arm/joint1";
+  private static final String TOPIC_JOINT2 = "robot/arm/joint2";
 
   private Model model;
   private RobotArm robotArm;
   private Joint joint1;
-  private MqttUpdater receiver;
+  private Joint joint2;
+  private MqttUpdater handler;
+  private ReceiverData data;
 
   @AfterEach
   public void closeConnections() {
-    if (receiver != null) {
-      receiver.close();
+    if (handler != null) {
+      handler.close();
     }
     if (model != null) {
       model.MqttCloseConnections();
@@ -44,49 +46,116 @@ public class ExampleTest extends AbstractMqttTest {
   }
 
   @Test
-  public void communicate() throws IOException, InterruptedException {
+  public void communicateSendInitialValue() throws IOException, InterruptedException {
     createModel();
-    List<RobotConfig> receivedConfigs = new ArrayList<>();
+    setupReceiverAndConnect(true);
 
-    createListener(receivedConfigs);
-
-    model.MqttSetHost(TestUtils.getMqttHost());
-    assertTrue(model.MqttWaitUntilReady(2, TimeUnit.SECONDS));
     // joint is currently within the safety zone, so speed should be low
-    robotArm.connectAppropriateSpeed(TOPIC_CONFIG, true);
-    joint1.connectCurrentPosition(TOPIC_JOINT1);
+    TestUtils.waitForMqtt();
+    assertEquals(1, data.numberOfConfigs);
+    assertFalse(data.failedLastConversion);
+    assertEquals(robotArm.speedLow(), data.lastConfig.getSpeed(), TestUtils.DELTA);
+
+    // change position of the first joint out of the safety zone, second still in
+    sendData(TOPIC_JOINT1, 0.2f, 0.2f, 0.2f);
+
+    // still in safety zone, so no update should have been sent
+    TestUtils.waitForMqtt();
+    assertEquals(makePosition(2, 2, 2), joint1.getCurrentPosition());
+    assertEquals(1, data.numberOfConfigs);
+    assertFalse(data.failedLastConversion);
+    assertEquals(robotArm.speedLow(), data.lastConfig.getSpeed(), TestUtils.DELTA);
+
+    // change position of second joint also out of the safety zone, now speed must be high
+    sendData(TOPIC_JOINT2, 0.3f, 0.4f, 0.5f);
+
+    TestUtils.waitForMqtt();
+    assertEquals(makePosition(3, 4, 5), joint2.getCurrentPosition());
+    assertEquals(2, data.numberOfConfigs);
+    assertFalse(data.failedLastConversion);
+    assertEquals(robotArm.speedHigh(), data.lastConfig.getSpeed(), TestUtils.DELTA);
+
+    // change position of second joint, still out of the safety zone, no update should be sent
+    sendData(TOPIC_JOINT2, 1.3f, 2.4f, 3.5f);
+
+    TestUtils.waitForMqtt();
+    assertEquals(makePosition(13, 24, 35), joint2.getCurrentPosition());
+    assertEquals(2, data.numberOfConfigs);
+  }
+
+  @Test
+  public void communicateOnlyUpdatedValue() throws IOException, InterruptedException {
+    createModel();
+    setupReceiverAndConnect(false);
 
-    // now change the position of the joint out of the safety zone
-    joint1.setCurrentPosition(makePosition(2, 2, 2));
+    // no value should have been sent
+    TestUtils.waitForMqtt();
+    assertEquals(0, data.numberOfConfigs);
 
-    // and wait for MQTT to send/receive messages
-    TimeUnit.SECONDS.sleep(2);
+    // change position of the first joint out of the safety zone, second still in
+    sendData(TOPIC_JOINT1, 0.2f, 0.2f, 0.2f);
 
-    // there should be two configs received by now (the initial one, and the updated)
-    assertEquals(2, receivedConfigs.size());
-    RobotConfig actualInitialConfig = receivedConfigs.get(0);
-    assertEquals(robotArm.speedLow(), actualInitialConfig.getSpeed(), TestUtils.DELTA);
+    // still in safety zone, first update should have been sent
+    TestUtils.waitForMqtt();
+    assertEquals(makePosition(2, 2, 2), joint1.getCurrentPosition());
+    assertEquals(0, data.numberOfConfigs);
 
-    RobotConfig actualUpdatedConfig = receivedConfigs.get(1);
-    assertEquals(robotArm.speedHigh(), actualUpdatedConfig.getSpeed(), TestUtils.DELTA);
+    // change position of second joint also out of the safety zone, now speed must be high
+    sendData(TOPIC_JOINT2, 0.3f, 0.4f, 0.5f);
+
+    TestUtils.waitForMqtt();
+    assertEquals(makePosition(3, 4, 5), joint2.getCurrentPosition());
+    assertEquals(1, data.numberOfConfigs);
+    assertFalse(data.failedLastConversion);
+    assertEquals(robotArm.speedHigh(), data.lastConfig.getSpeed(), TestUtils.DELTA);
+
+    // change position of second joint, still out of the safety zone, no update should be sent
+    sendData(TOPIC_JOINT2, 1.3f, 2.4f, 3.5f);
+
+    TestUtils.waitForMqtt();
+    assertEquals(makePosition(13, 24, 35), joint2.getCurrentPosition());
+    assertEquals(1, data.numberOfConfigs);
   }
 
-  private void createListener(List<RobotConfig> receivedConfigs) {
-    receiver = new MqttUpdater("receiver");
-    try {
-      receiver.setHost(TestUtils.getMqttHost(), TestUtils.getMqttDefaultPort());
-    } catch (IOException e) {
-      fail("Could not set host: " + e.getMessage());
-    }
-    assertTrue(receiver.waitUntilReady(2, TimeUnit.SECONDS));
-    receiver.newConnection(TOPIC_CONFIG, bytes -> {
+  private void sendData(String topic, float x, float y, float z) {
+    handler.publish(topic, Linkstate.PandaLinkState.newBuilder()
+        .setPos(Linkstate.PandaLinkState.Position.newBuilder()
+            .setPositionX(x)
+            .setPositionY(y)
+            .setPositionZ(z)
+            .build())
+        .build()
+        .toByteArray()
+    );
+  }
+
+  private void setupReceiverAndConnect(boolean writeCurrentValue) throws IOException {
+    model.MqttSetHost(TestUtils.getMqttHost());
+    assertTrue(model.MqttWaitUntilReady(2, TimeUnit.SECONDS));
+
+    handler = new MqttUpdater().dontSendWelcomeMessage().setHost(TestUtils.getMqttHost());
+    assertTrue(handler.waitUntilReady(2, TimeUnit.SECONDS));
+
+    // add dependencies
+    robotArm.addDependency1(joint1);
+    robotArm.addDependency1(joint2);
+    robotArm.addDependency1(robotArm.getEndEffector());
+
+    data = new ReceiverData();
+
+    handler.newConnection(TOPIC_CONFIG, bytes -> {
+      data.numberOfConfigs += 1;
       try {
-        RobotConfig config = RobotConfig.parseFrom(bytes);
-        receivedConfigs.add(config);
+        data.lastConfig = RobotConfig.parseFrom(bytes);
+        data.failedLastConversion = false;
       } catch (InvalidProtocolBufferException e) {
-        fail("Received bad config: " + e.getMessage());
+        data.failedLastConversion = true;
       }
     });
+
+    robotArm.connectAppropriateSpeed(TOPIC_CONFIG, writeCurrentValue);
+    joint1.connectCurrentPosition(TOPIC_JOINT1);
+    joint2.connectCurrentPosition(TOPIC_JOINT2);
   }
 
   private void createModel() {
@@ -95,41 +164,44 @@ public class ExampleTest extends AbstractMqttTest {
     ZoneModel zoneModel = new ZoneModel();
     zoneModel.setSize(makePosition(1, 1, 1));
 
-    IntPosition myPosition = makePosition(0, 0, 0);
-    Coordinate myCoordinate = new Coordinate(myPosition);
-    Coordinate leftPosition = new Coordinate(makePosition(-1, 0, 0));
-    Coordinate rightPosition = new Coordinate(makePosition(1, 0, 0));
+    IntPosition firstPosition = makePosition(0, 0, 0);
+    IntPosition secondPosition = makePosition(-1, 0, 0);
+    IntPosition thirdPosition = makePosition(1, 0, 0);
 
     Zone safetyZone = new Zone();
-    safetyZone.addCoordinate(myCoordinate);
-    safetyZone.addCoordinate(leftPosition);
-    safetyZone.addCoordinate(rightPosition);
+    safetyZone.addCoordinate(new Coordinate(firstPosition));
+    safetyZone.addCoordinate(new Coordinate(secondPosition));
+    safetyZone.addCoordinate(new Coordinate(thirdPosition));
     zoneModel.addSafetyZone(safetyZone);
     model.setZoneModel(zoneModel);
 
     robotArm = new RobotArm();
-    robotArm.setAttributeTestSource(1);  // set initial value, no trigger
 
     joint1 = new Joint();
     joint1.setName("joint1");
-    joint1.setCurrentPosition(myPosition);
+    joint1.setCurrentPosition(firstPosition);
+
+    joint2 = new Joint();
+    joint2.setName("joint2");
+    joint2.setCurrentPosition(secondPosition);
 
     EndEffector endEffector = new EndEffector();
     endEffector.setName("gripper");
     endEffector.setCurrentPosition(makePosition(2, 2, 3));
 
     robotArm.addJoint(joint1);
+    robotArm.addJoint(joint2);
     robotArm.setEndEffector(endEffector);
     model.setRobotArm(robotArm);
-
-    // add dependencies
-    robotArm.addDependency1(joint1);
-    robotArm.addDependency1(endEffector);
-    robotArm.addDependency2(robotArm);
   }
 
   private static IntPosition makePosition(int x, int y, int z) {
     return IntPosition.of(x, y, z);
   }
 
+  private static class ReceiverData {
+    RobotConfig lastConfig;
+    boolean failedLastConversion = true;
+    int numberOfConfigs = 0;
+  }
 }
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java
index 9c151da32e5ca12c1dea1ec4e23e4c3168ca4910..e57c78a4c3c0a7f4ba9b8fc90e31b8b072f27e97 100644
--- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java
+++ b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read1Write2Test.java
@@ -59,28 +59,28 @@ public class Read1Write2Test extends AbstractMqttTest {
     setupReceiverAndConnect(true);
 
     // check initial value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(1, Integer.parseInt(INITIAL_VALUE), prefixed(INITIAL_VALUE), 1, Integer.parseInt(INITIAL_VALUE), prefixed(INITIAL_VALUE));
 
     // set new value
     sendData("2", "3");
 
     // check new value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(2, 2, prefixed("2"), 2, 3, prefixed("3"));
 
     // set new value
     sendData("4", "4");
 
     // check new value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(3, 4, prefixed("4"), 3, 4, prefixed("4"));
 
     // set new value only for same
     setDataOnlySame("77");
 
     // check new value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(4, 77, prefixed("77"), 3, 4, prefixed("4"));
   }
 
@@ -94,28 +94,28 @@ public class Read1Write2Test extends AbstractMqttTest {
     setupReceiverAndConnect(false);
 
     // check initial value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(0, null, null, 0, null, null);
 
     // set new value
     sendData("2", "3");
 
     // check new value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(1, 2, prefixed("2"), 1, 3, prefixed("3"));
 
     // set new value
     sendData("4", "4");
 
     // check new value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(2, 4, prefixed("4"), 2, 4, prefixed("4"));
 
     // set new value only for same
     setDataOnlySame("77");
 
     // check new value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(3, 77, prefixed("77"), 2, 4, prefixed("4"));
   }
 
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java
index 6c2b37b83629b245add25fd35659b7ce0ea0185a..ef741400d6bb86edffe804ef2414361f64046761 100644
--- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java
+++ b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/Read2Write1Test.java
@@ -58,7 +58,7 @@ public class Read2Write1Test extends AbstractMqttTest {
     setupReceiverAndConnect(true);
 
     // check initial value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(1, Integer.parseInt(INITIAL_VALUE + INITIAL_VALUE),
         1, Integer.parseInt(INITIAL_VALUE + INITIAL_VALUE));
 
@@ -66,7 +66,7 @@ public class Read2Write1Test extends AbstractMqttTest {
     sendData(true, "2", true, "3");
 
     // check new value. same: 2, 0. different: 3, 0.
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(2, 20,
         2, 30);
 
@@ -74,7 +74,7 @@ public class Read2Write1Test extends AbstractMqttTest {
     sendData(false, "4", false, "4");
 
     // check new value. same: 2, 4. different: 3, 4.
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(3, 24,
         3, 34);
 
@@ -82,7 +82,7 @@ public class Read2Write1Test extends AbstractMqttTest {
     setDataOnlySame(true, "77");
 
     // check new value. same: 77, 4. different: 3, 4.
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(4, 774,
         3, 34);
   }
@@ -97,7 +97,7 @@ public class Read2Write1Test extends AbstractMqttTest {
     setupReceiverAndConnect(false);
 
     // check initial value
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(0, null,
         0, null);
 
@@ -105,7 +105,7 @@ public class Read2Write1Test extends AbstractMqttTest {
     sendData(true, "2", true, "3");
 
     // check new value. same: 2, 0. different: 3, 0.
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(1, 20,
         1, 30);
 
@@ -113,7 +113,7 @@ public class Read2Write1Test extends AbstractMqttTest {
     sendData(false, "4", false, "4");
 
     // check new value. same: 2, 4. different: 3, 4.
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(2, 24,
         2, 34);
 
@@ -121,7 +121,7 @@ public class Read2Write1Test extends AbstractMqttTest {
     setDataOnlySame(true, "77");
 
     // check new value. same: 77, 4. different: 3, 4.
-    TimeUnit.SECONDS.sleep(2);
+    TestUtils.waitForMqtt();
     checkData(3, 774,
         2, 34);
   }
diff --git a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java
index d0c03c9221023005f7896abf681f6627609ebed5..05db73e8790a25dd9d730ea637e8be500d568d5f 100644
--- a/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java
+++ b/ros2rag.tests/src/test/java/org/jastadd/ros2rag/tests/TestUtils.java
@@ -5,6 +5,7 @@ import java.io.IOException;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.concurrent.TimeUnit;
 
 /**
  * Utility methods for tests.
@@ -58,4 +59,7 @@ public class TestUtils {
     return new String(encoded, encoding);
   }
 
+  static void waitForMqtt() throws InterruptedException {
+    TimeUnit.SECONDS.sleep(2);
+  }
 }