diff --git a/src/entities/collision.rs b/src/entities/collision.rs
index 08a43e7a52194cfbcab68aae4a494aa1c4a1f27d..8064cb9183ecc6323d9ba101a40658e45cd252cb 100644
--- a/src/entities/collision.rs
+++ b/src/entities/collision.rs
@@ -1,5 +1,6 @@
 use crate::deref_as;
-use bevy::prelude::{Color, Component, Rect, Vec2};
+use bevy::math::Vec3Swizzles;
+use bevy::prelude::{Changed, Color, Component, Entity, Query, Rect, Transform, Vec2};
 
 #[derive(Clone, Copy, Debug, Component)]
 pub struct BoxSize(Vec2);
@@ -37,4 +38,45 @@ impl CollisionGroup {
 			Enemy => Color::rgb_u8(133, 20, 75),
 		}
 	}
+
+	pub fn interacts_with(&self, other: CollisionGroup) -> bool {
+		use CollisionGroup::*;
+
+		matches!(
+			(*self, other),
+			(FriendlyProjectile, Enemy)
+				| (Enemy, FriendlyProjectile)
+				| (Player, Pickup)
+				| (Pickup, Player)
+				| (HostileProjectile, Player)
+				| (Player, HostileProjectile)
+		)
+	}
+}
+
+pub fn check_entity_collisions(
+	moved_colliders: Query<(Entity, &Transform, &BoxSize, &CollisionGroup), Changed<Transform>>,
+	all_colliders: Query<(Entity, &Transform, &BoxSize, &CollisionGroup)>,
+) {
+	for (moved_entity, moved_transform, moved_size, moved_group) in &moved_colliders {
+		for (target_entity, target_transform, target_size, target_group) in &all_colliders {
+			if moved_entity == target_entity {
+				continue;
+			}
+
+			let moved_box = Rect::from_center_size(moved_transform.translation.xy(), **moved_size);
+			let target_box =
+				Rect::from_center_size(target_transform.translation.xy(), **target_size);
+
+			if moved_group.interacts_with(*target_group)
+				&& check_box_collisions(moved_box, target_box)
+			{
+				log::info!(
+					"Two colliding entities! {:?} and {:?}",
+					target_entity,
+					moved_entity
+				);
+			}
+		}
+	}
 }
diff --git a/src/entities/mod.rs b/src/entities/mod.rs
index 0b8174e00a131672fd1495c24c961e1cab0b3a61..810dfe2aaf6ba26cdc2155892f8242d08c3dea12 100644
--- a/src/entities/mod.rs
+++ b/src/entities/mod.rs
@@ -19,6 +19,7 @@ mod _plugin {
 				super::player::process_player_input,
 				super::motion::apply_velocity,
 				super::spawning::apply_despawn_boundaries,
+				super::collision::check_entity_collisions,
 			));
 		}
 	}