Index: kernel/genarch/include/genarch/mm/page_ht.h
===================================================================
--- kernel/genarch/include/genarch/mm/page_ht.h	(revision 346b12a2767bb66df8633e469fd871fea8c43b5c)
+++ kernel/genarch/include/genarch/mm/page_ht.h	(revision 2a2fbc84d3b2a2ff06b9bb236ff8e813c17ce223)
@@ -44,5 +44,4 @@
 #include <mm/page.h>
 #include <mm/slab.h>
-#include <synch/mutex.h>
 #include <adt/hash_table.h>
 
@@ -66,5 +65,4 @@
 
 extern slab_cache_t *pte_cache;
-extern mutex_t page_ht_lock;
 extern hash_table_t page_ht;
 extern hash_table_operations_t ht_operations;
Index: kernel/genarch/src/mm/as_ht.c
===================================================================
--- kernel/genarch/src/mm/as_ht.c	(revision 346b12a2767bb66df8633e469fd871fea8c43b5c)
+++ kernel/genarch/src/mm/as_ht.c	(revision 2a2fbc84d3b2a2ff06b9bb236ff8e813c17ce223)
@@ -77,5 +77,4 @@
 	if (flags & FLAG_AS_KERNEL) {
 		hash_table_create(&page_ht, PAGE_HT_ENTRIES, 2, &ht_operations);
-		mutex_initialize(&page_ht_lock, MUTEX_PASSIVE);
 		pte_cache = slab_cache_create("pte_t", sizeof(pte_t), 0,
 		    NULL, NULL, SLAB_CACHE_MAGDEFERRED);
@@ -99,5 +98,5 @@
 /** Lock page table.
  *
- * Lock address space and page hash table.
+ * Lock address space.
  * Interrupts must be disabled.
  *
@@ -110,11 +109,9 @@
 	if (lock)
 		mutex_lock(&as->lock);
-	
-	mutex_lock(&page_ht_lock);
 }
 
 /** Unlock page table.
  *
- * Unlock address space and page hash table.
+ * Unlock address space.
  * Interrupts must be disabled.
  *
@@ -125,6 +122,4 @@
 void ht_unlock(as_t *as, bool unlock)
 {
-	mutex_unlock(&page_ht_lock);
-	
 	if (unlock)
 		mutex_unlock(&as->lock);
@@ -140,5 +135,5 @@
 bool ht_locked(as_t *as)
 {
-	return (mutex_locked(&page_ht_lock) && mutex_locked(&as->lock));
+	return mutex_locked(&as->lock);
 }
 
Index: kernel/genarch/src/mm/page_ht.c
===================================================================
--- kernel/genarch/src/mm/page_ht.c	(revision 346b12a2767bb66df8633e469fd871fea8c43b5c)
+++ kernel/genarch/src/mm/page_ht.c	(revision 2a2fbc84d3b2a2ff06b9bb236ff8e813c17ce223)
@@ -71,5 +71,5 @@
  *
  */
-mutex_t page_ht_lock;
+IRQ_SPINLOCK_STATIC_INITIALIZE(page_ht_lock);
 
 /** Page hash table.
@@ -193,4 +193,6 @@
 
 	ASSERT(page_table_locked(as));
+
+	irq_spinlock_lock(&page_ht_lock, true);
 	
 	if (!hash_table_find(&page_ht, key)) {
@@ -219,4 +221,6 @@
 		hash_table_insert(&page_ht, key, &pte->link);
 	}
+
+	irq_spinlock_unlock(&page_ht_lock, true);
 }
 
@@ -240,4 +244,6 @@
 	ASSERT(page_table_locked(as));
 	
+	irq_spinlock_lock(&page_ht_lock, true);
+
 	/*
 	 * Note that removed PTE's will be freed
@@ -245,4 +251,6 @@
 	 */
 	hash_table_remove(&page_ht, key, 2);
+
+	irq_spinlock_unlock(&page_ht_lock, true);
 }
 
@@ -255,5 +263,5 @@
 
 	ASSERT(nolock || page_table_locked(as));
-	
+
 	link_t *cur = hash_table_find(&page_ht, key);
 	if (cur)
@@ -274,7 +282,11 @@
 bool ht_mapping_find(as_t *as, uintptr_t page, bool nolock, pte_t *pte)
 {
+	irq_spinlock_lock(&page_ht_lock, true);
+
 	pte_t *t = ht_mapping_find_internal(as, page, nolock);
 	if (t)
 		*pte = *t;
+
+	irq_spinlock_unlock(&page_ht_lock, true);
 	
 	return t != NULL;
@@ -290,4 +302,6 @@
 void ht_mapping_update(as_t *as, uintptr_t page, bool nolock, pte_t *pte)
 {
+	irq_spinlock_lock(&page_ht_lock, true);
+
 	pte_t *t = ht_mapping_find_internal(as, page, nolock);
 	if (!t)
@@ -306,4 +320,6 @@
 	t->a = pte->a;
 	t->d = pte->d;
+
+	irq_spinlock_unlock(&page_ht_lock, true);
 }
 
