diff --git a/epicardium/main.c b/epicardium/main.c
index 2b0453c2c0922a3dd0a341d3e744a2e987a6e652..8e01f8ee9d3c15e14dbd077f4b4650f57f69373d 100644
--- a/epicardium/main.c
+++ b/epicardium/main.c
@@ -30,21 +30,6 @@ void vApiDispatcher(void *pvParameters)
 	}
 }
 
-static void pmic_button(bool falling)
-{
-	if (falling) {
-		printf("Resetting ...\n");
-		/*
-		 * Give the UART fifo time to clear.
-		 * TODO: Do this properly
-		 */
-		for (int i = 0; i < 0x1000000; i++) {
-			__asm volatile("nop");
-		}
-		MXC_GCR->rstr0 = MXC_F_GCR_RSTR0_SYSTEM;
-	}
-}
-
 int main(void)
 {
 	card10_init();
@@ -53,8 +38,6 @@ int main(void)
 	/* TODO: Move this to its own function */
 	SCB->SCR |= SCB_SCR_SEVONPEND_Msk;
 
-	pmic_set_button_callback(pmic_button);
-
 	cdcacm_init();
 
 	printf("=> Initializing tasks ...\n");
@@ -71,6 +54,19 @@ int main(void)
 		abort();
 	}
 
+	/* PMIC */
+	if (xTaskCreate(
+		    vPmicTask,
+		    (const char *)"PMIC",
+		    configMINIMAL_STACK_SIZE,
+		    NULL,
+		    tskIDLE_PRIORITY + 1,
+		    NULL) != pdPASS) {
+		printf("Failed to create pmic task!\n");
+		abort();
+	}
+
+	/* API */
 	if (xTaskCreate(
 		    vApiDispatcher,
 		    (const char *)"API Dispatcher",
diff --git a/epicardium/modules/meson.build b/epicardium/modules/meson.build
index 03fce22cb86c55267fabd05db5136cfb778098a9..9f2d2c070b0978786fa00f1390f8d36788099427 100644
--- a/epicardium/modules/meson.build
+++ b/epicardium/modules/meson.build
@@ -1,5 +1,6 @@
 module_sources = files(
   'leds.c',
+  'pmic.c',
   'serial.c',
-  'vibra.c'
+  'vibra.c',
 )
diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h
index cc779a5f324d68564886c371bf3593e3502fd37f..5a074273748019293f30c6ae299c830a019c497c 100644
--- a/epicardium/modules/modules.h
+++ b/epicardium/modules/modules.h
@@ -5,5 +5,8 @@
 #define SERIAL_READ_BUFFER_SIZE 128
 void vSerialTask(void *pvParameters);
 
+/* ---------- PMIC --------------------------------------------------------- */
+void vPmicTask(void *pvParameters);
+
 #endif /* MODULES_H */
 
diff --git a/epicardium/modules/pmic.c b/epicardium/modules/pmic.c
new file mode 100644
index 0000000000000000000000000000000000000000..41618cdae0dd23c4c0657d75377a738cb5b94a98
--- /dev/null
+++ b/epicardium/modules/pmic.c
@@ -0,0 +1,61 @@
+#include <stdio.h>
+
+#include "max32665.h"
+#include "gcr_regs.h"
+#include "pmic.h"
+#include "MAX77650-Arduino-Library.h"
+
+#include "FreeRTOS.h"
+#include "task.h"
+
+#include "epicardium.h"
+#include "modules.h"
+
+/* Task ID for the pmic handler */
+static TaskHandle_t pmic_task_id = NULL;
+
+void pmic_interrupt_callback(void *_)
+{
+	BaseType_t xHigherPriorityTaskWoken = pdFALSE;
+	if (pmic_task_id != NULL) {
+		vTaskNotifyGiveFromISR(pmic_task_id, &xHigherPriorityTaskWoken);
+		portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
+	}
+}
+
+void vPmicTask(void *pvParameters)
+{
+	pmic_task_id = xTaskGetCurrentTaskHandle();
+
+	while (1) {
+		ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
+
+		uint8_t int_flag = MAX77650_getINT_GLBL();
+
+		if (int_flag & MAX77650_INT_nEN_F) {
+			/* Button was pressed */
+			printf("pmic: Button pressed!\n");
+		}
+		if (int_flag & MAX77650_INT_nEN_R) {
+			/* Button was pressed */
+			printf("pmic: Button released!\n");
+
+			printf("Resetting ...\n");
+			/*
+			 * Give the UART fifo time to clear.
+			 * TODO: Do this properly
+			 */
+			for (int i = 0; i < 0x1000000; i++) {
+				__asm volatile("nop");
+			}
+			MXC_GCR->rstr0 = MXC_F_GCR_RSTR0_SYSTEM;
+		}
+
+		/* TODO: Remove when all interrupts are handled */
+		if (int_flag & ~(MAX77650_INT_nEN_F | MAX77650_INT_nEN_R)) {
+			printf("=====> WARNING <=====\n"
+			       "* Unhandled PMIC Interrupt: %x\n",
+			       int_flag);
+		}
+	}
+}