diff --git a/eraser-base/src/main/jastadd/Item.jrag b/eraser-base/src/main/jastadd/Item.jrag
index 5c03824f96b9de7db5a5ddeb0c4a330b516db4f9..d547307b9b0321040b2b30d1dd295861184f764d 100644
--- a/eraser-base/src/main/jastadd/Item.jrag
+++ b/eraser-base/src/main/jastadd/Item.jrag
@@ -296,6 +296,8 @@ aspect ItemHandling {
       try {
         // sendState() refined in MQTT and Influx aspect
         sendState();
+        
+
       } catch (Exception e) {
         logger.catching(e);
       }
@@ -458,6 +460,11 @@ aspect ItemHandling {
 
   }
 
+  //--- onReceiveStateChange ---
+  protected void Item.onReceiveStateChange() {
+      //Instant lastChange = this.
+  }
+
   
 
 
diff --git a/eraser-base/src/main/jastadd/StateData.jrag b/eraser-base/src/main/jastadd/StateData.jrag
new file mode 100644
index 0000000000000000000000000000000000000000..eed976e4579d69ead07009adbbc517a71a05f690
--- /dev/null
+++ b/eraser-base/src/main/jastadd/StateData.jrag
@@ -0,0 +1,9 @@
+aspect StateData {
+    public void StateData.afterStateChangeApplied() {
+        
+    }
+
+    public void StateData.checkStateTransitionTime() {
+        
+    }
+}
\ No newline at end of file
diff --git a/eraser-base/src/main/jastadd/eraser.flex b/eraser-base/src/main/jastadd/eraser.flex
index 5f70414fa4005ad1baf1b0623459ce7c5f2f69f2..aa5d6f5c6c63141d0d6d808e0de8d05c48c71fd9 100644
--- a/eraser-base/src/main/jastadd/eraser.flex
+++ b/eraser-base/src/main/jastadd/eraser.flex
@@ -86,6 +86,9 @@ Comment = "//" [^\n\r]+
 "incoming"     { return sym(Terminals.INCOMING); }
 "items"        { return sym(Terminals.ITEMS); }
 "itemType"     { return sym(Terminals.ITEM_TYPE); }
+"ItemPerformance" { return sym(Terminals.ITEM_PERFORMANCE); }
+"performance" { return sym(Terminals.PERFORMANCE); }
+"procFreq" { return sym(Terminals.PROCESS_FREQUENCY); }
 "label"        { return sym(Terminals.LABEL); }
 "links"        { return sym(Terminals.LINKS); }
 "metaData"     { return sym(Terminals.META_DATA); }
diff --git a/eraser-base/src/main/jastadd/eraser.parser b/eraser-base/src/main/jastadd/eraser.parser
index 68967a5655bf12cab2e2127db29e1f0ac5ebd808..9789e576fd4534971f68222eb4cd32a285d6e252 100644
--- a/eraser-base/src/main/jastadd/eraser.parser
+++ b/eraser-base/src/main/jastadd/eraser.parser
@@ -50,6 +50,7 @@ Root goal =
   |  influx_root.ir                     {: return eph.createRoot(ir); :}
   |  machine_learning_root.ml           {: return eph.createRoot(ml); :}
   |  rule.rule                          {: return eph.createRoot(rule); :}
+  |  item_performance.ip           {: return eph.createRoot(ip); :}
   ;
 
 %left RB_ROUND;
@@ -132,6 +133,7 @@ Item item_body =
   |  STATE EQUALS TEXT.n item_body.i    {: i.setStateFromString(n); return i; :}
   |  TOPIC EQUALS TEXT.n item_body.i    {: return eph.setTopic(i, n); :}
   |  CATEGORY EQUALS TEXT.n item_body.i {: return eph.setCategory(i, n); :}
+  |  PERFORMANCE EQUALS TEXT.n item_body.i {: return eph.setPerformance(i, n); :}
   |  META_DATA EQUALS string_map.md item_body.i
     {: return eph.setMetaData(i, md); :}
   |                                     {: return eph.createItem(); :}
@@ -328,3 +330,14 @@ IntegerKeyMap integer_map_body =
        return result;
     :}
   ;
+
+ItemPerformance item_performance =
+    ITEM_PERFORMANCE COLON item_performance_body.ipb SEMICOLON   {: return ipb; :}
+  ;
+
+// ItemPerformance: id="" procFreq="" persFreq="";
+ItemPerformance item_performance_body =
+     ID EQUALS TEXT.n item_performance_body.ip                  {: return eph.setID(ip, n); :}
+  |  PROCESS_FREQUENCY EQUALS TEXT.n item_performance_body.ip        {: ip.setEventProcessingFrequency(Double.parseDouble(n)); return ip; :}
+  |                                                   {: return new ItemPerformance(); :}
+  ;
\ No newline at end of file
diff --git a/eraser-base/src/main/jastadd/shem.relast b/eraser-base/src/main/jastadd/shem.relast
index 852f8b246af844e4357ebbad8805f1f94e029671..0350bdcb13d6a8b13653c71f7019cb07795b794d 100644
--- a/eraser-base/src/main/jastadd/shem.relast
+++ b/eraser-base/src/main/jastadd/shem.relast
@@ -25,9 +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] [StateData];
 rel Item.Category? -> ItemCategory ;
-rel Item.ItemPerformance -> ItemPerformance ;
+
 
 abstract ItemWithBooleanState : Item ::= <_state:boolean> ;
 abstract ItemWithStringState : Item ::= <_state:String> ;
@@ -50,6 +50,9 @@ ItemMetaData ::= <Key:String> <Value:String> ;
 
 ItemCategory ::= <Name:String> ;
 
+StateData ::= <lastChangeDate:Instant> ;
+rel StateData.ItemPerformance -> ItemPerformance ;
+
 Group : LabelledModelElement ::= Group* Item* [AggregationFunction:GroupAggregationFunction] ;
 abstract GroupAggregationFunction ;
 SimpleGroupAggregationFunction : GroupAggregationFunction ::= <FunctionName:SimpleGroupAggregationFunctionName> ;
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 795d469bc786cfde73b12f8329956cbb79bb953a..1cc2133c56e8c08402fb4d90df91d42a414f0e7a 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
@@ -24,11 +24,13 @@ public class EraserParserHelper {
   private Map<String, Parameter> parameterMap = new HashMap<>();
   private Map<String, Item> itemMap = new HashMap<>();
   private Map<String, Group> groupMap = new HashMap<>();
+  private Map<String, ItemPerformance> itemPerformanceMap = new HashMap<>();
 
   private Map<Thing, String> missingThingTypeMap = new HashMap<>();
   private Map<Channel, String> missingChannelTypeMap = new HashMap<>();
   private Map<Item, String> missingTopicMap = new HashMap<>();
   private Map<Item, String> missingItemCategoryMap = new HashMap<>();
+
   private Map<Designator, String> missingItemForDesignator = new HashMap<>();
 
   private Map<Thing, Iterable<String>> missingChannelListMap = new HashMap<>();
@@ -36,6 +38,7 @@ public class EraserParserHelper {
   private Map<Item, Iterable<String>> missingControllingListMap = new HashMap<>();
   private Map<Group, Iterable<String>> missingSubGroupListMap = new HashMap<>();
   private Map<Group, Iterable<String>> missingItemListMap = new HashMap<>();
+  private Map<Item, String> missingItemPerformanceMap = new HashMap<>();
   private Map<ThingType, Iterable<String>> missingChannelTypeListMap = new HashMap<>();
   private Map<ThingType, Iterable<String>> missingParameterListMap = new HashMap<>();
 
@@ -93,6 +96,7 @@ public class EraserParserHelper {
     resolveList(itemMap, missingItemLinkListMap, Channel::addLinkedItem);
     resolveList(groupMap, missingSubGroupListMap, Group::addGroup);
     resolveList(itemMap, missingItemListMap, this::addItemToGroup);
+    resolve(itemPerformanceMap, missingItemPerformanceMap, this::setPerformanceOnItem);
     resolveList(channelTypeMap, missingChannelTypeListMap, ThingType::addChannelType);
     resolveList(parameterMap, missingParameterListMap, ThingType::addParameter);
     resolveList(itemMap, missingControllingListMap, Item::addControlling);
@@ -100,6 +104,7 @@ public class EraserParserHelper {
     createUnknownGroupIfNecessary();
     createChannelCategories();
     createItemCategories();
+
     if (checkUnusedElements) {
       checkUnusedElements();
     }
@@ -110,6 +115,12 @@ public class EraserParserHelper {
     group.addItem(item);
   }
 
+  private void setPerformanceOnItem(Item item, ItemPerformance itemPerformance) {
+    StateData stateData = item.getStateData();
+    ItemObserver itemObserver = item.getItemObserver();
+    item.getStateData().setItemPerformance(itemPerformance);
+  }
+
   private void fillUnused() {
     unusedElements.addAll(thingTypeMap.values());
     unusedElements.addAll(channelTypeMap.values());
@@ -222,6 +233,12 @@ public class EraserParserHelper {
     return thing;
   }
 
+  public ItemPerformance setID(ItemPerformance itemPerformance, String id) {
+    itemPerformance.setID(id);
+    itemPerformanceMap.put(id,itemPerformance);
+    return itemPerformance;
+  }
+
   public ThingType setID(ThingType thingType, String id) {
     thingType.setID(id);
     thingTypeMap.put(id, thingType);
@@ -255,6 +272,7 @@ public class EraserParserHelper {
     return c;
   }
 
+
   public Channel setLinks(Channel c, StringList linkNames) {
     missingItemLinkListMap.put(c, linkNames);
     return c;
@@ -285,6 +303,11 @@ public class EraserParserHelper {
     return item;
   }
 
+  public Item setPerformance(Item item, String performanceName) {
+    missingItemPerformanceMap.put(item, performanceName);
+    return item;
+  }
+
   public Item setMetaData(Item item, StringKeyMap metaData) {
     for (AbstractMap.SimpleEntry<String, String> entry : metaData) {
       item.addMetaData(new ItemMetaData(entry.getKey(), entry.getValue()));
@@ -471,6 +494,12 @@ public class EraserParserHelper {
     return result;
   }
 
+  public Root createRoot(ItemPerformance itemPerformance) {
+    Root result = createRoot();
+    result.addItemPerformance(itemPerformance);
+    return result;
+  }
+
   //+++ newStuff (to be categorized) +++
   public Designator createDesignator(String itemName) {
     Designator result = new Designator();