Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision 174156fd1cf321a6363777352073d05829467b2f)
+++ kernel/generic/src/ipc/ipc.c	(revision faf19d46527b6580aa9e3488fa09a9ff27b64328)
@@ -205,4 +205,5 @@
 	phone->state = IPC_PHONE_FREE;
 	atomic_store(&phone->active_calls, 0);
+	phone->label = 0;
 	phone->kobject = NULL;
 }
@@ -371,5 +372,5 @@
 	}
 
-	call->data.phone = phone;
+	call->data.request_label = phone->label;
 	call->data.task_id = caller->taskid;
 }
@@ -520,5 +521,5 @@
 
 	if (mode & IPC_FF_ROUTE_FROM_ME) {
-		call->data.phone = newphone;
+		call->data.request_label = newphone->label;
 		call->data.task_id = TASK->taskid;
 	}
@@ -670,4 +671,5 @@
 		list_remove(&phone->link);
 		phone->state = IPC_PHONE_SLAMMED;
+		phone->label = 0;
 
 		if (notify_box) {
Index: kernel/generic/src/ipc/ops/conctmeto.c
===================================================================
--- kernel/generic/src/ipc/ops/conctmeto.c	(revision 174156fd1cf321a6363777352073d05829467b2f)
+++ kernel/generic/src/ipc/ops/conctmeto.c	(revision faf19d46527b6580aa9e3488fa09a9ff27b64328)
@@ -46,17 +46,18 @@
 	 * That will be done once the phone is connected.
 	 */
-	cap_phone_handle_t phone_handle;
-	kobject_t *phone_obj;
-	errno_t rc = phone_alloc(TASK, false, &phone_handle, &phone_obj);
+	cap_phone_handle_t phandle;
+	kobject_t *pobj;
+	errno_t rc = phone_alloc(TASK, false, &phandle, &pobj);
 	if (rc != EOK) {
-		call->priv = -1;
+		call->priv = 0;
 		return rc;
 	}
 
-	/* Hand over phone_obj's reference to ARG5 */
-	IPC_SET_ARG5(call->data, (sysarg_t) phone_obj->phone);
+	/* Move pobj's reference to call->priv */
+	call->priv = (sysarg_t) pobj;
+	pobj = NULL;
 
 	/* Remember the handle */
-	call->priv = CAP_HANDLE_RAW(phone_handle);
+	IPC_SET_ARG5(call->data, (sysarg_t) phandle);
 
 	return EOK;
@@ -65,14 +66,15 @@
 static errno_t request_forget(call_t *call)
 {
-	cap_phone_handle_t phone_handle = (cap_handle_t) call->priv;
+	cap_phone_handle_t phandle = (cap_handle_t) IPC_GET_ARG5(call->data);
 
-	if (CAP_HANDLE_RAW(phone_handle) < 0)
+	if (CAP_HANDLE_RAW(phandle) < 0)
 		return EOK;
 
-	/* Hand over reference from ARG5 to phone->kobject */
-	phone_t *phone = (phone_t *) IPC_GET_ARG5(call->data);
-	/* Drop phone->kobject's reference */
-	kobject_put(phone->kobject);
-	cap_free(TASK, phone_handle);
+	/* Move reference from call->priv to pobj */
+	kobject_t *pobj = (kobject_t *) call->priv;
+	call->priv = 0;
+	/* Drop pobj's reference */
+	kobject_put(pobj);
+	cap_free(TASK, phandle);
 
 	return EOK;
@@ -81,19 +83,21 @@
 static errno_t answer_preprocess(call_t *answer, ipc_data_t *olddata)
 {
-	/* Hand over reference from ARG5 to phone */
-	phone_t *phone = (phone_t *) IPC_GET_ARG5(*olddata);
+	/* Get an extra reference for phone */
+	kobject_t *pobj = (kobject_t *) answer->priv;
+	kobject_add_ref(pobj);
 
-	/*
-	 * Get an extra reference and pass it in the answer data.
-	 */
-	kobject_add_ref(phone->kobject);
-	IPC_SET_ARG5(answer->data, (sysarg_t) phone);
+	/* Set the recipient-assigned label */
+	pobj->phone->label = IPC_GET_ARG5(answer->data);
+
+	/* Restore phone handle in answer's ARG5 */
+	IPC_SET_ARG5(answer->data, IPC_GET_ARG5(*olddata));
 
 	/* If the user accepted the call, connect */
 	if (IPC_GET_RETVAL(answer->data) == EOK) {
-		/* Hand over reference from phone to the answerbox */
-		(void) ipc_phone_connect(phone, &TASK->answerbox);
+		/* Hand over reference from pobj to the answerbox */
+		(void) ipc_phone_connect(pobj->phone, &TASK->answerbox);
 	} else {
-		kobject_put(phone->kobject);
+		/* Drop the extra reference */
+		kobject_put(pobj);
 	}
 
@@ -103,15 +107,17 @@
 static errno_t answer_process(call_t *answer)
 {
-	cap_phone_handle_t phone_handle = (cap_handle_t) answer->priv;
-	phone_t *phone = (phone_t *) IPC_GET_ARG5(answer->data);
+	cap_phone_handle_t phandle = (cap_handle_t) IPC_GET_ARG5(answer->data);
+	/* Move the reference from answer->priv to pobj */
+	kobject_t *pobj = (kobject_t *) answer->priv;
+	answer->priv = 0;
 
 	if (IPC_GET_RETVAL(answer->data)) {
-		if (CAP_HANDLE_RAW(phone_handle) >= 0) {
+		if (CAP_HANDLE_RAW(phandle) >= 0) {
 			/*
 			 * Cleanup the unpublished capability and drop
 			 * phone->kobject's reference.
 			 */
-			kobject_put(phone->kobject);
-			cap_free(TASK, phone_handle);
+			kobject_put(pobj);
+			cap_free(TASK, phandle);
 		}
 	} else {
@@ -121,7 +127,5 @@
 		 * capability for each phone that wasn't hung up by the user.
 		 */
-		cap_publish(TASK, phone_handle, phone->kobject);
-
-		IPC_SET_ARG5(answer->data, CAP_HANDLE_RAW(phone_handle));
+		cap_publish(TASK, phandle, pobj);
 	}
 
Index: kernel/generic/src/ipc/ops/concttome.c
===================================================================
--- kernel/generic/src/ipc/ops/concttome.c	(revision 174156fd1cf321a6363777352073d05829467b2f)
+++ kernel/generic/src/ipc/ops/concttome.c	(revision faf19d46527b6580aa9e3488fa09a9ff27b64328)
@@ -42,10 +42,15 @@
 static int request_process(call_t *call, answerbox_t *box)
 {
-	cap_phone_handle_t phone_handle;
-	kobject_t *phone_obj;
-	errno_t rc = phone_alloc(TASK, false, &phone_handle, &phone_obj);
-	call->priv = (sysarg_t) phone_obj;
-	IPC_SET_ARG5(call->data,
-	    (rc == EOK) ? CAP_HANDLE_RAW(phone_handle) : CAP_NIL);
+	cap_phone_handle_t phandle = CAP_NIL;
+	kobject_t *pobj = NULL;
+	errno_t rc = phone_alloc(TASK, false, &phandle, &pobj);
+	if (rc == EOK) {
+		/*
+		 * Set the sender-assigned label to the new phone.
+		 */
+		pobj->phone->label = IPC_GET_ARG5(call->data);
+	}
+	call->priv = (sysarg_t) pobj;
+	IPC_SET_ARG5(call->data, CAP_HANDLE_RAW(phandle));
 	return 0;
 }
@@ -53,10 +58,10 @@
 static errno_t answer_cleanup(call_t *answer, ipc_data_t *olddata)
 {
-	cap_phone_handle_t phone_handle = (cap_handle_t) IPC_GET_ARG5(*olddata);
-	kobject_t *phone_obj = (kobject_t *) answer->priv;
+	cap_phone_handle_t phandle = (cap_handle_t) IPC_GET_ARG5(*olddata);
+	kobject_t *pobj = (kobject_t *) answer->priv;
 
-	if (CAP_HANDLE_VALID(phone_handle)) {
-		kobject_put(phone_obj);
-		cap_free(TASK, phone_handle);
+	if (CAP_HANDLE_VALID(phandle)) {
+		kobject_put(pobj);
+		cap_free(TASK, phandle);
 	}
 
@@ -66,11 +71,11 @@
 static errno_t answer_preprocess(call_t *answer, ipc_data_t *olddata)
 {
-	cap_phone_handle_t phone_handle = (cap_handle_t) IPC_GET_ARG5(*olddata);
-	kobject_t *phone_obj = (kobject_t *) answer->priv;
+	cap_phone_handle_t phandle = (cap_handle_t) IPC_GET_ARG5(*olddata);
+	kobject_t *pobj = (kobject_t *) answer->priv;
 
 	if (IPC_GET_RETVAL(answer->data) != EOK) {
 		/* The connection was not accepted */
 		answer_cleanup(answer, olddata);
-	} else if (CAP_HANDLE_VALID(phone_handle)) {
+	} else if (CAP_HANDLE_VALID(phandle)) {
 		/*
 		 * The connection was accepted
@@ -81,13 +86,10 @@
 		 * will be consumed by ipc_phone_connect().
 		 */
-		kobject_add_ref(phone_obj);
+		kobject_add_ref(pobj);
 
-		if (ipc_phone_connect(phone_obj->phone,
+		if (ipc_phone_connect(pobj->phone,
 		    &answer->sender->answerbox)) {
 			/* Pass the reference to the capability */
-			cap_publish(TASK, phone_handle, phone_obj);
-			/* Set 'phone hash' as ARG5 of response */
-			IPC_SET_ARG5(answer->data,
-			    (sysarg_t) phone_obj->phone);
+			cap_publish(TASK, phandle, pobj);
 		} else {
 			/* The answerbox is shutting down. */
Index: kernel/generic/src/ipc/sysipc.c
===================================================================
--- kernel/generic/src/ipc/sysipc.c	(revision 174156fd1cf321a6363777352073d05829467b2f)
+++ kernel/generic/src/ipc/sysipc.c	(revision faf19d46527b6580aa9e3488fa09a9ff27b64328)
@@ -202,4 +202,5 @@
 			kobject_put(phone->kobject);
 			phone->state = IPC_PHONE_SLAMMED;
+			phone->label = 0;
 			irq_spinlock_unlock(&phone->callee->lock, true);
 		}
@@ -386,5 +387,5 @@
 
 	/* Set the user-defined label */
-	call->data.label = label;
+	call->data.answer_label = label;
 
 	errno_t res = request_preprocess(call, kobj->phone);
@@ -430,5 +431,5 @@
 
 	/* Set the user-defined label */
-	call->data.label = label;
+	call->data.answer_label = label;
 
 	errno_t res = request_preprocess(call, kobj->phone);
@@ -504,7 +505,11 @@
 	if (!method_is_immutable(IPC_GET_IMETHOD(call->data))) {
 		if (method_is_system(IPC_GET_IMETHOD(call->data))) {
-			if (IPC_GET_IMETHOD(call->data) == IPC_M_CONNECT_TO_ME)
-				phone_dealloc((cap_phone_handle_t)
-				    IPC_GET_ARG5(call->data));
+			if (IPC_GET_IMETHOD(call->data) ==
+			    IPC_M_CONNECT_TO_ME) {
+				kobject_put((kobject_t *) call->priv);
+				call->priv = 0;
+				cap_free(TASK,
+				    (cap_handle_t) IPC_GET_ARG5(call->data));
+			}
 
 			IPC_SET_ARG1(call->data, imethod);
@@ -771,6 +776,6 @@
 	call->data.flags = call->flags;
 	if (call->flags & IPC_CALL_NOTIF) {
-		/* Set in_phone_hash to the interrupt counter */
-		call->data.phone = (void *) call->priv;
+		/* Set the request_label to the interrupt counter */
+		call->data.request_label = (sysarg_t) call->priv;
 
 		call->data.cap_handle = CAP_NIL;
