diff --git a/python_payload/main.py b/python_payload/main.py
index df12e6501e2ac6f0a19b67c51e91e1eaba73f13c..95efc93d49860f45c379bd402d38a60df52fc11d 100644
--- a/python_payload/main.py
+++ b/python_payload/main.py
@@ -94,12 +94,24 @@ menu_badge = SimpleMenu(
     ],
     vm,
 )
+
+menu_system = SimpleMenu(
+    [
+        MenuItemBack(),
+        MenuItemForeground("Settings", menu_settings),
+        MenuItemNoop("Disk Mode"),
+        MenuItemNoop("About"),
+        MenuItemNoop("Reboot"),
+    ],
+    vm,
+)
+
 menu_main = SunMenu(
     [
         MenuItemForeground("Badge", menu_badge),
         MenuItemForeground("Music", menu_music),
         MenuItemForeground("Apps", menu_apps),
-        MenuItemForeground("Settings", menu_settings),
+        MenuItemForeground("System", menu_system),
     ],
     vm,
 )
@@ -126,5 +138,17 @@ debug = overlays.OverlayDebug()
 debug.add_fragment(overlays.DebugReactorStats(reactor))
 compositor.add_overlay(debug)
 
+debug_touch = overlays.OverlayCaptouch()
+
+
+# Tie compositor's debug touch overlay to setting.
+def _onoff_debug_touch_update() -> None:
+    compositor.enabled[overlays.OverlayKind.Touch] = settings.onoff_debug_touch.value
+
+
+_onoff_debug_touch_update()
+settings.onoff_debug_touch.subscribe(_onoff_debug_touch_update)
+compositor.add_overlay(debug_touch)
+
 reactor.set_top(compositor)
 reactor.run()
diff --git a/python_payload/st3m/settings.py b/python_payload/st3m/settings.py
index 27e48a50726350df1f34ab45c429ea0f2bb5e93e..9836c125b5db6bdfbb6eb6cade42e04c7d0a61bd 100644
--- a/python_payload/st3m/settings.py
+++ b/python_payload/st3m/settings.py
@@ -293,8 +293,10 @@ class SettingsMenu(SimpleMenu):
 
 # Actual tunables / settings.
 onoff_debug = OnOffTunable("Debug Overlay", "system.debug", False)
+onoff_debug_touch = OnOffTunable("Touch Overlay", "system.debug_touch", False)
 all_settings: List[UnaryTunable] = [
     onoff_debug,
+    onoff_debug_touch,
 ]
 
 
diff --git a/python_payload/st3m/ui/elements/overlays.py b/python_payload/st3m/ui/elements/overlays.py
index a02cceccd964a25baae1c9c0173cf164c3cc485f..ef80808f9ef7c1f9f9290c2b7081c6e00435b69e 100644
--- a/python_payload/st3m/ui/elements/overlays.py
+++ b/python_payload/st3m/ui/elements/overlays.py
@@ -8,6 +8,7 @@ etc.
 
 from st3m import Responder, Ctx, InputState, Reactor
 from st3m.goose import Dict, Enum, List, ABCBase, abstractmethod
+from st3m.utils import tau
 
 
 class OverlayKind(Enum):
@@ -15,11 +16,13 @@ class OverlayKind(Enum):
     Indicators = 0
     # Naughty debug developers for naughty developers and debuggers.
     Debug = 1
+    Touch = 2
 
 
 _all_kinds = [
     OverlayKind.Indicators,
     OverlayKind.Debug,
+    OverlayKind.Touch,
 ]
 
 
@@ -138,3 +141,47 @@ class OverlayDebug(Overlay):
         ctx.gray(0).rectangle(-120, 80, 240, 12).fill()
         ctx.gray(1).move_to(0, 86).text(self.text())
         ctx.restore()
+
+
+class OverlayCaptouch(Overlay):
+    kind = OverlayKind.Touch
+
+    class Dot(Responder):
+        def __init__(self, ix: int) -> None:
+            self.ix = ix
+            self.phi = 0.0
+            self.rad = 0.0
+            self.pressed = False
+
+        def think(self, s: InputState, delta_ms: int) -> None:
+            self.pressed = s.petal_pressed[self.ix]
+            (rad, phi) = s.petal_pos[self.ix]
+            self.phi = phi
+            self.rad = rad
+
+        def draw(self, ctx: Ctx) -> None:
+            if not self.pressed:
+                return
+
+            a = (tau / 10) * self.ix
+            ctx.rotate(-a)
+            ctx.translate(0, -80)
+
+            offs_x = -self.phi / 1000
+            offs_y = -self.rad / 1000
+            ctx.rectangle(-5 + offs_x, -5 + offs_y, 10, 10)
+            ctx.rgb(1, 0, 1)
+            ctx.fill()
+
+    def __init__(self) -> None:
+        self.dots = [self.Dot(i) for i in range(10)]
+
+    def think(self, ins: InputState, delta_ms: int) -> None:
+        for dot in self.dots:
+            dot.think(ins, delta_ms)
+
+    def draw(self, ctx: Ctx) -> None:
+        for dot in self.dots:
+            ctx.save()
+            dot.draw(ctx)
+            ctx.restore()