Index: abi/include/abi/ipc/interfaces.h
===================================================================
--- abi/include/abi/ipc/interfaces.h	(revision fc22069bde020238acd12a7eb6194ef878fc7e34)
+++ abi/include/abi/ipc/interfaces.h	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
@@ -80,5 +80,9 @@
 typedef enum {
 	INTERFACE_LOADER =
-	    FOURCC_COMPACT('l', 'o', 'a', 'd') | IFACE_EXCHANGE_PARALLEL
+	    FOURCC_COMPACT('l', 'o', 'a', 'd') | IFACE_EXCHANGE_PARALLEL,
+	INTERFACE_TCP_CB =
+	    FOURCC_COMPACT('t', 'c', 'p', ' ') | IFACE_EXCHANGE_SERIALIZE | IFACE_MOD_CALLBACK,
+	INTERFACE_UDP_CB =
+	    FOURCC_COMPACT('u', 'd', 'p', ' ') | IFACE_EXCHANGE_SERIALIZE | IFACE_MOD_CALLBACK
 } iface_t;
 
Index: uspace/lib/c/generic/async.c
===================================================================
--- uspace/lib/c/generic/async.c	(revision fc22069bde020238acd12a7eb6194ef878fc7e34)
+++ uspace/lib/c/generic/async.c	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
@@ -630,4 +630,71 @@
 	.remove_callback = NULL
 };
+
+/** Wrapper for making IPC_M_CONNECT_TO_ME calls using the async framework.
+ *
+ * Ask through phone for a new connection to some service.
+ *
+ * @param exch    Exchange for sending the message.
+ * @param iface   Callback interface.
+ * @param arg1    User defined argument.
+ * @param arg2    User defined argument.
+ * @param handler Callback handler.
+ * @param data    Handler data.
+ * @param port_id ID of the newly created port.
+ *
+ * @return Zero on success or a negative error code.
+ *
+ */
+int async_create_callback_port(async_exch_t *exch, iface_t iface, sysarg_t arg1,
+    sysarg_t arg2, async_port_handler_t handler, void *data, port_id_t *port_id)
+{
+	if ((iface & IFACE_MOD_CALLBACK) != IFACE_MOD_CALLBACK)
+		return EINVAL;
+	
+	if (exch == NULL)
+		return ENOENT;
+	
+	ipc_call_t answer;
+	aid_t req = async_send_3(exch, IPC_M_CONNECT_TO_ME, iface, arg1, arg2,
+	    &answer);
+	
+	sysarg_t ret;
+	async_wait_for(req, &ret);
+	if (ret != EOK)
+		return (int) ret;
+	
+	sysarg_t phone_hash = IPC_GET_ARG5(answer);
+	interface_t *interface;
+	
+	futex_down(&async_futex);
+	
+	ht_link_t *link = hash_table_find(&interface_hash_table, &iface);
+	if (link)
+		interface = hash_table_get_inst(link, interface_t, link);
+	else
+		interface = async_new_interface(iface);
+	
+	if (!interface) {
+		futex_up(&async_futex);
+		return ENOMEM;
+	}
+	
+	port_t *port = async_new_port(interface, handler, data);
+	if (!port) {
+		futex_up(&async_futex);
+		return ENOMEM;
+	}
+	
+	*port_id = port->id;
+	
+	futex_up(&async_futex);
+	
+	fid_t fid = async_new_connection(answer.in_task_id, phone_hash,
+	    0, NULL, handler, data);
+	if (fid == (uintptr_t) NULL)
+		return ENOMEM;
+	
+	return EOK;
+}
 
 static size_t notification_key_hash(void *key)
Index: uspace/lib/c/generic/inet/tcp.c
===================================================================
--- uspace/lib/c/generic/inet/tcp.c	(revision fc22069bde020238acd12a7eb6194ef878fc7e34)
+++ uspace/lib/c/generic/inet/tcp.c	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
@@ -66,5 +66,9 @@
 
 	aid_t req = async_send_0(exch, TCP_CALLBACK_CREATE, NULL);
-	int rc = async_connect_to_me(exch, 0, 0, 0, tcp_cb_conn, tcp);
+	
+	port_id_t port;
+	int rc = async_create_callback_port(exch, INTERFACE_TCP_CB, 0, 0,
+	    tcp_cb_conn, tcp, &port);
+	
 	async_exchange_end(exch);
 
Index: uspace/lib/c/generic/inet/udp.c
===================================================================
--- uspace/lib/c/generic/inet/udp.c	(revision fc22069bde020238acd12a7eb6194ef878fc7e34)
+++ uspace/lib/c/generic/inet/udp.c	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
@@ -53,5 +53,9 @@
 
 	aid_t req = async_send_0(exch, UDP_CALLBACK_CREATE, NULL);
-	int rc = async_connect_to_me(exch, 0, 0, 0, udp_cb_conn, udp);
+	
+	port_id_t port;
+	int rc = async_create_callback_port(exch, INTERFACE_UDP_CB, 0, 0,
+	    udp_cb_conn, udp, &port);
+	
 	async_exchange_end(exch);
 
Index: uspace/lib/c/include/async.h
===================================================================
--- uspace/lib/c/include/async.h	(revision fc22069bde020238acd12a7eb6194ef878fc7e34)
+++ uspace/lib/c/include/async.h	(revision 78bb04b92e09ae2a1fde3ea5b10390585614d400)
@@ -165,4 +165,7 @@
     port_id_t *);
 extern void async_set_fallback_port_handler(async_port_handler_t, void *);
+extern int async_create_callback_port(async_exch_t *, iface_t, sysarg_t,
+    sysarg_t, async_port_handler_t, void *, port_id_t *);
+
 extern void async_set_notification_handler_stack_size(size_t);
 
