diff --git a/src/shared/events/EventBroker.cpp b/src/shared/events/EventBroker.cpp
index 04b8570f76b9146bc5aa9b671ef8764a887f3ce0..96fe93c762b795ac5f32b32fe90d12db35fc6095 100644
--- a/src/shared/events/EventBroker.cpp
+++ b/src/shared/events/EventBroker.cpp
@@ -56,6 +56,43 @@ void EventBroker::post(const Event& ev, uint8_t topic,
     }
 }
 
+uint16_t EventBroker::postDelayed(const Event& ev, uint8_t topic,
+                                  unsigned int delayMs)
+{
+    D(assert(delayMs >= EVENT_BROKER_MIN_DELAY &&
+             "delayMs must be longer or equal to EVENT_BROKER_MIN_DELAY"));
+
+    delayMs = std::max(delayMs, EVENT_BROKER_MIN_DELAY);
+
+    Lock<FastMutex> lock(mtxDelayedEvents);
+
+    // Delay in system ticks
+    long long delayTicks =
+        static_cast<long long>(delayMs * miosix::TICK_FREQ / 1000);
+
+    DelayedEvent dev{eventCounter++, ev, topic, getTick() + delayTicks};
+    bool added = false;
+
+    // Add the new event in the list, ordered by deadline (first = nearest
+    // deadline)
+    for (auto it = delayedEvents.begin(); it != delayedEvents.end(); it++)
+    {
+        if (dev.deadline < (*it).deadline)
+        {
+            delayedEvents.insert(it, dev);
+            added = true;
+            break;
+        }
+    }
+
+    if (!added)  // In case this is the last/only event in the list
+    {
+        delayedEvents.push_back(dev);
+    }
+
+    return dev.schedId;
+}
+
 void EventBroker::removeDelayed(uint16_t id)
 {
     Lock<FastMutex> lock(mtxDelayedEvents);
diff --git a/src/shared/events/EventBroker.h b/src/shared/events/EventBroker.h
index 7bad9f06f9028553f50110e51da55c02658f19cc..7437d623070bea3d1636528f1e55f92becb8b224 100644
--- a/src/shared/events/EventBroker.h
+++ b/src/shared/events/EventBroker.h
@@ -22,6 +22,7 @@
 
 #pragma once
 
+#include <assert.h>
 #include <diagnostic/PrintLogger.h>
 #include <events/Event.h>
 #include <events/FSM.h>
@@ -79,41 +80,7 @@ public:
      * @param delayMs Delay in milliseconds.
      * @return Unique id of the delayed event.
      */
-    template <unsigned int delayMs>
-    uint16_t postDelayed(const Event& ev, uint8_t topic)
-    {
-        static_assert(
-            delayMs >= EVENT_BROKER_MIN_DELAY,
-            "delayMs must be longer or equal to EVENT_BROKER_MIN_DELAY");
-
-        Lock<FastMutex> lock(mtxDelayedEvents);
-
-        // Delay in system ticks
-        long long delayTicks =
-            static_cast<long long>(delayMs * miosix::TICK_FREQ / 1000);
-
-        DelayedEvent dev{eventCounter++, ev, topic, getTick() + delayTicks};
-        bool added = false;
-
-        // Add the new event in the list, ordered by deadline (first = nearest
-        // deadline)
-        for (auto it = delayedEvents.begin(); it != delayedEvents.end(); it++)
-        {
-            if (dev.deadline < (*it).deadline)
-            {
-                delayedEvents.insert(it, dev);
-                added = true;
-                break;
-            }
-        }
-
-        if (!added)  // In case this is the last/only event in the list
-        {
-            delayedEvents.push_back(dev);
-        }
-
-        return dev.schedId;
-    }
+    uint16_t postDelayed(const Event& ev, uint8_t topic, unsigned int delayMs);
 
     /**
      * Removes a delayed event before it is posted.
diff --git a/src/tests/catch/test-eventbroker.cpp b/src/tests/catch/test-eventbroker.cpp
index 18a9eb65c348d484a29c2c7823be366e4cc042d0..9590563db8b32f2c7694cc4dd4a287580068193d 100644
--- a/src/tests/catch/test-eventbroker.cpp
+++ b/src/tests/catch/test-eventbroker.cpp
@@ -211,8 +211,8 @@ TEST_CASE_METHOD(EventBrokerTestFixture, "EventBroker - Events can be dalayed")
     long long start = getTick();
 
     // Post delayed event by 1000 ms
-    broker.postDelayed<1000>(ev, TOPIC_1);
-    broker.postDelayed<3000>(ev, TOPIC_2);
+    broker.postDelayed(ev, TOPIC_1, 1000);
+    broker.postDelayed(ev, TOPIC_2, 3000);
 
     REQUIRE(expectEvent(EV_A, TOPIC_1, start + 1000, 2, broker));
     REQUIRE(expectEvent(EV_A, TOPIC_2, start + 3000, 2, broker));
@@ -225,8 +225,8 @@ TEST_CASE_METHOD(EventBrokerTestFixture,
     long long start = getTick();
 
     // Post delayed event by 1000 ms
-    uint16_t delayed = broker.postDelayed<1000>(ev, TOPIC_1);
-    broker.postDelayed<3000>(ev, TOPIC_2);
+    uint16_t delayed = broker.postDelayed(ev, TOPIC_1, 1000);
+    broker.postDelayed(ev, TOPIC_2, 3000);
 
     SECTION("Individual events can be removed")
     {
diff --git a/src/tests/events/fsm/test-fsm.h b/src/tests/events/fsm/test-fsm.h
index f603cdfec09f72e09864f4dbeaf43e08264c9b6d..facd7f6b63279efb7017a1560f09535c22803a6d 100644
--- a/src/tests/events/fsm/test-fsm.h
+++ b/src/tests/events/fsm/test-fsm.h
@@ -208,8 +208,8 @@ private:
                 v = 1;
 
                 // Post EV_D to itself in 1 seconds
-                delayed_ev_id = EventBroker::getInstance().postDelayed<1000>(
-                    Event{EV_D}, TOPIC_T1);
+                delayed_ev_id = EventBroker::getInstance().postDelayed(
+                    Event{EV_D}, TOPIC_T1, 1000);
 
                 break;
             }