diff --git a/bootloader/bootloader-usb.c b/bootloader/bootloader-usb.c
index 003d295a6a8ecc07f41cc74517de5861642c28f6..04a921f6e414ae786cff50bff06425f47cbdf083 100644
--- a/bootloader/bootloader-usb.c
+++ b/bootloader/bootloader-usb.c
@@ -114,11 +114,17 @@ void delay_us(unsigned int usec)
 	mxc_delay(usec);
 }
 
+void bootloader_stop(void)
+{
+	card10_reset();
+}
+
 void bootloader_dirty(void)
 {
 	Paint_DrawString_EN(0, 16 * 3, "Writing.", &Font16, 0x0000, 0xf000);
 	LCD_Update();
 }
+
 void bootloader_clean(void)
 {
 	Paint_DrawString_EN(0, 16 * 3, "Ready.  ", &Font16, 0x0000, 0xffff);
diff --git a/bootloader/main.c b/bootloader/main.c
index 187ebcc7daba4d0ba96d4e4cccbcefd22a4e67cb..cf7916a4d6d3f1339f0dbf8392460b4c5b70b497 100644
--- a/bootloader/main.c
+++ b/bootloader/main.c
@@ -210,15 +210,7 @@ static inline void boot(const void *vtable)
 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;
+		card10_reset();
 	}
 }
 
diff --git a/bootloader/mscmem.c b/bootloader/mscmem.c
index 82d6ce8856661edc5a9dbe840aa3cb2afdd574bb..f2da8d6ba79422abeb911b17d0e2736012992879 100644
--- a/bootloader/mscmem.c
+++ b/bootloader/mscmem.c
@@ -3,6 +3,7 @@
 #include <stdio.h>
 #include "mx25lba.h"
 
+void bootloader_stop(void);
 void bootloader_dirty(void);
 void bootloader_clean(void);
 
@@ -50,7 +51,9 @@ int mscmem_start()
 int mscmem_stop()
 {
 	printf("%s\n", __func__);
-	return mx25_stop();
+	int ret = mx25_stop();
+	bootloader_stop();
+	return ret;
 }
 
 /******************************************************************************/
diff --git a/lib/card10/card10.c b/lib/card10/card10.c
index 2b3e3a317a043823e1fdb97f527627e522fa7657..92ddee1be65cda57b9c7f8b8459e301dda328bbf 100644
--- a/lib/card10/card10.c
+++ b/lib/card10/card10.c
@@ -216,6 +216,19 @@ void card10_poll(void)
 	pmic_poll();
 }
 
+void card10_reset(void)
+{
+	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;
+}
+
 void GPIO0_IRQHandler(void)
 {
 	GPIO_Handler(PORT_0);
diff --git a/lib/card10/card10.h b/lib/card10/card10.h
index e06b8a3f71abddcd2c2ad5d0206c885ead9961c0..488575a104f4c289998deaabfea14626d533de8c 100644
--- a/lib/card10/card10.h
+++ b/lib/card10/card10.h
@@ -13,4 +13,5 @@ void core1_start(void);
 void core1_stop(void);
 
 void card10_poll(void);
+void card10_reset(void);
 #endif