Index: uspace/lib/usb/include/usb/classes/hidparser.h
===================================================================
--- uspace/lib/usb/include/usb/classes/hidparser.h	(revision b53d3b77ce51876e074439c7c1ca69ccba2cf5c9)
+++ uspace/lib/usb/include/usb/classes/hidparser.h	(revision 96bfe76961a392a78b0265e75cb421f23b07f86b)
@@ -207,5 +207,5 @@
     const usb_hid_report_in_callbacks_t *callbacks, void *arg);
 
-int usb_hid_report_input_length(const usb_hid_report_parser_t *parser,
+size_t usb_hid_report_input_length(const usb_hid_report_parser_t *parser,
 	usb_hid_report_path_t *path, int flags);
 
@@ -223,12 +223,21 @@
 void usb_hid_report_set_last_item(usb_hid_report_path_t *usage_path, int32_t tag, int32_t data);
 int usb_hid_report_compare_usage_path(usb_hid_report_path_t *report_path, usb_hid_report_path_t *path, int flags);
-int	usb_hid_report_path_clone(usb_hid_report_path_t *new_usage_path, usb_hid_report_path_t *usage_path);
-
-
-// output
-//	- funkce co vrati cesty poli v output reportu
-//	- funkce co pro danou cestu nastavi data
-//	- finalize
-
+usb_hid_report_path_t *usb_hid_report_path_clone(usb_hid_report_path_t *usage_path);
+
+
+// output API
+/** Allocates output report buffer*/
+uint8_t *usb_hid_report_output(usb_hid_report_parser_t *parser);
+/** Frees output report buffer*/
+void usb_hid_report_output_free(uint8_t *output);
+
+/** Returns size of output for given usage path */
+size_t usb_hid_report_output_size(usb_hid_report_parser_t *parser,
+                                  usb_hid_report_path_t *path, int flags);
+/** Updates the output report buffer by translated given data */
+int usb_hid_report_output_translate(usb_hid_report_parser_t *parser,
+                                    usb_hid_report_path_t *path, int flags,
+                                    uint8_t *buffer, size_t size,
+                                    int32_t *data, size_t data_size);
 #endif
 /**
Index: uspace/lib/usb/src/hidparser.c
===================================================================
--- uspace/lib/usb/src/hidparser.c	(revision b53d3b77ce51876e074439c7c1ca69ccba2cf5c9)
+++ uspace/lib/usb/src/hidparser.c	(revision 96bfe76961a392a78b0265e75cb421f23b07f86b)
@@ -164,10 +164,7 @@
 					// store current usage path
 					report_item->usage_path = usage_path;
-
-					// new current usage path 
-					tmp_usage_path = usb_hid_report_path();
 					
-					// copy old path to the new one
-					usb_hid_report_path_clone(tmp_usage_path, usage_path);
+					// clone path to the new one
+					tmp_usage_path = usb_hid_report_path_clone(usage_path);
 
 					// swap
@@ -796,5 +793,5 @@
 }
 
-int usb_hid_report_input_length(const usb_hid_report_parser_t *parser,
+size_t usb_hid_report_input_length(const usb_hid_report_parser_t *parser,
 	usb_hid_report_path_t *path, int flags)
 {	
@@ -949,5 +946,5 @@
 			break;
 
-		/* given path must be the end of the report one*/
+		/* compare with only the end of path*/
 		case USB_HID_PATH_COMPARE_END:
 				report_link = report_path->link.prev;
@@ -1019,14 +1016,19 @@
 
 /**
- *
- */
-int	usb_hid_report_path_clone(usb_hid_report_path_t *new_usage_path, usb_hid_report_path_t *usage_path)
+ * Clone content of given usage path to the new one
+ *
+ */
+usb_hid_report_path_t *usb_hid_report_path_clone(usb_hid_report_path_t *usage_path)
 {
 	usb_hid_report_usage_path_t *path_item;
 	link_t *path_link;
-
+	usb_hid_report_path_t *new_usage_path = usb_hid_report_path ();
+
+	if(new_usage_path == NULL){
+		return NULL;
+	}
 	
 	if(list_empty(&usage_path->link)){
-		return EOK;
+		return new_usage_path;
 	}
 
@@ -1039,5 +1041,5 @@
 	}
 
-	return EOK;
+	return new_usage_path;
 }
 
