diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java
index fd6024bdfd45e2652eb4eaa118eada3dbfc75f23..5836641cd5b068302f1b258c08c5a4021400b228 100644
--- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java
+++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/util/TestUtils.java
@@ -35,6 +35,15 @@ public class TestUtils {
     return ModelAndItem.of(root.getSmartHomeEntityModel(), item);
   }
 
+  public static SmartHomeEntityModel createModelWithGroup() {
+    Root root = Root.createEmptyRoot();
+    Group g = new Group();
+    root.getSmartHomeEntityModel().addGroup(g);
+    g.setID("DEFAULT_GROUP");
+
+    return root.getSmartHomeEntityModel();
+  }
+
   public static NumberItem addItemTo(SmartHomeEntityModel model, double initialValue) {
     return addItemTo(model, initialValue, false);
   }
diff --git a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java
index c566bf861833c4cd12fecee142d285d1228269a2..633627c6bf85e4ddd363865b01bb62155919ae1e 100644
--- a/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java
+++ b/eraser-base/src/test/java/de/tudresden/inf/st/eraser/RulesTest.java
@@ -2,12 +2,17 @@ package de.tudresden.inf.st.eraser;
 
 import beaver.Parser;
 import de.tudresden.inf.st.eraser.jastadd.model.*;
+import de.tudresden.inf.st.eraser.jastadd.model.Action;
 import de.tudresden.inf.st.eraser.util.ParserUtils;
 import de.tudresden.inf.st.eraser.util.TestUtils;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Disabled;
+import org.testcontainers.shaded.com.google.common.collect.ImmutableList;
 
 import java.io.IOException;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ScheduledFuture;
@@ -15,9 +20,9 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.StreamSupport;
 
+import static de.tudresden.inf.st.eraser.util.TestUtils.getDefaultGroup;
 import static org.assertj.core.api.Assertions.fail;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.*;
 
 /**
  * Testing the simple rule engine.
@@ -245,6 +250,254 @@ public class RulesTest {
     assertEquals(2, counter.get(item), "Change of item to 7 should not trigger the rule, check2 violated");
   }
 
+  @Test
+  public void testStateSyncGroupRewriteStructure() {
+    // init StateSyncGroup
+    StateSyncGroup group = new StateSyncGroup();
+
+    ArrayList<Item> items = new ArrayList<>();
+
+    // create model and an item
+    TestUtils.ModelAndItem mai = TestUtils.createModelAndItem(0, true);
+    NumberItem item0 = mai.item;
+    group.addTargetItem(item0);
+    items.add(item0);
+
+    // init more items
+    for (int i=1;i<=4;i++) {
+      NumberItem item = TestUtils.addItemTo(mai.model, i, true);
+      item.setID("item"+i);
+      group.addTargetItem(item);
+      items.add(item);
+    }
+
+    // add StateSyncGroup as rule to root
+    mai.model.getRoot().addRule(group);
+
+
+
+    // trace rewritten rule and its actions
+    Rule rewrittenRule = mai.model.getRoot().getRules().getChild(0);
+
+
+    ImmutableList<Action> actions = ImmutableList.copyOf(rewrittenRule.getActionList().iterator());
+    ImmutableList<ItemObserver> observers = ImmutableList.copyOf(rewrittenRule.getObservers().iterator());
+
+    // check general structure
+    assertEquals(ImmutableList.copyOf(rewrittenRule.getConditionList().iterator()).size(), 0);
+    assertEquals(actions.size(), 5);
+
+    // check actions and observers
+    for (int i=0;i<items.size();i++) {
+      assertTrue(actions.get(i) instanceof SetStateFromTriggeringItemAction);
+      assertTrue(observers.contains(items.get(i).getItemObserver()));
+    }
+
+
+
+  }
+
+  private static void addItemToModel(SmartHomeEntityModel model, Item item) {
+    getDefaultGroup(model).addItem(item);
+  }
+
+  @Test
+  public void testColorItemStateSyncGroup() {
+    StateSyncGroup group = new StateSyncGroup();
+
+    //init model and 3 items
+    SmartHomeEntityModel model = TestUtils.createModelWithGroup();
+
+    ColorItem colorItem1 = new ColorItem();
+    addItemToModel(model,colorItem1);
+    group.addTargetItem(colorItem1);
+
+    ColorItem colorItem2 = new ColorItem();
+    addItemToModel(model,colorItem2);
+    group.addTargetItem(colorItem2);
+
+    ColorItem colorItem3 = new ColorItem();
+    addItemToModel(model,colorItem3);
+    group.addTargetItem(colorItem3);
+
+
+    // add StateSyncGroup as rule to root and trigger rewrite
+    model.getRoot().addRule(group);
+    model.getRoot().doFullTraversal();
+
+
+    colorItem1.setState(TupleHSB.parse("0,0,100"));
+    assertEquals(colorItem1.getState(),TupleHSB.parse("0,0,100"));
+    assertEquals(colorItem2.getState(),TupleHSB.parse("0,0,100"));
+    assertEquals(colorItem3.getState(),TupleHSB.parse("0,0,100"));
+
+    colorItem3.setState(TupleHSB.parse("0,0,7"));
+    assertEquals(colorItem1.getState(),TupleHSB.parse("0,0,7"));
+    assertEquals(colorItem2.getState(),TupleHSB.parse("0,0,7"));
+    assertEquals(colorItem3.getState(),TupleHSB.parse("0,0,7"));
+
+
+  }
+
+  @Test
+  public void testDateTimeItemStateSyncGroup() {
+    StateSyncGroup group = new StateSyncGroup();
+
+    //init model and 3 items
+    SmartHomeEntityModel model = TestUtils.createModelWithGroup();
+
+    DateTimeItem dateTimeItem1 = new DateTimeItem();
+    addItemToModel(model,dateTimeItem1);
+    group.addTargetItem(dateTimeItem1);
+
+    DateTimeItem dateTimeItem2 = new DateTimeItem();
+    addItemToModel(model,dateTimeItem2);
+    group.addTargetItem(dateTimeItem2);
+
+    DateTimeItem dateTimeItem3 = new DateTimeItem();
+    addItemToModel(model,dateTimeItem3);
+    group.addTargetItem(dateTimeItem3);
+
+
+    // add StateSyncGroup as rule to root and trigger rewrite
+    model.getRoot().addRule(group);
+    model.getRoot().doFullTraversal();
+
+    Instant i1 = Instant.now();
+    dateTimeItem1.setState(i1);
+    assertEquals(dateTimeItem1.getState(),i1);
+    assertEquals(dateTimeItem2.getState(),i1);
+    assertEquals(dateTimeItem3.getState(),i1);
+
+    Instant i2 = Instant.now();
+    dateTimeItem3.setState(i2);
+    assertEquals(dateTimeItem1.getState(),i2);
+    assertEquals(dateTimeItem2.getState(),i2);
+    assertEquals(dateTimeItem3.getState(),i2);
+  }
+
+  /**
+   * Also for DimmerItem, RollerShutterItem, ActivityItem
+   */
+  @Test
+  public void testDoubleStateItemStateSyncGroup() {
+    StateSyncGroup group = new StateSyncGroup();
+
+    //init model and 3 items
+    SmartHomeEntityModel model = TestUtils.createModelWithGroup();
+
+    NumberItem numberItem1 = new NumberItem();
+    addItemToModel(model,numberItem1);
+    group.addTargetItem(numberItem1);
+
+    NumberItem numberItem2 = new NumberItem();
+    addItemToModel(model,numberItem2);
+    group.addTargetItem(numberItem2);
+
+    NumberItem numberItem3 = new NumberItem();
+    addItemToModel(model,numberItem3);
+    group.addTargetItem(numberItem3);
+
+
+    // add StateSyncGroup as rule to root and trigger rewrite
+    model.getRoot().addRule(group);
+    model.getRoot().doFullTraversal();
+
+
+    numberItem1.setState(123);
+    assertEquals(numberItem1.getState(),123);
+    assertEquals(numberItem2.getState(),123);
+    assertEquals(numberItem3.getState(),123);
+
+    numberItem2.setState(42);
+    assertEquals(numberItem1.getState(),42);
+    assertEquals(numberItem2.getState(),42);
+    assertEquals(numberItem3.getState(),42);
+  }
+
+  /**
+   * Also for ImageItem, LocationItem, PlayerItem, DefaultItem
+   */
+  @Test
+  public void testStringStateItemStateSyncGroup() {
+    StateSyncGroup group = new StateSyncGroup();
+
+    //init model and 3 items
+    SmartHomeEntityModel model = TestUtils.createModelWithGroup();
+
+    StringItem stringItem1 = new StringItem();
+    addItemToModel(model,stringItem1);
+    group.addTargetItem(stringItem1);
+
+    StringItem stringItem2 = new StringItem();
+    addItemToModel(model,stringItem2);
+    group.addTargetItem(stringItem2);
+
+    StringItem stringItem3 = new StringItem();
+    addItemToModel(model,stringItem3);
+    group.addTargetItem(stringItem3);
+
+
+    // add StateSyncGroup as rule to root and trigger rewrite
+    model.getRoot().addRule(group);
+    model.getRoot().doFullTraversal();
+
+
+    stringItem1.setState("123");
+    assertEquals(stringItem1.getState(),"123");
+    assertEquals(stringItem2.getState(),"123");
+    assertEquals(stringItem3.getState(),"123");
+
+    stringItem2.setState("Hermes");
+    assertEquals(stringItem1.getState(),"Hermes");
+    assertEquals(stringItem2.getState(),"Hermes");
+    assertEquals(stringItem3.getState(),"Hermes");
+
+
+  }
+
+
+  /**
+   * Also for ContactItem
+   */
+  @Test
+  public void testBooleanStateItemStateSyncGroup() {
+    StateSyncGroup group = new StateSyncGroup();
+
+    //init model and 3 items
+    SmartHomeEntityModel model = TestUtils.createModelWithGroup();
+
+    SwitchItem switchItem1 = new SwitchItem();
+    addItemToModel(model,switchItem1);
+    group.addTargetItem(switchItem1);
+
+    SwitchItem switchItem2 = new SwitchItem();
+    addItemToModel(model,switchItem2);
+    group.addTargetItem(switchItem2);
+
+    SwitchItem switchItem3 = new SwitchItem();
+    addItemToModel(model,switchItem3);
+    group.addTargetItem(switchItem3);
+
+
+    // add StateSyncGroup as rule to root and trigger rewrite
+    model.getRoot().addRule(group);
+    model.getRoot().doFullTraversal();
+
+
+    switchItem3.setState(false);
+    assertFalse(switchItem1.getState());
+    assertFalse(switchItem2.getState());
+    assertFalse(switchItem3.getState());
+
+    switchItem1.setState(true);
+    assertTrue(switchItem1.getState());
+    assertTrue(switchItem2.getState());
+    assertTrue(switchItem3.getState());
+
+  }
+
+
   @Test
   public void testTwoActions() {
     TestUtils.ModelAndItem modelAndItem = createModelAndItem(2);
@@ -673,7 +926,7 @@ public class RulesTest {
 
   private StringItem addStringItem(SmartHomeEntityModel model, String initialValue) {
     StringItem item = new StringItem();
-    Group group = TestUtils.getDefaultGroup(model);
+    Group group = getDefaultGroup(model);
     item.setID("item" + group.getNumItem());
     item.setState(initialValue, false);
     group.addItem(item);