diff --git a/eraser-base/src/main/jastadd/Item.jrag b/eraser-base/src/main/jastadd/Item.jrag
index 3cda6928db5c7921d01d34b5bf90bd08415fccf1..0afb11fc40ea51c6220b8b285adaf9edb68daf02 100644
--- a/eraser-base/src/main/jastadd/Item.jrag
+++ b/eraser-base/src/main/jastadd/Item.jrag
@@ -294,7 +294,6 @@ aspect ItemHandling {
    * @param shouldSendState whether to send the new state (currently affects MQTT and Influx)
    */
   protected void Item.stateUpdated(boolean shouldSendState) {
-    this.getStateData().afterStateChangeApplied();
     if (shouldSendState) {
       try {
         // sendState() refined in MQTT and Influx aspect
@@ -303,7 +302,8 @@ aspect ItemHandling {
         logger.catching(e);
       }
     }
-    if (hasItemObserver() && this.getStateData().checkStateTransitionTime()) {
+    if (hasItemObserver() && this.getStateData().checkStateProcessingTime()) {
+      this.getStateData().afterStateChangeProcessed();
       getItemObserver().apply();
     }
   }
diff --git a/eraser-base/src/main/jastadd/StateData.jrag b/eraser-base/src/main/jastadd/StateData.jrag
index 66b6d7248c472a8369573af1b7ed0f98242aa5ac..bfb18d6996108bb1eaa13ec58651a4ca5eb816f3 100644
--- a/eraser-base/src/main/jastadd/StateData.jrag
+++ b/eraser-base/src/main/jastadd/StateData.jrag
@@ -1,14 +1,17 @@
 aspect StateData {
-    public void StateData.afterStateChangeApplied() {
+    public void StateData.afterStateChangeProcessed() {
         this.setLastChangeDate(Instant.now());
     }
 
-    public boolean StateData.checkStateTransitionTime() {
+    public boolean StateData.checkStateProcessingTime() {
         if (this.getItemPerformance()==null) {
             return true;
         }
         double frequency = this.getItemPerformance().getEventProcessingFrequency();
         Instant lastStateChange = this.getLastChangeDate();
+        if (lastStateChange==null) {
+            return true;
+        }
 
         return lastStateChange.toEpochMilli() + (1/frequency)*1000 < Instant.now().toEpochMilli();
 
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..3654470a6285e3424d750043b0df66cec295361b 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
@@ -2,6 +2,8 @@ package de.tudresden.inf.st.eraser.util;
 
 import de.tudresden.inf.st.eraser.jastadd.model.*;
 
+import java.util.ArrayList;
+
 /**
  * Helper class to create models used in tests.
  *
@@ -35,6 +37,13 @@ public class TestUtils {
     return ModelAndItem.of(root.getSmartHomeEntityModel(), item);
   }
 
+  public static SmartHomeEntityModel createModelWithGroup() {
+    Root root = Root.createEmptyRoot();
+    ParserUtils.createUnknownGroup(root.getSmartHomeEntityModel(),new ArrayList<>());
+
+    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 1a1ea62a2d4611fa00da7252510a325fe40cf41f..1c57da5fc7e16dddc2cbc22150e243469743b237 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
@@ -15,6 +15,7 @@ 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;
@@ -245,6 +246,11 @@ public class RulesTest {
     assertEquals(2, counter.get(item), "Change of item to 7 should not trigger the rule, check2 violated");
   }
 
+  private static void addItemToModel(SmartHomeEntityModel model, Item item) {
+    getDefaultGroup(model).addItem(item);
+  }
+
+
   @Test
   public void testTwoActions() {
     TestUtils.ModelAndItem modelAndItem = createModelAndItem(2);
@@ -662,6 +668,35 @@ public class RulesTest {
     assertEquals(2, counter.get(null), "Rule was not executed two times");
   }
 
+  @Test
+  public void testItemPerformance() {
+
+    TestUtils.ModelAndItem mai = createModelAndItem(0);
+    NumberItem numberItem = mai.item;
+
+    ItemPerformance itemPerformance = new ItemPerformance();
+    itemPerformance.setEventProcessingFrequency(10);
+    numberItem.getStateData().setItemPerformance(itemPerformance);
+
+    Rule rule = new Rule();
+    CountingAction counter = new CountingAction();
+    rule.addAction(counter);
+    rule.activateFor(numberItem);
+    numberItem.setState(1);
+    numberItem.setState(2);
+    assertEquals(1, counter.get(numberItem), "Action was triggered although ItemPerformance too small");
+    counter.reset();
+    waitMillis(100);
+    numberItem.setState(3);
+    assertEquals(1, counter.get(numberItem), "Action wasn't triggered although frequency ItemPerformance is small enough");
+    counter.reset();
+    numberItem.setState(4);
+    numberItem.setState(5);
+    assertEquals(0, counter.get(numberItem), "Action was triggered although ItemPerformance too small");
+    counter.reset();
+
+  }
+
   private static void waitMillis(int millis) {
     try {
       Thread.sleep(millis);
@@ -673,7 +708,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);