Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision fcfa926b2317b908a3f89771e91374c54f076261)
+++ kernel/generic/src/ipc/ipc.c	(revision f9841e692b7ead7f19c6caf92ef08eeb5f912775)
@@ -171,5 +171,5 @@
  *
  */
-static void _ipc_answer_free_call(call_t *call, bool selflocked)
+void _ipc_answer_free_call(call_t *call, bool selflocked)
 {
 	/* Count sent answer */
@@ -306,8 +306,5 @@
 	if (phone->state != IPC_PHONE_CONNECTED) {
 		mutex_unlock(&phone->lock);
-		if (call->flags & IPC_CALL_FORWARDED) {
-			IPC_SET_RETVAL(call->data, EFORWARD);
-			_ipc_answer_free_call(call, false);
-		} else {
+		if (!(call->flags & IPC_CALL_FORWARDED)) {
 			if (phone->state == IPC_PHONE_HUNGUP)
 				ipc_backsend_err(phone, call, EHANGUP);
Index: kernel/generic/src/ipc/sysipc.c
===================================================================
--- kernel/generic/src/ipc/sysipc.c	(revision fcfa926b2317b908a3f89771e91374c54f076261)
+++ kernel/generic/src/ipc/sysipc.c	(revision f9841e692b7ead7f19c6caf92ef08eeb5f912775)
@@ -412,11 +412,16 @@
 {
 	call_t *call = get_call(callid);
-	bool need_old;
+	phone_t *phone;
+	bool need_old = answer_need_old(call);
+	bool after_forward = false;
+	ipc_data_t old;
 	int rc;
 
 	if (!call)
 		return ENOENT;
-	
-	phone_t *phone;
+
+	if (need_old)
+		old = call->data;
+	
 	if (phone_get(phoneid, &phone) != EOK) {
 		rc = ENOENT;
@@ -465,16 +470,20 @@
 	}
 	
-	return ipc_forward(call, phone, &TASK->answerbox, mode);
+	rc = ipc_forward(call, phone, &TASK->answerbox, mode);
+	if (rc != EOK) {
+		after_forward = true;
+		goto error;
+	}
+
+	return EOK;
 
 error:
-	need_old = answer_need_old(call);
-	ipc_data_t old;
-
-	if (need_old)
-		old = call->data;
-
 	IPC_SET_RETVAL(call->data, EFORWARD);
 	answer_preprocess(call, need_old ? &old : NULL);
-	ipc_answer(&TASK->answerbox, call);
+	if (after_forward)
+		_ipc_answer_free_call(call, false);
+	else
+		ipc_answer(&TASK->answerbox, call);
+
 	return rc;
 }
