Index: kernel/generic/include/ipc/ipc.h
===================================================================
--- kernel/generic/include/ipc/ipc.h	(revision 6d351e674a67b6ecee3c205c0f09e29e92b462be)
+++ kernel/generic/include/ipc/ipc.h	(revision bc117a5ac32e41495ea60ebd89a93d3ffea64de7)
@@ -179,4 +179,5 @@
 extern void ipc_call_release(call_t *);
 
+extern int ipc_call_sync(phone_t *, call_t *);
 extern int ipc_call(phone_t *, call_t *);
 extern call_t *ipc_wait_for_call(answerbox_t *, uint32_t, unsigned int);
Index: kernel/generic/include/ipc/sysipc.h
===================================================================
--- kernel/generic/include/ipc/sysipc.h	(revision 6d351e674a67b6ecee3c205c0f09e29e92b462be)
+++ kernel/generic/include/ipc/sysipc.h	(revision bc117a5ac32e41495ea60ebd89a93d3ffea64de7)
@@ -40,4 +40,6 @@
 #include <typedefs.h>
 
+extern int ipc_req_internal(int, ipc_data_t *);
+
 extern sysarg_t sys_ipc_call_async_fast(sysarg_t, sysarg_t, sysarg_t,
     sysarg_t, sysarg_t, sysarg_t);
Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision 6d351e674a67b6ecee3c205c0f09e29e92b462be)
+++ kernel/generic/src/ipc/ipc.c	(revision bc117a5ac32e41495ea60ebd89a93d3ffea64de7)
@@ -188,4 +188,32 @@
 }
 
+/** Helper function to facilitate synchronous calls.
+ *
+ * @param phone   Destination kernel phone structure.
+ * @param request Call structure with request.
+ *
+ * @return EOK on success or a negative error code.
+ *
+ */
+int ipc_call_sync(phone_t *phone, call_t *request)
+{
+	answerbox_t *mybox = slab_alloc(ipc_answerbox_slab, 0);
+	ipc_answerbox_init(mybox, TASK);
+	
+	/* We will receive data in a special box. */
+	request->callerbox = mybox;
+	
+	int rc = ipc_call(phone, request);
+	if (rc != EOK) {
+		slab_free(ipc_answerbox_slab, mybox);
+		return rc;
+	}
+	// TODO: forget the call if interrupted
+	(void) ipc_wait_for_call(mybox, SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE);
+	
+	slab_free(ipc_answerbox_slab, mybox);
+	return EOK;
+}
+
 /** Answer a message which was not dispatched and is not listed in any queue.
  *
@@ -756,5 +784,5 @@
 	ipc_cleanup_call_list(&TASK->answerbox,
 	    &TASK->answerbox.dispatched_calls);
-
+ 	
 	ipc_forget_all_active_calls();
 	ipc_wait_for_all_answered_calls();
Index: kernel/generic/src/ipc/sysipc.c
===================================================================
--- kernel/generic/src/ipc/sysipc.c	(revision 6d351e674a67b6ecee3c205c0f09e29e92b462be)
+++ kernel/generic/src/ipc/sysipc.c	(revision bc117a5ac32e41495ea60ebd89a93d3ffea64de7)
@@ -257,4 +257,47 @@
 {
 	return SYSIPC_OP(request_process, call, box);
+}
+
+/** Make a call over IPC and wait for reply.
+ *
+ * @param phoneid     Phone handle for the call.
+ * @param data[inout] Structure with request/reply data.
+ *
+ * @return EOK on success.
+ * @return ENOENT if there is no such phone handle.
+ *
+ */
+int ipc_req_internal(int phoneid, ipc_data_t *data)
+{
+	phone_t *phone;
+	if (phone_get(phoneid, &phone) != EOK)
+		return ENOENT;
+	
+	call_t *call = ipc_call_alloc(0);
+	memcpy(call->data.args, data->args, sizeof(data->args));
+	
+	int rc = request_preprocess(call, phone);
+	if (!rc) {
+#ifdef CONFIG_UDEBUG
+		udebug_stoppable_begin();
+#endif
+
+		rc = ipc_call_sync(phone, call); 
+
+#ifdef CONFIG_UDEBUG
+		udebug_stoppable_end();
+#endif
+
+		if (rc != EOK)
+			return EINTR;
+
+		process_answer(call);
+	} else
+		IPC_SET_RETVAL(call->data, rc);
+	
+	memcpy(data->args, call->data.args, sizeof(data->args));
+	ipc_call_free(call);
+	
+	return EOK;
 }
 
