Index: uspace/srv/hid/input/generic/input.c
===================================================================
--- uspace/srv/hid/input/generic/input.c	(revision 4005e37a2d1535eb6403d0b6cb288e64c71a8a0c)
+++ uspace/srv/hid/input/generic/input.c	(revision edb3cf2f04d2b108284b32ca61af972d4d06ac35)
@@ -172,8 +172,16 @@
 
 /** Mouse pointer has moved. */
-void mouse_push_event_move(mouse_dev_t *mdev, int dx, int dy)
+void mouse_push_event_move(mouse_dev_t *mdev, int dx, int dy, int dz)
 {
 	async_exch_t *exch = async_exchange_begin(client_sess);
-	async_msg_2(exch, INPUT_EVENT_MOVE, dx, dy);
+	if (dx || dy)
+		async_msg_2(exch, INPUT_EVENT_MOVE, dx, dy);
+	if (dz) {
+		keycode_t code = dz > 0 ? KC_UP : KC_DOWN;
+		for (int i = 0; i < 3; ++i) {
+			async_msg_4(exch, INPUT_EVENT_KEY, KEY_PRESS, code, 0, 0);
+		}
+		async_msg_4(exch, INPUT_EVENT_KEY, KEY_RELEASE, code, 0, 0);
+	}
 	async_exchange_end(exch);
 }
Index: uspace/srv/hid/input/include/mouse.h
===================================================================
--- uspace/srv/hid/input/include/mouse.h	(revision 4005e37a2d1535eb6403d0b6cb288e64c71a8a0c)
+++ uspace/srv/hid/input/include/mouse.h	(revision edb3cf2f04d2b108284b32ca61af972d4d06ac35)
@@ -62,5 +62,5 @@
 
 extern void mouse_push_data(mouse_dev_t *, sysarg_t);
-extern void mouse_push_event_move(mouse_dev_t *, int, int);
+extern void mouse_push_event_move(mouse_dev_t *, int, int, int);
 extern void mouse_push_event_button(mouse_dev_t *, int, int);
 
Index: uspace/srv/hid/input/proto/adb.c
===================================================================
--- uspace/srv/hid/input/proto/adb.c	(revision 4005e37a2d1535eb6403d0b6cb288e64c71a8a0c)
+++ uspace/srv/hid/input/proto/adb.c	(revision edb3cf2f04d2b108284b32ca61af972d4d06ac35)
@@ -82,5 +82,5 @@
 	
 	if (dx != 0 || dy != 0)
-		mouse_push_event_move(mouse_dev, dx, dy);
+		mouse_push_event_move(mouse_dev, dx, dy, 0);
 }
 
Index: uspace/srv/hid/input/proto/mousedev.c
===================================================================
--- uspace/srv/hid/input/proto/mousedev.c	(revision 4005e37a2d1535eb6403d0b6cb288e64c71a8a0c)
+++ uspace/srv/hid/input/proto/mousedev.c	(revision edb3cf2f04d2b108284b32ca61af972d4d06ac35)
@@ -91,11 +91,12 @@
 		switch (IPC_GET_IMETHOD(call)) {
 		case MOUSEEV_MOVE_EVENT:
-			mouse_push_event_move(mousedev->mouse_dev, IPC_GET_ARG1(call),
-			    IPC_GET_ARG2(call));
+			mouse_push_event_move(mousedev->mouse_dev,
+			    IPC_GET_ARG1(call), IPC_GET_ARG2(call),
+			    IPC_GET_ARG3(call));
 			retval = EOK;
 			break;
 		case MOUSEEV_BUTTON_EVENT:
-			mouse_push_event_button(mousedev->mouse_dev, IPC_GET_ARG1(call),
-			    IPC_GET_ARG2(call));
+			mouse_push_event_button(mousedev->mouse_dev,
+			    IPC_GET_ARG1(call), IPC_GET_ARG2(call));
 			retval = EOK;
 			break;
Index: uspace/srv/hid/input/proto/ps2.c
===================================================================
--- uspace/srv/hid/input/proto/ps2.c	(revision 4005e37a2d1535eb6403d0b6cb288e64c71a8a0c)
+++ uspace/srv/hid/input/proto/ps2.c	(revision edb3cf2f04d2b108284b32ca61af972d4d06ac35)
@@ -126,5 +126,5 @@
 		
 		if (x != 0 || y != 0)
-			mouse_push_event_move(mouse_dev, x, y);
+			mouse_push_event_move(mouse_dev, x, y, 0);
 	}
 }
