Index: kernel/generic/src/ipc/kbox.c
===================================================================
--- kernel/generic/src/ipc/kbox.c	(revision 569a51acd0cd10a573e65d239ca788a66e80c2db)
+++ kernel/generic/src/ipc/kbox.c	(revision 1afa94dc6d456692c9d48c2e3f7088087ffdc9ca)
@@ -232,9 +232,24 @@
 	}
 	
-	if (task->kb.finished != false) {
+	if (task->kb.finished) {
 		mutex_unlock(&task->kb.cleanup_lock);
 		return EINVAL;
 	}
 	
+	/* Create a kbox thread if necessary. */
+	if (task->kb.thread == NULL) {
+		thread_t *kb_thread = thread_create(kbox_thread_proc, NULL, task,
+		    THREAD_FLAG_NONE, "kbox");
+		
+		if (!kb_thread) {
+			mutex_unlock(&task->kb.cleanup_lock);
+			return ENOMEM;
+		}
+		
+		task->kb.thread = kb_thread;
+		thread_ready(kb_thread);
+	}
+	
+	/* Allocate a new phone. */
 	cap_handle_t phone_handle = phone_alloc(TASK);
 	if (phone_handle < 0) {
@@ -249,24 +264,5 @@
 	(void) ipc_phone_connect(phone_obj->phone, &task->kb.box);
 	
-	if (task->kb.thread != NULL) {
-		mutex_unlock(&task->kb.cleanup_lock);
-		*out_phone = phone_handle;
-		return EOK;
-	}
-	
-	/* Create a kbox thread */
-	thread_t *kb_thread = thread_create(kbox_thread_proc, NULL, task,
-	    THREAD_FLAG_NONE, "kbox");
-	if (!kb_thread) {
-		// FIXME: Shouldn't we clean up phone_handle?
-		mutex_unlock(&task->kb.cleanup_lock);
-		return ENOMEM;
-	}
-	
-	task->kb.thread = kb_thread;
-	thread_ready(kb_thread);
-	
 	mutex_unlock(&task->kb.cleanup_lock);
-	
 	*out_phone = phone_handle;
 	return EOK;
Index: kernel/generic/src/ipc/sysipc.c
===================================================================
--- kernel/generic/src/ipc/sysipc.c	(revision 569a51acd0cd10a573e65d239ca788a66e80c2db)
+++ kernel/generic/src/ipc/sysipc.c	(revision 1afa94dc6d456692c9d48c2e3f7088087ffdc9ca)
@@ -897,23 +897,26 @@
 }
 
-#ifdef __32_BITS__
-
-/** Syscall connect to a task by ID (32 bits)
+/** Syscall connect to a task by ID
  *
  * @return Error code.
  *
  */
-sysarg_t sys_ipc_connect_kbox(sysarg64_t *uspace_taskid, cap_handle_t *uspace_phone)
+sysarg_t sys_ipc_connect_kbox(task_id_t *uspace_taskid, cap_handle_t *uspace_phone)
 {
 #ifdef CONFIG_UDEBUG
-	sysarg64_t taskid;
+	task_id_t taskid;
 	cap_handle_t phone;
-	int rc = copy_from_uspace(&taskid, uspace_taskid, sizeof(sysarg64_t));
+	
+	int rc = copy_from_uspace(&taskid, uspace_taskid, sizeof(task_id_t));
 	if (rc == EOK) {
 		rc = ipc_connect_kbox((task_id_t) taskid, &phone);
 	}
+	
 	if (rc == EOK) {
 		rc = copy_to_uspace(uspace_phone, &phone, sizeof(cap_handle_t));
-		// FIXME: Clean up phone on failure.
+		if (rc != EOK) {
+			// Clean up the phone on failure.
+			sys_ipc_hangup(phone);
+		}
 	}
 	
@@ -924,29 +927,4 @@
 }
 
-#endif  /* __32_BITS__ */
-
-#ifdef __64_BITS__
-
-/** Syscall connect to a task by ID (64 bits)
- *
- * @return Error code.
- *
- */
-sysarg_t sys_ipc_connect_kbox(sysarg_t taskid, cap_handle_t *uspace_phone)
-{
-#ifdef CONFIG_UDEBUG
-	cap_handle_t phone;
-	int rc = ipc_connect_kbox((task_id_t) taskid, &phone);
-	if (rc == EOK) {
-		rc = copy_to_uspace(uspace_phone, &phone, sizeof(cap_handle_t));
-	}
-	return (sysarg_t) rc;
-#else
-	return (sysarg_t) ENOTSUP;
-#endif
-}
-
-#endif  /* __64_BITS__ */
-
 /** @}
  */
