Index: uspace/lib/libc/generic/ipc.c
===================================================================
--- uspace/lib/libc/generic/ipc.c	(revision 0c09f2b5b069871c49c79e41106502db160094db)
+++ uspace/lib/libc/generic/ipc.c	(revision 32099239a6124d59220f89570e99659141d22ed7)
@@ -190,5 +190,5 @@
 static ipc_callid_t _ipc_call_async(int phoneid, ipc_call_t *data)
 {
-	return __SYSCALL2(SYS_IPC_CALL_ASYNC, phoneid, (sysarg_t) data);
+	return __SYSCALL2(SYS_IPC_CALL_ASYNC_SLOW, phoneid, (sysarg_t) data);
 }
 
@@ -269,6 +269,6 @@
 /** Make a fast asynchronous call.
  *
- * This function can only handle two arguments of payload. It is, however,
- * faster than the more generic ipc_call_async_3().
+ * This function can only handle four arguments of payload. It is, however,
+ * faster than the more generic ipc_call_async_slow().
  *
  * Note that this function is a void function.
@@ -281,4 +281,6 @@
  * @param arg1		Service-defined payload argument.
  * @param arg2		Service-defined payload argument.
+ * @param arg3		Service-defined payload argument.
+ * @param arg4		Service-defined payload argument.
  * @param private	Argument to be passed to the answer/error callback.
  * @param callback	Answer or error callback.
@@ -287,7 +289,7 @@
  *			asynchronous calls.
  */
-void ipc_call_async_2(int phoneid, ipcarg_t method, ipcarg_t arg1,
-    ipcarg_t arg2, void *private, ipc_async_callback_t callback,
-    int can_preempt)
+void ipc_call_async_fast(int phoneid, ipcarg_t method, ipcarg_t arg1,
+    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, void *private,
+    ipc_async_callback_t callback, int can_preempt)
 {
 	async_call_t *call = NULL;
@@ -305,6 +307,6 @@
 	 */
 	futex_down(&ipc_futex);
-	callid = __SYSCALL4(SYS_IPC_CALL_ASYNC_FAST, phoneid, method, arg1,
-	    arg2);
+	callid = __SYSCALL6(SYS_IPC_CALL_ASYNC_FAST, phoneid, method, arg1,
+	    arg2, arg3, arg4);
 
 	if (callid == IPC_CALLRET_TEMPORARY) {
@@ -317,4 +319,6 @@
 		IPC_SET_ARG1(call->u.msg.data, arg1);
 		IPC_SET_ARG2(call->u.msg.data, arg2);
+		IPC_SET_ARG3(call->u.msg.data, arg3);
+		IPC_SET_ARG4(call->u.msg.data, arg4);
 	}
 	ipc_finish_async(callid, phoneid, call, can_preempt);
@@ -333,4 +337,6 @@
  * @param arg2		Service-defined payload argument.
  * @param arg3		Service-defined payload argument.
+ * @param arg4		Service-defined payload argument.
+ * @param arg5		Service-defined payload argument.
  * @param private	Argument to be passed to the answer/error callback.
  * @param callback	Answer or error callback.
@@ -340,7 +346,7 @@
  *
  */
-void ipc_call_async_3(int phoneid, ipcarg_t method, ipcarg_t arg1,
-    ipcarg_t arg2, ipcarg_t arg3, void *private, ipc_async_callback_t callback,
-    int can_preempt)
+void ipc_call_async_slow(int phoneid, ipcarg_t method, ipcarg_t arg1,
+    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, void *private,
+    ipc_async_callback_t callback, int can_preempt)
 {
 	async_call_t *call;
@@ -355,7 +361,9 @@
 	IPC_SET_ARG2(call->u.msg.data, arg2);
 	IPC_SET_ARG3(call->u.msg.data, arg3);
+	IPC_SET_ARG4(call->u.msg.data, arg4);
+	IPC_SET_ARG5(call->u.msg.data, arg5);
 	/*
-	 * We need to make sure that we get callid before another thread accesses
-	 * the queue again.
+	 * We need to make sure that we get callid before another thread
+	 * accesses the queue again.
 	 */
 	futex_down(&ipc_futex);
Index: uspace/lib/libc/include/ipc/ipc.h
===================================================================
--- uspace/lib/libc/include/ipc/ipc.h	(revision 0c09f2b5b069871c49c79e41106502db160094db)
+++ uspace/lib/libc/include/ipc/ipc.h	(revision 32099239a6124d59220f89570e99659141d22ed7)
@@ -38,5 +38,4 @@
 #include <kernel/ipc/ipc.h>
 #include <kernel/ddi/irq.h>
-#include <libc.h>
 #include <sys/types.h>
 #include <kernel/synch/synch.h>
@@ -184,5 +183,4 @@
     ipcarg_t *result5);
 
-
 extern ipc_callid_t ipc_wait_cycle(ipc_call_t *call, uint32_t usec, int flags);
 extern ipc_callid_t ipc_wait_for_call_timeout(ipc_call_t *data, uint32_t usec);
@@ -194,19 +192,48 @@
 
 #define ipc_answer_fast_0(callid, retval) \
-	ipc_answer_fast((callid), (retval), 0, 0)
+    ipc_answer_fast((callid), (retval), 0, 0)
 #define ipc_answer_fast_1(callid, retval, arg1) \
-	ipc_answer_fast((callid), (retval), (arg1), 0)
+    ipc_answer_fast((callid), (retval), (arg1), 0)
 extern ipcarg_t ipc_answer_fast(ipc_callid_t callid, ipcarg_t retval,
     ipcarg_t arg1, ipcarg_t arg2);
 extern ipcarg_t ipc_answer(ipc_callid_t callid, ipc_call_t *call);
 
-#define ipc_call_async(phoneid, method, arg1, private, callback, can_preempt) \
-    (ipc_call_async_2(phoneid, method, arg1, 0, private, callback, can_preempt))
-extern void ipc_call_async_2(int phoneid, ipcarg_t method, ipcarg_t arg1,
-    ipcarg_t arg2, void *private, ipc_async_callback_t callback,
-    int can_preempt);
-extern void ipc_call_async_3(int phoneid, ipcarg_t method, ipcarg_t arg1,
-    ipcarg_t arg2, ipcarg_t arg3, void *private, ipc_async_callback_t callback,
-    int can_preempt);
+/*
+ * User-friendly wrappers for ipc_call_async_fast() and ipc_call_async_slow().
+ * They are in the form of ipc_call_async_m(), where m is the number of payload
+ * arguments. The macros decide between the fast and the slow version according
+ * to m.
+ */
+#define ipc_call_async_0(phoneid, method, private, callback, \
+    can_preempt) \
+	ipc_call_async_fast((phoneid), (method), 0, 0, 0, 0, (private), \
+	    (callback), (can_preempt))
+#define ipc_call_async_1(phoneid, method, arg1, private, callback, \
+    can_preempt) \
+	ipc_call_async_fast((phoneid), (method), (arg1), 0, 0, 0, (private), \
+	    (callback), (can_preempt))
+#define ipc_call_async_2(phoneid, method, arg1, arg2, private, callback, \
+    can_preempt) \
+	ipc_call_async_fast((phoneid), (method), (arg1), (arg2), 0, 0, \
+	    (private), (callback), (can_preempt))
+#define ipc_call_async_3(phoneid, method, arg1, arg2, arg3, private, callback, \
+    can_preempt) \
+	ipc_call_async_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, \
+	    (private), (callback), (can_preempt))
+#define ipc_call_async_4(phoneid, method, arg1, arg2, arg3, arg4, private, \
+    callback, can_preempt) \
+	ipc_call_async_fast((phoneid), (method), (arg1), (arg2), (arg3), \
+	    (arg4), (private), (callback), (can_preempt))
+#define ipc_call_async_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, \
+    private, callback, can_preempt) \
+	ipc_call_async_slow((phoneid), (method), (arg1), (arg2), (arg3), \
+	    (arg4), (arg5), (private), (callback), (can_preempt))
+
+extern void ipc_call_async_fast(int phoneid, ipcarg_t method, ipcarg_t arg1,
+    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, void *private,
+    ipc_async_callback_t callback, int can_preempt);
+extern void ipc_call_async_slow(int phoneid, ipcarg_t method, ipcarg_t arg1,
+    ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, void *private,
+    ipc_async_callback_t callback, int can_preempt);
 
 extern int ipc_connect_to_me(int phoneid, int arg1, int arg2, ipcarg_t *phone);
