Index: uspace/drv/usbmouse/init.c
===================================================================
--- uspace/drv/usbmouse/init.c	(revision fd5fed83bc13c7430f750d17a9126a5af90cacf1)
+++ uspace/drv/usbmouse/init.c	(revision 8f74140ca5b19e8eb5dec7c5bc38675d17d80bdf)
@@ -100,4 +100,39 @@
 }
 
+static void default_connection_handler(ddf_fun_t *, ipc_callid_t, ipc_call_t *);
+static ddf_dev_ops_t mouse_ops = {
+	.default_handler = default_connection_handler
+};
+
+/** Default handler for IPC methods not handled by DDF.
+ *
+ * @param dev Device handling the call.
+ * @param icallid Call id.
+ * @param icall Call data.
+ */
+void default_connection_handler(ddf_fun_t *fun,
+    ipc_callid_t icallid, ipc_call_t *icall)
+{
+	sysarg_t method = IPC_GET_IMETHOD(*icall);
+
+	usb_mouse_t *mouse = (usb_mouse_t *) fun->driver_data;
+	assert(mouse != NULL);
+
+	if (method == IPC_M_CONNECT_TO_ME) {
+		int callback = IPC_GET_ARG5(*icall);
+
+		if (mouse->console_phone != -1) {
+			async_answer_0(icallid, ELIMIT);
+			return;
+		}
+
+		mouse->console_phone = callback;
+		async_answer_0(icallid, EOK);
+		return;
+	}
+
+	async_answer_0(icallid, EINVAL);
+}
+
 
 int usb_mouse_create(ddf_dev_t *dev)
@@ -108,4 +143,5 @@
 	}
 	mouse->device = dev;
+	mouse->console_phone = -1;
 
 	int rc;
@@ -144,4 +180,7 @@
 		goto leave;
 	}
+
+	mouse->mouse_fun->ops = &mouse_ops;
+
 	rc = ddf_fun_bind(mouse->mouse_fun);
 	if (rc != EOK) {
@@ -157,4 +196,5 @@
 	/* Everything allright. */
 	dev->driver_data = mouse;
+	mouse->mouse_fun->driver_data = mouse;
 
 	return EOK;
Index: uspace/drv/usbmouse/mouse.c
===================================================================
--- uspace/drv/usbmouse/mouse.c	(revision fd5fed83bc13c7430f750d17a9126a5af90cacf1)
+++ uspace/drv/usbmouse/mouse.c	(revision 8f74140ca5b19e8eb5dec7c5bc38675d17d80bdf)
@@ -37,4 +37,5 @@
 #include <usb/debug.h>
 #include <errno.h>
+#include <ipc/mouse.h>
 
 int usb_mouse_polling_fibril(void *arg)
@@ -94,4 +95,20 @@
 		}
 
+		if (mouse->console_phone >= 0) {
+			if ((shift_x != 0) || (shift_y != 0)) {
+				/* FIXME: guessed for QEMU */
+				async_req_2_0(mouse->console_phone,
+				    MEVENT_MOVE,
+				    - shift_x / 10,  - shift_y / 10);
+			}
+			if (butt) {
+				/* FIXME: proper button clicking. */
+				async_req_2_0(mouse->console_phone,
+				    MEVENT_BUTTON, 1, 1);
+				async_req_2_0(mouse->console_phone,
+				    MEVENT_BUTTON, 1, 0);
+			}
+		}
+
 		usb_log_debug("buttons=%s  dX=%+3d  dY=%+3d  wheel=%+3d\n",
 		   str_buttons, shift_x, shift_y, wheel);
Index: uspace/drv/usbmouse/mouse.h
===================================================================
--- uspace/drv/usbmouse/mouse.h	(revision fd5fed83bc13c7430f750d17a9126a5af90cacf1)
+++ uspace/drv/usbmouse/mouse.h	(revision 8f74140ca5b19e8eb5dec7c5bc38675d17d80bdf)
@@ -50,4 +50,5 @@
 	usb_endpoint_pipe_t poll_pipe;
 	suseconds_t poll_interval_us;
+	int console_phone;
 } usb_mouse_t;
 
