Index: uspace/lib/usb/src/hiddescriptor.c
===================================================================
--- uspace/lib/usb/src/hiddescriptor.c	(revision cc5908ebb647ae50145e0da5792c167a91835e00)
+++ uspace/lib/usb/src/hiddescriptor.c	(revision 252cf2ac9a065f1f05c769741c851681c52a9640)
@@ -64,6 +64,9 @@
 {
 	/* find or append current collection path to the list */
-	link_t *path_it = report->collection_paths.next;
+	//link_t *path_it = report->collection_paths.next;
+	link_t *path_it = report->collection_paths.prev->next;
 	usb_hid_report_path_t *path = NULL;
+	
+	
 	while(path_it != &report->collection_paths) {
 		path = list_get_instance(path_it, usb_hid_report_path_t, link);
@@ -115,6 +118,4 @@
 	usb_hid_report_field_t *field;
 	int i;
-
-	usb_log_debug("usages_count  - %zu\n", report_item->usages_count);
 
 	uint32_t *usages;
@@ -147,5 +148,5 @@
 			*/
 			field->usage = 0;
-			field->usage_page = report_item->usage_page;
+			field->usage_page = 0; //report_item->usage_page;
 
 			field->usages_count = report_item->usages_count;
@@ -168,4 +169,5 @@
 			}
 			else {
+				// should not occur
 				field->usage = usage;
 				field->usage_page = report_item->usage_page;
@@ -465,6 +467,10 @@
 			
 			// set last item
-			usb_hid_report_set_last_item(usage_path, USB_HID_TAG_CLASS_GLOBAL, report_item->usage_page);
-			usb_hid_report_set_last_item(usage_path, USB_HID_TAG_CLASS_LOCAL, report_item->usages[report_item->usages_count-1]);
+			usb_hid_report_set_last_item(usage_path, 
+			                             USB_HID_TAG_CLASS_GLOBAL, 
+			                             USB_HID_EXTENDED_USAGE_PAGE(report_item->usages[report_item->usages_count-1]));
+			usb_hid_report_set_last_item(usage_path, 
+			                             USB_HID_TAG_CLASS_LOCAL, 
+			                             USB_HID_EXTENDED_USAGE(report_item->usages[report_item->usages_count-1]));
 			
 			// append the new one which will be set by common
@@ -561,4 +567,6 @@
                              usb_hid_report_item_t *report_item, usb_hid_report_path_t *usage_path)
 {
+	int32_t extended_usage;
+	
 	switch(tag) {
 		case USB_HID_REPORT_TAG_USAGE:
@@ -570,5 +578,7 @@
 					report_item->in_delimiter = INSIDE_DELIMITER_SET;
 				case OUTSIDE_DELIMITER_SET:
-					report_item->usages[report_item->usages_count] = usb_hid_report_tag_data_uint32(data,item_size);
+					extended_usage = ((report_item->usage_page) << 16);
+					extended_usage += usb_hid_report_tag_data_uint32(data,item_size);
+					report_item->usages[report_item->usages_count] = extended_usage;
 					report_item->usages_count++;
 					break;
@@ -607,5 +617,6 @@
 				}
 				else {
-					report_item->usages[report_item->usages_count++] = i;
+					
+					report_item->usages[report_item->usages_count++] = (report_item->usage_page << 16) + i;
 				}
 			}
@@ -691,4 +702,5 @@
 		usb_log_debug("\t\ttUSAGEMIN: %X\n", report_item->usage_minimum);
 		usb_log_debug("\t\tUSAGEMAX: %X\n", report_item->usage_maximum);
+		usb_log_debug("\t\tUSAGES COUNT: %zu\n", report_item->usages_count);
 
 		usb_log_debug("\t\tVALUE: %X\n", report_item->value);
@@ -696,5 +708,5 @@
 		usb_log_debug("\t\tUSAGE PAGE: %X\n", report_item->usage_page);
 		
-		//usb_hid_print_usage_path(report_item->collection_path);
+		usb_hid_print_usage_path(report_item->collection_path);
 
 		usb_log_debug("\n");		
@@ -728,5 +740,5 @@
 		usb_hid_descriptor_print_list(&report_des->report_items);
 
-
+/*
 		link_t *path_it = report->collection_paths.next;
 		while(path_it != &report->collection_paths) {
@@ -734,5 +746,5 @@
 			path_it = path_it->next;
 		}
-		
+*/		
 		report_it = report_it->next;
 	}
Index: uspace/lib/usb/src/hidparser.c
===================================================================
--- uspace/lib/usb/src/hidparser.c	(revision cc5908ebb647ae50145e0da5792c167a91835e00)
+++ uspace/lib/usb/src/hidparser.c	(revision 252cf2ac9a065f1f05c769741c851681c52a9640)
@@ -111,5 +111,5 @@
 	usb_hid_report_description_t *report_des;
 	usb_hid_report_type_t type = USB_HID_REPORT_TYPE_INPUT;
-
+	
 	if(report == NULL) {
 		return EINVAL;
@@ -140,6 +140,13 @@
 		
 				item->usage = USB_HID_EXTENDED_USAGE(item->usages[item->value - item->physical_minimum]);
-				item->usage_page = USB_HID_EXTENDED_USAGE_PAGE(item->usages[item->value - item->physical_minimum]);
-
+				item->usage_page = USB_HID_EXTENDED_USAGE_PAGE(item->usages[item->value - item->physical_minimum]);				
+
+				usb_hid_report_set_last_item (item->collection_path, 
+				                              USB_HID_TAG_CLASS_GLOBAL,
+				                              item->usage_page);
+				usb_hid_report_set_last_item (item->collection_path, 
+				                              USB_HID_TAG_CLASS_LOCAL,
+				                              item->usage);
+				
 			}
 			else {
@@ -150,5 +157,5 @@
 		list_item = list_item->next;
 	}
-	   
+	
 	return EOK;
 	
Index: uspace/lib/usb/src/hidpath.c
===================================================================
--- uspace/lib/usb/src/hidpath.c	(revision cc5908ebb647ae50145e0da5792c167a91835e00)
+++ uspace/lib/usb/src/hidpath.c	(revision 252cf2ac9a065f1f05c769741c851681c52a9640)
@@ -42,4 +42,7 @@
 
 
+#define USB_HID_SAME_USAGE(usage1, usage2)	((usage1 == usage2) || (usage1 == 0) || (usage2 == 0))
+#define USB_HID_SAME_USAGE_PAGE(page1, page2)	((page1 == page2) || (page1 == 0) || (page2 == 0))
+
 /**
  * Appends one item (couple of usage_path and usage) into the usage path
@@ -203,7 +206,7 @@
 			while(report_link != &report_path->head) {
 				report_item = list_get_instance(report_link, usb_hid_report_usage_path_t, link);
-				if(report_item->usage_page == path_item->usage_page){
+				if(USB_HID_SAME_USAGE_PAGE(report_item->usage_page, path_item->usage_page)){
 					if(only_page == 0){
-						if(report_item->usage == path_item->usage) {
+						if(USB_HID_SAME_USAGE(report_item->usage, path_item->usage)) {
 							return EOK;
 						}
@@ -242,7 +245,7 @@
 					                              link);		
 
-					if((report_item->usage_page != path_item->usage_page) || 
+					if(!USB_HID_SAME_USAGE_PAGE(report_item->usage_page, path_item->usage_page) || 
 					   ((only_page == 0) && 
-					    (report_item->usage != path_item->usage))) {
+					    !USB_HID_SAME_USAGE(report_item->usage, path_item->usage))) {
 							
 						   return 1;
@@ -282,9 +285,9 @@
 					                              usb_hid_report_usage_path_t, 
 					                              link);		
-
-					if((report_item->usage_page != path_item->usage_page) || 
+						  
+					if(!USB_HID_SAME_USAGE_PAGE(report_item->usage_page, path_item->usage_page) || 
 					   ((only_page == 0) && 
-					    (report_item->usage != path_item->usage))) {
-						   return 1;
+					    !USB_HID_SAME_USAGE(report_item->usage, path_item->usage))) {
+							return 1;
 					} else {
 						report_link = report_link->prev;
