Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision e701eb11c1bab3bbb6c9ec77eae0aff69273dfdf)
+++ kernel/generic/src/ipc/ipc.c	(revision bdd16005b053a10072e178c234e2ba090dda380f)
@@ -212,8 +212,10 @@
  *
  * @param call		Call structure to be answered.
- */
-static void _ipc_answer_free_call(call_t *call)
+ * @param selflocked	If true, then TASK->answebox is locked.
+ */
+static void _ipc_answer_free_call(call_t *call, bool selflocked)
 {
 	answerbox_t *callerbox = call->callerbox;
+	bool do_lock = ((!selflocked) || callerbox != (&TASK->answerbox));
 
 	call->flags |= IPC_CALL_ANSWERED;
@@ -226,7 +228,9 @@
 	}
 
-	spinlock_lock(&callerbox->lock);
+	if (do_lock)
+		spinlock_lock(&callerbox->lock);
 	list_append(&call->link, &callerbox->answers);
-	spinlock_unlock(&callerbox->lock);
+	if (do_lock)
+		spinlock_unlock(&callerbox->lock);
 	waitq_wakeup(&callerbox->wq, WAKEUP_FIRST);
 }
@@ -244,5 +248,5 @@
 	spinlock_unlock(&box->lock);
 	/* Send back answer */
-	_ipc_answer_free_call(call);
+	_ipc_answer_free_call(call, false);
 }
 
@@ -261,5 +265,5 @@
 	atomic_inc(&phone->active_calls);
 	IPC_SET_RETVAL(call->data, err);
-	_ipc_answer_free_call(call);
+	_ipc_answer_free_call(call, false);
 }
 
@@ -300,5 +304,5 @@
 		if (call->flags & IPC_CALL_FORWARDED) {
 			IPC_SET_RETVAL(call->data, EFORWARD);
-			_ipc_answer_free_call(call);
+			_ipc_answer_free_call(call, false);
 		} else {
 			if (phone->state == IPC_PHONE_HUNGUP)
@@ -455,5 +459,5 @@
 
 		IPC_SET_RETVAL(call->data, EHANGUP);
-		_ipc_answer_free_call(call);
+		_ipc_answer_free_call(call, true);
 	}
 }
