Index: kernel/generic/src/adt/bitmap.c
===================================================================
--- kernel/generic/src/adt/bitmap.c	(revision c5396c1804ab53d2d15266e72be0b0617bebb8b3)
+++ kernel/generic/src/adt/bitmap.c	(revision 3731d316ba8734ec66b1e1175e1b2d89faf45e7a)
@@ -100,4 +100,5 @@
 	bitmap->elements = elements;
 	bitmap->bits = (uint8_t *) data;
+	bitmap->next_fit = 0;
 }
 
@@ -116,4 +117,5 @@
 		return;
 	
+	size_t start_byte = start / BITMAP_ELEMENT;
 	size_t aligned_start = ALIGN_UP(start, BITMAP_ELEMENT);
 	
@@ -129,5 +131,5 @@
 	if (start + count < aligned_start) {
 		/* Set bits in the middle of byte. */
-		bitmap->bits[start / BITMAP_ELEMENT] |=
+		bitmap->bits[start_byte] |=
 		    ((1 << lub) - 1) << (start & BITMAP_REMAINER);
 		return;
@@ -136,5 +138,5 @@
 	if (lub) {
 		/* Make sure to set any leading unaligned bits. */
-		bitmap->bits[start / BITMAP_ELEMENT] |=
+		bitmap->bits[start_byte] |=
 		    ~((1 << (BITMAP_ELEMENT - lub)) - 1);
 	}
@@ -169,4 +171,5 @@
 		return;
 	
+	size_t start_byte = start / BITMAP_ELEMENT;
 	size_t aligned_start = ALIGN_UP(start, BITMAP_ELEMENT);
 	
@@ -182,5 +185,5 @@
 	if (start + count < aligned_start) {
 		/* Set bits in the middle of byte */
-		bitmap->bits[start / BITMAP_ELEMENT] &=
+		bitmap->bits[start_byte] &=
 		    ~(((1 << lub) - 1) << (start & BITMAP_REMAINER));
 		return;
@@ -189,5 +192,5 @@
 	if (lub) {
 		/* Make sure to clear any leading unaligned bits. */
-		bitmap->bits[start / BITMAP_ELEMENT] &=
+		bitmap->bits[start_byte] &=
 		    (1 << (BITMAP_ELEMENT - lub)) - 1;
 	}
@@ -206,4 +209,6 @@
 		    ~((1 << tab) - 1);
 	}
+	
+	bitmap->next_fit = start_byte;
 }
 
@@ -269,7 +274,9 @@
 		return false;
 	
-	size_t bytes = bitmap_size(bitmap->elements);
-	
-	for (size_t byte = 0; byte < bytes; byte++) {
+	size_t size = bitmap_size(bitmap->elements);
+	
+	for (size_t pos = 0; pos < size; pos++) {
+		size_t byte = (bitmap->next_fit + pos) % size;
+		
 		/* Skip if the current byte has all bits set */
 		if (bitmap->bits[byte] == ALL_ONES)
@@ -288,22 +295,24 @@
 			
 			if (!bitmap_get_fast(bitmap, i)) {
-				bool continuous = true;
+				size_t continuous = 1;
 				
 				for (size_t j = 1; j < count; j++) {
-					if ((i + j >= bitmap->elements) ||
-					    (bitmap_get_fast(bitmap, i + j))) {
-						continuous = false;
+					if ((i + j < bitmap->elements) &&
+					    (!bitmap_get_fast(bitmap, i + j)))
+						continuous++;
+					else
 						break;
-					}
 				}
 				
-				if (continuous) {
+				if (continuous == count) {
 					if (index != NULL) {
 						bitmap_set_range(bitmap, i, count);
+						bitmap->next_fit = i / BITMAP_ELEMENT;
 						*index = i;
 					}
 					
 					return true;
-				}
+				} else
+					i += continuous;
 			}
 		}
