Index: arch/amd64/src/proc/task.c
===================================================================
--- arch/amd64/src/proc/task.c	(revision 9c1c677109242df29e86affb8527c36e254031e2)
+++ arch/amd64/src/proc/task.c	(revision 31e8ddd3646b281263eac10f5b0878e1700ccd12)
@@ -28,4 +28,5 @@
 
 #include <proc/task.h>
+#include <mm/slab.h>
 #include <arch/types.h>
 
@@ -39,2 +40,12 @@
 	bitmap_initialize(&t->arch.iomap, NULL, 0);
 }
+
+/** Perform amd64 specific task destruction.
+ *
+ * @param t Task to be initialized.
+ */
+void task_destroy_arch(task_t *t)
+{
+	if (t->arch.iomap.map)
+		free(t->arch.iomap.map);
+}
Index: arch/ia32/src/proc/task.c
===================================================================
--- arch/ia32/src/proc/task.c	(revision 9c1c677109242df29e86affb8527c36e254031e2)
+++ arch/ia32/src/proc/task.c	(revision 31e8ddd3646b281263eac10f5b0878e1700ccd12)
@@ -30,4 +30,5 @@
 #include <arch/types.h>
 #include <adt/bitmap.h>
+#include <mm/slab.h>
 
 /** Perform ia32 specific task initialization.
@@ -40,2 +41,12 @@
 	bitmap_initialize(&t->arch.iomap, NULL, 0);
 }
+
+/** Perform ia32 specific task destruction.
+ *
+ * @param t Task to be initialized.
+ */
+void task_destroy_arch(task_t *t)
+{
+	if (t->arch.iomap.map)
+		free(t->arch.iomap.map);
+}
Index: arch/ia64/include/proc/task.h
===================================================================
--- arch/ia64/include/proc/task.h	(revision 9c1c677109242df29e86affb8527c36e254031e2)
+++ arch/ia64/include/proc/task.h	(revision 31e8ddd3646b281263eac10f5b0878e1700ccd12)
@@ -34,4 +34,5 @@
 
 #define task_create_arch(t)
+#define task_destroy_arch(t)
 
 #endif
Index: arch/mips32/include/proc/task.h
===================================================================
--- arch/mips32/include/proc/task.h	(revision 9c1c677109242df29e86affb8527c36e254031e2)
+++ arch/mips32/include/proc/task.h	(revision 31e8ddd3646b281263eac10f5b0878e1700ccd12)
@@ -34,4 +34,5 @@
 
 #define task_create_arch(t)
+#define task_destroy_arch(t)
 
 #endif
Index: arch/ppc32/include/proc/task.h
===================================================================
--- arch/ppc32/include/proc/task.h	(revision 9c1c677109242df29e86affb8527c36e254031e2)
+++ arch/ppc32/include/proc/task.h	(revision 31e8ddd3646b281263eac10f5b0878e1700ccd12)
@@ -34,4 +34,5 @@
 
 #define task_create_arch(t)
+#define task_destroy_arch(t)
 
 #endif
Index: arch/ppc64/include/proc/task.h
===================================================================
--- arch/ppc64/include/proc/task.h	(revision 9c1c677109242df29e86affb8527c36e254031e2)
+++ arch/ppc64/include/proc/task.h	(revision 31e8ddd3646b281263eac10f5b0878e1700ccd12)
@@ -34,4 +34,5 @@
 
 #define task_create_arch(t)
+#define task_destroy_arch(t)
 
 #endif
Index: arch/sparc64/include/proc/task.h
===================================================================
--- arch/sparc64/include/proc/task.h	(revision 9c1c677109242df29e86affb8527c36e254031e2)
+++ arch/sparc64/include/proc/task.h	(revision 31e8ddd3646b281263eac10f5b0878e1700ccd12)
@@ -34,4 +34,5 @@
 
 #define task_create_arch(t)
+#define task_destroy_arch(t)
 
 #endif
Index: generic/include/proc/task.h
===================================================================
--- generic/include/proc/task.h	(revision 9c1c677109242df29e86affb8527c36e254031e2)
+++ generic/include/proc/task.h	(revision 31e8ddd3646b281263eac10f5b0878e1700ccd12)
@@ -93,4 +93,8 @@
 #endif
 
+#ifndef task_destroy_arch
+extern void task_destroy_arch(task_t *t);
+#endif
+
 extern __native sys_task_get_id(task_id_t *uspace_task_id);
 
Index: generic/src/mm/as.c
===================================================================
--- generic/src/mm/as.c	(revision 9c1c677109242df29e86affb8527c36e254031e2)
+++ generic/src/mm/as.c	(revision 31e8ddd3646b281263eac10f5b0878e1700ccd12)
@@ -148,6 +148,8 @@
 	ipl = interrupts_disable();
 	spinlock_lock(&inactive_as_with_asid_lock);
-	if (as->asid != ASID_INVALID && as->asid != ASID_KERNEL) {
-		list_remove(&as->inactive_as_with_asid_link);
+
+	if (as->asid != ASID_INVALID && as != AS_KERNEL) {
+		if (!as->cpu_refcount)
+			list_remove(&as->inactive_as_with_asid_link);
 		asid_put(as->asid);
 	}
Index: generic/src/proc/task.c
===================================================================
--- generic/src/proc/task.c	(revision 9c1c677109242df29e86affb8527c36e254031e2)
+++ generic/src/proc/task.c	(revision 31e8ddd3646b281263eac10f5b0878e1700ccd12)
@@ -141,4 +141,24 @@
 void task_destroy(task_t *t)
 {
+	spinlock_lock(&tasks_lock);
+	btree_remove(&tasks_btree, t->taskid, NULL);
+	spinlock_unlock(&tasks_lock);
+
+	task_destroy_arch(t);
+	btree_destroy(&t->futexes);
+
+	mutex_lock_active(&t->as->lock);
+	if (--t->as->refcount == 0) {
+		mutex_unlock(&t->as->lock);
+		as_destroy(t->as);
+		/*
+		 * t->as is destroyed.
+		 */
+	} else {
+		mutex_unlock(&t->as->lock);
+	}
+	
+	free(t);
+	TASK = NULL;
 }
 
@@ -259,4 +279,6 @@
 	ta->refcount++;
 	spinlock_unlock(&ta->lock);
+
+	spinlock_unlock(&tasks_lock);
 	
 	t = thread_create(ktaskclnp, NULL, ta, 0, "ktaskclnp");
