diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h
index 57ebe42515f2450f8b9938220c795f012e6c27d5..83e0d73db337cfb6b0a8aff1f135539f19160854 100644
--- a/epicardium/modules/modules.h
+++ b/epicardium/modules/modules.h
@@ -34,6 +34,9 @@ int personal_state_enabled();
 /* ---------- PMIC --------------------------------------------------------- */
 void vPmicTask(void *pvParameters);
 
+/* Critical battery voltage */
+#define BATTERY_CRITICAL   3.00f
+
 enum pmic_amux_signal {
 	PMIC_AMUX_CHGIN_U     = 0x1,
 	PMIC_AMUX_CHGIN_I     = 0x2,
diff --git a/epicardium/modules/pmic.c b/epicardium/modules/pmic.c
index 52df8563ccf9f314e7d4681491e981dd1351dfae..a1180fc530f41a5b37277b4446568c70e22de07c 100644
--- a/epicardium/modules/pmic.c
+++ b/epicardium/modules/pmic.c
@@ -127,6 +127,36 @@ pmic_poll_interrupts(TickType_t *button_start_tick, TickType_t duration)
 	}
 }
 
+__attribute__((noreturn)) static void pmic_die(float u_batt)
+{
+	/* Stop core 1 */
+	core1_stop();
+
+	/* Grab the screen */
+	disp_forcelock();
+
+	/* Draw an error screen */
+	epic_disp_clear(0x0000);
+
+	epic_disp_print(0, 0, " Battery", 0xffff, 0x0000);
+	epic_disp_print(0, 20, " critical", 0xffff, 0x0000);
+	epic_disp_print(0, 40, "  !!!!", 0xffff, 0x0000);
+	epic_disp_update();
+
+	/* Vibrate violently */
+	epic_vibra_set(true);
+
+	/* Wait a bit */
+	for (int i = 0; i < 50000000; i++)
+		__NOP();
+
+	LOG_WARN("pmic", "Poweroff");
+	MAX77650_setSFT_RST(0x2);
+
+	while (1)
+		__WFI();
+}
+
 /*
  * Check the battery voltage.  If it drops too low, turn card10 off.
  */
@@ -148,9 +178,9 @@ static void pmic_check_battery()
 		(int)(u_batt * 1000.0) % 1000
 	);
 
-	/*
-	 * TODO: Handle voltage value
-	 */
+	if (u_batt < BATTERY_CRITICAL) {
+		pmic_die(u_batt);
+	}
 }
 
 /*