diff --git a/epicardium/modules/lifecycle.c b/epicardium/modules/lifecycle.c
index 483730ecad2dc75a842d23135f3e606ba5744fcc..50e89f906c54a6663c7278c1dd8d9958ebc77e5d 100644
--- a/epicardium/modules/lifecycle.c
+++ b/epicardium/modules/lifecycle.c
@@ -77,7 +77,7 @@ static int load_stat(char *name)
 		/* A python script */
 		return PL_PYTHON_SCRIPT;
 	} else if (strcmp(name + name_len - 4, ".elf") == 0) {
-		return PL_L0DABLE;
+		return 0;//PL_L0DABLE; //Dangerous!
 	}
 
 	return -ENOEXEC;
@@ -239,6 +239,54 @@ static int write_default_menu(void)
 	return 0;
 }
 
+/*
+ * Embed the main.py script in the Epicardium binary.
+ */
+__asm(".section \".rodata\"\n"
+      "_main_script_start:\n"
+      ".incbin \"../preload/main.py\"\n"
+      "_main_script_end:\n"
+      ".previous\n");
+
+extern const uint8_t _main_script_start;
+extern const uint8_t _main_script_end;
+
+static int write_default_main(void)
+{
+	const size_t length =
+		(uintptr_t)&_main_script_end - (uintptr_t)&_main_script_start;
+	int ret;
+
+	LOG_INFO("lifecycle", "Writing default main ...");
+
+	int fd = epic_file_open("main.py", "w");
+	if (fd < 0) {
+		return fd;
+	}
+
+	ret = epic_file_write(fd, &_main_script_start, length);
+	if (ret < 0) {
+		return ret;
+	}
+
+	ret = epic_file_close(fd);
+	if (ret < 0) {
+		return ret;
+	}
+
+	return 0;
+}
+
+static void factory_reset(void)
+{
+	LOG_ERR("lifecycle", "Factory reset!");
+	epic_file_unlink("/main.py");
+	epic_file_unlink("/menu.py");
+	epic_file_unlink("/mac.txt");
+	write_default_menu();
+	write_default_main();
+}
+
 /*
  * Go back to the menu.
  */
@@ -367,14 +415,18 @@ void vLifecycleTask(void *pvParameters)
 	vTaskDelay(pdMS_TO_TICKS(10));
 
 	xSemaphoreGive(core1_mutex);
+	
+	hardware_init();
+
+	if (epic_buttons_read(BUTTON_RIGHT_TOP)) {
+		factory_reset();
+	}
 
 	/* If `main.py` exists, start it.  Otherwise, start `menu.py`. */
 	if (epic_exec("main.py") < 0) {
 		return_to_menu();
 	}
 
-	hardware_init();
-
 	/* When triggered, reset core 1 to menu */
 	while (1) {
 		ulTaskNotifyTake(pdTRUE, portMAX_DELAY);