diff --git a/python_payload/st3m/application.py b/python_payload/st3m/application.py
index 6b1f58f296033f304f3cc4a8a7b9086695615095..4621d725af20f9d14e03a821b510ec05215bdb16 100644
--- a/python_payload/st3m/application.py
+++ b/python_payload/st3m/application.py
@@ -1,12 +1,12 @@
 from st3m.ui.view import (
     BaseView,
-    ViewTransitionSwipeRight,
     ViewTransitionSwipeLeft,
     ViewManager,
 )
 from st3m.ui.menu import MenuItem
 from st3m.input import InputState
-from st3m.goose import Optional, List, Enum, Dict
+import st3m.wifi
+from st3m.goose import Optional, List, Dict
 from st3m.logging import Log
 from ctx import Context
 
@@ -47,8 +47,24 @@ class ApplicationContext:
 class Application(BaseView):
     def __init__(self, app_ctx: ApplicationContext) -> None:
         self._app_ctx = app_ctx
+        self._wifi_preference = app_ctx.bundle_metadata["app"].get("wifi_preference")
         super().__init__()
 
+    def on_enter(self, vm: Optional[ViewManager]) -> None:
+        # Try to connect/disconnect from wifi if requested by app
+        if self._wifi_preference is True and not st3m.wifi.is_connected():
+            st3m.wifi.setup_wifi()
+        elif self._wifi_preference is False:
+            st3m.wifi.disable()
+        super().on_enter(vm)
+
+    def on_exit(self) -> None:
+        # If the app requested to change wifi state
+        # fall back to system defaults on exit
+        if self._wifi_preference is not None:
+            st3m.wifi._onoff_wifi_update()
+        super().on_exit()
+
     def think(self, ins: InputState, delta_ms: int) -> None:
         super().think(ins, delta_ms)