Index: kernel/generic/include/ipc/ipc.h
===================================================================
--- kernel/generic/include/ipc/ipc.h	(revision 2541646edc3bac5a0e847991c1b508b338a5ba50)
+++ kernel/generic/include/ipc/ipc.h	(revision c33f39f4a55470110026b6a1da1f54f3b2870e05)
@@ -72,4 +72,7 @@
 typedef struct answerbox {
 	IRQ_SPINLOCK_DECLARE(lock);
+
+	/** Answerbox is active until it enters cleanup. */
+	bool active;
 	
 	struct task *task;
@@ -171,5 +174,5 @@
 
 extern void ipc_phone_init(phone_t *);
-extern void ipc_phone_connect(phone_t *, answerbox_t *);
+extern bool ipc_phone_connect(phone_t *, answerbox_t *);
 extern int ipc_phone_hangup(phone_t *);
 
Index: kernel/generic/include/ipc/ipcrsc.h
===================================================================
--- kernel/generic/include/ipc/ipcrsc.h	(revision 2541646edc3bac5a0e847991c1b508b338a5ba50)
+++ kernel/generic/include/ipc/ipcrsc.h	(revision c33f39f4a55470110026b6a1da1f54f3b2870e05)
@@ -42,5 +42,5 @@
 extern int phone_get(sysarg_t, phone_t **);
 extern int phone_alloc(task_t *);
-extern void phone_connect(int, answerbox_t *);
+extern bool phone_connect(int, answerbox_t *);
 extern void phone_dealloc(int);
 
Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision 2541646edc3bac5a0e847991c1b508b338a5ba50)
+++ kernel/generic/src/ipc/ipc.c	(revision c33f39f4a55470110026b6a1da1f54f3b2870e05)
@@ -137,18 +137,24 @@
  * @param phone Initialized phone structure.
  * @param box   Initialized answerbox structure.
- *
- */
-void ipc_phone_connect(phone_t *phone, answerbox_t *box)
-{
+ * @return      True if the phone was connected, false otherwise.
+ */
+bool ipc_phone_connect(phone_t *phone, answerbox_t *box)
+{
+	bool active;
+
 	mutex_lock(&phone->lock);
-	
-	phone->state = IPC_PHONE_CONNECTED;
-	phone->callee = box;
-	
 	irq_spinlock_lock(&box->lock, true);
-	list_append(&phone->link, &box->connected_phones);
+
+	active = box->active;
+	if (active) {
+		phone->state = IPC_PHONE_CONNECTED;
+		phone->callee = box;
+		list_append(&phone->link, &box->connected_phones);
+	}
+
 	irq_spinlock_unlock(&box->lock, true);
-	
 	mutex_unlock(&phone->lock);
+
+	return active;
 }
 
@@ -684,4 +690,14 @@
 void ipc_cleanup(void)
 {
+	/*
+	 * Mark the answerbox as inactive.
+	 *
+	 * The main purpose for doing this is to prevent any pending callback
+	 * connections from getting established beyond this point.
+	 */
+	irq_spinlock_lock(&TASK->answerbox.lock, true);
+	TASK->answerbox.active = false;
+	irq_spinlock_unlock(&TASK->answerbox.lock, true);
+
 	/* Disconnect all our phones ('ipc_phone_hangup') */
 	for (size_t i = 0; i < IPC_MAX_PHONES; i++)
Index: kernel/generic/src/ipc/ipcrsc.c
===================================================================
--- kernel/generic/src/ipc/ipcrsc.c	(revision 2541646edc3bac5a0e847991c1b508b338a5ba50)
+++ kernel/generic/src/ipc/ipcrsc.c	(revision c33f39f4a55470110026b6a1da1f54f3b2870e05)
@@ -241,4 +241,5 @@
  * @param phoneid Phone handle to be connected.
  * @param box     Answerbox to which to connect the phone handle.
+ * @return        True if the phone was connected, false otherwise.
  *
  * The procedure _enforces_ that the user first marks the phone
@@ -247,10 +248,10 @@
  *
  */
-void phone_connect(int phoneid, answerbox_t *box)
+bool phone_connect(int phoneid, answerbox_t *box)
 {
 	phone_t *phone = &TASK->phones[phoneid];
 	
 	ASSERT(phone->state == IPC_PHONE_CONNECTING);
-	ipc_phone_connect(phone, box);
+	return ipc_phone_connect(phone, box);
 }
 
Index: kernel/generic/src/ipc/kbox.c
===================================================================
--- kernel/generic/src/ipc/kbox.c	(revision 2541646edc3bac5a0e847991c1b508b338a5ba50)
+++ kernel/generic/src/ipc/kbox.c	(revision c33f39f4a55470110026b6a1da1f54f3b2870e05)
@@ -48,4 +48,12 @@
 {
 	/*
+	 * Not really needed, just to be consistent with the meaning of
+	 * answerbox_t.active.
+	 */
+	irq_spinlock_lock(&TASK->kb.box.lock, true);
+	TASK->kb.box.active = false;
+	irq_spinlock_unlock(&TASK->kb.box.lock, true);
+
+	/*
 	 * Only hold kb.cleanup_lock while setting kb.finished -
 	 * this is enough.
@@ -234,5 +242,5 @@
 	
 	/* Connect the newly allocated phone to the kbox */
-	ipc_phone_connect(&TASK->phones[newphid], &task->kb.box);
+	(void) ipc_phone_connect(&TASK->phones[newphid], &task->kb.box);
 	
 	if (task->kb.thread != NULL) {
Index: kernel/generic/src/ipc/ops/conctmeto.c
===================================================================
--- kernel/generic/src/ipc/ops/conctmeto.c	(revision 2541646edc3bac5a0e847991c1b508b338a5ba50)
+++ kernel/generic/src/ipc/ops/conctmeto.c	(revision c33f39f4a55470110026b6a1da1f54f3b2870e05)
@@ -65,5 +65,5 @@
 	/* If the user accepted call, connect */
 	if (IPC_GET_RETVAL(answer->data) == EOK)
-		ipc_phone_connect(phone, &TASK->answerbox);
+		(void) ipc_phone_connect(phone, &TASK->answerbox);
 
 	return EOK;
Index: kernel/generic/src/ipc/ops/concttome.c
===================================================================
--- kernel/generic/src/ipc/ops/concttome.c	(revision 2541646edc3bac5a0e847991c1b508b338a5ba50)
+++ kernel/generic/src/ipc/ops/concttome.c	(revision c33f39f4a55470110026b6a1da1f54f3b2870e05)
@@ -73,7 +73,13 @@
 	} else if (phoneid >= 0) {
 		/* The connection was accepted */
-		phone_connect(phoneid, &answer->sender->answerbox);
-		/* Set 'phone hash' as arg5 of response */
-		IPC_SET_ARG5(answer->data, (sysarg_t) &TASK->phones[phoneid]);
+		if (phone_connect(phoneid, &answer->sender->answerbox)) {
+			/* Set 'phone hash' as arg5 of response */
+			IPC_SET_ARG5(answer->data,
+			    (sysarg_t) &TASK->phones[phoneid]);
+		} else {
+			/* The answerbox is shutting down. */
+			IPC_SET_RETVAL(answer->data, ENOENT);
+			answer_cleanup(answer, olddata);
+		}
 	} else {
 		IPC_SET_RETVAL(answer->data, ELIMIT);
Index: kernel/generic/src/ipc/ops/connclone.c
===================================================================
--- kernel/generic/src/ipc/ops/connclone.c	(revision 2541646edc3bac5a0e847991c1b508b338a5ba50)
+++ kernel/generic/src/ipc/ops/connclone.c	(revision c33f39f4a55470110026b6a1da1f54f3b2870e05)
@@ -87,5 +87,5 @@
 	}
 		
-	ipc_phone_connect(&phone->callee->task->phones[newphid],
+	(void) ipc_phone_connect(&phone->callee->task->phones[newphid],
 	    cloned_phone->callee);
 	phones_unlock(cloned_phone, phone);
Index: kernel/generic/src/proc/task.c
===================================================================
--- kernel/generic/src/proc/task.c	(revision 2541646edc3bac5a0e847991c1b508b338a5ba50)
+++ kernel/generic/src/proc/task.c	(revision c33f39f4a55470110026b6a1da1f54f3b2870e05)
@@ -206,4 +206,6 @@
 	event_task_init(task);
 	
+	task->answerbox.active = true;
+
 #ifdef CONFIG_UDEBUG
 	/* Init debugging stuff */
@@ -211,4 +213,5 @@
 	
 	/* Init kbox stuff */
+	task->kb.box.active = true;
 	task->kb.finished = false;
 #endif
@@ -216,5 +219,5 @@
 	if ((ipc_phone_0) &&
 	    (container_check(ipc_phone_0->task->container, task->container)))
-		ipc_phone_connect(&task->phones[0], ipc_phone_0);
+		(void) ipc_phone_connect(&task->phones[0], ipc_phone_0);
 	
 	btree_create(&task->futexes);
