Index: kernel/genarch/src/mm/as_ht.c
===================================================================
--- kernel/genarch/src/mm/as_ht.c	(revision 6b326ea1735157aac82f0c34c32f593c39d929a1)
+++ kernel/genarch/src/mm/as_ht.c	(revision 3a4ac81ba8f6e2a39733e3ea182453fee6ed9b92)
@@ -41,4 +41,5 @@
 #include <mm/as.h>
 #include <mm/frame.h>
+#include <mm/slab.h>
 #include <typedefs.h>
 #include <memstr.h>
@@ -77,4 +78,6 @@
 		hash_table_create(&page_ht, PAGE_HT_ENTRIES, 2, &ht_operations);
 		mutex_initialize(&page_ht_lock, MUTEX_PASSIVE);
+		pte_cache = slab_cache_create("pte_cache", sizeof(pte_t), 0, NULL, NULL,
+		    SLAB_CACHE_MAGDEFERRED);
 	}
 	
Index: kernel/genarch/src/mm/page_ht.c
===================================================================
--- kernel/genarch/src/mm/page_ht.c	(revision 6b326ea1735157aac82f0c34c32f593c39d929a1)
+++ kernel/genarch/src/mm/page_ht.c	(revision 3a4ac81ba8f6e2a39733e3ea182453fee6ed9b92)
@@ -60,4 +60,6 @@
 static pte_t *ht_mapping_find(as_t *, uintptr_t, bool);
 
+slab_cache_t *pte_cache = NULL;
+
 /**
  * This lock protects the page hash table. It must be acquired
@@ -163,5 +165,5 @@
 	pte_t *pte = hash_table_get_instance(item, pte_t, link);
 	
-	free(pte);
+	slab_free(pte_cache, pte);
 }
 
@@ -188,5 +190,5 @@
 	
 	if (!hash_table_find(&page_ht, key)) {
-		pte_t *pte = (pte_t *) malloc(sizeof(pte_t), FRAME_ATOMIC);
+		pte_t *pte = slab_alloc(pte_cache, FRAME_LOWMEM | FRAME_ATOMIC);
 		ASSERT(pte != NULL);
 		
