diff --git a/python_payload/st3m/ui/interactions.py b/python_payload/st3m/ui/interactions.py
index 4ee09f2236b81e663869ff14d5b390f581900057..55f20f43db6d9964855946468218786bf12815ea 100644
--- a/python_payload/st3m/ui/interactions.py
+++ b/python_payload/st3m/ui/interactions.py
@@ -49,18 +49,25 @@ class ScrollController(st3m.Responder):
         if count < 0:
             count = 0
         self._nitems = count
-
-    def set_position(self, position: int) -> None:
-        """
-        Immediately set a position without animating the transition.
-        """
-        self._target_position = self._current_position = position
+        if self._target_position >= self._nitems:
+            self._target_position = self._nitems - 1
 
     def scroll_to(self, position: int) -> None:
         """
         Scroll to specified position.
         """
         self._target_position = position
+        if self._target_position < 0:
+            self._target_position = 0
+        if self._target_position >= self._nitems:
+            self._target_position = self._nitems - 1
+
+    def set_position(self, position: int) -> None:
+        """
+        Immediately set a position without animating the transition.
+        """
+        self.scroll_to(position)
+        self._current_position = self._target_position
 
     def scroll_left(self) -> None:
         """
@@ -69,6 +76,8 @@ class ScrollController(st3m.Responder):
         """
         self._target_position -= 1
         self._velocity = -10
+        if self._target_position < 0:
+            self._target_position = 0
 
     def scroll_right(self) -> None:
         """
@@ -77,6 +86,8 @@ class ScrollController(st3m.Responder):
         """
         self._target_position += 1
         self._velocity = 10
+        if self._target_position >= self._nitems:
+            self._target_position = self._nitems - 1
 
     def think(self, ins: InputState, delta_ms: int) -> None:
         if self._nitems == 0:
@@ -84,10 +95,6 @@ class ScrollController(st3m.Responder):
             self._current_position = 0
             self._velocity = 0
             return
-        if self._target_position < 0:
-            self._target_position = 0
-        if self._target_position >= self._nitems:
-            self._target_position = self._nitems - 1
 
         self._physics_step(min(delta_ms, 100) / 1000.0)