Index: uspace/lib/c/generic/async.c
===================================================================
--- uspace/lib/c/generic/async.c	(revision 9c0242b0b40302f92f8d0ac933b78ff30bf0348d)
+++ uspace/lib/c/generic/async.c	(revision ecb692a289b0fbcb7662930ed99c42e844f9e108)
@@ -166,4 +166,6 @@
 	/** Call data of the opening call. */
 	ipc_call_t call;
+	/** Local argument or NULL if none. */
+	void *carg;
 	
 	/** Identification of the closing call. */
@@ -171,5 +173,5 @@
 	
 	/** Fibril function that will be used to handle the connection. */
-	void (*cfibril)(ipc_callid_t, ipc_call_t *);
+	async_client_conn_t cfibril;
 } connection_t;
 
@@ -211,9 +213,11 @@
  * This function is defined as a weak symbol - to be redefined in user code.
  *
- * @param callid Hash of the incoming call.
- * @param call   Data of the incoming call.
- *
- */
-static void default_client_connection(ipc_callid_t callid, ipc_call_t *call)
+ * @param callid	Hash of the incoming call.
+ * @param call		Data of the incoming call.
+ * @param arg		Local argument
+ *
+ */
+static void default_client_connection(ipc_callid_t callid, ipc_call_t *call,
+    void *arg)
 {
 	ipc_answer_0(callid, ENOENT);
@@ -224,6 +228,7 @@
  * This function is defined as a weak symbol - to be redefined in user code.
  *
- * @param callid Hash of the incoming call.
- * @param call   Data of the incoming call.
+ * @param callid	Hash of the incoming call.
+ * @param call  	Data of the incoming call.
+ * @param arg		Local argument.
  *
  */
@@ -233,5 +238,5 @@
 
 static async_client_conn_t client_connection = default_client_connection;
-static async_client_conn_t interrupt_received = default_interrupt_received;
+static async_interrupt_handler_t interrupt_received = default_interrupt_received;
 
 /** Setter for client_connection function pointer.
@@ -250,5 +255,5 @@
  *             notification fibril.
  */
-void async_set_interrupt_received(async_client_conn_t intr)
+void async_set_interrupt_received(async_interrupt_handler_t intr)
 {
 	interrupt_received = intr;
@@ -633,5 +638,5 @@
 	 */
 	fibril_connection->cfibril(fibril_connection->callid,
-	    &fibril_connection->call);
+	    &fibril_connection->call, fibril_connection->carg);
 	
 	/*
@@ -704,4 +709,5 @@
  * @param cfibril       Fibril function that should be called upon opening the
  *                      connection.
+ * @param carg		Extra argument to pass to the connection fibril
  *
  * @return New fibril id or NULL on failure.
@@ -710,5 +716,5 @@
 fid_t async_new_connection(sysarg_t in_task_hash, sysarg_t in_phone_hash,
     ipc_callid_t callid, ipc_call_t *call,
-    async_client_conn_t cfibril)
+    async_client_conn_t cfibril, void *carg)
 {
 	connection_t *conn = malloc(sizeof(*conn));
@@ -725,4 +731,5 @@
 	conn->callid = callid;
 	conn->close_callid = 0;
+	conn->carg = carg;
 	
 	if (call)
@@ -779,5 +786,5 @@
 		/* Open new connection with fibril, etc. */
 		async_new_connection(call->in_task_hash, IPC_GET_ARG5(*call),
-		    callid, call, client_connection);
+		    callid, call, client_connection, NULL);
 		return;
 	}
@@ -1414,5 +1421,5 @@
  */
 int async_connect_to_me(async_exch_t *exch, sysarg_t arg1, sysarg_t arg2,
-    sysarg_t arg3, async_client_conn_t client_receiver)
+    sysarg_t arg3, async_client_conn_t client_receiver, void *carg)
 {
 	if (exch == NULL)
@@ -1428,5 +1435,5 @@
 	if (client_receiver != NULL)
 		async_new_connection(task_hash, phone_hash, 0, NULL,
-		    client_receiver);
+		    client_receiver, carg);
 	
 	return EOK;
Index: uspace/lib/c/generic/async_obsolete.c
===================================================================
--- uspace/lib/c/generic/async_obsolete.c	(revision 9c0242b0b40302f92f8d0ac933b78ff30bf0348d)
+++ uspace/lib/c/generic/async_obsolete.c	(revision ecb692a289b0fbcb7662930ed99c42e844f9e108)
@@ -240,5 +240,5 @@
  */
 int async_obsolete_connect_to_me(int phone, sysarg_t arg1, sysarg_t arg2,
-    sysarg_t arg3, async_client_conn_t client_receiver)
+    sysarg_t arg3, async_client_conn_t client_receiver, void *carg)
 {
 	sysarg_t task_hash;
@@ -251,5 +251,5 @@
 	if (client_receiver != NULL)
 		async_new_connection(task_hash, phone_hash, 0, NULL,
-		    client_receiver);
+		    client_receiver, carg);
 	
 	return EOK;
Index: uspace/lib/c/generic/devman.c
===================================================================
--- uspace/lib/c/generic/devman.c	(revision 9c0242b0b40302f92f8d0ac933b78ff30bf0348d)
+++ uspace/lib/c/generic/devman.c	(revision ecb692a289b0fbcb7662930ed99c42e844f9e108)
@@ -194,5 +194,5 @@
 	
 	exch = devman_exchange_begin(DEVMAN_DRIVER);
-	async_connect_to_me(exch, 0, 0, 0, NULL);
+	async_connect_to_me(exch, 0, 0, 0, NULL, NULL);
 	devman_exchange_end(exch);
 	
Index: uspace/lib/c/generic/devmap.c
===================================================================
--- uspace/lib/c/generic/devmap.c	(revision 9c0242b0b40302f92f8d0ac933b78ff30bf0348d)
+++ uspace/lib/c/generic/devmap.c	(revision ecb692a289b0fbcb7662930ed99c42e844f9e108)
@@ -187,5 +187,5 @@
 	
 	exch = devmap_exchange_begin(DEVMAP_DRIVER);
-	async_connect_to_me(exch, 0, 0, 0, NULL);
+	async_connect_to_me(exch, 0, 0, 0, NULL, NULL);
 	devmap_exchange_end(exch);
 	
Index: uspace/lib/c/generic/net/modules.c
===================================================================
--- uspace/lib/c/generic/net/modules.c	(revision 9c0242b0b40302f92f8d0ac933b78ff30bf0348d)
+++ uspace/lib/c/generic/net/modules.c	(revision ecb692a289b0fbcb7662930ed99c42e844f9e108)
@@ -141,5 +141,6 @@
 	if (phone >= 0) {
 		/* Request the bidirectional connection */
-		int rc = async_obsolete_connect_to_me(phone, arg1, arg2, arg3, client_receiver);
+		int rc = async_obsolete_connect_to_me(phone, arg1, arg2, arg3,
+		    client_receiver, NULL);
 		if (rc != EOK) {
 			async_obsolete_hangup(phone);
Index: uspace/lib/c/generic/net/socket_client.c
===================================================================
--- uspace/lib/c/generic/net/socket_client.c	(revision 9c0242b0b40302f92f8d0ac933b78ff30bf0348d)
+++ uspace/lib/c/generic/net/socket_client.c	(revision ecb692a289b0fbcb7662930ed99c42e844f9e108)
@@ -203,6 +203,7 @@
  * @param[in] iid	The initial message identifier.
  * @param[in] icall	The initial message call structure.
- */
-static void socket_connection(ipc_callid_t iid, ipc_call_t * icall)
+ * @param[in] arg	Local argument.
+ */
+static void socket_connection(ipc_callid_t iid, ipc_call_t * icall, void *arg)
 {
 	ipc_callid_t callid;
Index: uspace/lib/c/generic/ns.c
===================================================================
--- uspace/lib/c/generic/ns.c	(revision 9c0242b0b40302f92f8d0ac933b78ff30bf0348d)
+++ uspace/lib/c/generic/ns.c	(revision ecb692a289b0fbcb7662930ed99c42e844f9e108)
@@ -42,5 +42,5 @@
 {
 	async_exch_t *exch = async_exchange_begin(session_ns);
-	int rc = async_connect_to_me(exch, service, 0, 0, NULL);
+	int rc = async_connect_to_me(exch, service, 0, 0, NULL, NULL);
 	async_exchange_end(exch);
 	
Index: uspace/lib/c/include/async.h
===================================================================
--- uspace/lib/c/include/async.h	(revision 9c0242b0b40302f92f8d0ac933b78ff30bf0348d)
+++ uspace/lib/c/include/async.h	(revision ecb692a289b0fbcb7662930ed99c42e844f9e108)
@@ -53,5 +53,16 @@
 typedef void (*async_client_data_dtor_t)(void *);
 
-typedef void (*async_client_conn_t)(ipc_callid_t, ipc_call_t *);
+/** Client connection handler
+ *
+ * @param callid	ID of incoming call or 0 if connection initiated from
+ *			inside using async_connect_to_me()
+ * @param call		Incoming call or 0 if connection initiated from inside
+ * @param arg		Local argument passed from async_new_connection() or
+ *			async_connect_to_me()
+ */
+typedef void (*async_client_conn_t)(ipc_callid_t, ipc_call_t *, void *);
+
+/** Interrupt handler */
+typedef void (*async_interrupt_handler_t)(ipc_callid_t, ipc_call_t *);
 
 /** Exchange management style
@@ -166,5 +177,5 @@
 
 extern fid_t async_new_connection(sysarg_t, sysarg_t, ipc_callid_t,
-    ipc_call_t *, async_client_conn_t);
+    ipc_call_t *, async_client_conn_t, void *);
 
 extern void async_usleep(suseconds_t);
@@ -177,5 +188,5 @@
 
 extern void async_set_client_connection(async_client_conn_t);
-extern void async_set_interrupt_received(async_client_conn_t);
+extern void async_set_interrupt_received(async_interrupt_handler_t);
 
 /*
@@ -351,5 +362,5 @@
 
 extern int async_connect_to_me(async_exch_t *, sysarg_t, sysarg_t, sysarg_t,
-    async_client_conn_t);
+    async_client_conn_t, void *);
 
 extern int async_hangup(async_sess_t *);
Index: uspace/lib/c/include/async_obsolete.h
===================================================================
--- uspace/lib/c/include/async_obsolete.h	(revision 9c0242b0b40302f92f8d0ac933b78ff30bf0348d)
+++ uspace/lib/c/include/async_obsolete.h	(revision ecb692a289b0fbcb7662930ed99c42e844f9e108)
@@ -198,5 +198,5 @@
 
 extern int async_obsolete_connect_to_me(int, sysarg_t, sysarg_t, sysarg_t,
-    async_client_conn_t);
+    async_client_conn_t, void *);
 extern int async_obsolete_connect_me_to(int, sysarg_t, sysarg_t, sysarg_t);
 extern int async_obsolete_connect_me_to_blocking(int, sysarg_t, sysarg_t, sysarg_t);
