Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision 7cf85223604344c546d878a32fb99cb22303d602)
+++ kernel/generic/src/ipc/ipc.c	(revision a4e3976dac7e27c7776b22cdabe3f689766f265d)
@@ -829,8 +829,8 @@
 {
 	ipc_phone_hangup(cap->kobject->phone);
-	kobject_t *kobj = cap_unpublish_locked(cap->task, cap->handle,
+	kobject_t *kobj = cap_unpublish(cap->task, cap->handle,
 	    KOBJECT_TYPE_PHONE);
 	kobject_put(kobj);
-	cap_free_locked(cap->task, cap->handle);
+	cap_free(cap->task, cap->handle);
 	return true;
 }
@@ -839,8 +839,4 @@
 {
 	ipc_irq_unsubscribe(&TASK->answerbox, cap->handle);
-	kobject_t *kobj = cap_unpublish_locked(cap->task, cap->handle,
-	    KOBJECT_TYPE_IRQ);
-	kobject_put(kobj);
-	cap_free_locked(cap->task, cap->handle);
 	return true;
 }
Index: kernel/generic/src/ipc/irq.c
===================================================================
--- kernel/generic/src/ipc/irq.c	(revision 7cf85223604344c546d878a32fb99cb22303d602)
+++ kernel/generic/src/ipc/irq.c	(revision a4e3976dac7e27c7776b22cdabe3f689766f265d)
@@ -271,7 +271,24 @@
 }
 
+static void irq_hash_out(irq_t *irq)
+{
+	irq_spinlock_lock(&irq_uspace_hash_table_lock, true);
+	irq_spinlock_lock(&irq->lock, false);
+	
+	if (irq->notif_cfg.hashed_in) {
+		/* Remove the IRQ from the uspace IRQ hash table. */
+		hash_table_remove_item(&irq_uspace_hash_table, &irq->link);
+		irq->notif_cfg.hashed_in = false;
+	}
+
+	irq_spinlock_unlock(&irq->lock, false);
+	irq_spinlock_unlock(&irq_uspace_hash_table_lock, true);
+}
+
 static void irq_destroy(void *arg)
 {
 	irq_t *irq = (irq_t *) arg;
+
+	irq_hash_out(irq);
 
 	/* Free up the IRQ code and associated structures. */
@@ -373,16 +390,5 @@
 	assert(kobj->irq->notif_cfg.answerbox == box);
 
-	irq_spinlock_lock(&irq_uspace_hash_table_lock, true);
-	irq_spinlock_lock(&kobj->irq->lock, false);
-	
-	if (kobj->irq->notif_cfg.hashed_in) {
-		/* Remove the IRQ from the uspace IRQ hash table. */
-		hash_table_remove_item(&irq_uspace_hash_table,
-		    &kobj->irq->link);
-		kobj->irq->notif_cfg.hashed_in = false;
-	}
-
-	irq_spinlock_unlock(&kobj->irq->lock, false);
-	irq_spinlock_unlock(&irq_uspace_hash_table_lock, true);
+	irq_hash_out(kobj->irq);
 
 	kobject_put(kobj);
