diff --git a/src/dusk/entity/entity.c b/src/dusk/entity/entity.c
index 18ef933..dcc097e 100644
--- a/src/dusk/entity/entity.c
+++ b/src/dusk/entity/entity.c
@@ -52,29 +52,48 @@ void entityUpdate(entity_t *entity) {
 
   fixed248_t newX = entity->x + entity->vx;
   fixed248_t newY = entity->y + entity->vy;
+  fixed248_t halfTileWH = FIXED248(TILE_WIDTH_HEIGHT / 2, 0);
+  fixed248_t selfCircR = halfTileWH;
 
   // Check for collisions with the world boundaries
 
-  // Check for collisions with tiles
+  // Check for collisions with tile
+  fixed248_t tileStartX = fx248Floor(newX - halfTileWH);
+  fixed248_t tileStartY = fx248Floor(newY - halfTileWH);
+  fixed248_t tileEndX = fx248Ceil(newX + halfTileWH);
+  fixed248_t tileEndY = fx248Ceil(newY + halfTileWH);
+
+  for(fixed248_t y = tileStartY; y <= tileEndY; y+= FIXED248_ONE) {
+    for(fixed248_t x = tileStartX; x <= tileEndX; x+= FIXED248_ONE) {
+      // 
+    }
+  }
+
+  // uint16_t tileStartX = fx248Tou16(fx248Floor(newX - halfTileWH));
+  // uint16_t tileStartY = fx248Tou16(fx248Floor(newY - halfTileWH));
+  // uint16_t tileEndX = fx248Tou16(fx248Ceil(newX + halfTileWH)) + 1;
+  // uint16_t tileEndY = fx248Tou16(fx248Ceil(newY + halfTileWH)) + 1;
+
+  // printf("Checking tiles between (%u, %u) and (%u, %u)\n",
+  //   tileStartX, tileStartY, tileEndX, tileEndY
+  // );
+  // for(uint16_t tileY = tileStartY; tileY <= tileEndY; tileY++) {
+  //   for(uint16_t tileX = tileStartX; tileX <= tileEndX; tileX++) {
+  //   }
+  // }
+
 
   // Check for collisions with other entities
-  fixed248_t halfTileW = FIXED248(TILE_WIDTH_HEIGHT / 2, 0);
-  fixed248_t halfTileH = FIXED248(TILE_WIDTH_HEIGHT / 2, 0);
-  fixed248_t selfCircR = halfTileW;
-  fixed248_t selfCircX = newX - halfTileW;
-  fixed248_t selfCircY = newY - halfTileH;
-
-  for(entity_t *otherEntity = ENTITIES; otherEntity < ENTITIES + ENTITY_COUNT_MAX; ++otherEntity) {
+  entity_t *otherEntity = ENTITIES;
+  do {
     // Skip self and null entities
     if(otherEntity == entity || otherEntity->type == ENTITY_TYPE_NULL) continue;
 
-    fixed248_t otherCircX = otherEntity->x - halfTileW;
-    fixed248_t otherCircY = otherEntity->y - halfTileH;
-    fixed248_t otherCircR = halfTileW;
+    fixed248_t otherCircR = halfTileWH;
 
     collisionresult_t collision = physicsCheckCircleCircle(
-      selfCircX, selfCircY, selfCircR,
-      otherCircX, otherCircY, otherCircR
+      newX, newY, selfCircR,
+      otherEntity->x, otherEntity->y, otherCircR
     );
     if(!collision.hit) continue;
 
@@ -83,11 +102,7 @@ void entityUpdate(entity_t *entity) {
     fixed248_t slideY = fx248Mulf32(collision.normalY, fx248Tof32(collision.depth));
     newX -= slideX;
     newY -= slideY;
-
-    // Update selfCircX/Y for next collision check
-    selfCircX = newX - halfTileW;
-    selfCircY = newY - halfTileH;
-  }
+  } while(++otherEntity < ENTITIES + ENTITY_COUNT_MAX);
 
   entity->x = newX;
   entity->y = newY;
diff --git a/src/dusk/util/fixed.c b/src/dusk/util/fixed.c
index b8d3adf..7cdc02b 100644
--- a/src/dusk/util/fixed.c
+++ b/src/dusk/util/fixed.c
@@ -20,6 +20,11 @@ fixed248_t fx248Fromf32(const float_t b) {
   return (fixed248_t)(b * (1 << FIXED248_FRACTION_BITS));
 }
 
+fixed248_t fx248Fromu16(const uint16_t b) {
+  return (fixed248_t)((int32_t)b << FIXED248_FRACTION_BITS);
+}
+
+
 
 int32_t fx248Toi32(const fixed248_t a) {
   return (int32_t)(a >> FIXED248_FRACTION_BITS);
@@ -33,6 +38,9 @@ float_t fx248Tof32(const fixed248_t a) {
   return (float_t)(a / (float_t)(1 << FIXED248_FRACTION_BITS));
 }
 
+uint16_t fx248Tou16(const fixed248_t a) {
+  return (uint16_t)((a >> FIXED248_FRACTION_BITS) & 0xFFFF);
+}
 
 fixed248_t fx248Addfx248(const fixed248_t a, const fixed248_t b) {
   return a + b;
@@ -118,22 +126,26 @@ fixed248_t fx248Divf32(const fixed248_t a, const float_t b) {
 
 
 
-int32_t fx248Floor(const fixed248_t a) {
-  return (int32_t)(a >> FIXED248_FRACTION_BITS);
+fixed248_t fx248Floor(const fixed248_t a) {
+  return a & ~((1 << FIXED248_FRACTION_BITS) - 1);
 }
 
-int32_t fx248Ceil(const fixed248_t a) {
-  return (int32_t)((
-    a + ((1 << FIXED248_FRACTION_BITS) - 1)
-  ) >> FIXED248_FRACTION_BITS);
+fixed248_t fx248Ceil(const fixed248_t a) {
+  if(a & ((1 << FIXED248_FRACTION_BITS) - 1)) {
+    return (a & ~((1 << FIXED248_FRACTION_BITS) - 1)) + (1 << FIXED248_FRACTION_BITS);
+  }
+  return a;
 }
 
-int32_t fx248Round(const fixed248_t a) {
-  return (int32_t)(
-    (a + (1 << (FIXED248_FRACTION_BITS - 1))
-  ) >> FIXED248_FRACTION_BITS);
+fixed248_t fx248Round(const fixed248_t a) {
+  if(a & ((1 << (FIXED248_FRACTION_BITS - 1)) - 1)) {
+    return (a & ~((1 << FIXED248_FRACTION_BITS) - 1)) + (1 << FIXED248_FRACTION_BITS);
+  }
+  return a & ~((1 << FIXED248_FRACTION_BITS) - 1);
 }
 
+
+
 uint32_t fx248Flooru32(const fixed248_t a) {
   return (uint32_t)((a >> FIXED248_FRACTION_BITS) & 0xFFFFFFFF);
 }
diff --git a/src/dusk/util/fixed.h b/src/dusk/util/fixed.h
index d7cdfea..3ccfa1d 100644
--- a/src/dusk/util/fixed.h
+++ b/src/dusk/util/fixed.h
@@ -18,6 +18,7 @@ typedef int32_t fixed248_t;
   ((i) << FIXED248_FRACTION_BITS) + \
   (((f) * FIXED248_HIGH_MULTIPLIER) / 100) \
 ))
+#define FIXED248_ONE (FIXED248(1, 0))
 
 /**
  * Convert an int32_t value to a fixed248_t value.
@@ -43,6 +44,14 @@ fixed248_t fx248Fromu32(const uint32_t b);
  */
 fixed248_t fx248Fromf32(const float_t b);
 
+/**
+ * Convert a uint16_t value to a fixed248_t value.
+ * 
+ * @param b The uint16_t value to convert.
+ * @return The converted fixed248_t value.
+ */
+fixed248_t fx248Fromu16(const uint16_t b);
+
 
 
 /**
@@ -69,6 +78,14 @@ uint32_t fx248Tou32(const fixed248_t a);
  */
 float_t fx248Tof32(const fixed248_t a);
 
+/**
+ * Convert a fixed248_t value to a uint16_t value.
+ * 
+ * @param a The fixed248_t value to convert.
+ * @return The converted uint16_t value.
+ */
+uint16_t fx248Tou16(const fixed248_t a);
+
 
 
 /**
@@ -229,7 +246,7 @@ fixed248_t fx248Divf32(const fixed248_t a, const float_t b);
  * @param a The fixed248_t value to convert.
  * @return The converted int32_t value.
  */
-int32_t fx248Floor(const fixed248_t a);
+fixed248_t fx248Floor(const fixed248_t a);
 
 /**
  * Convert a fixed248_t value to an int32_t value, rounding towards positive
@@ -238,7 +255,7 @@ int32_t fx248Floor(const fixed248_t a);
  * @param a The fixed248_t value to convert.
  * @return The converted int32_t value.
  */
-int32_t fx248Ceil(const fixed248_t a);
+fixed248_t fx248Ceil(const fixed248_t a);
 
 /**
  * Convert a fixed248_t value to an int32_t value, rounding to the nearest
@@ -247,7 +264,9 @@ int32_t fx248Ceil(const fixed248_t a);
  * @param a The fixed248_t value to convert.
  * @return The converted int32_t value.
  */
-int32_t fx248Round(const fixed248_t a);
+fixed248_t fx248Round(const fixed248_t a);
+
+
 
 /**
  * Convert a fixed248_t value to a uint32_t value, rounding towards zero.