diff --git a/src/entities/gui_entities.py b/src/entities/gui_entities.py
index f1d3417442904aa9d94cedfab946caf816de79a4..2ad0cead075013949e96d8c58db99f7a8d0f2584 100644
--- a/src/entities/gui_entities.py
+++ b/src/entities/gui_entities.py
@@ -22,6 +22,7 @@ from src.misc import (
     set_roomba_vision_range_2,
     set_roomba_vision_range_full,
     toggle_roomba_ai,
+    toggle_roomba_failure,
 )
 
 
@@ -65,13 +66,13 @@ class GuiCore:
             data_manager,
             'Randomizers:',
             data_manager.gui_data['gui_w_start'] + 10,
-            data_manager.gui_data['gui_h_start'] + 75,
+            data_manager.gui_data['gui_h_start'] + 115,
         )
         self.roomba_header_text = GuiText(
             data_manager,
             'Roomba Settings:',
             data_manager.gui_data['gui_w_start'] + 10,
-            data_manager.gui_data['gui_h_start'] + 240,
+            data_manager.gui_data['gui_h_start'] + 280,
         )
 
         # Initialize "toggle ai" button.
@@ -85,11 +86,22 @@ class GuiCore:
         )
         self.elements.append(self.toggle_ai)
 
+        # Initialize "toggle failure" button.
+        self.toggle_failure_button = GuiButton(
+            data_manager,
+            'Toggle Failure',
+            70,
+            name='Toggle Failure',
+            function_call=toggle_roomba_failure,
+            function_args=data_manager,
+        )
+        self.elements.append(self.toggle_failure_button)
+
         # Initialize "randomize tile walls" buttons.
         self.rand_walls = GuiButton(
             data_manager,
             'Randomize Walls (E)',
-            100,
+            140,
             name='RandWalls Button (Equal Randomization)',
             function_call=data_manager.tile_set.randomize_tile_walls_equal,
         )
@@ -97,7 +109,7 @@ class GuiCore:
         self.rand_walls = GuiButton(
             data_manager,
             'Randomize Walls (W)',
-            140,
+            180,
             name='RandWalls Button (Weighted Randomization)',
             function_call=data_manager.tile_set.randomize_tile_walls_weighted,
         )
@@ -107,7 +119,7 @@ class GuiCore:
         self.rand_trash = GuiButton(
             data_manager,
             'Randomize Trash',
-            180,
+            220,
             name='RandTrash Button',
             function_call=data_manager.tile_set.randomize_trash,
         )
@@ -117,7 +129,7 @@ class GuiCore:
         self.vision_0 = GuiButton(
             data_manager,
             'Bump Sensor',
-            260,
+            300,
             name='Distance of 0 (Bump Sensor)',
             function_call=set_roomba_vision_range_0,
             function_args=data_manager,
@@ -128,7 +140,7 @@ class GuiCore:
         self.vision_1 = GuiButton(
             data_manager,
             'Distance of 1',
-            300,
+            340,
             name='Distance of 1',
             function_call=set_roomba_vision_range_1,
             function_args=data_manager,
@@ -139,7 +151,7 @@ class GuiCore:
         self.vision_2 = GuiButton(
             data_manager,
             'Distance of 2',
-            340,
+            380,
             name='Distance of 2',
             function_call=set_roomba_vision_range_2,
             function_args=data_manager,
@@ -150,7 +162,7 @@ class GuiCore:
         self.vision_full = GuiButton(
             data_manager,
             'Full Sight',
-            380,
+            420,
             name='Full Sight',
             function_call=set_roomba_vision_range_full,
             function_args=data_manager,
diff --git a/src/misc.py b/src/misc.py
index 90b1ebab23c4fd8608c03cc9e803b1ce8b84ab4d..8d1a4dbe7ec12058aff43da89845d515f2be8e20 100644
--- a/src/misc.py
+++ b/src/misc.py
@@ -46,6 +46,7 @@ class DataManager:
         self.tile_set = None
         self.roomba = None
         self.ai_active = False
+        self.ai_can_fail = False
         self.roomba_vision = 1
         self.ideal_trash_paths = None
         self.ideal_overall_path = None
@@ -176,19 +177,6 @@ def handle_mouse_click(data_manager, button_state, pos_x, pos_y):
         calc_traveling_salesman(data_manager)
 
 
-def toggle_roomba_ai(data_manager):
-    """
-    Toggles roomba AI on or off. Program start default is off.
-    :param data_manager: Data manager data structure. Consolidates useful program data to one location.
-    """
-    logger.debug('toggle_roomba_ai()')
-    logger.info('Toggling roomba ai.')
-    if data_manager.ai_active:
-        data_manager.ai_active = False
-    else:
-        data_manager.ai_active = True
-
-
 def set_roomba_vision_range_0(data_manager):
     """
     Adjusts roomba AI sight to see 0 tiles out from current location.
@@ -229,6 +217,34 @@ def set_roomba_vision_range_full(data_manager):
     data_manager.roomba_vision = -1
 
 
+def toggle_roomba_ai(data_manager):
+    """
+    Toggles roomba AI on or off. Program start default is off.
+    :param data_manager: Data manager data structure. Consolidates useful program data to one location.
+    """
+    logger.debug('toggle_roomba_ai()')
+    if data_manager.ai_active:
+        logger.info('Toggling roomba ai to "off".')
+        data_manager.ai_active = False
+    else:
+        logger.info('Toggling roomba ai to "on".')
+        data_manager.ai_active = True
+
+
+def toggle_roomba_failure(data_manager):
+    """
+    Toggles roomba "failure chance" on or off. Program start default is off.
+    :param data_manager: Data manager data structure. Consolidates useful program data to one location.
+    """
+    logger.debug('toggle_roomba_failure()')
+    if data_manager.ai_can_fail:
+        logger.info('Toggling roomba failure rate to "off".')
+        data_manager.ai_can_fail = False
+    else:
+        logger.info('Toggling roomba failure rate to "10% failure chance on movement".')
+        data_manager.ai_can_fail = True
+
+
 # endregion GUI Logic Functions
 
 
diff --git a/src/systems.py b/src/systems.py
index 990a063c99f3da2ad9e9b1e961d61042ea12299c..e3f200b01460a8597eaafc70f0fed9e56ee38924 100644
--- a/src/systems.py
+++ b/src/systems.py
@@ -70,7 +70,7 @@ class AbstractMovementSystem(ABC):
         if orig_location != sprite.y:
             # Call general "movement" logic, for entity having moved in any direction at all.
             logger.debug('Moved north.')
-            self._handle_move(sprite)
+            self._handle_move(sprite, orig_x, orig_y)
 
             # Movement successful.
             return True
@@ -109,7 +109,7 @@ class AbstractMovementSystem(ABC):
         if orig_location != sprite.x:
             # Call general "movement" logic, for entity having moved in any direction at all.
             logger.debug('Moved east.')
-            self._handle_move(sprite)
+            self._handle_move(sprite, orig_x, orig_y)
 
             # Movement successful.
             return True
@@ -148,7 +148,7 @@ class AbstractMovementSystem(ABC):
         if orig_location != sprite.y:
             # Call general "movement" logic, for entity having moved in any direction at all.
             logger.debug('Moved south.')
-            self._handle_move(sprite)
+            self._handle_move(sprite, orig_x, orig_y)
 
             # Movement successful.
             return True
@@ -182,7 +182,7 @@ class AbstractMovementSystem(ABC):
         if orig_location != sprite.x:
             # Call general "movement" logic, for entity having moved in any direction at all.
             logger.debug('Moved west.')
-            self._handle_move(sprite)
+            self._handle_move(sprite, orig_x, orig_y)
 
             # Movement successful.
             return True
@@ -190,7 +190,7 @@ class AbstractMovementSystem(ABC):
             # Movement failed. Some barrier was in the way.
             return False
 
-    def _handle_move(self, sprite):
+    def _handle_move(self, sprite, orig_x, orig_y):
         """
         Generalized logic that applies upon roomba moving in any direction.
         :param sprite: Entity sprite data.
@@ -207,13 +207,31 @@ class AbstractMovementSystem(ABC):
         if roomba_location[0] == tile_x and roomba_location[1] == tile_y and curr_tile.trashpile.exists:
             curr_tile.trashpile.clean()
 
+        # Handle if roomba is set to allow "failing".
+        # Such an instance causes 10% chance of trash pile appearing in square roomba just left.
+        roomba_failed = False
+        if self.data_manager.ai_can_fail:
+            roomba_failed = self._trigger_failure(orig_x, orig_y)
+
         # Recalculate path distances for new roomba location.
-        calc_trash_distances(self.data_manager, roomba_only=True)
-        calc_traveling_salesman(self.data_manager, calc_new=False)
+        calc_trash_distances(self.data_manager, roomba_only=(not roomba_failed))
+        calc_traveling_salesman(self.data_manager, calc_new=roomba_failed)
 
         # Update for a movement.
         self.data_manager.gui_data['total_move_counter'] += 1
 
+    def _trigger_failure(self, tile_x, tile_y):
+        """
+        If toggled on, roomba has 10% chance of "failing" upon leaving any square.
+        Causes roomba to generate a new trash pile in square it was just in.
+        :return: True if roomba failure occurred | False otherwise.
+        """
+        if random.randint(0, 9) < 1:
+            # Trigger failure.
+            self.data_manager.tile_set.tiles[tile_y][tile_x].trashpile.place()
+            return True
+        return False
+
 
 class MovementSystem(sdl2.ext.Applicator, AbstractMovementSystem):
     """