diff --git a/eraser-base/src/main/jastadd/Item.jrag b/eraser-base/src/main/jastadd/Item.jrag
index e6378febc6811e38d19984d70e7e28c24fe27efa..d28d3b1b492c2d1d731bb51d2bdb2a058c265156 100644
--- a/eraser-base/src/main/jastadd/Item.jrag
+++ b/eraser-base/src/main/jastadd/Item.jrag
@@ -1,10 +1,5 @@
 aspect ItemHandling {
 
-  protected boolean Item.isFrozen = false;
-  public void Item.freeze() { isFrozen = true; }
-  public void Item.unfreeze() { isFrozen = false; }
-  public final boolean Item.isFrozen() { return isFrozen; }
-
   protected boolean Item.sendState = true;
   public void Item.disableSendState() { sendState = false; }
   public void Item.enableSendState() { sendState = true; }
@@ -254,31 +249,31 @@ aspect ItemHandling {
 
   //--- setState(value,shouldSendState) ---
   public void ItemWithBooleanState.setState(boolean value, boolean shouldSendState) {
-    if (isFrozen || stateEquals(value)) { return; }
+    if (stateEquals(value)) { return; }
     set_state(value);
     stateUpdated(shouldSendState);
   }
 
   public void ItemWithStringState.setState(String value, boolean shouldSendState) {
-    if (isFrozen || stateEquals(value)) { return; }
+    if (stateEquals(value)) { return; }
     set_state(value);
     stateUpdated(shouldSendState);
   }
 
   public void ItemWithDoubleState.setState(double value, boolean shouldSendState) {
-    if (isFrozen || stateEquals(value)) { return; }
+    if (stateEquals(value)) { return; }
     set_state(value);
     stateUpdated(shouldSendState);
   }
 
   public void ColorItem.setState(TupleHSB value, boolean shouldSendState) {
-    if (isFrozen || stateEquals(value)) { return; }
+    if (stateEquals(value)) { return; }
     set_state(value);
     stateUpdated(shouldSendState);
   }
 
   public void DateTimeItem.setState(Instant value, boolean shouldSendState) {
-    if (isFrozen || stateEquals(value)) { return; }
+    if (stateEquals(value)) { return; }
     set_state(value);
     stateUpdated(shouldSendState);
   }
@@ -405,6 +400,7 @@ aspect ItemHandling {
     SetStateFromTriggeringItemAction action = new SetStateFromTriggeringItemAction();
     action.setAffectedItem(controlledItem);
     rule.addAction(action);
+    rule.activateFor(controllerItem);
     
     return rule;
     
@@ -437,14 +433,10 @@ aspect ItemHandling {
   public abstract void ItemUpdate.apply();
   public void ItemUpdateColor.apply() {
     getItem().setStateFromColor(getNewHSB());
-    getItem().freeze();
-    getItem().unfreeze();
   }
   //--- ItemUpdate.apply ---
   public void ItemUpdateDouble.apply() {
     getItem().setStateFromDouble(getNewValue());
-    getItem().freeze();
-    getItem().unfreeze();
   }
 
   //--- ItemUpdate.describe ---
diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ControllingItemTest.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ControllingItemTest.java
index b25642533f1bd893fffc0605f8080fddfcdbbf29..581108cc4fca4044e91f09eb88840fce183537c5 100644
--- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ControllingItemTest.java
+++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/ControllingItemTest.java
@@ -125,4 +125,21 @@ public class ControllingItemTest {
     item.enableSendState();
     return item;
   }
+
+
+  @Test
+  public void testCircularControlling() {
+    ModelAndItem mai = TestUtils.createModelAndItem(0, true);
+    NumberItem item1 = mai.item;
+    NumberItem item2 = TestUtils.addItemTo(mai.model, 4, true);
+    item1.addControlling(item2);
+    item2.addControlling(item1);
+
+    assertEquals(0, item1.getState(), DELTA);
+    assertEquals(4, item2.getState(), DELTA);
+
+    item1.setState(5);
+    assertEquals(5, item1.getState(), DELTA);
+    assertEquals(5, item2.getState(), DELTA, "Item was not controlled correctly");
+  }
 }
diff --git a/eraser-base/src/test/resources/tests/ppc4/input.eraser b/eraser-base/src/test/resources/tests/ppc4/input.eraser
index 8687f881951aa3bc8766e209a87432a235e2a72a..5d7c299b5b794316c4dce44e97f242e5a3435388 100644
--- a/eraser-base/src/test/resources/tests/ppc4/input.eraser
+++ b/eraser-base/src/test/resources/tests/ppc4/input.eraser
@@ -9,14 +9,14 @@ Group: id="my-empty-group" ;
 Color Item : id="color1" label="a Color Item" state="1,2,3" topic="item/hsb/color1/state";
 DateTime Item : id="datetime1" label="a DateTime Item" state="1543415826" topic="item/date/datetime1/state";
 Contact Item : id="contact1" label="a Contact Item" state="CLOSED" topic="item/bool/contact1/state";
-Dimmer Item : id="dimmer1" label="a Dimmer Item" state="123" topic="item/double/dimmer1/state" controls=["color1", "datetime1"];
-Image Item : id="image1" label="an Image Item" state="def" topic="item/str/image1/state" controls=[];
+Dimmer Item : id="dimmer1" label="a Dimmer Item" state="123" topic="item/double/dimmer1/state";
+Image Item : id="image1" label="an Image Item" state="def" topic="item/str/image1/state" ;
 Location Item : id="location1" label="a Location Item" state="ghi" topic="item/str/location1/state";
-Number Item : id="number1" label="a Number Item" state="456" topic="item/double/number1/state" controls=["string1"];
+Number Item : id="number1" label="a Number Item" state="456" topic="item/double/number1/state" ;
 Player Item : id="player1" label="a Player Item" state="jkl" topic="item/str/player1/state";
 RollerShutter Item : id="rollerShutter1" label="a RollerShutter Item" state="0" topic="item/str/rs1/state";
 Activity Item: id="activity";
 String Item : id="string1" label="a String Item" state="mno" topic="item/str/string1/state";
-Switch Item : id="switch1" label="a Switch Item" state="true" topic="item/bool/switch1/state" controls=["rollerShutter1"];
+Switch Item : id="switch1" label="a Switch Item" state="true" topic="item/bool/switch1/state";
 Item : id="default1" label="a Default Item" state="pqr" topic="item/str/default1/state";
 Influx: host="localhost" ;
diff --git a/eraser-base/src/test/resources/tests/ppc4/output.eraser b/eraser-base/src/test/resources/tests/ppc4/output.eraser
index d4934300c2f7e3c0c8be65bf4f4932bbc4b7be52..4f22e2e26a56180066d1370a6dda13d695d16b3e 100644
--- a/eraser-base/src/test/resources/tests/ppc4/output.eraser
+++ b/eraser-base/src/test/resources/tests/ppc4/output.eraser
@@ -4,13 +4,13 @@ Image Item: id="image1" label="an Image Item" state="def" topic="item/str/image1
 Location Item: id="location1" label="a Location Item" state="ghi" topic="item/str/location1/state" ;
 DateTime Item: id="datetime1" label="a DateTime Item" state="1970-01-18T20:43:35.826Z" topic="item/date/datetime1/state" ;
 Item: id="default1" label="a Default Item" state="pqr" topic="item/str/default1/state" ;
-Dimmer Item: id="dimmer1" label="a Dimmer Item" state="123.0" topic="item/double/dimmer1/state" controls=["color1", "datetime1"] ;
+Dimmer Item: id="dimmer1" label="a Dimmer Item" state="123.0" topic="item/double/dimmer1/state" ;
 Player Item: id="player1" label="a Player Item" state="jkl" topic="item/str/player1/state" ;
-Number Item: id="number1" label="a Number Item" state="456.0" topic="item/double/number1/state" controls=["string1"] ;
+Number Item: id="number1" label="a Number Item" state="456.0" topic="item/double/number1/state" ;
 RollerShutter Item: id="rollerShutter1" label="a RollerShutter Item" state="0.0" topic="item/str/rs1/state" ;
 Activity Item: id="activity" ;
 String Item: id="string1" label="a String Item" state="mno" topic="item/str/string1/state" ;
-Switch Item: id="switch1" label="a Switch Item" state="ON" topic="item/bool/switch1/state" controls=["rollerShutter1"] ;
+Switch Item: id="switch1" label="a Switch Item" state="ON" topic="item/bool/switch1/state" ;
 Group: id="my-first-group" items=["color1", "contact1", "image1", "location1"] aggregation="AND" ("ON", "OFF") ;
 Group: id="my-second-group" items=["datetime1", "default1"] ;
 Group: id="my-third-group" items=["dimmer1", "player1"] ;
diff --git a/eraser-base/src/test/resources/tests/ppc5/input.eraser b/eraser-base/src/test/resources/tests/ppc5/input.eraser
index 21cc14bc796965aae71d2bca119f60b0cdf640c5..194cc284c08bf3c0f8c44a50dec9d22d8d3aedc5 100644
--- a/eraser-base/src/test/resources/tests/ppc5/input.eraser
+++ b/eraser-base/src/test/resources/tests/ppc5/input.eraser
@@ -11,7 +11,7 @@ Group: items=["min-item", "max-item"] id="max-group" groups=["min-group"] aggreg
 
 Number Item: id="min-item" ; // state will be set to default value
 Switch Item: topic="items/max"
- controls=["min-item"] id="max-item" state="true" label="Item with all members set" category="not used"
+ id="max-item" state="true" label="Item with all members set" category="not used"
  metaData={"one":"true", "zero":"false"} ;
 
 // Parameters will get sorted alphabetically in output
diff --git a/eraser-base/src/test/resources/tests/ppc5/output.eraser b/eraser-base/src/test/resources/tests/ppc5/output.eraser
index 5498db37c271084736a1be692b318f92ab2c5b5e..82738395874c5951e61078f4fb386998d1d86829 100644
--- a/eraser-base/src/test/resources/tests/ppc5/output.eraser
+++ b/eraser-base/src/test/resources/tests/ppc5/output.eraser
@@ -1,7 +1,7 @@
 Thing: id="min-thing" type="min-thing-type" ;
 Thing: id="max-thing" label="Max Thing" type="max-thing-type" channels=["min-channel", "max-channel"] ;
 Number Item: id="min-item" state="0.0" ;
-Switch Item: id="max-item" label="Item with all members set" state="ON" category="not used" topic="items/max" controls=["min-item"] metaData={"one":"true", "zero":"false"} ;
+Switch Item: id="max-item" label="Item with all members set" state="ON" category="not used" topic="items/max" metaData={"one":"true", "zero":"false"} ;
 Group: id="min-group" ;
 Group: id="max-group" groups=["min-group"] items=["min-item", "max-item"] aggregation="AND" ("one", "two") ;
 ThingType: id="min-thing-type" ;