Index: uspace/lib/c/generic/io/con_srv.c
===================================================================
--- uspace/lib/c/generic/io/con_srv.c	(revision 07b7c48db097d0b27a33d03332ecd39ea551a2b9)
+++ uspace/lib/c/generic/io/con_srv.c	(revision 21eeb653ff68913d2cffadcf7ed07f2b3a14eef1)
@@ -35,4 +35,5 @@
  */
 #include <errno.h>
+#include <io/cons_event.h>
 #include <ipc/console.h>
 #include <stdlib.h>
@@ -40,4 +41,28 @@
 
 #include <io/con_srv.h>
+
+static int console_ev_encode(cons_event_t *event, ipc_call_t *call)
+{
+	IPC_SET_ARG1(*call, event->type);
+
+	switch (event->type) {
+	case CEV_KEY:
+		IPC_SET_ARG2(*call, event->ev.key.type);
+		IPC_SET_ARG3(*call, event->ev.key.key);
+		IPC_SET_ARG4(*call, event->ev.key.mods);
+		IPC_SET_ARG5(*call, event->ev.key.c);
+		break;
+	case CEV_POS:
+		IPC_SET_ARG2(*call, (event->ev.pos.pos_id << 16) | (event->ev.pos.type & 0xffff));
+		IPC_SET_ARG3(*call, event->ev.pos.btn_num);
+		IPC_SET_ARG4(*call, event->ev.pos.hpos);
+		IPC_SET_ARG5(*call, event->ev.pos.vpos);
+		break;
+	default:
+		return EIO;
+	}
+
+	return EOK;
+}
 
 static void con_read_srv(con_srv_t *srv, ipc_callid_t callid,
@@ -273,5 +298,6 @@
 {
 	int rc;
-	kbd_event_t event;
+	cons_event_t event;
+	ipc_call_t result;
 
 	if (srv->srvs->ops->get_event == NULL) {
@@ -281,5 +307,17 @@
 
 	rc = srv->srvs->ops->get_event(srv, &event);
-	async_answer_4(callid, rc, event.type, event.key, event.mods, event.c);
+	if (rc != EOK) {
+		async_answer_0(callid, rc);
+		return;
+	}
+
+	rc = console_ev_encode(&event, &result);
+	if (rc != EOK) {
+		async_answer_0(callid, rc);
+		return;
+	}
+
+	async_answer_5(callid, rc, IPC_GET_ARG1(result), IPC_GET_ARG2(result),
+	    IPC_GET_ARG3(result), IPC_GET_ARG4(result), IPC_GET_ARG5(result));
 }
 
Index: uspace/lib/c/generic/io/console.c
===================================================================
--- uspace/lib/c/generic/io/console.c	(revision 07b7c48db097d0b27a33d03332ecd39ea551a2b9)
+++ uspace/lib/c/generic/io/console.c	(revision 21eeb653ff68913d2cffadcf7ed07f2b3a14eef1)
@@ -154,15 +154,40 @@
 }
 
+static int console_ev_decode(ipc_call_t *call, cons_event_t *event)
+{
+	event->type = IPC_GET_ARG1(*call);
+
+	switch (event->type) {
+	case CEV_KEY:
+		event->ev.key.type = IPC_GET_ARG2(*call);
+		event->ev.key.key = IPC_GET_ARG3(*call);
+		event->ev.key.mods = IPC_GET_ARG4(*call);
+		event->ev.key.c = IPC_GET_ARG5(*call);
+		break;
+	case CEV_POS:
+		event->ev.pos.pos_id = IPC_GET_ARG2(*call) >> 16;
+		event->ev.pos.type = IPC_GET_ARG2(*call) & 0xffff;
+		event->ev.pos.btn_num = IPC_GET_ARG3(*call);
+		event->ev.pos.hpos = IPC_GET_ARG4(*call);
+		event->ev.pos.vpos = IPC_GET_ARG5(*call);
+		break;
+	default:
+		return EIO;
+	}
+
+	return EOK;
+}
+
 bool console_get_event(console_ctrl_t *ctrl, cons_event_t *event)
 {
 	if (ctrl->input_aid == 0) {
-		sysarg_t type;
-		sysarg_t key;
-		sysarg_t mods;
-		sysarg_t c;
+		ipc_call_t result;
 		
 		async_exch_t *exch = async_exchange_begin(ctrl->input_sess);
-		int rc = async_req_0_4(exch, CONSOLE_GET_EVENT, &type, &key, &mods, &c);
+		aid_t aid = async_send_0(exch, CONSOLE_GET_EVENT, &result);
 		async_exchange_end(exch);
+		
+		sysarg_t rc;
+		async_wait_for(aid, &rc);
 		
 		if (rc != EOK) {
@@ -171,9 +196,9 @@
 		}
 		
-		event->type = CEV_KEY;
-		event->ev.key.type = type;
-		event->ev.key.key = key;
-		event->ev.key.mods = mods;
-		event->ev.key.c = c;
+		rc = console_ev_decode(&result, event);
+		if (rc != EOK) {
+			errno = rc;
+			return false;
+		}
 	} else {
 		sysarg_t retval;
@@ -187,9 +212,9 @@
 		}
 		
-		event->type = CEV_KEY;
-		event->ev.key.type = IPC_GET_ARG1(ctrl->input_call);
-		event->ev.key.key = IPC_GET_ARG2(ctrl->input_call);
-		event->ev.key.mods = IPC_GET_ARG3(ctrl->input_call);
-		event->ev.key.c = IPC_GET_ARG4(ctrl->input_call);
+		int rc = console_ev_decode(&ctrl->input_call, event);
+		if (rc != EOK) {
+			errno = rc;
+			return false;
+		}
 	}
 	
@@ -225,9 +250,9 @@
 	}
 	
-	event->type = CEV_KEY;
-	event->ev.key.type = IPC_GET_ARG1(ctrl->input_call);
-	event->ev.key.key = IPC_GET_ARG2(ctrl->input_call);
-	event->ev.key.mods = IPC_GET_ARG3(ctrl->input_call);
-	event->ev.key.c = IPC_GET_ARG4(ctrl->input_call);
+	rc = console_ev_decode(&ctrl->input_call, event);
+	if (rc != EOK) {
+		errno = rc;
+		return false;
+	}
 	
 	/* Update timeout */
Index: uspace/lib/c/include/io/con_srv.h
===================================================================
--- uspace/lib/c/include/io/con_srv.h	(revision 07b7c48db097d0b27a33d03332ecd39ea551a2b9)
+++ uspace/lib/c/include/io/con_srv.h	(revision 21eeb653ff68913d2cffadcf7ed07f2b3a14eef1)
@@ -41,5 +41,5 @@
 #include <io/color.h>
 #include <io/concaps.h>
-#include <io/kbd_event.h>
+#include <io/cons_event.h>
 #include <io/pixel.h>
 #include <io/style.h>
@@ -82,5 +82,5 @@
 	void (*set_rgb_color)(con_srv_t *, pixel_t, pixel_t);
 	void (*set_cursor_visibility)(con_srv_t *, bool);
-	int (*get_event)(con_srv_t *, kbd_event_t *);
+	int (*get_event)(con_srv_t *, cons_event_t *);
 } con_ops_t;
 
