Index: uspace/lib/c/generic/async.c
===================================================================
--- uspace/lib/c/generic/async.c	(revision 0f4532eacacffee1dfacd43bc26f46e3dc904200)
+++ uspace/lib/c/generic/async.c	(revision 93ad49a84b4c98526fa998394274bbd6c68b4f7d)
@@ -1658,19 +1658,20 @@
 }
 
-/** Shift arguments for new connections left by one.
+/** Set arguments for new connections.
  *
  * FIXME This is an ugly hack to work around the problem that parallel
  * exchanges are implemented using parallel connections. When we create
- * such a session via a naming server, the naming server shifts the
- * arguments for the initial connection, but not for the latter connections.
+ * a callback session, the framework does not know arguments for the new
+ * connections.
  *
  * The proper solution seems to be to implement parallel exchanges using
  * tagging.
  */
-void async_sess_args_shift(async_sess_t *sess)
-{
-	sess->arg1 = sess->arg2;
-	sess->arg2 = sess->arg3;
-	sess->arg3 = 0;
+void async_sess_args_set(async_sess_t *sess, sysarg_t arg1, sysarg_t arg2,
+    sysarg_t arg3)
+{
+	sess->arg1 = arg1;
+	sess->arg2 = arg2;
+	sess->arg3 = arg3;
 }
 
Index: uspace/lib/c/generic/ns.c
===================================================================
--- uspace/lib/c/generic/ns.c	(revision 0f4532eacacffee1dfacd43bc26f46e3dc904200)
+++ uspace/lib/c/generic/ns.c	(revision 93ad49a84b4c98526fa998394274bbd6c68b4f7d)
@@ -61,5 +61,5 @@
 	 * first argument for non-initial connections.
 	 */
-	async_sess_args_shift(sess);
+	async_sess_args_set(sess, arg2, arg3, 0);
 	
 	return sess;
Index: uspace/lib/c/include/async.h
===================================================================
--- uspace/lib/c/include/async.h	(revision 0f4532eacacffee1dfacd43bc26f46e3dc904200)
+++ uspace/lib/c/include/async.h	(revision 93ad49a84b4c98526fa998394274bbd6c68b4f7d)
@@ -333,8 +333,12 @@
 extern void async_poke(void);
 
-void async_sess_args_shift(async_sess_t *sess);
-
 extern async_exch_t *async_exchange_begin(async_sess_t *);
 extern void async_exchange_end(async_exch_t *);
+
+/*
+ * FIXME These functions just work around problems with parallel exchange
+ * management. Proper solution needs to be implemented.
+ */
+void async_sess_args_set(async_sess_t *sess, sysarg_t, sysarg_t, sysarg_t);
 
 /*
