diff --git a/ros3rag.common/src/main/resources/jastadd/types.jadd b/ros3rag.common/src/main/resources/jastadd/types.jadd
index a0290bf295e70ff220f622405709a01b18f09d1d..2d8077469bcf93f69ccef4777e6093b152c6e870 100644
--- a/ros3rag.common/src/main/resources/jastadd/types.jadd
+++ b/ros3rag.common/src/main/resources/jastadd/types.jadd
@@ -188,6 +188,10 @@ aspect Navigation {
   }
   syn List<String> Region.locationNamesAsList() = arrayAsList(getLocationNames()) ;
   syn List<DropOffLocation> Region.locationList();
+
+  syn Set<String> LogicalMovableObject.regionNameSet() {
+    return getLocatedAtList().stream().map(LogicalRegion::getName).collect(java.util.stream.Collectors.toSet());
+  }
 }
 
 aspect Printing {
diff --git a/ros3rag.placeB/src/main/jastadd/WorldModelB.jadd b/ros3rag.placeB/src/main/jastadd/WorldModelB.jadd
index c96e250e67fb1222ef352eb384c6f7525a5b163d..6370aff43ffa566609597507758b0a873f61410b 100644
--- a/ros3rag.placeB/src/main/jastadd/WorldModelB.jadd
+++ b/ros3rag.placeB/src/main/jastadd/WorldModelB.jadd
@@ -73,7 +73,7 @@ aspect Computation {
         continue;
       }
       if (!myGenericObject.isLogicalMovableObject()) {
-        System.err.println("MovableObject " + otherObject.getName() + " is a location in myScene. Skipping!");
+        System.err.println("MovableObject " + otherObject.getName() + " is not a MovableObject in myScene. Skipping!");
         continue;
       }
       LogicalMovableObject myObject = myGenericObject.asLogicalMovableObject();
@@ -94,8 +94,8 @@ aspect Computation {
       if (otherObject.getLocatedAtList().size() > 1) {
         System.err.println("More than one region found for other " + otherObject.getName() + ", using only first.");
       }
-      Set<LogicalRegion> myRegions = new HashSet<>(myObject.getLocatedAtList());
-      Set<LogicalRegion> otherRegions = new HashSet<>(otherObject.getLocatedAtList());
+      Set<String> myRegions = myObject.regionNameSet();
+      Set<String> otherRegions = otherObject.regionNameSet();
       if (!myObject.hasLocatedAt() && !otherObject.hasLocatedAt() ||
           (myObject.hasLocatedAt() && otherObject.hasLocatedAt() &&
               myRegions.equals(otherRegions))) {
@@ -189,7 +189,7 @@ aspect Computation {
               }
               return result;
             }).orElseGet(() -> error("Could not resolve graph vertex of new region " + getNewRegion().nameAndHash()));
-          }).orElseGet(() -> error("Could not find a free location in " + getNewRegion().nameAndHash()));
+          }).orElseGet(() -> error("Could not find a free location in " + getNewRegion().nameAndHash() + " for " + getObject().nameAndHash()));
     }).orElseGet(() -> error("Could not resolve graph vertex of previous location " + previousLocation.nameAndHash()));
   }
   eq DifferenceNewObject.computeOperations() {
diff --git a/ros3rag.placeB/src/main/java/de/tudresden/inf/st/placeB/SimpleMainB.java b/ros3rag.placeB/src/main/java/de/tudresden/inf/st/placeB/SimpleMainB.java
index 5895d962e1e5adcc07bc6e23714eb712be5e8db7..9b8602b279e67de08ce0d1b43e02ec0dab4eeeee 100644
--- a/ros3rag.placeB/src/main/java/de/tudresden/inf/st/placeB/SimpleMainB.java
+++ b/ros3rag.placeB/src/main/java/de/tudresden/inf/st/placeB/SimpleMainB.java
@@ -149,53 +149,77 @@ public class SimpleMainB {
     LogicalScene logicalSceneFromPlaceA = sceneFromPlaceA.getLogicalScene();
     byte[] bytesToSend = _ragconnect__apply__TreeDefaultLogicalSceneToBytesMapping(logicalSceneFromPlaceA);
 
-    logger.info("Wait 2 sec, then send new logical scene");
-    TimeUnit.SECONDS.sleep(2);
+    describedWait(1, "send new logical scene");
     mqttHandler.publish(topicUpdateFromPlaceA, bytesToSend);
 
-    logger.info("Wait another 2 sec, then print model status");
-    TimeUnit.SECONDS.sleep(2);
+    describedWait(2, "print model status");
     mqttHandler.publish(topicModel, "detailed".getBytes(StandardCharsets.UTF_8));
 
-    logger.info("Wait another 2 sec, then send updated sceneB");
-    TimeUnit.SECONDS.sleep(2);
-
     // set object O1 to position of P-E in sceneB and publish it
-    Position posOfPE = myScene.resolveObjectOfInterest("P-E").getPosition();
+    describedWait(3, "send updated sceneB (P-E)");
+    scene = updatePositionOfObject(scene, "O1", myScene.resolveObjectOfInterest("P-E").getPosition());
+    mqttHandler.publish(topicSceneUpdateB, scene.toByteArray());
+
+    describedWait(4, "set R1 to not busy");
+    model.findRobot("R1").ifPresentOrElse(robot -> robot.setBusy(false), () -> logger.warn("Did not find R1"));
+
+    describedWait(5, "print model status");
+    mqttHandler.publish(topicModel, "detailed".getBytes(StandardCharsets.UTF_8));
+
+    // set object O1 to position of P2.2 in sceneB and publish it
+    describedWait(6, "send updated sceneB (P2.2)");
+    scene = updatePositionOfObject(scene, "O1", myScene.resolveObjectOfInterest("P2.2").getPosition());
+    mqttHandler.publish(topicSceneUpdateB, scene.toByteArray());
+
+    describedWait(7, "print model status");
+    mqttHandler.publish(topicModel, "detailed".getBytes(StandardCharsets.UTF_8));
+
+    describedWait(8, "set R2 to not busy");
+    model.findRobot("R2").ifPresentOrElse(robot -> robot.setBusy(false), () -> logger.warn("Did not find R2"));
+
+    describedWait(9, "print model status");
+    mqttHandler.publish(topicModel, "detailed".getBytes(StandardCharsets.UTF_8));
+
+    if (exitAutomatically) {
+      TimeUnit.SECONDS.sleep(5);
+      exitCondition.countDown();
+    }
 
+    exitCondition.await();
+  }
+
+  static void describedWait(int stepNr, String description) throws InterruptedException {
+    logger.info("({}) Wait 2 secs, then {}", stepNr, description);
+    TimeUnit.SECONDS.sleep(2);
+    logger.info(description);
+  }
+
+  static de.tudresden.inf.st.ceti.Scene updatePositionOfObject(
+      de.tudresden.inf.st.ceti.Scene scene,
+      String objectName,
+      Position newPosition) {
     List<Object> objectsList = scene.getObjectsList();
     Object newObj = null;
     int index, objectsListSize;
     for (index = 0, objectsListSize = objectsList.size(); index < objectsListSize; index++) {
       Object obj = objectsList.get(index);
-      if (obj.getId().equals("O1")) {
+      if (obj.getId().equals(objectName)) {
         Object.Builder builder = obj.toBuilder();
         builder.getPosBuilder()
-            .setX(posOfPE.getX())
-            .setY(posOfPE.getY())
-            .setZ(posOfPE.getZ());
+            .setX(newPosition.getX())
+            .setY(newPosition.getY())
+            .setZ(newPosition.getZ());
         newObj = builder.build();
         break;
       }
     }
     if (newObj == null) {
-      logger.error("Did not find object O1!");
+      logger.error("Did not find object {}!", objectName);
     } else {
       scene = scene.toBuilder().setObjects(index, newObj).build();
-      logger.info("New scene: {}", scene);
-      mqttHandler.publish(topicSceneUpdateB, scene.toByteArray());
+      logger.info("Update {} in scene to {}", objectName, newObj);
     }
-
-    logger.info("Wait another 2 sec, then print model status");
-    TimeUnit.SECONDS.sleep(2);
-    mqttHandler.publish(topicModel, "detailed".getBytes(StandardCharsets.UTF_8));
-
-    if (exitAutomatically) {
-      TimeUnit.SECONDS.sleep(5);
-      exitCondition.countDown();
-    }
-
-    exitCondition.await();
+    return scene;
   }
 
   // copied from WorldModelA
diff --git a/ros3rag.placeB/src/main/java/de/tudresden/inf/st/placeB/UtilB.java b/ros3rag.placeB/src/main/java/de/tudresden/inf/st/placeB/UtilB.java
index 622b717207b5311ec5a8e267d27e502b53d8f844..8ad4ec64df1789f4bddc3c96299a3cc7bc2221c4 100644
--- a/ros3rag.placeB/src/main/java/de/tudresden/inf/st/placeB/UtilB.java
+++ b/ros3rag.placeB/src/main/java/de/tudresden/inf/st/placeB/UtilB.java
@@ -84,7 +84,7 @@ public class UtilB {
       return "\"" + objName + "\"";
     }
     try {
-      return model.getMyScene().getLogicalScene().resolveLogicalObjectOfInterest(objName).getName();
+      return model.getMyScene().resolveObjectOfInterest(objName).getName();
     } catch (NullPointerException ignore) {
       return "+" + objName + "(not resolved)+";
     }
@@ -98,10 +98,13 @@ public class UtilB {
     StringBuilder sb = new StringBuilder();
     sb.append("myRobots: ")
         .append(model.getRobotList().prettyPrint(
-            robot -> robot.getName() + "(canReach: " + robot.getCanReachObjectOfInterestWrapper()
+            robot -> robot.getName()
+                + "(" + (robot.getBusy() ? "busy" : "free")
+                + ", canReach: "
+                + robot.getCanReachObjectOfInterestWrapper()
                 .getCanReachObjectOfInterestList()
                 .prettyPrint(canReachObj -> resolveObjName(model, canReachObj.getObjectName()))
-            + ")"))
+                + ")"))
         .append("\n");
     if (detailed) {
       // also include "normal" scene