diff --git a/ros3rag.placeA/src/main/resources/regions-a-placeworld.json b/ros3rag.placeA/src/main/resources/regions-a-placeworld.json
index 43cb170518c8f0e817ad26b47b719317f75a163d..7b9e155e0f56bc006adb6bb4821ecec998ad74d2 100644
--- a/ros3rag.placeA/src/main/resources/regions-a-placeworld.json
+++ b/ros3rag.placeA/src/main/resources/regions-a-placeworld.json
@@ -1,6 +1,6 @@
 {
   "regions": [
     { "name": "G", "positions": ["target_Blue"] },
-    { "name": "I", "positions": ["target_Green"] }
+    { "name": "G", "positions": ["target_Green"] }
   ]
 }
diff --git a/ros3rag.placeB/src/main/jastadd/WorldModelB.connect b/ros3rag.placeB/src/main/jastadd/WorldModelB.connect
index 2c88a864d233dd9d023fcac06990ec10e73caf11..8d91fc98c41cc625abcea7162bad571c134466d6 100644
--- a/ros3rag.placeB/src/main/jastadd/WorldModelB.connect
+++ b/ros3rag.placeB/src/main/jastadd/WorldModelB.connect
@@ -100,11 +100,22 @@ CommandCheckForOccupiedCollaborationZone maps byte[] bytes to String {:
       reject();
     }
 
+    // if target is collaboration zone
     ObjectOfInterest obj = scene.resolveObjectOfInterest(pp.getIdPlace());
     DropOffLocation loc = obj.asDropOffLocation();
     if (loc.isCollaborationZone()) {
-      CollaborationZone cz = loc.asCollaborationZone();
-      String specialIncomingName = "(>)" + cz.getName();
+      String specialIncomingName = "(>)" + loc.getName();
+      if (!occupiedZoneNames.contains(specialIncomingName)) {
+        occupiedZoneNames.add(specialIncomingName);
+        updated = true;
+      }
+    }
+    // if object is located at collaboration zone
+    LogicalObjectOfInterest logicalObj = scene.getLogicalScene().resolveLogicalObjectOfInterest(pp.getIdPick());
+    LogicalMovableObject toBePicked = logicalObj.asLogicalMovableObject();
+    DropOffLocation sourceLocation = toBePicked.myLocation();
+    if (sourceLocation != null && sourceLocation.isCollaborationZone()) {
+      String specialIncomingName = "(^)" + sourceLocation.getName();
       if (!occupiedZoneNames.contains(specialIncomingName)) {
         occupiedZoneNames.add(specialIncomingName);
         updated = true;
diff --git a/ros3rag.placeB/src/main/jastadd/WorldModelB.jadd b/ros3rag.placeB/src/main/jastadd/WorldModelB.jadd
index e11e27bc4e2fe39072d0c30b81539ae9880150b9..420813b65a6093ab57b1d76da4bcca7542db7ebc 100644
--- a/ros3rag.placeB/src/main/jastadd/WorldModelB.jadd
+++ b/ros3rag.placeB/src/main/jastadd/WorldModelB.jadd
@@ -314,29 +314,43 @@ aspect Computation {
     for (String zoneName : arrayAsList(getOccupiedCollaborationZoneNames())) {
       if (zoneName.startsWith("(>)")) {
         String targetZone = zoneName.substring(3);
-        if (getCurrentPosition().equals(zoneName) && myState == de.tudresden.inf.st.ceti.Object.State.STATE_IDLE) {
-          System.out.println(pre + targetZone);
-          return targetZone;  // robot was moving and has now reached its target
-        }
-        if (isStateMoving(myState) || "unknown".equals(getCurrentPosition())) {
-          System.out.println(pre + zoneName);
-          return zoneName;  // actually return (>) + targetZone
+        // (1)
+        String currentTarget = getCurrentPosition().startsWith("(") ? getCurrentPosition().substring(3) : getCurrentPosition();
+        if (!targetZone.equals(currentTarget) && myState == de.tudresden.inf.st.ceti.Object.State.STATE_IDLE) {
+          return logAndReturn(pre, "(+)" + targetZone);
         }
       }
+      // (2) // getCurrentPosition().startsWith("(+)") &&
+      if (isStateMoving(myState)) {
+        return logAndReturn(pre, zoneName);
+      }
+      // (3)
+      if (getCurrentPosition().startsWith("(>)") && myState == de.tudresden.inf.st.ceti.Object.State.STATE_IDLE) {
+        return logAndReturn(pre, getCurrentPosition().substring(3));
+      }
       if (zoneName.startsWith("(^)")) {
-        String targetZone = zoneName.substring(3);
-        if (getCurrentPosition().equals(zoneName) && myState == de.tudresden.inf.st.ceti.Object.State.STATE_IDLE) {
-          System.out.println(pre + "(empty)");
-          return "";  // robot was moving and has now reached its target
+        String sourceZone = zoneName.substring(3);
+        // (4)
+        if (!getCurrentPosition().startsWith("(^)") && !getCurrentPosition().equals("safe") && myState == de.tudresden.inf.st.ceti.Object.State.STATE_IDLE) {
+          return logAndReturn(pre, "(-)" + sourceZone);
         }
-        if (isStateMoving(myState) || "unknown".equals(getCurrentPosition())) {
-          System.out.println(pre + zoneName);
-          return zoneName;  // actually return (^) + targetZone
+        // (6)
+        if (getCurrentPosition().startsWith("(^)") && myState == de.tudresden.inf.st.ceti.Object.State.STATE_IDLE) {
+          return logAndReturn(pre, "safe");
         }
       }
+      // (5)
+      if (getCurrentPosition().startsWith("(-)") && isStateMoving(myState)) {
+        return logAndReturn(pre, "(^)" + getCurrentPosition().substring(3));
+      }
     }
-    System.out.println(pre + getCurrentPosition());
-    return getCurrentPosition();
+    // no-op
+    return logAndReturn(pre, getCurrentPosition());
+  }
+
+  private String Robot.logAndReturn(String pre, String returnValue) {
+    System.out.println(pre + returnValue);
+    return returnValue;
   }
 
   private boolean Robot.isStateMoving(de.tudresden.inf.st.ceti.Object.State state) {
@@ -404,16 +418,9 @@ aspect Navigation {
   syn Robot CollaborationZone.occupient() {
     // (>) == moving in, (^) == evacuate/moving out
     for (Robot robot : worldModelB().getRobotList()) {
-      String zoneName = robot.getCurrentPosition();
-      if (zoneName.startsWith("(>)") && zoneName.substring(3).equals(getName())) {
-        // robot is currently moving into this zone. always regard it as occupied by it
-        return robot;
-      }
-      if (zoneName.startsWith("(^)") && zoneName.substring(3).equals(getName())) {
-        // robot is moving out of this zone. also regard it as occupied
-        return robot;
-      }
+      String zoneName = robot.getCurrentPosition().startsWith("(") ? robot.getCurrentPosition().substring(3) : robot.getCurrentPosition();
       if (zoneName.equals(getName())) {
+        // robot is currently in this zone, or moving into or out of this zone. always regard it as occupied by it
         return robot;
       }
     }
diff --git a/ros3rag.placeB/src/main/java/de/tudresden/inf/st/placeB/MainB.java b/ros3rag.placeB/src/main/java/de/tudresden/inf/st/placeB/MainB.java
index 2c0da972e5388c7a1adc87a845561efb05562ce7..52f1a58a07bcf2728f8c0d2f8448e5506d182bf4 100644
--- a/ros3rag.placeB/src/main/java/de/tudresden/inf/st/placeB/MainB.java
+++ b/ros3rag.placeB/src/main/java/de/tudresden/inf/st/placeB/MainB.java
@@ -45,6 +45,7 @@ public class MainB extends SharedMainParts<MqttHandler, WorldModelB> {
   protected void createSpecificMainHandlerConnections() {
     mainHandler.newConnection("place-b/demo", bytes -> {
       String topic = new String(bytes);
+      int slashIndex;
       switch (topic) {
         case "objectRed1/red":
           UtilB.updatePositionOfObjectToLocation(model.getMyScene(), "objectRed1", "binRed");
@@ -65,29 +66,32 @@ public class MainB extends SharedMainParts<MqttHandler, WorldModelB> {
         case "arm2/picking":
         case "arm2/placing":
         case "arm2/moving":
-          int slashIndex = topic.indexOf("/");
+          slashIndex = topic.indexOf("/");
           String robot = topic.substring(0, slashIndex);
           String stateString = "STATE_" + topic.substring(slashIndex + 1).toUpperCase();
           Object.State state = Object.State.valueOf(stateString);
           updateAndPublishScene(robot, r -> r.toBuilder().setState(state).build());
           break;
-        case "big-blue/cz":
-          updateAndPublishScene("bigBlue", bigBlue -> {
-            Object.Builder builder = bigBlue.toBuilder();
+        case "bigBlue/cz1":
+        case "bigBlue/G1":
+        case "bigBlue/G2":
+        case "bigBlue/I1":
+        case "bigBlue/I2":
+        case "bigGreen/cz1":
+        case "bigGreen/G1":
+        case "bigGreen/G2":
+        case "bigGreen/I1":
+        case "bigGreen/I2":
+          slashIndex = topic.indexOf("/");
+          String obj = topic.substring(0, slashIndex);
+          String location = topic.substring(slashIndex + 1);
+          Position pos = model.getMyScene().resolveObjectOfInterest(location).asDropOffLocation().getPosition();
+          updateAndPublishScene(obj, o -> {
+            Object.Builder builder = o.toBuilder();
             builder.getPosBuilder()
-                .setX(0.0012)
-                .setY(0.65)
-                .setZ(0.94);
-            return builder.build();
-          });
-          break;
-        case "big-blue/g1":
-          updateAndPublishScene("bigBlue", bigBlue -> {
-            Object.Builder builder = bigBlue.toBuilder();
-            builder.getPosBuilder()
-                .setX(0.1)
-                .setY(1.0)
-                .setZ(0.93);
+                .setX(pos.getX())
+                .setY(pos.getY())
+                .setZ(pos.getZ());
             return builder.build();
           });
           break;
diff --git a/ros3rag.placeB/src/main/resources/reachability-b-placeworld.json b/ros3rag.placeB/src/main/resources/reachability-b-placeworld.json
index 29f63f1969054177fca57102dc5f5988f54e169c..7f5d47fc8419d5d4535944493949f1d1672e651a 100644
--- a/ros3rag.placeB/src/main/resources/reachability-b-placeworld.json
+++ b/ros3rag.placeB/src/main/resources/reachability-b-placeworld.json
@@ -13,7 +13,7 @@
       "name": "arm2",
       "reachableLocations": [
         "cz1",
-        "G1",
+        "G1", "G2", "G3", "G4",
         "I1", "I2", "I3" ,"I4"
       ]
     }
diff --git a/ros3rag.placeB/src/main/resources/regions-b-placeworld.json b/ros3rag.placeB/src/main/resources/regions-b-placeworld.json
index 224d69e448eb070ba67c6beaa6795c783d352c84..19c849b41643e12b82ebc715c1949b627c37a68a 100644
--- a/ros3rag.placeB/src/main/resources/regions-b-placeworld.json
+++ b/ros3rag.placeB/src/main/resources/regions-b-placeworld.json
@@ -6,7 +6,7 @@
     { "name": "D", "positions": ["D1"] },
     { "name": "E", "positions": ["E1"] },
     { "name": "F", "positions": ["F1"] },
-    { "name": "G", "positions": ["G1"] },
+    { "name": "G", "positions": ["G1", "G2", "G3", "G4"] },
     { "name": "H", "positions": ["H1"] },
     { "name": "I", "positions": ["I1", "I2", "I3", "I4"] },
     { "name": "CZ", "positions": ["cz1"] }