diff --git a/pycardium/modules/interrupt.c b/pycardium/modules/interrupt.c
index 45ee55c383c63dabacbc911d303b8133fad9aa12..5462791914bef4127767242dc4eac9a6866f3317 100644
--- a/pycardium/modules/interrupt.c
+++ b/pycardium/modules/interrupt.c
@@ -5,23 +5,23 @@
 #include "api/common.h"
 #include "mphalport.h"
 
-mp_obj_t bhi160_callback = NULL;
+mp_obj_t callbacks[API_INT_MAX + 1] = {
+	0,
+};
 
 static void interrupt_set(api_int_id_t id, mp_obj_t func)
 {
-	// TODO: maintain list of interrupts callbacks
-	if (id == API_INT_BHI160) {
-		bhi160_callback = func;
+	if (id <= API_INT_MAX) {
+		callbacks[id] = func;
 	}
 }
 
 void api_interrupt_handler_catch_all(api_int_id_t id)
 {
-	// TODO: iterate over registered callbacks
-	if (id == API_INT_BHI160) {
-		if (bhi160_callback) {
+	if (id <= API_INT_MAX) {
+		if (callbacks[id]) {
 			mp_sched_schedule(
-				bhi160_callback, MP_OBJ_NEW_SMALL_INT(0)
+				callbacks[id], MP_OBJ_NEW_SMALL_INT(id)
 			);
 		}
 	}
@@ -52,8 +52,10 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(
 
 STATIC const mp_rom_map_elem_t interrupt_module_globals_table[] = {
 	{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_interrupt) },
-	{ MP_ROM_QSTR(MP_QSTR_set_callback), MP_ROM_PTR(&interrupt_set_callback_obj) },
-	{ MP_ROM_QSTR(MP_QSTR_enable_callback), MP_ROM_PTR(&interrupt_enable_callback_obj) },
+	{ MP_ROM_QSTR(MP_QSTR_set_callback),
+	  MP_ROM_PTR(&interrupt_set_callback_obj) },
+	{ MP_ROM_QSTR(MP_QSTR_enable_callback),
+	  MP_ROM_PTR(&interrupt_enable_callback_obj) },
 	{ MP_ROM_QSTR(MP_QSTR_BHI160), MP_OBJ_NEW_SMALL_INT(2) },
 };
 STATIC MP_DEFINE_CONST_DICT(