diff --git a/eraser-base/src/main/jastadd/Item.jrag b/eraser-base/src/main/jastadd/Item.jrag
index 2473947b7cba1be7e26f5b265e41fc9e75fdec0c..ece1fd875c26b2d6f4bc94aa712f9bfe56a8884b 100644
--- a/eraser-base/src/main/jastadd/Item.jrag
+++ b/eraser-base/src/main/jastadd/Item.jrag
@@ -281,6 +281,8 @@ aspect ItemHandling {
     stateUpdated(shouldSendState);
   }
 
+  syn ItemObserver Item.getItemObserver() = new ItemObserver();
+
   //--- stateUpdated ---
   /**
    * Called, whenever the state of an item is updated. Does various things including:
@@ -462,23 +464,27 @@ aspect ItemHandling {
 
 
   //--- copyStateTo ---
-  protected abstract void Item.copyStateTo(Item... stateReceivers);
-  protected void ItemWithBooleanState.copyStateTo(Item... stateReceivers) {
-    Arrays.asList(stateReceivers).forEach(s -> s.setStateFromBoolean(this.getState()));
+  protected abstract void Item.copyStateTo(Item stateReceiver);
+
+  protected void ItemWithBooleanState.copyStateTo(Item stateReceiver) {
+    stateReceiver.setStateFromBoolean(this.getState());
   }
-  protected void ItemWithStringState.copyStateTo(Item... stateReceivers) {
-    Arrays.asList(stateReceivers).forEach(s -> s.setStateFromString(this.getState()));
+  protected void ItemWithStringState.copyStateTo(Item stateReceiver) {
+    stateReceiver.setStateFromString(this.getState());
   }
-  protected void ItemWithDoubleState.copyStateTo(Item... stateReceivers) {
-    Arrays.asList(stateReceivers).forEach(s -> s.setStateFromDouble(this.getState()));
+  protected void ItemWithDoubleState.copyStateTo(Item stateReceiver) {
+    stateReceiver.setStateFromDouble(this.getState());
   }
-  protected void ColorItem.copyStateTo(Item... stateReceivers) {
-    Arrays.asList(stateReceivers).forEach(s -> s.setStateFromColor(this.getState()));
+  protected void ColorItem.copyStateTo(Item stateReceiver) {
+    stateReceiver.setStateFromColor(this.getState());
   }
-  protected void DateTimeItem.copyStateTo(Item... stateReceivers) {
-    Arrays.asList(stateReceivers).forEach(s -> s.setStateFromInstant(this.getState()));
+  protected void DateTimeItem.copyStateTo(Item stateReceiver) {
+    stateReceiver.setStateFromInstant(this.getState());
   }
 
+
+
+
   private void ColorItem.setBrightness(int value) {
     setState(getState().withDifferentBrightness(value));
   }
diff --git a/eraser-base/src/main/jastadd/Rules.jrag b/eraser-base/src/main/jastadd/Rules.jrag
index 7e550453b2e7a0140b8a019fc885d509e8f67cdb..743ccc5ba6213f63c9445413cf137ac4d3261e70 100644
--- a/eraser-base/src/main/jastadd/Rules.jrag
+++ b/eraser-base/src/main/jastadd/Rules.jrag
@@ -95,7 +95,11 @@ aspect Rules {
     getAffectedItem().setStateFromString(getNewStateProvider().get());
   }
   public void SetStateFromTriggeringItemAction.applyFor(Item item) {
-    item.copyStateTo(getAffectedItem());
+    Item target = getAffectedItem();
+    if (target==item) {
+      return;
+    }
+    item.copyStateTo(target);
   }
   public void SetStateFromItemsAction.applyFor(Item item) {
     getAffectedItem().setStateFromString(getCombinator().apply(getSourceItems()));
@@ -113,15 +117,13 @@ aspect StateSyncGroup {
   rewrite StateSyncGroup {
     to Rule {
       Item controllingItem = ((ItemObserver)getParent()).observedItem();
-      
-      SetStateFromTriggeringItemAction action = new SetStateFromTriggeringItemAction();
+      Rule rule = new Rule();
 
-      /*
-      action.setAffectedItems(getItems())
-      */
+      for (Item item : getItems()) {
+        rule.addAction(new SetStateFromTriggeringItemAction(item));
+        rule.addObserver(item.getItemObserver());
+      }   
       
-      Rule rule = new Rule();
-      rule.addAction(action);
       return rule;
     }
   }
diff --git a/eraser-base/src/main/jastadd/eraser.flex b/eraser-base/src/main/jastadd/eraser.flex
index e81c7f7f33cb847ead9d5caea9d273265869c084..21987f14a9762c3f7c9de8dadd405ad5431ad7b5 100644
--- a/eraser-base/src/main/jastadd/eraser.flex
+++ b/eraser-base/src/main/jastadd/eraser.flex
@@ -57,7 +57,7 @@ Comment = "//" [^\n\r]+
 "Influx"       { return sym(Terminals.INFLUX); }
 "ML"           { return sym(Terminals.ML); }
 "Rule"         { return sym(Terminals.RULE); }
-//"SyncState"    { return sym(Terminals.SYNCSTATE); }
+"SyncState"    { return sym(Terminals.SYNCSTATE); }
 // special items (group already has a token definition)
 "Activity"     { return sym(Terminals.ACTIVITY); }
 "Color"        { return sym(Terminals.COLOR); }
diff --git a/eraser-base/src/main/jastadd/eraser.parser b/eraser-base/src/main/jastadd/eraser.parser
index 74abecdd89e1817f8ae4dfe0ad997d470d24c8a2..00ade60d27e4aceb5252d3ba5df7685588c0ecee 100644
--- a/eraser-base/src/main/jastadd/eraser.parser
+++ b/eraser-base/src/main/jastadd/eraser.parser
@@ -3,6 +3,7 @@ package de.tudresden.inf.st.eraser.jastadd.parser;
 import de.tudresden.inf.st.eraser.jastadd.model.*;
 import de.tudresden.inf.st.eraser.jastadd.model.Action;
 import de.tudresden.inf.st.eraser.parser.EraserParserHelper;
+import de.tudresden.inf.st.eraser.jastadd.model.StateSyncGroup;
 import java.util.Map;
 import java.util.HashMap;
 :} ;
@@ -31,6 +32,7 @@ Root goal =
      thing.t goal.r                     {: insertZero(r.getSmartHomeEntityModel().getThingList(), t); return r; :}
   |  item.i goal.r                      {: return r; :}
   |  group.g goal.r                     {: insertZero(r.getSmartHomeEntityModel().getGroupList(), g); return r; :}
+  |  state_sync_group.ss goal.r         {: r.addRule(ss); return r; :}
   |  thing_type.tt goal.r               {: insertZero(r.getSmartHomeEntityModel().getThingTypeList(), tt); return r; :}
   |  parameter goal.r                   {: return r; :}
   |  channel_type.ct goal.r             {: insertZero(r.getSmartHomeEntityModel().getChannelTypeList(), ct); return r; :}
@@ -156,14 +158,15 @@ Group group_body =
 
 
 
-//  SYNCSTATE COLON syncstate_body.ssb SEMICOLON {: eph.addStateSyncGroup(ssb); :};
-//  StateSyncGroup ssg = SYNCSTATE COLON syncstate_body.ssb SEMICOLON {: return ssb; :};
-//
-//// SyncState: items=["ITEM_ID", "ITEM_ID"];
-//StateSyncGroup syncstate_body =
-//     ITEMS EQUALS string_list.items syncstate_body.ss       {: return eph.setItems(ss, items); :}
-//  |                                                         {: return new StateSyncGroup(); :}
-//  ;
+
+
+StateSyncGroup state_sync_group = SYNCSTATE COLON syncstate_body.ssb SEMICOLON {: return ssb; :};
+
+// SyncState: items=["ITEM_ID", "ITEM_ID"];
+StateSyncGroup syncstate_body =
+     ITEMS EQUALS string_list.items syncstate_body.ss       {: return eph.setItems(ss, items); :}
+  |                                                         {: return new StateSyncGroup(); :}
+  ;
 
 ThingType thing_type =
      THING_TYPE COLON thing_type_body.ttb SEMICOLON   {: return ttb; :}
diff --git a/eraser-base/src/main/jastadd/shem.relast b/eraser-base/src/main/jastadd/shem.relast
index 9e7252ffc151f6b276b96dbe6ff3e0bad0479818..ef37792977857ea6595f56c5b69b328c2ab46112 100644
--- a/eraser-base/src/main/jastadd/shem.relast
+++ b/eraser-base/src/main/jastadd/shem.relast
@@ -25,7 +25,9 @@ rel Channel.LinkedItem* <-> Item.Channel? ;
 Parameter : DescribableModelElement ::= <Type:ParameterValueType> [DefaultValue:ParameterDefaultValue] <Context:String> <Required:boolean> ;
 ParameterDefaultValue ::= <Value:String> ;
 
-abstract Item : LabelledModelElement ::= <_fetched_data:boolean> MetaData:ItemMetaData* ItemObserver;
+abstract Item : LabelledModelElement ::= <_fetched_data:boolean> MetaData:ItemMetaData* /ItemObserver/
+
+
 rel Item.Category? -> ItemCategory ;
 
 abstract ItemWithBooleanState : Item ::= <_state:boolean> ;
diff --git a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java
index 87cd2764f8955c472b37e6abc887fa5c04d0a9b8..e8843f8c43776aed777ac3ab51203a2e6f83b80a 100644
--- a/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java
+++ b/eraser-base/src/main/java/de/tudresden/inf/st/eraser/parser/EraserParserHelper.java
@@ -500,10 +500,6 @@ public class EraserParserHelper {
     return ssg;
   }
 
-  public void addStateSyncGroup(StateSyncGroup ssg) {
-    System.out.println("Gotcha");
-  }
-
 
   public Rule createRule(Condition c, Action a) {
     Rule result = new Rule();