diff --git a/overcooked_simulator/game_items.py b/overcooked_simulator/game_items.py
index b713fbfdab08d1e5cd666e4cd0fac8c79327753c..27ef0c50ecf3f26bd2f6a0133ac94709a0e7d2f9 100644
--- a/overcooked_simulator/game_items.py
+++ b/overcooked_simulator/game_items.py
@@ -1,8 +1,6 @@
 class HoldableItem:
     """Base class for game items which can be held by a player."""
 
-    pass
-
     def can_combine(self, other):
         return False
 
diff --git a/overcooked_simulator/main.py b/overcooked_simulator/main.py
index b3fa9d422547a6355eb8e0b2a07b71e820b89c0e..33c5b91aefcc38609aa9544fdb1a1aeafd7674ff 100644
--- a/overcooked_simulator/main.py
+++ b/overcooked_simulator/main.py
@@ -5,7 +5,6 @@ import numpy as np
 import pygame
 
 from overcooked_simulator import ROOT_DIR
-from overcooked_simulator.game_items import Tomato, Plate
 from overcooked_simulator.player import Player
 from overcooked_simulator.pygame_gui.pygame_gui import PyGameGUI
 from overcooked_simulator.simulation_runner import Simulator
diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py
index 8245fafabcba77786f4b940edea04bfe8bc55224..c1f452f4da69eefca736f7d5172ed5f87808be8b 100644
--- a/overcooked_simulator/overcooked_environment.py
+++ b/overcooked_simulator/overcooked_environment.py
@@ -156,6 +156,8 @@ class Environment:
 
         The movement action is a unit 2d vector.
 
+        Detects collisions with other players and pushes them out of the way.
+
         Args:
             player: The player to move.
             move_vector: The movement vector which is a unit-2d-vector of the movement direction
@@ -165,6 +167,18 @@ class Environment:
         step = move_vector * player.move_dist
         player.move(step)
         if self.detect_collision(player):
+            collided_players = self.get_collided_players(player)
+            for collided_player in collided_players:
+                pushing_vector = collided_player.pos - player.pos
+                if np.linalg.norm(pushing_vector) != 0:
+                    pushing_vector = pushing_vector / np.linalg.norm(pushing_vector)
+
+                old_pos_other = collided_player.pos.copy()
+                collided_player.move(pushing_vector * (collided_player.move_dist / 2))
+                if self.detect_collision_counters(
+                        collided_player
+                ) or self.detect_collision_world_bounds(player):
+                    collided_player.move_abs(old_pos_other)
             player.move_abs(old_pos)
 
             old_pos = player.pos.copy()
@@ -196,11 +210,29 @@ class Environment:
         Returns: True if the player is intersecting with any object in the environment.
         """
         return (
-                self.detect_player_collision(player)
+                len(self.get_collided_players(player)) != 0
                 or self.detect_collision_counters(player)
                 or self.detect_collision_world_bounds(player)
         )
 
+    def get_collided_players(self, player: Player) -> list[Player]:
+        """Detects collisions between the queried player and other players. Returns the list of the collided players.
+        A player is modelled as a circle. Collision is detected if the distance between the players is smaller
+        than the sum of the radius's.
+
+        Args:
+            player: The player to check collisions with other players for.
+
+        Returns: The list of other players the player collides with.
+
+        """
+        other_players = filter(lambda p: p.name != player.name, self.players.values())
+
+        def collide(p):
+            return np.linalg.norm(player.pos - p.pos) <= (player.radius + p.radius)
+
+        return list(filter(collide, other_players))
+
     def detect_player_collision(self, player: Player):
         """Detects collisions between the queried player and other players.
         A player is modelled as a circle. Collision is detected if the distance between the players is smaller