diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h
index 57ebe42515f2450f8b9938220c795f012e6c27d5..484e951f5c9b9c1e98b181717d4bf8740e1767b5 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.40f
+
 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 ef97392cb887b1ce43cbe948b79ec07286eccf5a..48a311c983cedd2ff2b1b71a4b4d4ddd9583336c 100644
--- a/epicardium/modules/pmic.c
+++ b/epicardium/modules/pmic.c
@@ -154,6 +154,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.
  */
@@ -175,9 +205,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);
+	}
 }
 
 /*