Index: uspace/lib/c/generic/async.c
===================================================================
--- uspace/lib/c/generic/async.c	(revision a0fc4be7fc5728e6a3ffacc1dc4b68ada5a428ae)
+++ uspace/lib/c/generic/async.c	(revision 0f4532eacacffee1dfacd43bc26f46e3dc904200)
@@ -1656,4 +1656,21 @@
 	
 	return sess;
+}
+
+/** Shift arguments for new connections left by one.
+ *
+ * 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.
+ *
+ * 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;
 }
 
Index: uspace/lib/c/generic/ns.c
===================================================================
--- uspace/lib/c/generic/ns.c	(revision a0fc4be7fc5728e6a3ffacc1dc4b68ada5a428ae)
+++ uspace/lib/c/generic/ns.c	(revision 0f4532eacacffee1dfacd43bc26f46e3dc904200)
@@ -56,4 +56,11 @@
 	async_exchange_end(exch);
 	
+	/*
+	 * 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_shift(sess);
+	
 	return sess;
 }
Index: uspace/lib/c/include/async.h
===================================================================
--- uspace/lib/c/include/async.h	(revision a0fc4be7fc5728e6a3ffacc1dc4b68ada5a428ae)
+++ uspace/lib/c/include/async.h	(revision 0f4532eacacffee1dfacd43bc26f46e3dc904200)
@@ -333,4 +333,6 @@
 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 *);
