Index: uspace/app/barber/barber.c
===================================================================
--- uspace/app/barber/barber.c	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
+++ uspace/app/barber/barber.c	(revision 0dd16778197e5f50b6e77a71d9b8aeb33b2ad863)
@@ -267,5 +267,5 @@
 			link_initialize(&dev->link);
 			dev->svc_id = svcs[i];
-			dev->sess = loc_service_connect(EXCHANGE_SERIALIZE, svcs[i], 0);
+			dev->sess = loc_service_connect_iface(svcs[i], INTERFACE_DDF_CLIENT, 0);
 			
 			list_append(&dev->link, &led_devs);
Index: uspace/lib/c/generic/async.c
===================================================================
--- uspace/lib/c/generic/async.c	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
+++ uspace/lib/c/generic/async.c	(revision 0dd16778197e5f50b6e77a71d9b8aeb33b2ad863)
@@ -2272,4 +2272,55 @@
 	sess->phone = phone;
 	sess->arg1 = arg1;
+	sess->arg2 = arg2;
+	sess->arg3 = arg3;
+	
+	fibril_mutex_initialize(&sess->remote_state_mtx);
+	sess->remote_state_data = NULL;
+	
+	list_initialize(&sess->exch_list);
+	fibril_mutex_initialize(&sess->mutex);
+	atomic_set(&sess->refcnt, 0);
+	
+	return sess;
+}
+
+/** Wrapper for making IPC_M_CONNECT_ME_TO calls using the async framework.
+ *
+ * Ask through phone for a new connection to some service and block until
+ * success.
+ *
+ * @param exch  Exchange for sending the message.
+ * @param iface Connection interface.
+ * @param arg2  User defined argument.
+ * @param arg3  User defined argument.
+ *
+ * @return New session on success or NULL on error.
+ *
+ */
+async_sess_t *async_connect_me_to_iface(async_exch_t *exch, iface_t iface,
+    sysarg_t arg2, sysarg_t arg3)
+{
+	if (exch == NULL) {
+		errno = ENOENT;
+		return NULL;
+	}
+	
+	async_sess_t *sess = (async_sess_t *) malloc(sizeof(async_sess_t));
+	if (sess == NULL) {
+		errno = ENOMEM;
+		return NULL;
+	}
+	
+	int phone = async_connect_me_to_internal(exch->phone, iface, arg2,
+	    arg3, 0);
+	if (phone < 0) {
+		errno = phone;
+		free(sess);
+		return NULL;
+	}
+	
+	sess->iface = iface;
+	sess->phone = phone;
+	sess->arg1 = iface;
 	sess->arg2 = arg2;
 	sess->arg3 = arg3;
Index: uspace/lib/c/generic/loc.c
===================================================================
--- uspace/lib/c/generic/loc.c	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
+++ uspace/lib/c/generic/loc.c	(revision 0dd16778197e5f50b6e77a71d9b8aeb33b2ad863)
@@ -569,4 +569,17 @@
 }
 
+async_sess_t *loc_service_connect_iface(service_id_t handle, iface_t iface,
+    unsigned int flags)
+{
+	async_sess_t *sess;
+	
+	if (flags & IPC_FLAG_BLOCKING)
+		sess = service_connect_blocking_iface_extended(SERVICE_LOC, iface, handle);
+	else
+		sess = service_connect_iface_extended(SERVICE_LOC, iface, handle);
+	
+	return sess;
+}
+
 async_sess_t *loc_service_connect(exch_mgmt_t mgmt, service_id_t handle,
     unsigned int flags)
Index: uspace/lib/c/generic/ns.c
===================================================================
--- uspace/lib/c/generic/ns.c	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
+++ uspace/lib/c/generic/ns.c	(revision 0dd16778197e5f50b6e77a71d9b8aeb33b2ad863)
@@ -58,4 +58,28 @@
 	async_sess_t *sess =
 	    async_connect_me_to(mgmt, exch, iface, service, arg3);
+	async_exchange_end(exch);
+	
+	if (!sess)
+		return NULL;
+	
+	/*
+	 * FIXME Ugly hack to work around limitation of implementing
+	 * parallel exchanges using multiple connections. Shift out
+	 * first argument for non-initial connections.
+	 */
+	async_sess_args_set(sess, iface, arg3, 0);
+	
+	return sess;
+}
+
+async_sess_t *service_connect_iface_extended(service_t service, iface_t iface,
+    sysarg_t arg3)
+{
+	async_exch_t *exch = async_exchange_begin(session_ns);
+	if (!exch)
+		return NULL;
+	
+	async_sess_t *sess =
+	    async_connect_me_to_iface(exch, iface, service, arg3);
 	async_exchange_end(exch);
 	
Index: uspace/lib/c/include/async.h
===================================================================
--- uspace/lib/c/include/async.h	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
+++ uspace/lib/c/include/async.h	(revision 0dd16778197e5f50b6e77a71d9b8aeb33b2ad863)
@@ -350,4 +350,6 @@
 extern async_sess_t *async_connect_me_to(exch_mgmt_t, async_exch_t *, sysarg_t,
     sysarg_t, sysarg_t);
+extern async_sess_t *async_connect_me_to_iface(async_exch_t *, iface_t,
+    sysarg_t, sysarg_t);
 extern async_sess_t *async_connect_me_to_blocking(exch_mgmt_t, async_exch_t *,
     sysarg_t, sysarg_t, sysarg_t);
Index: uspace/lib/c/include/ipc/devman.h
===================================================================
--- uspace/lib/c/include/ipc/devman.h	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
+++ uspace/lib/c/include/ipc/devman.h	(revision 0dd16778197e5f50b6e77a71d9b8aeb33b2ad863)
@@ -144,5 +144,4 @@
 	DEVMAN_CLIENT,
 	DEVMAN_CONNECT_TO_DEVICE,
-	DEVMAN_CONNECT_FROM_LOC,
 	DEVMAN_CONNECT_TO_PARENTS_DEVICE
 } devman_interface_t;
Index: uspace/lib/c/include/loc.h
===================================================================
--- uspace/lib/c/include/loc.h	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
+++ uspace/lib/c/include/loc.h	(revision 0dd16778197e5f50b6e77a71d9b8aeb33b2ad863)
@@ -65,4 +65,6 @@
 extern loc_object_type_t loc_id_probe(service_id_t);
 
+extern async_sess_t *loc_service_connect_iface(service_id_t, iface_t,
+    unsigned int);
 extern async_sess_t *loc_service_connect(exch_mgmt_t, service_id_t,
     unsigned int);
Index: uspace/lib/c/include/ns.h
===================================================================
--- uspace/lib/c/include/ns.h	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
+++ uspace/lib/c/include/ns.h	(revision 0dd16778197e5f50b6e77a71d9b8aeb33b2ad863)
@@ -43,4 +43,5 @@
 extern int service_register(service_t);
 extern async_sess_t *service_connect(exch_mgmt_t, service_t, sysarg_t);
+extern async_sess_t *service_connect_iface_extended(service_t, iface_t, sysarg_t);
 extern async_sess_t *service_connect_iface(exch_mgmt_t, sysarg_t, service_t, sysarg_t);
 extern async_sess_t *service_connect_blocking(exch_mgmt_t, service_t, sysarg_t);
Index: uspace/srv/devman/loc.c
===================================================================
--- uspace/srv/devman/loc.c	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
+++ uspace/srv/devman/loc.c	(revision 0dd16778197e5f50b6e77a71d9b8aeb33b2ad863)
@@ -60,5 +60,5 @@
 	
 	loc_service_register_with_iface(loc_pathname,
-	    &fun->service_id, DEVMAN_CONNECT_FROM_LOC);
+	    &fun->service_id, INTERFACE_DDF_CLIENT);
 	
 	tree_add_loc_function(tree, fun);
Index: uspace/srv/devman/main.c
===================================================================
--- uspace/srv/devman/main.c	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
+++ uspace/srv/devman/main.c	(revision 0dd16778197e5f50b6e77a71d9b8aeb33b2ad863)
@@ -221,5 +221,5 @@
 		devman_forward(iid, icall, false);
 		break;
-	case DEVMAN_CONNECT_FROM_LOC:
+	case INTERFACE_DDF_CLIENT:
 		/* Someone connected through loc node. */
 		devman_connection_loc(iid, icall);
