Index: arch/amd64/include/syscall.h
===================================================================
--- arch/amd64/include/syscall.h	(revision 25d77096d63abbb97d50a9cafaf9e3e5379a6f5d)
+++ arch/amd64/include/syscall.h	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
@@ -32,5 +32,6 @@
 #include <arch/types.h>
 
-extern __native syscall_handler(__native id, __native a1, __native a2, __native a3);
+extern __native syscall_handler(__native a1,__native a2, __native a3, 
+				__native a4, __native id);
 extern void syscall_setup_cpu(void);
 
Index: arch/amd64/src/syscall.c
===================================================================
--- arch/amd64/src/syscall.c	(revision 25d77096d63abbb97d50a9cafaf9e3e5379a6f5d)
+++ arch/amd64/src/syscall.c	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
@@ -64,8 +64,8 @@
 /** Dispatch system call */
 __native syscall_handler(__native a1, __native a2, __native a3,
-			 __native id)
+			 __native a4, __native id)
 {
 	if (id < SYSCALL_END)
-		return syscall_table[id](a1,a2,a3);
+		return syscall_table[id](a1,a2,a3,a4);
 	else
 		panic("Undefined syscall %d", id);
Index: arch/ia32/src/interrupt.c
===================================================================
--- arch/ia32/src/interrupt.c	(revision 25d77096d63abbb97d50a9cafaf9e3e5379a6f5d)
+++ arch/ia32/src/interrupt.c	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
@@ -108,8 +108,8 @@
 {
 	interrupts_enable();
-	if (istate->edx < SYSCALL_END)
-		istate->eax = syscall_table[istate->edx](istate->eax, istate->ebx, istate->ecx);
+	if (istate->esi < SYSCALL_END)
+		istate->eax = syscall_table[istate->esi](istate->eax, istate->ebx, istate->ecx, istate->edx);
 	else
-		panic("Undefined syscall %d", istate->edx);
+		panic("Undefined syscall %d", istate->esi);
 	interrupts_disable();
 }
Index: arch/mips32/src/exception.c
===================================================================
--- arch/mips32/src/exception.c	(revision 25d77096d63abbb97d50a9cafaf9e3e5379a6f5d)
+++ arch/mips32/src/exception.c	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
@@ -135,8 +135,9 @@
 {
 	interrupts_enable();
-	if (istate->a3 < SYSCALL_END)
-		istate->v0 = syscall_table[istate->a3](istate->a0,
+	if (istate->t0 < SYSCALL_END)
+		istate->v0 = syscall_table[istate->t0](istate->a0,
 						       istate->a1,
-						       istate->a2);
+						       istate->a2,
+						       istate->a3);
 	else
 		panic("Undefined syscall %d", istate->a3);
Index: generic/include/ipc/ipc.h
===================================================================
--- generic/include/ipc/ipc.h	(revision 25d77096d63abbb97d50a9cafaf9e3e5379a6f5d)
+++ generic/include/ipc/ipc.h	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
@@ -78,4 +78,5 @@
 extern void ipc_answer(answerbox_t *box, call_t *request);
 extern void ipc_call(phone_t *phone, call_t *request);
+extern void ipc_call_sync(phone_t *phone, call_t *request);
 extern void ipc_phone_destroy(phone_t *phone);
 extern void ipc_phone_init(phone_t *phone, answerbox_t *box);
Index: generic/include/syscall/syscall.h
===================================================================
--- generic/include/syscall/syscall.h	(revision 25d77096d63abbb97d50a9cafaf9e3e5379a6f5d)
+++ generic/include/syscall/syscall.h	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
@@ -32,8 +32,9 @@
 typedef enum {
 	SYS_CTL = 0,
-	SYS_IO	= 1,
-	SYS_IPC_CALL = 2,
-	SYS_IPC_ANSWER = 3,
-	SYS_IPC_WAIT = 4,
+	SYS_IO,
+	SYS_IPC_CALL_SYNC,
+	SYS_IPC_CALL_ASYNC,
+	SYS_IPC_ANSWER,
+	SYS_IPC_WAIT,
 	SYSCALL_END
 } syscall_t;
Index: generic/src/ipc/ipc.c
===================================================================
--- generic/src/ipc/ipc.c	(revision 25d77096d63abbb97d50a9cafaf9e3e5379a6f5d)
+++ generic/src/ipc/ipc.c	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
@@ -106,6 +106,19 @@
 }
 
-
-/** Send a request using phone to answerbox
+/** Helper function to facilitate synchronous calls */
+void ipc_call_sync(phone_t *phone, call_t *request)
+{
+	answerbox_t sync_box; 
+
+	ipc_answerbox_init(&sync_box);
+
+	/* We will receive data on special box */
+	request->callerbox = &sync_box;
+
+	ipc_call(phone, request);
+	ipc_wait_for_call(&sync_box, 0);
+}
+
+/** Send a asynchronous request using phone to answerbox
  *
  * @param phone Phone connected to answerbox
@@ -200,4 +213,6 @@
 		printf("Received phone call - %P %P\n",
 		       call->data[0], call->data[1]);
+		call->data[0] = 0xbabaaaee;;
+		call->data[1] = 0xaaaaeeee;
 		ipc_answer(&TASK->answerbox, call);
 		printf("Call answered.\n");
Index: generic/src/syscall/syscall.c
===================================================================
--- generic/src/syscall/syscall.c	(revision 25d77096d63abbb97d50a9cafaf9e3e5379a6f5d)
+++ generic/src/syscall/syscall.c	(revision 631ca4d04a2284ebd54da4b84fc569fab1e212a4)
@@ -56,10 +56,41 @@
 }
 
-/** Send a call over syscall
+/** Send a call over IPC, wait for reply, return to user
  *
  * @return Call identification, returns -1 on fatal error, 
            -2 on 'Too many async request, handle answers first
  */
-static __native sys_ipc_call(__native phoneid, __native arg1, __native arg2)
+static __native sys_ipc_call_sync(__native phoneid, __native arg1, 
+				   __native arg2, __native *respdata)
+{
+	call_t *call;
+	phone_t *phone;
+	/* Special answerbox for synchronous messages */
+
+	if (phoneid >= IPC_MAX_PHONES)
+		return -ENOENT;
+
+	phone = &TASK->phones[phoneid];
+	if (!phone->callee)
+		return -ENOENT;
+
+	call = ipc_call_alloc();
+	call->data[0] = arg1;
+	call->data[1] = arg2;
+	
+	ipc_call_sync(phone, call);
+
+	copy_to_uspace(respdata, &call->data, sizeof(__native) * IPC_CALL_LEN);
+
+	return 0;
+}
+
+/** Send an asynchronous call over ipc
+ *
+ * @return Call identification, returns -1 on fatal error, 
+           -2 on 'Too many async request, handle answers first
+ */
+static __native sys_ipc_call_async(__native phoneid, __native arg1, 
+				   __native arg2)
 {
 	call_t *call;
@@ -125,5 +156,6 @@
 	sys_ctl,
 	sys_io,
-	sys_ipc_call,
+	sys_ipc_call_sync,
+	sys_ipc_call_async,
 	sys_ipc_answer,
 	sys_ipc_wait_for_call
