diff --git a/python_payload/apps/audio_config/__init__.py b/python_payload/apps/audio_config/__init__.py
index db87a1cfe5f59a6e0c61ba93f12a88b8ad78a864..6a021be5ecffbfcc9e26a44a32fad310adb80df9 100644
--- a/python_payload/apps/audio_config/__init__.py
+++ b/python_payload/apps/audio_config/__init__.py
@@ -1,4 +1,5 @@
 from st3m.application import Application
+from st3m.ui.view import View, ViewTransitionDirection
 import math, random, sys_display
 from st3m import settings
 import audio
@@ -271,11 +272,9 @@ class Drawable:
 class Submenu(Drawable):
     def __init__(self, press):
         super().__init__(press)
-        self.submenu_active = False
 
     def draw(self, ctx):
-        if self.submenu_active:
-            self._draw(ctx)
+        self._draw(ctx)
 
     def _draw(self, ctx):
         # override w specific implementation!
@@ -565,6 +564,22 @@ class Press:
         self.select_pressed = False
 
 
+class SubView(View):
+    def __init__(self, menu, app):
+        self.menu = menu
+        self.app = app
+
+    def on_enter(self, vm):
+        self.vm = vm
+
+    def think(self, ins, delta_ms):
+        if self.vm.is_active(self):
+            self.app.think(ins, delta_ms)
+
+    def draw(self, ctx):
+        self.menu.draw(ctx)
+
+
 class App(Application):
     def __init__(self, app_ctx):
         super().__init__(app_ctx)
@@ -596,52 +611,45 @@ class App(Application):
     def draw(self, ctx):
         self.ctx = ctx
 
-        main_menu_active = True
-        for menu in self.menus:
-            menu.draw(self.ctx)
-            if menu.submenu_active:
-                main_menu_active = False
-
-        if main_menu_active:
-            self.draw_bg()
-            ctx.save()
-            ctx.rgb(*colours.GO_GREEN)
-            ctx.rotate(math.tau / 10)
-            for i in range(5):
-                if i == 2:
-                    ctx.rotate(math.tau / 5)
-                    continue
-                ctx.round_rectangle(-40, -110, 80, 45, 6).stroke()
+        self.draw_bg()
+        ctx.save()
+        ctx.rgb(*colours.GO_GREEN)
+        ctx.rotate(math.tau / 10)
+        for i in range(5):
+            if i == 2:
                 ctx.rotate(math.tau / 5)
-            ctx.restore()
+                continue
+            ctx.round_rectangle(-40, -110, 80, 45, 6).stroke()
+            ctx.rotate(math.tau / 5)
+        ctx.restore()
 
-            ctx.text_align = ctx.CENTER
-            ctx.rotate(math.tau / 10)
-            ctx.move_to(0, -91)
-            ctx.text("volume")
-            ctx.move_to(0, -74)
-            ctx.text("control")
-            ctx.move_to(0, 0)
-            ctx.rotate(math.tau * (1 / 5 + 1 / 2))
-            ctx.move_to(0, 92)
-            ctx.text("inputs")
-            ctx.move_to(0, 0)
-            ctx.rotate(math.tau * 2 / 5)
-            ctx.move_to(0, 92)
-            ctx.text("speaker")
-            ctx.move_to(0, 0)
-            ctx.rotate(math.tau * (1 / 5 + 1 / 2))
-            ctx.move_to(0, -91)
-            ctx.text("head")
-            ctx.move_to(0, -74)
-            ctx.text("phones")
-            ctx.rotate(math.tau / 10)
-            ctx.move_to(0, 0)
-            ctx.text("audio config")
-            ctx.rgb(0.7, 0.7, 0.7)
-            ctx.font_size = 18
-            ctx.move_to(0, 20)
-            ctx.text("exit to save")
+        ctx.text_align = ctx.CENTER
+        ctx.rotate(math.tau / 10)
+        ctx.move_to(0, -91)
+        ctx.text("volume")
+        ctx.move_to(0, -74)
+        ctx.text("control")
+        ctx.move_to(0, 0)
+        ctx.rotate(math.tau * (1 / 5 + 1 / 2))
+        ctx.move_to(0, 92)
+        ctx.text("inputs")
+        ctx.move_to(0, 0)
+        ctx.rotate(math.tau * 2 / 5)
+        ctx.move_to(0, 92)
+        ctx.text("speaker")
+        ctx.move_to(0, 0)
+        ctx.rotate(math.tau * (1 / 5 + 1 / 2))
+        ctx.move_to(0, -91)
+        ctx.text("head")
+        ctx.move_to(0, -74)
+        ctx.text("phones")
+        ctx.rotate(math.tau / 10)
+        ctx.move_to(0, 0)
+        ctx.text("audio config")
+        ctx.rgb(0.7, 0.7, 0.7)
+        ctx.font_size = 18
+        ctx.move_to(0, 20)
+        ctx.text("exit to save")
 
         self.press.select_pressed = False
         self.press.left_pressed = False
@@ -651,12 +659,12 @@ class App(Application):
         super().think(ins, delta_ms)
         for i in range(1, 10, 2):
             if self.input.captouch.petals[i].whole.pressed:
-                for menu in self.menus:
-                    menu.submenu_active = False
+                if not self.is_active():
+                    self.vm.pop()
                 if i < 5:
-                    self.menus[i // 2].submenu_active = True
+                    self.vm.push(SubView(self.menus[i // 2], self))
                 elif i > 5:
-                    self.menus[(i // 2) - 1].submenu_active = True
+                    self.vm.push(SubView(self.menus[(i // 2) - 1], self))
 
         if (
             self.input.buttons.app.right.pressed
@@ -670,11 +678,12 @@ class App(Application):
 
     def on_enter(self, vm):
         super().on_enter(vm)
-        settings.load_all()
+        if self.vm.direction == ViewTransitionDirection.FORWARD:
+            settings.load_all()
 
     def on_exit(self):
-        settings.save_all()
-        super().on_exit()
+        if self.vm.direction == ViewTransitionDirection.BACKWARD:
+            settings.save_all()
 
 
 if __name__ == "__main__":