Index: generic/src/ddi/ddi.c
===================================================================
--- generic/src/ddi/ddi.c	(revision 31e8ddd3646b281263eac10f5b0878e1700ccd12)
+++ generic/src/ddi/ddi.c	(revision 2569ec90628757660b8e028954d0481dcbb2c3d7)
@@ -136,10 +136,4 @@
 	}
 
-	/*
-	 * TODO: We are currently lacking support for task destroying.
-	 * Once it is added to the kernel, we must take care to
-	 * synchronize in a way that prevents race conditions here.
-	 */
-	
 	/* Lock the task and release the lock protecting tasks_btree. */
 	spinlock_lock(&t->lock);
Index: generic/src/proc/task.c
===================================================================
--- generic/src/proc/task.c	(revision 31e8ddd3646b281263eac10f5b0878e1700ccd12)
+++ generic/src/proc/task.c	(revision 2569ec90628757660b8e028954d0481dcbb2c3d7)
@@ -141,8 +141,4 @@
 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);
@@ -275,9 +271,10 @@
 		return ENOENT;
 	}
-	
+
 	spinlock_lock(&ta->lock);
 	ta->refcount++;
 	spinlock_unlock(&ta->lock);
 
+	btree_remove(&tasks_btree, ta->taskid, NULL);
 	spinlock_unlock(&tasks_lock);
 	
Index: generic/src/security/cap.c
===================================================================
--- generic/src/security/cap.c	(revision 31e8ddd3646b281263eac10f5b0878e1700ccd12)
+++ generic/src/security/cap.c	(revision 2569ec90628757660b8e028954d0481dcbb2c3d7)
@@ -113,7 +113,12 @@
 		return (__native) ENOENT;
 	}
+	
+	spinlock_lock(&t->lock);
+	cap_set(t, cap_get(t) | caps);
+	spinlock_unlock(&t->lock);
+	
 	spinlock_unlock(&tasks_lock);
 	
-	cap_set(t, cap_get(t) | caps);
+
 	
 	interrupts_restore(ipl);	
@@ -150,5 +155,4 @@
 		return (__native) ENOENT;
 	}
-	spinlock_unlock(&tasks_lock);
 
 	/*
@@ -158,10 +162,15 @@
 	 */
 	if (!(cap_get(TASK) & CAP_CAP) || !(t == TASK)) {
+		spinlock_unlock(&tasks_lock);
 		interrupts_restore(ipl);
 		return (__native) EPERM;
 	}
+	
+	spinlock_lock(&t->lock);
+	cap_set(t, cap_get(t) & ~caps);
+	spinlock_unlock(&t->lock);
 
-	cap_set(t, cap_get(t) & ~caps);
-	
+	spinlock_unlock(&tasks_lock);
+
 	interrupts_restore(ipl);
 	return 0;
