diff --git a/bootloader/main.c b/bootloader/main.c
index 0132402dadaa63d97a0fa5f4b80afdd723c46f7b..70d8a1ebd9a9123d6875b1a76ed9c62795e13cf3 100644
--- a/bootloader/main.c
+++ b/bootloader/main.c
@@ -210,6 +210,21 @@ int main(void)
 		printf("Trying to shortcut to main epicardium\n");
 
 		boot((uintptr_t *)PARTITION_START);
+	}else if(boot_type == Reboot_USBStorage) {
+		card10_init_slim();
+		bootloader_display_init();
+
+//		bootloader_display_header();
+		bootloader_display_line(2, "USB activated.", 0xffff);
+		bootloader_display_line(3, "Ready.", 0xffff);
+		run_usbmsc();
+
+		// If we return, don't try to boot. Maybe rather trigger a software reset.
+		// Reason: Not sure in which state the USB peripheral is and what kind
+		// of interrupts are active.
+		card10_reset();
+		while (1)
+			;
 	}
 	card10_init();
 
diff --git a/lib/card10/card10.c b/lib/card10/card10.c
index 6b7b9ddf1abbe4447ed182745911321819ec15c2..b85e366e13265f7ce17cacf1ead42026ee201fdf 100644
--- a/lib/card10/card10.c
+++ b/lib/card10/card10.c
@@ -35,10 +35,30 @@ const gpio_cfg_t bhi_interrupt_pin = {
 	PORT_0, PIN_13, GPIO_FUNC_IN, GPIO_PAD_PULL_UP
 };
 
-void card10_init(void)
-{
-	printf("card10 init...\n");
+static void spi_init() {
+	// Enable SPI
+	sys_cfg_spi_t spi17y_master_cfg;
 
+	spi17y_master_cfg.map = MAP_A;
+	spi17y_master_cfg.ss0 = Enable;
+	spi17y_master_cfg.ss1 = Disable;
+	spi17y_master_cfg.ss2 = Disable;
+
+	if (SPI_Init(SPI0, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
+		printf("Error configuring SPI\n");
+		while (1)
+			;
+	}
+
+	if (SPI_Init(SPI2, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
+		printf("Error configuring SPI\n");
+		while (1)
+			;
+	}
+}
+
+void card10_init_internal(bool skip_rtc)
+{
 	//Setup the I2CM
 	I2C_Shutdown(MXC_I2C0_BUS0);
 	I2C_Init(MXC_I2C0_BUS0, I2C_FAST_MODE, NULL);
@@ -56,46 +76,31 @@ void card10_init(void)
 	pmic_set_led(0, 0);
 	pmic_set_led(1, 0);
 	pmic_set_led(2, 0);
-	TMR_Delay(MXC_TMR0, MSEC(1000), 0);
-
-	while (RTC_EnableRTCE(MXC_RTC) == E_BUSY)
-		;
-
-	// Enable 32 kHz output
-	while (RTC_SquareWave(
-		       MXC_RTC,
-		       SQUARE_WAVE_ENABLED,
-		       F_32KHZ,
-		       NOISE_IMMUNE_MODE,
-		       NULL) == E_BUSY
-	)
-		;
-	/* If we don't have a valid time yet, set it to 2019-01-01 */
-	if (RTC_GetSecond() < 1546300800UL) {
-		while (RTC_Init(MXC_RTC, 1546300800UL, 0, NULL) == E_BUSY)
-			;
-	}
 
-	// Enable SPI
-	sys_cfg_spi_t spi17y_master_cfg;
+	if (!skip_rtc) {
+		TMR_Delay(MXC_TMR0, MSEC(1000), 0);
 
-	spi17y_master_cfg.map = MAP_A;
-	spi17y_master_cfg.ss0 = Enable;
-	spi17y_master_cfg.ss1 = Disable;
-	spi17y_master_cfg.ss2 = Disable;
-
-	if (SPI_Init(SPI0, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
-		printf("Error configuring SPI\n");
-		while (1)
+		while (RTC_EnableRTCE(MXC_RTC) == E_BUSY)
 			;
-	}
 
-	if (SPI_Init(SPI2, 0, SPI_SPEED, spi17y_master_cfg) != 0) {
-		printf("Error configuring SPI\n");
-		while (1)
+		// Enable 32 kHz output
+		while (RTC_SquareWave(
+				MXC_RTC,
+				SQUARE_WAVE_ENABLED,
+				F_32KHZ,
+				NOISE_IMMUNE_MODE,
+				NULL) == E_BUSY
+		)
 			;
+		/* If we don't have a valid time yet, set it to 2019-01-01 */
+		if (RTC_GetSecond() < 1546300800UL) {
+			while (RTC_Init(MXC_RTC, 1546300800UL, 0, NULL) == E_BUSY)
+				;
+		}
 	}
 
+	spi_init();
+
 	display_init();
 
 	leds_init();
@@ -103,6 +108,18 @@ void card10_init(void)
 	GPIO_Config(&bhi_interrupt_pin);
 }
 
+void card10_init(void)
+{
+	printf("card10 init...\n");
+	card10_init_internal(false);
+}
+
+void card10_init_slim(void)
+{
+	printf("card10 slim init...\n");
+	card10_init_internal(true);
+}
+
 static uint32_t ecg_read_reg(uint8_t reg)
 {
 	spi_req_t req;
diff --git a/lib/card10/card10.h b/lib/card10/card10.h
index f42dc58fd2ab5e19f46a7e62c7d98740db2c4e26..e474b98b40fb545fe33048a67025c947fba10c15 100644
--- a/lib/card10/card10.h
+++ b/lib/card10/card10.h
@@ -7,6 +7,7 @@
 extern const gpio_cfg_t bhi_interrupt_pin;
 
 void card10_init(void);
+void card10_init_slim(void);
 void card10_diag(void);
 
 void core1_start(void *isr);