diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h
index 25c239acede55550e623711f42bb252045d43257..36ea64b818dc32c39b071a97305d36d5362b85bf 100644
--- a/epicardium/epicardium.h
+++ b/epicardium/epicardium.h
@@ -66,6 +66,7 @@ typedef _Bool bool;
 
 #define API_RTC_GET_SECONDS        0x50
 #define API_RTC_SCHEDULE_ALARM     0x51
+#define API_RTC_SET_MILLISECONDS   0x52
 
 #define API_LEDS_SET               0x60
 #define API_LEDS_SET_HSV           0x61
@@ -964,6 +965,11 @@ API(API_FILE_UNLINK, int epic_file_unlink(const char* path));
  */
 API(API_RTC_GET_SECONDS, uint32_t epic_rtc_get_seconds(void));
 
+/**
+ * Sets the current RTC time in milliseconds
+ */
+API(API_RTC_SET_MILLISECONDS, void epic_rtc_set_milliseconds(uint64_t milliseconds));
+
 /**
  * Schedule the RTC alarm for the given timestamp.
  *
diff --git a/epicardium/modules/rtc.c b/epicardium/modules/rtc.c
index edfb0441ebc572aa157cc270666abda6e2cf3f64..030de3100f18b1184c16497dc0ebb7bcedf5e725 100644
--- a/epicardium/modules/rtc.c
+++ b/epicardium/modules/rtc.c
@@ -25,6 +25,21 @@ uint32_t epic_rtc_get_seconds(void)
 	return sec;
 }
 
+void epic_rtc_set_milliseconds(uint64_t milliseconds)
+{
+	uint32_t sec, subsec;
+
+	sec    = milliseconds / 1000;
+	subsec = (milliseconds % 1000);
+	subsec *= 256;
+	subsec /= 1000;
+
+	while (RTC_Init(MXC_RTC, sec, subsec, NULL) == E_BUSY)
+		;
+	while (RTC_EnableRTCE(MXC_RTC) == E_BUSY)
+		;
+}
+
 void RTC_IRQHandler(void)
 {
 	int flags = RTC_GetFlags();