diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h
index 842714028be6bdf0a9a86b31a052fbcf7fa1ec22..cf803cdf7b27b9e8931260a766d4435ec8126776 100644
--- a/epicardium/epicardium.h
+++ b/epicardium/epicardium.h
@@ -33,6 +33,7 @@ typedef _Bool bool;
 #define API_SYSTEM_EXEC             0x2
 #define API_SYSTEM_RESET            0x3
 #define API_BATTERY_VOLTAGE         0x4
+#define API_HARDWARE_RESET          0x5
 
 #define API_INTERRUPT_ENABLE        0xA
 #define API_INTERRUPT_DISABLE       0xB
@@ -300,6 +301,13 @@ API(API_SYSTEM_EXEC, int __epic_exec(char *name));
  */
 API(API_SYSTEM_RESET, void epic_system_reset(void));
 
+/**
+ * Brings peripherals and hardware back into a sane state (LEDs off,
+ * display on, sensors off, vibration motor off, BLE not bonding,
+ * BLE not scanning, files of core 1 closed).
+ */
+API(API_HARDWARE_RESET, int epic_hardware_reset(void));
+
 /**
  * PMIC API
  * ===============
diff --git a/epicardium/modules/hardware.c b/epicardium/modules/hardware.c
index 055ae486b391ca0b46b6737689141e1ea175014b..6f30993ac7cace4cb85d16480ba223f28e1e3364 100644
--- a/epicardium/modules/hardware.c
+++ b/epicardium/modules/hardware.c
@@ -218,13 +218,13 @@ int hardware_init(void)
 }
 
 /*
- * hardware_reset() is called whenever a new l0dable is started.  hardware_reset()
+ * epic_hardware_reset() is called whenever a new l0dable is started. epic_hardware_reset()
  * should bring all peripherals back into a known initial state.  This does not
- * necessarily mean resetting the peripheral entirely but hardware_reset()
+ * necessarily mean resetting the peripheral entirely but epic_hardware_reset()
  * should at least bring the API facing part of a peripheral back into the state
  * a fresh booted l0dable expects.
  */
-int hardware_reset(void)
+int epic_hardware_reset(void)
 {
 	/*
 	 * API Dispatcher & API Interrupts
diff --git a/epicardium/modules/lifecycle.c b/epicardium/modules/lifecycle.c
index 76c5648cc20120eca6de28fad2ed4329404943da..9fe6b7ae66c45992e8aac32c194f0d38004c1a75 100644
--- a/epicardium/modules/lifecycle.c
+++ b/epicardium/modules/lifecycle.c
@@ -113,7 +113,7 @@ static int do_load(struct load_info *info)
 	/*
 	 * Reinitialize Hardware & Drivers
 	 */
-	res = hardware_reset();
+	res = epic_hardware_reset();
 	if (res < 0) {
 		goto out_free_api;
 	}
diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h
index 14184bd9ca96b367ebcf57a7d8b7739a407df817..8ac21b880413dbea8d5a9900d3146b9b21ae03e3 100644
--- a/epicardium/modules/modules.h
+++ b/epicardium/modules/modules.h
@@ -19,10 +19,9 @@ void dispatcher_mutex_init(void);
 extern struct mutex api_mutex;
 extern TaskHandle_t dispatcher_task_id;
 
-/* ---------- Hardware Init & Reset ---------------------------------------- */
+/* ---------- Hardware Init ------------------------------------------------ */
 int hardware_early_init(void);
 int hardware_init(void);
-int hardware_reset(void);
 
 /* ---------- Lifecycle ---------------------------------------------------- */
 void vLifecycleTask(void *pvParameters);
diff --git a/pycardium/main.c b/pycardium/main.c
index 3aec04919f1cbe3b6858f07697878897424ede7b..ce5ae4b4c7a9379e0f6517caf910aa3337a96298 100644
--- a/pycardium/main.c
+++ b/pycardium/main.c
@@ -65,6 +65,7 @@ int main(void)
 		}
 
 		epic_uart_write_str(header, sizeof(header));
+		epic_hardware_reset();
 
 		for (;;) {
 			if (pyexec_mode_kind == PYEXEC_MODE_RAW_REPL) {