Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision c70ce740c4a67c6bc2a75eecfc30ef47cb81ccfb)
+++ kernel/generic/src/ipc/ipc.c	(revision fe12f9f4a762ce1e8283c22cdb1d81da41f8cdda)
@@ -119,4 +119,5 @@
 	spinlock_initialize(&box->irq_lock, "ipc_box_irqlock");
 	waitq_initialize(&box->wq);
+	link_initialize(&box->sync_box_link);
 	list_initialize(&box->connected_phones);
 	list_initialize(&box->calls);
@@ -169,7 +170,18 @@
 {
 	answerbox_t *sync_box; 
+	ipl_t ipl;
 
 	sync_box = slab_alloc(ipc_answerbox_slab, 0);
 	ipc_answerbox_init(sync_box, TASK);
+
+	/*
+	 * Put the answerbox on the TASK's list of synchronous answerboxes so
+	 * that it can be cleaned up if the call is interrupted.
+	 */
+	ipl = interrupts_disable();
+	spinlock_lock(&TASK->lock);
+	list_append(&sync_box->sync_box_link, &TASK->sync_box_head);
+	spinlock_unlock(&TASK->lock);
+	interrupts_restore(ipl);
 
 	/* We will receive data in a special box. */
@@ -179,7 +191,18 @@
 	if (!ipc_wait_for_call(sync_box, SYNCH_NO_TIMEOUT,
 	    SYNCH_FLAGS_INTERRUPTIBLE)) {
-	    	/* The asnwerbox will be freed by someone else. */
+	    	/* The answerbox and the call will be freed by ipc_cleanup(). */
 		return EINTR;
 	}
+
+	/*
+	 * The answer arrived without interruption so we can remove the
+	 * answerbox from the TASK's list of synchronous answerboxes.
+	 */
+	(void) interrupts_disable();
+	spinlock_lock(&TASK->lock);
+	list_remove(&sync_box->sync_box_link);
+	spinlock_unlock(&TASK->lock);
+	interrupts_restore(ipl);
+
 	slab_free(ipc_answerbox_slab, sync_box);
 	return EOK;
@@ -513,4 +536,5 @@
 	int i;
 	call_t *call;
+	ipl_t ipl;
 
 	/* Disconnect all our phones ('ipc_phone_hangup') */
@@ -538,5 +562,19 @@
 	spinlock_unlock(&TASK->answerbox.lock);
 	
-	/* Wait for all async answers to arrive */
+	/* Wait for all answers to interrupted synchronous calls to arrive */
+	ipl = interrupts_disable();
+	while (!list_empty(&TASK->sync_box_head)) {
+		answerbox_t *box = list_get_instance(TASK->sync_box_head.next,
+		    answerbox_t, sync_box_link);
+
+		list_remove(&box->sync_box_link);
+		call = ipc_wait_for_call(box, SYNCH_NO_TIMEOUT,
+		    SYNCH_FLAGS_NONE);
+		ipc_call_free(call);
+		slab_free(ipc_answerbox_slab, box);
+	}
+	interrupts_restore(ipl);
+
+	/* Wait for all answers to asynchronous calls to arrive */
 	while (1) {
 		/* Go through all phones, until all are FREE... */
Index: kernel/generic/src/ipc/sysipc.c
===================================================================
--- kernel/generic/src/ipc/sysipc.c	(revision c70ce740c4a67c6bc2a75eecfc30ef47cb81ccfb)
+++ kernel/generic/src/ipc/sysipc.c	(revision fe12f9f4a762ce1e8283c22cdb1d81da41f8cdda)
@@ -559,5 +559,5 @@
 #endif
 		if (rc != EOK) {
-			/* The call will be freed by someone else. */
+			/* The call will be freed by ipc_cleanup(). */
 			return rc;
 		}
@@ -612,5 +612,5 @@
 #endif
 		if (rc != EOK) {
-			/* The call will be freed by someone else. */
+			/* The call will be freed by ipc_cleanup(). */
 			return rc;
 		}
Index: kernel/generic/src/proc/task.c
===================================================================
--- kernel/generic/src/proc/task.c	(revision c70ce740c4a67c6bc2a75eecfc30ef47cb81ccfb)
+++ kernel/generic/src/proc/task.c	(revision fe12f9f4a762ce1e8283c22cdb1d81da41f8cdda)
@@ -178,4 +178,5 @@
 		ipc_phone_connect(&ta->phones[0], ipc_phone_0);
 	atomic_set(&ta->active_calls, 0);
+	list_initialize(&ta->sync_box_head);
 
 	mutex_initialize(&ta->futexes_lock, MUTEX_PASSIVE);
