diff --git a/include/maestro/i_memlock.h b/include/maestro/i_memlock.h
index 98667a789a8c4165dc5c4b8a1e3df60f6c87bb62..201d5a209d54c48934bdafde581fe81ecfa0c8b7 100644
--- a/include/maestro/i_memlock.h
+++ b/include/maestro/i_memlock.h
@@ -83,6 +83,12 @@ mstro_memunlock(void* addr, size_t len);
 mstro_status
 mstro_memlock_init(size_t min_required);
 
+/**@brief De-Initialize the memlock subsystem
+ *
+ */
+mstro_status
+mstro_memlock_finalize(void);
+
 /**@} (end of group MSTRO_I_MEMLOCK) */
 /**@} (end of group MSTRO_Internal) */
 
diff --git a/maestro/core.c b/maestro/core.c
index 7bac92b88684f8a9beab40470520045af9f53472..83c1fdfb718fb12a33c1711e5a80cf50812c52fc 100644
--- a/maestro/core.c
+++ b/maestro/core.c
@@ -371,7 +371,7 @@ mstro_core_finalize(void)
     goto BAILOUT;
   }
 
-  status = MSTRO_OK;
+  status = mstro_memlock_finalize();
 
 BAILOUT:  
   return status;
diff --git a/maestro/memlock.c b/maestro/memlock.c
index 51bcc0d6516d8d19663f879694283cbd15c506ea..863ec81ad0558850efd86525b0fd9b4317e4f537 100644
--- a/maestro/memlock.c
+++ b/maestro/memlock.c
@@ -14,6 +14,8 @@
 #include <pthread.h>
 #include <sys/mman.h>
 #include <errno.h>
+#include <sys/time.h>
+#include <sys/resource.h>
 
 /* Terminology:
  *
@@ -119,6 +121,28 @@ mstro_memlock_init(size_t min_required)
 }
 
 
+mstro_status
+mstro_memlock_finalize(void)
+{
+  mstro_status s=MSTRO_OK;
+
+  WITH_LOCKED_PAGETABLE({
+    if(g_locked_pages) {
+      if(kh_size(g_locked_pages)!=0) {
+        ERR("Table of locked page-sets nonempty: %d live entries\n",
+	    kh_size(g_locked_pages));
+        s=MSTRO_FAIL;
+      }
+      kh_destroy(page_set, g_locked_pages);
+    } else {
+      ERR("called before init, or called twice\n");
+    }
+  }, BAILOUT);
+BAILOUT:
+  return s;
+}
+
+
 /** check whether @arg page is locked.
  *
  * Must be called while holding @ref g_locked_pages_mtx.
diff --git a/tests/check_memlock.c b/tests/check_memlock.c
index cc8e4f843b6c88c12d89687f7035b260b80e182a..7a9719eb3c6bfea5fd66284deb69596b4e99b550 100644
--- a/tests/check_memlock.c
+++ b/tests/check_memlock.c
@@ -56,6 +56,7 @@ CHEAT_TEST(lock_unlock,
              cheat_assert(MSTRO_OK==mstro_memunlock(x,8000));
 
              free(x);
+             cheat_assert(MSTRO_OK==mstro_memlock_finalize());
            })
 
 
@@ -78,6 +79,7 @@ CHEAT_TEST(lock_unlock_multi,
              cheat_assert(MSTRO_FAIL==mstro_memunlock(x,8000));
 
              free(x);
+             cheat_assert(MSTRO_OK==mstro_memlock_finalize());
            })
 
 CHEAT_TEST(lock_overlapping,
@@ -108,6 +110,5 @@ CHEAT_TEST(lock_overlapping,
              cheat_assert(MSTRO_OK==mstro_memunlock(start3, len3));
 
              free(x);
-
-             
+             cheat_assert(MSTRO_OK==mstro_memlock_finalize());
            })