diff --git a/core/src/collider.c b/core/src/collider.c
index 4175bd0..ef64b6b 100644
--- a/core/src/collider.c
+++ b/core/src/collider.c
@@ -7,10 +7,11 @@ struct Collider {
     PhysicsEntity owner;
     RigidBody* body;
     PhysicsMask layers;
+    PhysicsMask mask;
     int overlap;
 };
 
-Collider* collider_new(PhysicsEntity owner, Shape* shape, int overlap, PhysicsMask layers) {
+Collider* collider_new(PhysicsEntity owner, Shape* shape, int overlap, PhysicsMask layers, PhysicsMask mask) {
     Collider* self = malloc(sizeof(Collider));
     ASSERT_RETURN(self != NULL, NULL, "Failed to allocate space for Collider");
     *self = (Collider) {
@@ -18,6 +19,7 @@ Collider* collider_new(PhysicsEntity owner, Shape* shape, int overlap, PhysicsMa
         .owner = owner,
         .body = owner.tc->get_rigidbody(owner.data),
         .layers = layers,
+        .mask = mask,
         .overlap = overlap,
     };
     rigidbody_add_collider(self->body, self);
@@ -34,7 +36,7 @@ PhysicsQuery collider_to_query(Collider* self) {
     return (PhysicsQuery) {
         .shape = self->shape,
         .transform = rigidbody_get_transform(self->body),
-        .mask = self->layers
+        .mask = self->mask
     };
 }
 
@@ -54,6 +56,22 @@ void collider_set_overlap(Collider* self, int value) {
     self->overlap = value;
 }
 
+PhysicsMask collider_get_mask(const Collider* self) {
+    return self->mask;
+}
+
+void collider_set_mask(Collider* self, PhysicsMask mask) {
+    self->mask = mask;
+}
+
+PhysicsMask collider_get_layers(const Collider* self) {
+    return self->layers;
+}
+
+void collider_set_layers(Collider* self, PhysicsMask layers) {
+    self->layers = layers;
+}
+
 PhysicsEntity collider_get_owner(Collider* self) {
     return self->owner;
 }
diff --git a/core/src/collider.h b/core/src/collider.h
index e0af726..8199d93 100644
--- a/core/src/collider.h
+++ b/core/src/collider.h
@@ -6,7 +6,7 @@
 
 typedef struct Collider Collider;
 
-extern Collider* collider_new(PhysicsEntity owner, Shape* shape, int overlap, PhysicsMask layers);
+extern Collider* collider_new(PhysicsEntity owner, Shape* shape, int overlap, PhysicsMask layers, PhysicsMask mask);
 extern void collider_destroy(Collider* self);
 extern PhysicsQuery collider_to_query(Collider* self);
 
@@ -16,6 +16,12 @@ extern RigidBody* collider_get_rigidbody(Collider* self);
 extern int collider_is_overlap(Collider* self);
 extern void collider_set_overlap(Collider* self, int value);
 
+extern PhysicsMask collider_get_mask(const Collider* self);
+extern void collider_set_mask(Collider* self, PhysicsMask mask);
+
+extern PhysicsMask collider_get_layers(const Collider* self);
+extern void collider_set_layers(Collider* self, PhysicsMask layers);
+
 extern PhysicsEntity collider_get_owner(Collider* self);
 
 #endif // !_fencer_collider_h
diff --git a/core/src/collision.c b/core/src/collision.c
index 9dd49fa..0de7149 100644
--- a/core/src/collision.c
+++ b/core/src/collision.c
@@ -138,6 +138,8 @@ Collision collision_invert(Collision collision_a, Collider* a) {
 }
 
 int collision_check(Collider* a, Collider* b, Collision* out_a, Collision* out_b) {
+    if(!(collider_get_layers(a) & collider_get_mask(b)) || !(collider_get_mask(a) & collider_get_layers(b)))
+        return 0;
     Collision collision_a, collision_b;
     int collision_a_overlaps = _internal_collision_get_collisions(a, b, &collision_a);
     int collision_b_overlaps = _internal_collision_get_collisions(b, a, &collision_b);
@@ -183,5 +185,5 @@ int _internal_overlap_check(PhysicsQuery a, PhysicsQuery b) {
 
 int overlap_check(PhysicsQuery query, Collider* collider) {
     PhysicsQuery collider_query = collider_to_query(collider);
-    return (query.mask & collider_query.mask) != 0 && (_internal_overlap_check(query, collider_query) || _internal_overlap_check(collider_query, query));
+    return (query.mask & collider_get_layers(collider)) != 0 && (_internal_overlap_check(query, collider_query) || _internal_overlap_check(collider_query, query));
 }
diff --git a/game/src/Enemy.c b/game/src/Enemy.c
index c651387..3787179 100644
--- a/game/src/Enemy.c
+++ b/game/src/Enemy.c
@@ -59,13 +59,14 @@ Enemy* MakeEnemy() {
     };
 
     self->rigidbody = rigidbody_make(Enemy_as_PhysicsEntity(self));
-    self->collider = collider_new(Enemy_as_PhysicsEntity(self), shape_new_square(MakeVector(0.2f, 0.05f)), 0, PHYSICS_LAYER_DEFAULT);
+    self->collider = collider_new(Enemy_as_PhysicsEntity(self), shape_new_square(MakeVector(0.2f, 0.05f)), 0,
+                                  PHYSICS_LAYER_DEFAULT, PHYSICS_LAYER_DEFAULT);
     self->collider = collider_new(Enemy_as_PhysicsEntity(self), shape_new((Vector[]){
         MakeVector(-0.2f, -0.95f),
         MakeVector( 0.2f, -0.95f),
         MakeVector( 0.2f,  0.0f),
         MakeVector(-0.2f,  0.0f),
-    }, 4), 1, PHYSICS_LAYER_COMBAT);
+    }, 4), 1, PHYSICS_LAYER_COMBAT, 0x0);
     PhysicsEntity pe = Enemy_as_PhysicsEntity(self);
     LOG_INFO("enemy instantiated mirroring as: %s", pe.mirror->get_typestring(pe.data));
 
diff --git a/game/src/Layers.h b/game/src/Layers.h
index 9983988..24814d9 100644
--- a/game/src/Layers.h
+++ b/game/src/Layers.h
@@ -1,6 +1,7 @@
 #ifndef FIGHT_LAYERS_H
 #define FIGHT_LAYERS_H
 
-#define PHYSICS_LAYER_COMBAT 0x2
+#define PHYSICS_LAYER_CHARACTERS 0x2
+#define PHYSICS_LAYER_COMBAT 0x3
 
-#endif // !FIGHT_LAYERS_H
\ No newline at end of file
+#endif // !FIGHT_LAYERS_H
diff --git a/game/src/Player.c b/game/src/Player.c
index a6b14d1..e70cfb8 100644
--- a/game/src/Player.c
+++ b/game/src/Player.c
@@ -95,13 +95,13 @@ Player* MakePlayer() {
         MakeVector( 0.2f, -0.065f),
         MakeVector( 0.2f,  0.065f),
         MakeVector(-0.2f,  0.065f)
-    }, 4), 0, PHYSICS_LAYER_DEFAULT);
+    }, 4), 0, PHYSICS_LAYER_CHARACTERS, PHYSICS_LAYER_DEFAULT);
     self->hitbox = collider_new(Player_as_PhysicsEntity(self), shape_new((Vector[]){
         MakeVector(-0.2f, -0.95f),
         MakeVector( 0.2f, -0.95f),
         MakeVector( 0.2f,  0.00f),
         MakeVector(-0.2f,  0.00f)
-    }, 3), 1, PHYSICS_LAYER_COMBAT);
+    }, 3), 1, PHYSICS_LAYER_COMBAT, 0x0);
 
     sprite_set_origin(self->sprite, MakeVector(0.45f, 0.925f));
 
diff --git a/game/src/Prop.c b/game/src/Prop.c
index 61a83f6..70699f5 100644
--- a/game/src/Prop.c
+++ b/game/src/Prop.c
@@ -41,7 +41,7 @@ Prop* MakeProp(Sprite* sprite, Shape* shape) {
         .collisionShape = NULL
     };
     self->rigidbody = rigidbody_make(Prop_as_PhysicsEntity(self));
-    self->collisionShape = collider_new(Prop_as_PhysicsEntity(self), shape, 0, PHYSICS_LAYER_DEFAULT);
+    self->collisionShape = collider_new(Prop_as_PhysicsEntity(self), shape, 0, PHYSICS_LAYER_DEFAULT, PHYSICS_LAYER_DEFAULT);
     rigidbody_set_static(self->rigidbody, 1);
     sprite_set_origin(self->sprite, MakeVector(0.5f, 1.0f));
     return self;