diff --git a/preload/menu.py b/preload/menu.py
index 6079495759bd6578e7f1c3941462d3427f5aa0ff..2a3794a0dab1a3778725c52e20224aa59aaff376 100644
--- a/preload/menu.py
+++ b/preload/menu.py
@@ -5,6 +5,7 @@ You can customize this script however you want :)  If you want to go back to
 the default version, just delete this file; the firmware will recreate it on
 next run.
 """
+import buttons
 import collections
 import color
 import display
@@ -25,6 +26,8 @@ def enumerate_entries():
         if f == "main.py":
             yield App("Home", f)
 
+    yield App("USB Storage", "USB_STORAGE_FLAG")
+
     yield from enumerate_apps(FAVORITE_APPS)
 
     yield from sorted(enumerate_apps(), key=lambda b: b.name.lower())
@@ -56,6 +59,25 @@ def enumerate_apps(apps=None):
             sys.print_exception(e)
 
 
+def usb_mode(disp):
+    os.usbconfig(os.USB_FLASH)
+
+    disp.clear(color.CAMPGREEN)
+    disp.print("USB Storage", posx=3, posy=20, fg=color.CAMPGREEN_DARK)
+    disp.print("open", posx=52, posy=40, fg=color.CAMPGREEN_DARK)
+    disp.update()
+
+    # Wait for select button to be released
+    while buttons.read(0xFF) == buttons.TOP_RIGHT:
+        pass
+
+    # Wait for any button to be pressed and disable USB storage again
+    while buttons.read(0xFF) == 0:
+        pass
+
+    os.usbconfig(os.USB_SERIAL)
+
+
 class MainMenu(simple_menu.Menu):
     timeout = 30.0
 
@@ -65,6 +87,10 @@ class MainMenu(simple_menu.Menu):
     def on_select(self, app, index):
         self.disp.clear().update()
         try:
+            if app.path == "USB_STORAGE_FLAG":
+                usb_mode(self.disp)
+                return
+
             print("Trying to load " + app.path)
             os.exec(app.path)
         except OSError as e: