Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision 2405bb5f5417ffd83d27e05ec6b988b032dda577)
+++ kernel/generic/src/ipc/ipc.c	(revision 79754332c900f66938d8f95354b7b119b1ff2aa9)
@@ -190,5 +190,5 @@
 		/* This is a forgotten call and call->sender is not valid. */
 		spinlock_unlock(&call->forget_lock);
-		/* TODO: free the call and its resources */
+		ipc_call_free(call);
 		return;
 	} else {
Index: kernel/generic/src/ipc/sysipc.c
===================================================================
--- kernel/generic/src/ipc/sysipc.c	(revision 2405bb5f5417ffd83d27e05ec6b988b032dda577)
+++ kernel/generic/src/ipc/sysipc.c	(revision 79754332c900f66938d8f95354b7b119b1ff2aa9)
@@ -174,25 +174,32 @@
 }
 
-static int a_preprocess_m_connection_clone(call_t *answer, ipc_data_t *olddata)
+static void cleanup_m_connection_clone(call_t *answer, ipc_data_t *olddata)
 {
 	int phoneid = (int) IPC_GET_ARG1(*olddata);
 	phone_t *phone = &TASK->phones[phoneid];
 
+	/*
+	 * In this case, the connection was established at the request time and
+	 * therefore we need to slam the phone.  We don't merely hangup as that
+	 * would result in sending IPC_M_HUNGUP to the third party on the other
+	 * side of the cloned phone.
+	 */
+	mutex_lock(&phone->lock);
+	if (phone->state == IPC_PHONE_CONNECTED) {
+		irq_spinlock_lock(&phone->callee->lock, true);
+		list_remove(&phone->link);
+		phone->state = IPC_PHONE_SLAMMED;
+		irq_spinlock_unlock(&phone->callee->lock, true);
+	}
+	mutex_unlock(&phone->lock);
+}
+
+static int a_preprocess_m_connection_clone(call_t *answer, ipc_data_t *olddata)
+{
 	if (IPC_GET_RETVAL(answer->data) != EOK) {
 		/*
-		 * The recipient of the cloned phone rejected the offer.  In
-		 * this case, the connection was established at the request
-		 * time and therefore we need to slam the phone.  We don't
-		 * merely hangup as that would result in sending IPC_M_HUNGUP
-		 * to the third party on the other side of the cloned phone.
+		 * The recipient of the cloned phone rejected the offer.
 		 */
-		mutex_lock(&phone->lock);
-		if (phone->state == IPC_PHONE_CONNECTED) {
-			irq_spinlock_lock(&phone->callee->lock, true);
-			list_remove(&phone->link);
-			phone->state = IPC_PHONE_SLAMMED;
-			irq_spinlock_unlock(&phone->callee->lock, true);
-		}
-		mutex_unlock(&phone->lock);
+		cleanup_m_connection_clone(answer, olddata);
 	}
 
@@ -206,5 +213,5 @@
 	if (IPC_GET_RETVAL(answer->data) != EOK) {
 		/*
-		 * The other party on the cloned phoned rejected our request
+		 * The other party on the cloned phone rejected our request
 		 * for connection on the protocol level.  We need to break the
 		 * connection without sending IPC_M_HUNGUP back.
@@ -223,4 +230,11 @@
 }
 
+static void cleanup_m_connect_to_me(call_t *answer, ipc_data_t *olddata)
+{
+	int phoneid = (int) IPC_GET_ARG5(*olddata);
+	
+	phone_dealloc(phoneid);
+}
+
 static int a_preprocess_m_connect_to_me(call_t *answer, ipc_data_t *olddata)
 {
@@ -229,5 +243,5 @@
 	if (IPC_GET_RETVAL(answer->data) != EOK) {
 		/* The connection was not accepted */
-		phone_dealloc(phoneid);
+		cleanup_m_connect_to_me(answer, olddata);
 	} else {
 		/* The connection was accepted */
@@ -240,9 +254,14 @@
 }
 
+static void cleanup_m_connect_me_to(call_t *answer, ipc_data_t *olddata)
+{
+	phone_dealloc(answer->priv);
+}
+
 static int a_preprocess_m_connect_me_to(call_t *answer, ipc_data_t *olddata)
 {
 	phone_t *phone = (phone_t *) IPC_GET_ARG5(*olddata);
 
-	/* If the users accepted call, connect */
+	/* If the user accepted call, connect */
 	if (IPC_GET_RETVAL(answer->data) == EOK)
 		ipc_phone_connect(phone, &TASK->answerbox);
@@ -406,4 +425,25 @@
 }
 
+/** Cleanup additional resources associated with the answer. */
+static void cleanup_forgotten(call_t *answer, ipc_data_t *olddata)
+{
+	if (!olddata)
+		return;
+
+	switch (IPC_GET_IMETHOD(*olddata)) {
+	case IPC_M_CONNECTION_CLONE:
+		cleanup_m_connection_clone(answer, olddata);
+		break;
+	case IPC_M_CONNECT_TO_ME:
+		cleanup_m_connect_to_me(answer, olddata);
+		break;
+	case IPC_M_CONNECT_ME_TO:
+		cleanup_m_connect_me_to(answer, olddata);
+		break;
+	default:
+		break;
+	}
+}
+
 /** Interpret process answer as control information.
  *
@@ -426,5 +466,5 @@
 		 */
 		spinlock_unlock(&answer->forget_lock);
-		/* TODO: free the call and its resources */
+		cleanup_forgotten(answer, olddata);
 		return rc;
 	} else {
