diff --git a/python_payload/st3m/ui/view.py b/python_payload/st3m/ui/view.py
index e7fbda2b76ca47cdc857b010372d8d1f1814fee5..820fd87e0c6329937d121ad1fa3d971b7a864480 100644
--- a/python_payload/st3m/ui/view.py
+++ b/python_payload/st3m/ui/view.py
@@ -177,6 +177,10 @@ class ViewManager(Responder):
         self._incoming: Optional[View] = None
         self._outgoing: Optional[View] = None
 
+        self._pending: Optional[View] = None
+        self._pending_vt: Optional[ViewTransition] = None
+        self._pending_direction: Optional[ViewTransitionDirection] = None
+
         self._debug = debug
 
         # Transition time.
@@ -194,6 +198,9 @@ class ViewManager(Responder):
         self._fully_drawn = 0
 
     def _end_transition(self) -> None:
+        if not self._transitioning:
+            return
+
         self._transitioning = False
 
         if self._incoming is not None:
@@ -202,6 +209,25 @@ class ViewManager(Responder):
             self._outgoing.on_exit_done()
             self._outgoing = None
 
+    def _perform_pending(self):
+        if not self._pending:
+            return
+        self._end_transition()
+        self._transitioning = True
+        self._transition = 0.0
+        self._first_think = True
+        self._fully_drawn = 0
+        self._direction = self._pending_direction
+        self._overriden_vt = self._pending_vt
+        self._outgoing = self._incoming
+        self._incoming = self._pending
+        self._pending = None
+        if self._outgoing is not None:
+            self._outgoing.on_exit()
+        self._incoming.on_enter(self)
+        if self._outgoing is None:
+            self._end_transition()
+
     def think(self, ins: InputState, delta_ms: int) -> None:
         self._input.think(ins, delta_ms)
 
@@ -228,6 +254,8 @@ class ViewManager(Responder):
         if self._incoming is not None:
             self._incoming.think(ins, delta_ms)
 
+        self._perform_pending()
+
     def draw(self, ctx: Context) -> None:
         if self._transitioning:
             if self._transition >= 1.0:
@@ -250,7 +278,7 @@ class ViewManager(Responder):
     def replace(
         self,
         r: View,
-        overide_vt: Optional[ViewTransition] = None,
+        override_vt: Optional[ViewTransition] = None,
         direction: ViewTransitionDirection = ViewTransitionDirection.NONE,
     ) -> None:
         """
@@ -259,22 +287,10 @@ class ViewManager(Responder):
 
         The new view will _not_ be added to history!
         """
-        if self._transitioning:
-            self._end_transition()
-        self._transitioning = True
-        self._transition = 0.0
-        self._direction = direction
-        self._first_think = True
-        self._fully_drawn = 0
-
-        self._outgoing = self._incoming
-        if self._outgoing is not None:
-            self._outgoing.on_exit()
-        self._incoming = r
-        self._incoming.on_enter(self)
-        self._overriden_vt = overide_vt
-        if self._outgoing is None:
-            self._end_transition()
+        self._pending = r
+        self._pending_vt = override_vt
+        self._pending_direction = direction
+        self._end_transition()
 
     def push(self, r: View, override_vt: Optional[ViewTransition] = None) -> None:
         """
@@ -282,7 +298,9 @@ class ViewManager(Responder):
         override_vt will be used instead of the default ViewTransition
         animation.
         """
-        if self._incoming is not None:
+        if self._pending is not None:
+            self._history.append(self._pending)
+        elif self._incoming is not None:
             self._history.append(self._incoming)
 
         self.replace(r, override_vt, ViewTransitionDirection.FORWARD)
@@ -314,14 +332,14 @@ class ViewManager(Responder):
         """
         Returns true if the passed view is currently the active one.
         """
-        return self._incoming == view
+        return (self._incoming == view and not self._pending) or self._pending == view
 
     @property
     def transitioning(self) -> bool:
         """
         Returns true if a transition is in progress.
         """
-        return self._transitioning
+        return self._transitioning or self._pending
 
     @property
     def direction(self) -> ViewTransitionDirection: