Index: uspace/lib/c/generic/taskman.c
===================================================================
--- uspace/lib/c/generic/taskman.c	(revision 33c5626380c2d2879d8d817b1457a442ef7c531e)
+++ uspace/lib/c/generic/taskman.c	(revision b2f05e2af4e0a8aba1fb4f873e82649ef1c667b4)
@@ -132,8 +132,17 @@
 {
 	async_exch_t *exch = taskman_exchange_begin();
-	errno_t rc = async_connect_to_me(exch, INTERFACE_ANY, TASKMAN_LOADER_CALLBACK, 0);
+	aid_t req = async_send_0(exch, TASKMAN_I_AM_LOADER, NULL);
+
+	errno_t rc = async_connect_to_me(exch, INTERFACE_ANY, 0, 0);
 	taskman_exchange_end(exch);
 
-	return rc;
+	if (rc != EOK) {
+		async_forget(req);
+		return rc;
+	}
+
+	errno_t retval;
+	async_wait_for(req, &retval);
+	return retval;
 }
 
Index: uspace/lib/c/include/ipc/taskman.h
===================================================================
--- uspace/lib/c/include/ipc/taskman.h	(revision 33c5626380c2d2879d8d817b1457a442ef7c531e)
+++ uspace/lib/c/include/ipc/taskman.h	(revision b2f05e2af4e0a8aba1fb4f873e82649ef1c667b4)
@@ -43,9 +43,10 @@
 	TASKMAN_EVENT_CALLBACK,
 	TASKMAN_NEW_TASK,
+
 	TASKMAN_I_AM_NS,
+	TASKMAN_I_AM_LOADER,
 
 	TASKMAN_CONNECT_TO_NS,
-	TASKMAN_CONNECT_TO_LOADER,
-	TASKMAN_LOADER_CALLBACK
+	TASKMAN_CONNECT_TO_LOADER
 } taskman_request_t;
 
Index: uspace/srv/taskman/main.c
===================================================================
--- uspace/srv/taskman/main.c	(revision 33c5626380c2d2879d8d817b1457a442ef7c531e)
+++ uspace/srv/taskman/main.c	(revision b2f05e2af4e0a8aba1fb4f873e82649ef1c667b4)
@@ -222,5 +222,5 @@
 }
 
-static void loader_callback(ipc_call_t *icall)
+static void taskman_i_am_loader(ipc_call_t *icall)
 {
 	DPRINTF("%s:%d from %" PRIu64 "\n", __func__, __LINE__, icall->task_id);
@@ -236,11 +236,5 @@
 
 	/* Create callback connection */
-	sess_ref->sess = async_callback_receive_start(EXCHANGE_ATOMIC, icall);
-	if (sess_ref->sess == NULL) {
-		async_answer_0(icall, EINVAL);
-		return;
-	}
-
-	async_answer_0(icall, EOK);
+	sess_ref->sess = async_callback_receive(EXCHANGE_ATOMIC);
 
 	/* Notify spawners */
@@ -251,24 +245,22 @@
 static void taskman_connection(ipc_call_t *icall, void *arg)
 {
-	/* handle new incoming calls */
-	if (ipc_get_imethod(icall) == IPC_M_CONNECT_ME_TO) {
-		switch (ipc_get_arg2(icall)) {
-		case TASKMAN_NEW_TASK:
-			taskman_new_task(icall);
-			break;
-		case TASKMAN_CONNECT_TO_NS:
-			connect_to_ns(icall);
-			return;
-		case TASKMAN_CONNECT_TO_LOADER:
-			connect_to_loader(icall);
-			return;
-		default:
-			DPRINTF("%s:%d from %" PRIu64 "/%" SCNuPTR "/%" SCNuPTR "/%" SCNuPTR "\n",
-			    __func__, __LINE__,
-			    icall->task_id, ipc_get_imethod(icall),
-			    ipc_get_arg1(icall), ipc_get_arg2(icall));
-			async_answer_0(icall, ENOTSUP);
-			return;
-		}
+	/* handle new incoming IPC_M_CONNECT_ME_TO calls */
+	switch (ipc_get_arg2(icall)) {
+	case TASKMAN_NEW_TASK:
+		taskman_new_task(icall);
+		break;
+	case TASKMAN_CONNECT_TO_NS:
+		connect_to_ns(icall);
+		break;
+	case TASKMAN_CONNECT_TO_LOADER:
+		connect_to_loader(icall);
+		break;
+	default:
+		DPRINTF("%s:%d from %" PRIu64 "/%" SCNuPTR "/%" SCNuPTR "/%" SCNuPTR "\n",
+		    __func__, __LINE__,
+		    icall->task_id, ipc_get_imethod(icall),
+		    ipc_get_arg1(icall), ipc_get_arg2(icall));
+		async_answer_0(icall, ENOTSUP);
+		return;
 	}
 
@@ -277,8 +269,8 @@
 		ipc_call_t call;
 
-		if (!async_get_call(&call)) {
+		if (!async_get_call(&call) || !ipc_get_imethod(&call)) {
 			/* Client disconnected */
 			DPRINTF("%s:%d client disconnected\n", __func__, __LINE__);
-			return;
+			break;
 		}
 
@@ -287,4 +279,7 @@
 			taskman_i_am_ns(&call);
 			break;
+		case TASKMAN_I_AM_LOADER:
+			taskman_i_am_loader(&call);
+			break;
 		case TASKMAN_WAIT:
 			taskman_ctl_wait(&call);
@@ -296,12 +291,4 @@
 			taskman_ctl_ev_callback(&call);
 			break;
-		case IPC_M_CONNECT_TO_ME:
-			if (ipc_get_arg2(&call) == TASKMAN_LOADER_CALLBACK) {
-				loader_callback(&call);
-				break;
-			}
-			goto FALLTHROUGH_DEFAULT;
-			break;
-		FALLTHROUGH_DEFAULT:
 		default:
 			DPRINTF("%s:%d from %" PRIu64 "/%" SCNuPTR "/%" SCNuPTR "/%" SCNuPTR "\n",
