Index: uspace/app/mkbd/main.c
===================================================================
--- uspace/app/mkbd/main.c	(revision 3c9eb46fa82f846ca61766409d7a28376d3a81e2)
+++ uspace/app/mkbd/main.c	(revision 266fcd8c981896a0b7c0c891dd44612adb7e6f96)
@@ -140,15 +140,15 @@
 	assert(report != NULL);
 	
-	printf("Calling usb_hid_parse_report() with size %zu and "
-	    "buffer: \n", size);
-	for (size_t i = 0; i < size; ++i) {
-		printf(" %X ", buffer[i]);
-	}
-	printf("\n");
+//	printf("Calling usb_hid_parse_report() with size %zu and "
+//	    "buffer: \n", size);
+//	for (size_t i = 0; i < size; ++i) {
+//		printf(" %X ", buffer[i]);
+//	}
+//	printf("\n");
 	
 	uint8_t report_id;
 	int rc = usb_hid_parse_report(report, buffer, size, &report_id);
 	if (rc != EOK) {
-		printf("Error parsing report: %s\n", str_error(rc));
+//		printf("Error parsing report: %s\n", str_error(rc));
 		return;
 	}
@@ -168,5 +168,9 @@
 	    USB_HID_REPORT_TYPE_INPUT);
 	
+//	printf("Field: %p\n", field);
+	
 	while (field != NULL) {
+//		printf("Field usage: %u, field value: %d\n", field->usage, 
+//		    field->value);
 		if (field->value != 0) {
 			const char *key_str = 
@@ -179,4 +183,5 @@
 		    | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 
 		    USB_HID_REPORT_TYPE_INPUT);
+//		printf("Next field: %p\n", field);
 	}
 	
@@ -200,4 +205,5 @@
 int main(int argc, char *argv[])
 {
+	int act_event = -1;
 	
 	if (argc <= 1) {
@@ -255,5 +261,5 @@
 	}
 	
-	printf("Event length: %zu\n", size);
+//	printf("Event length: %zu\n", size);
 	uint8_t *event = (uint8_t *)malloc(size);
 	if (event == NULL) {
@@ -262,15 +268,16 @@
 	}
 	
-	printf("Event length: %zu\n", size);
+//	printf("Event length: %zu\n", size);
 	
 	size_t actual_size;
+	int event_nr;
 	
 	while (1) {
 		// get event from the driver
-		printf("Getting event from the driver.\n");
+//		printf("Getting event from the driver.\n");
 		
 		/** @todo Try blocking call. */
 		rc = usbhid_dev_get_event(dev_phone, event, size, &actual_size, 
-		    0);
+		    &event_nr, 0);
 		if (rc != EOK) {
 			// hangup phone?
@@ -280,10 +287,15 @@
 		}
 		
-		printf("Got buffer: %p, size: %zu, max size: %zu\n", event, 
-		    actual_size, size);
-		
-		print_key(event, size, report);
-		
-		async_usleep(10000);
+//		printf("Got buffer: %p, size: %zu, max size: %zu\n", event, 
+//		    actual_size, size);
+		
+//		printf("Event number: %d, my actual event: %d\n", event_nr, 
+//		    act_event);
+		if (event_nr > act_event) {
+			print_key(event, size, report);
+			act_event = event_nr;
+		}
+		
+		async_usleep(100000);
 	}
 	
Index: uspace/drv/usbhid/generic/hiddev.c
===================================================================
--- uspace/drv/usbhid/generic/hiddev.c	(revision 3c9eb46fa82f846ca61766409d7a28376d3a81e2)
+++ uspace/drv/usbhid/generic/hiddev.c	(revision 266fcd8c981896a0b7c0c891dd44612adb7e6f96)
@@ -63,5 +63,5 @@
 
 static int usb_generic_hid_get_event(ddf_fun_t *fun, uint8_t *buffer, 
-    size_t size, size_t *act_size, unsigned int flags);
+    size_t size, size_t *act_size, int *event_nr, unsigned int flags);
 
 static int usb_generic_hid_client_connected(ddf_fun_t *fun);
@@ -108,9 +108,10 @@
 
 static int usb_generic_hid_get_event(ddf_fun_t *fun, uint8_t *buffer, 
-    size_t size, size_t *act_size, unsigned int flags)
+    size_t size, size_t *act_size, int *event_nr, unsigned int flags)
 {
 	usb_log_debug2("Generic HID: Get event.\n");
 	
-	if (fun == NULL || fun->driver_data == NULL) {
+	if (fun == NULL || fun->driver_data == NULL || buffer == NULL
+	    || act_size == NULL || event_nr == NULL) {
 		usb_log_debug("No function");
 		return EINVAL;
@@ -137,4 +138,5 @@
 	    hid_dev->input_report_size);
 	*act_size = hid_dev->input_report_size;
+	*event_nr = usb_hid_report_number(hid_dev);
 	
 	// clear the buffer so that it will not be received twice
Index: uspace/lib/drv/generic/remote_usbhid.c
===================================================================
--- uspace/lib/drv/generic/remote_usbhid.c	(revision 3c9eb46fa82f846ca61766409d7a28376d3a81e2)
+++ uspace/lib/drv/generic/remote_usbhid.c	(revision 266fcd8c981896a0b7c0c891dd44612adb7e6f96)
@@ -130,5 +130,6 @@
 
 	size_t act_length;
-	rc = hid_iface->get_event(fun, data, len, &act_length, flags);
+	int event_nr;
+	rc = hid_iface->get_event(fun, data, len, &act_length, &event_nr, flags);
 	if (rc != EOK) {
 		free(data);
@@ -147,5 +148,5 @@
 	free(data);
 
-	async_answer_0(callid, EOK);
+	async_answer_1(callid, EOK, event_nr);
 }
 
Index: uspace/lib/drv/include/usbhid_iface.h
===================================================================
--- uspace/lib/drv/include/usbhid_iface.h	(revision 3c9eb46fa82f846ca61766409d7a28376d3a81e2)
+++ uspace/lib/drv/include/usbhid_iface.h	(revision 266fcd8c981896a0b7c0c891dd44612adb7e6f96)
@@ -109,5 +109,5 @@
 	 */
 	int (*get_event)(ddf_fun_t *fun, uint8_t *buffer, size_t size,
-	    size_t *act_size, unsigned int flags);
+	    size_t *act_size, int *event_nr, unsigned int flags);
 	
 	/** Get size of the report descriptor in bytes.
Index: uspace/lib/usbhid/include/usb/hid/iface.h
===================================================================
--- uspace/lib/usbhid/include/usb/hid/iface.h	(revision 3c9eb46fa82f846ca61766409d7a28376d3a81e2)
+++ uspace/lib/usbhid/include/usb/hid/iface.h	(revision 266fcd8c981896a0b7c0c891dd44612adb7e6f96)
@@ -39,5 +39,5 @@
 
 int usbhid_dev_get_event_length(int, size_t *);
-int usbhid_dev_get_event(int, uint8_t *, size_t, size_t *,
+int usbhid_dev_get_event(int, uint8_t *, size_t, size_t *, int *,
     unsigned int);
 int usbhid_dev_get_report_descriptor_length(int, size_t *);
Index: uspace/lib/usbhid/src/hidiface.c
===================================================================
--- uspace/lib/usbhid/src/hidiface.c	(revision 3c9eb46fa82f846ca61766409d7a28376d3a81e2)
+++ uspace/lib/usbhid/src/hidiface.c	(revision 266fcd8c981896a0b7c0c891dd44612adb7e6f96)
@@ -77,5 +77,5 @@
  */
 int usbhid_dev_get_event(int dev_phone, uint8_t *buf, 
-    size_t size, size_t *actual_size, unsigned int flags)
+    size_t size, size_t *actual_size, int *event_nr, unsigned int flags)
 {
 	if (dev_phone < 0) {
@@ -99,7 +99,8 @@
 	}
 
+	ipc_call_t opening_request_call;
 	aid_t opening_request = async_send_2(dev_phone,
 	    DEV_IFACE_ID(USBHID_DEV_IFACE), IPC_M_USBHID_GET_EVENT,
-	    flags, NULL);
+	    flags, &opening_request_call);
 	if (opening_request == 0) {
 		free(buffer);
@@ -143,4 +144,8 @@
 		*actual_size = act_size;
 	}
+	
+	if (event_nr != NULL) {
+		*event_nr = IPC_GET_ARG1(opening_request_call);
+	}
 
 	return EOK;
