diff --git a/epicardium/api/control.c b/epicardium/api/control.c
index 99c99953344d6b2700e5c657cc4c6ade1fbe9b4e..f599788426eef36c601925f6929bc91e40a83b76 100644
--- a/epicardium/api/control.c
+++ b/epicardium/api/control.c
@@ -1,6 +1,5 @@
 #include "epicardium.h"
 #include "api/dispatcher.h"
-#include "api/interrupt-sender.h"
 #include "modules/log.h"
 
 #include "card10.h"
@@ -10,6 +9,7 @@
 #include "tmr.h"
 
 static void __core1_init(void);
+extern void interrupt_trigger(api_int_id_t id);
 
 struct core1_info {
 	/* Location of core1's interrupt vector table */
@@ -207,7 +207,7 @@ void core1_boot(void)
 void core1_trigger_reset(void)
 {
 	/* Signal core 1 that we intend to load a new payload. */
-	api_interrupt_trigger(EPIC_INT_RESET);
+	interrupt_trigger(EPIC_INT_RESET);
 }
 
 void core1_wait_ready(void)
diff --git a/epicardium/modules/bhi.c b/epicardium/modules/bhi.c
index 5a5528f5f2ce1c5dde700866847240eb6c69bc5a..baa2d16220be0754bcbb321ef04fa852a43d7a85 100644
--- a/epicardium/modules/bhi.c
+++ b/epicardium/modules/bhi.c
@@ -11,7 +11,6 @@
 #include "task.h"
 #include "queue.h"
 
-#include "api/interrupt-sender.h"
 #include "epicardium.h"
 #include "modules/log.h"
 #include "modules/modules.h"
@@ -320,7 +319,7 @@ bhi160_handle_packet(bhy_data_type_t data_type, bhy_data_generic_t *sensor_data)
 		}
 
 		if (wakeup) {
-			api_interrupt_trigger(epic_int);
+			interrupt_trigger(epic_int);
 		}
 		break;
 	default:
diff --git a/epicardium/modules/lifecycle.c b/epicardium/modules/lifecycle.c
index bce448e69442c6f9b6db81cd71814527caf02246..76c5648cc20120eca6de28fad2ed4329404943da 100644
--- a/epicardium/modules/lifecycle.c
+++ b/epicardium/modules/lifecycle.c
@@ -4,7 +4,6 @@
 #include "modules/config.h"
 #include "modules/mutex.h"
 #include "api/dispatcher.h"
-#include "api/interrupt-sender.h"
 #include "l0der/l0der.h"
 
 #include "card10.h"
diff --git a/epicardium/modules/max30001.c b/epicardium/modules/max30001.c
index 5c2ff10f8965e7a9e28c30ab51bbc00fd0af0c45..39379703ec292458a404a63346d4bf6258b04d84 100644
--- a/epicardium/modules/max30001.c
+++ b/epicardium/modules/max30001.c
@@ -11,7 +11,6 @@
 #include "task.h"
 #include "queue.h"
 
-#include "api/interrupt-sender.h"
 #include "epicardium.h"
 #include "modules/log.h"
 #include "modules/modules.h"
@@ -141,7 +140,7 @@ static void max30001_handle_samples(int16_t *sensor_data, int16_t n)
 			LOG_WARN("max30001", "queue full");
 		}
 	}
-	api_interrupt_trigger(EPIC_INT_MAX30001_ECG);
+	interrupt_trigger(EPIC_INT_MAX30001_ECG);
 }
 
 /***** Functions *****/
diff --git a/epicardium/modules/max86150.c b/epicardium/modules/max86150.c
index 0de234a8730a5d441cfd223ba9638637df639581..03527052c5b372d4a9ca30ae64d767d5ce51a79c 100644
--- a/epicardium/modules/max86150.c
+++ b/epicardium/modules/max86150.c
@@ -13,7 +13,6 @@
 #include "task.h"
 #include "queue.h"
 
-#include "api/interrupt-sender.h"
 #include "modules/modules.h"
 
 static const gpio_cfg_t max86150_interrupt_pin = {
@@ -141,7 +140,7 @@ static int max86150_handle_sample(struct max86150_sensor_data *data)
 		return -EIO;
 	}
 
-	api_interrupt_trigger(EPIC_INT_MAX86150);
+	interrupt_trigger(EPIC_INT_MAX86150);
 
 	return 0;
 }
diff --git a/epicardium/modules/rtc.c b/epicardium/modules/rtc.c
index b563462dbc242194e7f931721d82fcd21d0b344e..7d75fd169ca88aebb80e3d4def52b586b2684581 100644
--- a/epicardium/modules/rtc.c
+++ b/epicardium/modules/rtc.c
@@ -1,6 +1,6 @@
 #include "epicardium.h"
 #include "modules/log.h"
-#include "api/interrupt-sender.h"
+#include "modules/modules.h"
 
 #include "FreeRTOS.h"
 #include "task.h"
@@ -84,19 +84,23 @@ void epic_rtc_set_milliseconds(uint64_t milliseconds)
 	monotonic_offset += diff;
 }
 
+/* We need to use interrupt_trigger_unsafe() here */
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 void RTC_IRQHandler(void)
 {
 	int flags = RTC_GetFlags();
 
 	if (flags & MXC_F_RTC_CTRL_ALDF) {
 		RTC_ClearFlags(MXC_F_RTC_CTRL_ALDF);
-		api_interrupt_trigger(EPIC_INT_RTC_ALARM);
+		interrupt_trigger_unsafe(EPIC_INT_RTC_ALARM);
 	} else {
 		LOG_WARN("rtc", "Unknown IRQ caught!");
 		/* Disable IRQ so it does not retrigger */
 		NVIC_DisableIRQ(RTC_IRQn);
 	}
 }
+#pragma GCC diagnostic pop
 
 int epic_rtc_schedule_alarm(uint32_t timestamp)
 {
@@ -107,7 +111,7 @@ int epic_rtc_schedule_alarm(uint32_t timestamp)
 	 * immediately.
 	 */
 	if (epic_rtc_get_seconds() >= timestamp) {
-		api_interrupt_trigger(EPIC_INT_RTC_ALARM);
+		interrupt_trigger(EPIC_INT_RTC_ALARM);
 		return 0;
 	}
 
diff --git a/epicardium/modules/serial.c b/epicardium/modules/serial.c
index 25dd91846c9ea60a2aa26faa67cfce357ada7e9c..e80e30f75f2b718028238dd5270a0d4690b846c0 100644
--- a/epicardium/modules/serial.c
+++ b/epicardium/modules/serial.c
@@ -1,5 +1,4 @@
 #include "epicardium.h"
-#include "api/interrupt-sender.h"
 #include "modules/log.h"
 #include "modules/modules.h"
 
@@ -280,7 +279,7 @@ void serial_enqueue_char(char chr)
 {
 	if (chr == 0x3) {
 		/* Control-C */
-		api_interrupt_trigger(EPIC_INT_CTRL_C);
+		interrupt_trigger(EPIC_INT_CTRL_C);
 	}
 
 	if (xQueueSend(read_queue, &chr, 100) == errQUEUE_FULL) {
@@ -288,7 +287,7 @@ void serial_enqueue_char(char chr)
 		vTaskDelay(portTICK_PERIOD_MS * 50);
 	}
 
-	api_interrupt_trigger(EPIC_INT_UART_RX);
+	interrupt_trigger(EPIC_INT_UART_RX);
 }
 
 void vSerialTask(void *pvParameters)