diff --git a/python_payload/apps/demo_worms4.py b/python_payload/apps/demo_worms4.py
index ff383230ce821cf05c0ccbac3f3899b0eb6c2ef9..5aa6157684998aefe56ce84d9b5830ab2051e9a3 100644
--- a/python_payload/apps/demo_worms4.py
+++ b/python_payload/apps/demo_worms4.py
@@ -4,18 +4,19 @@ import time
 import math
 
 # flow3r imports
-from st3m import application
 from st3m import Ctx, InputState
+from st3m.application import Application
 from st3m.property import BLUE, WHITE
 from st3m.goose import Optional
 from st3m.utils import xy_from_polar
+from st3m.ui.view import ViewManager
 
 
 tau = 2 * math.pi
 
 
 # Subclass Application
-class AppWorms(application.Application):
+class AppWorms(Application):
     def __init__(self, name: str) -> None:
         super().__init__(name)
 
@@ -40,9 +41,9 @@ class AppWorms(application.Application):
 
         self.just_shown = True
 
-    def on_enter(self) -> None:
+    def on_enter(self, vm: Optional[ViewManager]) -> None:
         # print("on foreground")
-        super().on_enter()
+        super().on_enter(vm)
         self.just_shown = True
 
     def draw(self, ctx: Ctx) -> None:
diff --git a/python_payload/apps/melodic_demo.py b/python_payload/apps/melodic_demo.py
index 0462b9f688acde8554949f8273230daa42c61b16..2619e8c3a80c49ab6e1097fa7c9c79e651455ba0 100644
--- a/python_payload/apps/melodic_demo.py
+++ b/python_payload/apps/melodic_demo.py
@@ -3,8 +3,9 @@ from hardware import *
 import captouch
 import leds
 
-from st3m.goose import List
+from st3m.goose import List, Optional
 from st3m.input import InputState
+from st3m.ui.view import ViewManager
 from st3m.ui.ctx import Ctx
 
 octave = 0
@@ -94,7 +95,7 @@ class MelodicApp(Application):
         scope_draw(ctx)
         ctx.fill()
 
-    def on_enter(self) -> None:
+    def on_enter(self, vm: Optional[ViewManager]) -> None:
         foreground()
 
     def think(self, ins: InputState, delta_ms: int) -> None:
diff --git a/python_payload/main.py b/python_payload/main.py
index 50b807db653d6238d2a31bb4e237845f5a94b6b8..56366dac0df718c23fccfd9743a8ca876c7d7780 100644
--- a/python_payload/main.py
+++ b/python_payload/main.py
@@ -54,18 +54,9 @@ from apps.nick import app as nick
 from apps.cap_touch_demo import app as captouch_demo
 from apps.scroll_demo import app as scroll_demo
 
-
-# Set the view_managers for the apps, otherwise leaving the app (back) will not work
-worms._view_manager = vm
-harmonic._view_manager = vm
-melodic._view_manager = vm
-nick._view_manager = vm
-captouch_demo._view_manager = vm
-scroll_demo._view_manager = vm
-
 # Build menu structure
 
-menu_settings = settings.build_menu(vm)
+menu_settings = settings.build_menu()
 
 menu_music = SimpleMenu(
     [
@@ -76,7 +67,6 @@ menu_music = SimpleMenu(
         # MenuItemNoop("CrazySynth"),
         MenuItemNoop("NOOP Sequencer"),
     ],
-    vm,
 )
 
 menu_apps = SimpleMenu(
@@ -86,7 +76,6 @@ menu_apps = SimpleMenu(
         MenuItemForeground("worms", worms),
         MenuItemForeground("cap scroll", scroll_demo),
     ],
-    vm,
 )
 
 
@@ -95,7 +84,6 @@ menu_badge = SimpleMenu(
         MenuItemBack(),
         MenuItemForeground("nick", nick),
     ],
-    vm,
 )
 
 menu_system = SimpleMenu(
@@ -106,7 +94,6 @@ menu_system = SimpleMenu(
         MenuItemNoop("About"),
         MenuItemNoop("Reboot"),
     ],
-    vm,
 )
 
 menu_main = SunMenu(
@@ -116,7 +103,6 @@ menu_main = SunMenu(
         MenuItemForeground("Apps", menu_apps),
         MenuItemForeground("System", menu_system),
     ],
-    vm,
 )
 
 
diff --git a/python_payload/st3m/application.py b/python_payload/st3m/application.py
index 0ea4e0372beebcce3f4d7caec117d09e8267290a..7f71101ae42f5c7209b2cc8ea4ed218e43a3f6c8 100644
--- a/python_payload/st3m/application.py
+++ b/python_payload/st3m/application.py
@@ -12,6 +12,10 @@ class Application(ViewWithInputState):
     def on_exit(self) -> None:
         pass
 
+    def on_enter(self, vm: Optional[ViewManager]) -> None:
+        self._view_manager = vm
+        super().on_enter(vm)
+
     def think(self, ins: InputState, delta_ms: int) -> None:
         super().think(ins, delta_ms)
 
diff --git a/python_payload/st3m/settings.py b/python_payload/st3m/settings.py
index 9836c125b5db6bdfbb6eb6cade42e04c7d0a61bd..0e61d92ce9f44d67f540b3be6936bfa6e85a874c 100644
--- a/python_payload/st3m/settings.py
+++ b/python_payload/st3m/settings.py
@@ -334,7 +334,7 @@ def save_all() -> None:
     log.info("Saved settings to flash")
 
 
-def build_menu(vm: ViewManager) -> SimpleMenu:
+def build_menu() -> SimpleMenu:
     """
     Return a SimpleMenu for all settings.
     """
@@ -342,4 +342,4 @@ def build_menu(vm: ViewManager) -> SimpleMenu:
     positions: List[MenuItem] = [
         mib,
     ] + [SettingsMenuItem(t) for t in all_settings]
-    return SettingsMenu(positions, vm)
+    return SettingsMenu(positions)
diff --git a/python_payload/st3m/ui/elements/menus.py b/python_payload/st3m/ui/elements/menus.py
index 48170deebf190192d6d2de677447d9b43fa59333..c7617af741037688faf2ed3bbc4d4bf454d7ab2b 100644
--- a/python_payload/st3m/ui/elements/menus.py
+++ b/python_payload/st3m/ui/elements/menus.py
@@ -50,10 +50,10 @@ class SunMenu(MenuController):
         "_sun",
     )
 
-    def __init__(self, items: List[MenuItem], vm: ViewManager) -> None:
+    def __init__(self, items: List[MenuItem]) -> None:
         self._ts = 0
         self._sun = Sun()
-        super().__init__(items, vm)
+        super().__init__(items)
 
     def think(self, ins: InputState, delta_ms: int) -> None:
         super().think(ins, delta_ms)
@@ -104,15 +104,13 @@ class FlowerMenu(MenuController):
         "_sun",
     )
 
-    def __init__(
-        self, items: List[MenuItem], vm: ViewManager, name: str = "flow3r"
-    ) -> None:
+    def __init__(self, items: List[MenuItem], name: str = "flow3r") -> None:
         self._ts = 0
         self.name = name
         self.ui = GroupRing(r=80)
         for item in items:
             self.ui.items_ring.append(FlowerIcon(label=item.label()))
-        super().__init__(items, vm)
+        super().__init__(items)
 
         self.icon = FlowerIcon(label=self.name)
         self.icon.rotation_time = -5000
diff --git a/python_payload/st3m/ui/menu.py b/python_payload/st3m/ui/menu.py
index 5cc8c9c63ed5980214f36a494b342aca399d2a68..a3437f12d7315e12d8a74ed24a7d1afd9961d7e1 100644
--- a/python_payload/st3m/ui/menu.py
+++ b/python_payload/st3m/ui/menu.py
@@ -1,6 +1,7 @@
 import st3m
 
 from st3m import Responder
+from st3m import logging
 from st3m.goose import ABCBase, abstractmethod, List, Optional
 from st3m.input import InputState, InputController
 from st3m.ui.view import (
@@ -14,6 +15,9 @@ from st3m.ui.interactions import ScrollController
 from st3m.ui.ctx import Ctx
 
 
+log = logging.Log(__name__)
+
+
 class MenuItem(Responder):
     """
     An abstract MenuItem to be implemented by concrete impementations.
@@ -62,6 +66,8 @@ class MenuItemForeground(MenuItem):
     def press(self, vm: Optional[ViewManager]) -> None:
         if vm is not None:
             vm.push(self._r, ViewTransitionSwipeLeft())
+        else:
+            log.warning(f"Could not foreground {self._r} as no ViewManager is present")
 
     def label(self) -> str:
         return self._label
@@ -90,6 +96,8 @@ class MenuItemBack(MenuItem):
     def press(self, vm: Optional[ViewManager]) -> None:
         if vm is not None:
             vm.pop(ViewTransitionSwipeRight())
+        else:
+            log.warning(f"Could not go back as no ViewManager is present")
 
     def label(self) -> str:
         return "Back"
@@ -115,14 +123,18 @@ class MenuController(ViewWithInputState):
         "_view_manager",
     )
 
-    def __init__(self, items: List[MenuItem], vm: Optional[ViewManager]) -> None:
+    def __init__(self, items: List[MenuItem]) -> None:
         self._items = items
         self._scroll_controller = ScrollController()
         self._scroll_controller.set_item_count(len(items))
-        self._view_manager = vm
+        self._view_manager: Optional[ViewManager] = None
 
         super().__init__()
 
+    def on_enter(self, vm: Optional["ViewManager"]) -> None:
+        self._view_manager = vm
+        super().on_enter(vm)
+
     def _parse_state(self) -> None:
         left = self.input.left_shoulder.left
         right = self.input.left_shoulder.right
diff --git a/python_payload/st3m/ui/view.py b/python_payload/st3m/ui/view.py
index 752f9d63bc242590ca85db5ee313fc0df5fece75..7939670c5a63b39acee162daca496aab1a068e5d 100644
--- a/python_payload/st3m/ui/view.py
+++ b/python_payload/st3m/ui/view.py
@@ -13,7 +13,7 @@ class View(Responder):
     ViewWithInputState class.
     """
 
-    def on_enter(self) -> None:
+    def on_enter(self, vm: Optional["ViewManager"]) -> None:
         """
         Called when the View has just become active. This is guaranteed to be
         called before think().
@@ -36,7 +36,7 @@ class ViewWithInputState(View):
     def __init__(self) -> None:
         self.input = InputController()
 
-    def on_enter(self) -> None:
+    def on_enter(self, vm: Optional["ViewManager"]) -> None:
         self.input._ignore_pressed()
 
     def think(self, ins: InputState, delta_ms: int) -> None:
@@ -181,7 +181,7 @@ class ViewManager(Responder):
         """
         self._outgoing = self._incoming
         self._incoming = r
-        self._incoming.on_enter()
+        self._incoming.on_enter(self)
         self._overriden_vt = overide_vt
         if self._outgoing is None:
             return