Index: uspace/lib/usb/src/hidparser.c
===================================================================
--- uspace/lib/usb/src/hidparser.c	(revision c7c0984abd146b8b0c0fe4967d83486b28accc5d)
+++ uspace/lib/usb/src/hidparser.c	(revision 2020927ba9a1c0ea098d234485d70c1f0d24a51e)
@@ -73,5 +73,5 @@
 void usb_hid_print_usage_path(usb_hid_report_path_t *path);
 void usb_hid_descriptor_print_list(link_t *head);
-int usb_hid_report_reset_local_items();
+void usb_hid_report_reset_local_items(usb_hid_report_item_t *report_item);
 void usb_hid_free_report_list(link_t *head);
 usb_hid_report_item_t *usb_hid_report_item_clone(const usb_hid_report_item_t *item);
@@ -144,4 +144,8 @@
 	}
 
+	for(i=0; i<report_item->usages_count; i++){
+		usb_log_debug("usages (%d) - %x\n", i, report_item->usages[i]);
+	}
+
 	
 	for(i=0; i<report_item->count; i++){
@@ -168,16 +172,32 @@
 
 		if(report_item->usages_count > 0 && ((report_item->usage_minimum == 0) && (report_item->usage_maximum == 0))) {
-			if(i < report_item->usages_count){
-				if((report_item->usages[i] & 0xFF00) != 0){
-					field->usage_page = (report_item->usages[i] >> 16);					
-					field->usage = (report_item->usages[i] & 0xFF);
+			uint32_t usage;
+			if(report_item->type == USB_HID_REPORT_TYPE_INPUT) {
+				if(i < report_item->usages_count){
+					usage = report_item->usages[i];
 				}
 				else {
-					field->usage = report_item->usages[i];
+					usage = report_item->usages[report_item->usages_count - 1];
 				}
 			}
 			else {
-				field->usage = report_item->usages[report_item->usages_count - 1];
-			}
+				if((report_item->count - i - 1) < report_item->usages_count){
+					usage = report_item->usages[(report_item->count - i - 1)];
+				}
+				else {
+					usage = report_item->usages[report_item->usages_count - 1];
+				}
+			}
+
+						
+			if((usage & 0xFF00) != 0){
+				field->usage_page = (usage >> 16);					
+				field->usage = (usage & 0xFF);
+			}
+			else {
+				field->usage = usage;
+			}
+
+			
 		}	
 
@@ -342,17 +362,5 @@
 
 					/* reset local items */
-					while(report_item->usages_count > 0){
-						report_item->usages[--(report_item->usages_count)] = 0;
-					}
-
-					report_item->extended_usage_page = 0;
-					report_item->usage_minimum = 0;
-					report_item->usage_maximum = 0;
-					report_item->designator_index = 0;
-					report_item->designator_minimum = 0;
-					report_item->designator_maximum = 0;
-					report_item->string_index = 0;
-					report_item->string_minimum = 0;
-					report_item->string_maximum = 0;
+					usb_hid_report_reset_local_items (report_item);
 
 					break;
@@ -476,4 +484,5 @@
 			// TODO usage_path->flags = *data;
 			usb_hid_report_path_append_item(usage_path, report_item->usage_page, report_item->usages[report_item->usages_count-1]);						
+			usb_hid_report_reset_local_items (report_item);
 			return USB_HID_NO_ACTION;
 			break;
@@ -567,5 +576,6 @@
 	{
 		case USB_HID_REPORT_TAG_USAGE:
-			report_item->usages[report_item->usages_count++] = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->usages[report_item->usages_count] = usb_hid_report_tag_data_int32(data,item_size);
+			report_item->usages_count++;
 			break;
 		case USB_HID_REPORT_TAG_USAGE_MINIMUM:
@@ -1683,5 +1693,25 @@
 }
 
-
+void usb_hid_report_reset_local_items(usb_hid_report_item_t *report_item)
+{
+	if(report_item == NULL)	{
+		return;
+	}
+	
+	report_item->usages_count = 0;
+	memset(report_item->usages, 0, USB_HID_MAX_USAGES);
+	
+	report_item->extended_usage_page = 0;
+	report_item->usage_minimum = 0;
+	report_item->usage_maximum = 0;
+	report_item->designator_index = 0;
+	report_item->designator_minimum = 0;
+	report_item->designator_maximum = 0;
+	report_item->string_index = 0;
+	report_item->string_minimum = 0;
+	report_item->string_maximum = 0;
+
+	return;
+}
 /**
  * @}
