Index: uspace/drv/usbkbd/Makefile
===================================================================
--- uspace/drv/usbkbd/Makefile	(revision 0a9ea4a54c709b69b98fe037fe28f5f800446742)
+++ uspace/drv/usbkbd/Makefile	(revision 6336b6ed30c5d3025044acbae3db2d8893acd20c)
@@ -35,5 +35,6 @@
 	main.c \
 	descparser.c \
-	descdump.c
+	descdump.c \
+	conv.c
 
 include $(USPACE_PREFIX)/Makefile.common
Index: uspace/drv/usbkbd/descparser.c
===================================================================
--- uspace/drv/usbkbd/descparser.c	(revision 0a9ea4a54c709b69b98fe037fe28f5f800446742)
+++ uspace/drv/usbkbd/descparser.c	(revision 6336b6ed30c5d3025044acbae3db2d8893acd20c)
@@ -96,6 +96,6 @@
 	pos += sizeof(usb_standard_configuration_descriptor_t);
 
-	printf("Parsed configuration descriptor: \n");
-	dump_standard_configuration_descriptor(0, &config->config_descriptor);
+	//printf("Parsed configuration descriptor: \n");
+	//dump_standard_configuration_descriptor(0, &config->config_descriptor);
 	
 	int ret = EOK;
@@ -139,6 +139,6 @@
 			pos += desc_size;
 
-			printf("Parsed interface descriptor: \n");
-			dump_standard_interface_descriptor(&actual_iface->iface_desc);
+			//printf("Parsed interface descriptor: \n");
+			//dump_standard_interface_descriptor(&actual_iface->iface_desc);
 			
 			// allocate space for endpoint descriptors
@@ -153,5 +153,5 @@
 			ep_i = 0;
 
-			printf("Remaining size: %d\n", size - (size_t)(pos - data));
+			//printf("Remaining size: %d\n", size - (size_t)(pos - data));
 			
 			break;
@@ -180,6 +180,6 @@
 			pos += desc_size;
 
-			printf("Parsed endpoint descriptor: \n");
-			dump_standard_endpoint_descriptor(&actual_iface->endpoints[ep_i]);
+			//printf("Parsed endpoint descriptor: \n");
+			//dump_standard_endpoint_descriptor(&actual_iface->endpoints[ep_i]);
 			++ep_i;
 			
@@ -208,6 +208,6 @@
 			}*/
 
-			printf("Parsed HID descriptor header: \n");
-			dump_standard_hid_descriptor_header(&actual_iface->hid_desc);
+			//printf("Parsed HID descriptor header: \n");
+			//dump_standard_hid_descriptor_header(&actual_iface->hid_desc);
 			
 			// allocate space for all class-specific descriptor info
Index: uspace/drv/usbkbd/main.c
===================================================================
--- uspace/drv/usbkbd/main.c	(revision 0a9ea4a54c709b69b98fe037fe28f5f800446742)
+++ uspace/drv/usbkbd/main.c	(revision 6336b6ed30c5d3025044acbae3db2d8893acd20c)
@@ -38,6 +38,8 @@
 #include <usb/devreq.h>
 #include <usb/descriptor.h>
+#include <io/console.h>
 #include "descparser.h"
 #include "descdump.h"
+#include "conv.h"
 
 #define BUFFER_SIZE 32
@@ -88,4 +90,138 @@
 
 /*
+ * TODO: Move somewhere else
+ */
+/*
+#define BYTES_PER_LINE 12
+
+static void dump_buffer(const char *msg, const uint8_t *buffer, size_t length)
+{
+	printf("%s\n", msg);
+	
+	size_t i;
+	for (i = 0; i < length; i++) {
+		printf("  0x%02X", buffer[i]);
+		if (((i > 0) && (((i+1) % BYTES_PER_LINE) == 0))
+		    || (i + 1 == length)) {
+			printf("\n");
+		}
+	}
+}
+*/
+/*
+ * Copy-paste from srv/hid/kbd/generic/kbd.c
+ */
+
+/** Currently active modifiers. 
+ *
+ * TODO: put to device?
+ */
+static unsigned mods = KM_NUM_LOCK;
+
+/** Currently pressed lock keys. We track these to tackle autorepeat.  
+ *
+ * TODO: put to device? 
+ */
+static unsigned lock_keys;
+
+// TODO: put to device?
+//static int active_layout = 0;
+
+static void kbd_push_ev(int type, unsigned int key)
+{
+	console_event_t ev;
+	unsigned mod_mask;
+
+	// TODO: replace by our own parsing?? or are the key codes identical??
+	switch (key) {
+	case KC_LCTRL: mod_mask = KM_LCTRL; break;
+	case KC_RCTRL: mod_mask = KM_RCTRL; break;
+	case KC_LSHIFT: mod_mask = KM_LSHIFT; break;
+	case KC_RSHIFT: mod_mask = KM_RSHIFT; break;
+	case KC_LALT: mod_mask = KM_LALT; break;
+	case KC_RALT: mod_mask = KM_RALT; break;
+	default: mod_mask = 0; break;
+	}
+
+	if (mod_mask != 0) {
+		if (type == KEY_PRESS)
+			mods = mods | mod_mask;
+		else
+			mods = mods & ~mod_mask;
+	}
+
+	switch (key) {
+	case KC_CAPS_LOCK: mod_mask = KM_CAPS_LOCK; break;
+	case KC_NUM_LOCK: mod_mask = KM_NUM_LOCK; break;
+	case KC_SCROLL_LOCK: mod_mask = KM_SCROLL_LOCK; break;
+	default: mod_mask = 0; break;
+	}
+
+	if (mod_mask != 0) {
+		if (type == KEY_PRESS) {
+			/*
+			 * Only change lock state on transition from released
+			 * to pressed. This prevents autorepeat from messing
+			 * up the lock state.
+			 */
+			mods = mods ^ (mod_mask & ~lock_keys);
+			lock_keys = lock_keys | mod_mask;
+
+			/* Update keyboard lock indicator lights. */
+			// TODO
+			//kbd_ctl_set_ind(mods);
+		} else {
+			lock_keys = lock_keys & ~mod_mask;
+		}
+	}
+/*
+	printf("type: %d\n", type);
+	printf("mods: 0x%x\n", mods);
+	printf("keycode: %u\n", key);
+*/
+	/*
+	if (type == KEY_PRESS && (mods & KM_LCTRL) &&
+		key == KC_F1) {
+		active_layout = 0;
+		layout[active_layout]->reset();
+		return;
+	}
+
+	if (type == KEY_PRESS && (mods & KM_LCTRL) &&
+		key == KC_F2) {
+		active_layout = 1;
+		layout[active_layout]->reset();
+		return;
+	}
+
+	if (type == KEY_PRESS && (mods & KM_LCTRL) &&
+		key == KC_F3) {
+		active_layout = 2;
+		layout[active_layout]->reset();
+		return;
+	}
+	*/
+	ev.type = type;
+	ev.key = key;
+	ev.mods = mods;
+
+	//ev.c = layout[active_layout]->parse_ev(&ev);
+
+	printf("Sending key %d to the console\n", ev.key);
+	assert(console_callback_phone != -1);
+	async_msg_4(console_callback_phone, KBD_EVENT, ev.type, ev.key, ev.mods, 0);
+}
+/*
+ * End of copy-paste
+ */
+
+	/*
+	 * TODO:
+	 * 1) key press / key release - how does the keyboard notify about release?
+	 * 2) layouts (use the already defined), not important now
+	 * 3) 
+	 */
+
+/*
  * Callbacks for parser
  */
@@ -97,4 +233,9 @@
 	for (i = 0; i < count; ++i) {
 		printf("%d ", key_codes[i]);
+		// TODO: Key press / release
+
+		// TODO: NOT WORKING
+		unsigned int key = usbkbd_parse_scancode(key_codes[i]);
+		kbd_push_ev(KEY_PRESS, key);
 	}
 	printf("\n");
@@ -130,6 +271,6 @@
 		assert(actual_size == length);
 
-		dump_hid_class_descriptor(0, USB_DESCTYPE_HID_REPORT, 
-		    kbd_dev->conf->interfaces[i].report_desc, length);
+		//dump_hid_class_descriptor(0, USB_DESCTYPE_HID_REPORT, 
+		//    kbd_dev->conf->interfaces[i].report_desc, length);
 	}
 
@@ -189,5 +330,5 @@
 	}
 	
-	usbkbd_print_config(kbd_dev->conf);
+	//usbkbd_print_config(kbd_dev->conf);
 
 	/*
@@ -264,12 +405,16 @@
 	//usb_hid_parse_report(kbd_dev->parser, buffer, actual_size, callbacks, 
 	//    NULL);
-	printf("Calling usb_hid_boot_keyboard_input_report()...\n)");
-	usb_hid_boot_keyboard_input_report(buffer, actual_size, callbacks, NULL);
+//	printf("Calling usb_hid_boot_keyboard_input_report() with size %d\n",
+//	    actual_size);
+//	dump_buffer("bufffer: ", buffer, actual_size);
+	int rc = usb_hid_boot_keyboard_input_report(buffer, actual_size, callbacks, 
+	    NULL);
+	if (rc != EOK) {
+		printf("Error in usb_hid_boot_keyboard_input_report(): %d\n", rc);
+	}
 }
 
 static void usbkbd_poll_keyboard(usb_hid_dev_kbd_t *kbd_dev)
 {
-	return;
-	
 	int rc;
 	usb_handle_t handle;
@@ -289,10 +434,13 @@
 	};
 
+	printf("Polling keyboard...\n");
+
 	while (true) {
-		async_usleep(1000 * 1000);
+		async_usleep(1000 * 1000 * 2);
 		rc = usb_drv_async_interrupt_in(kbd_dev->device->parent_phone,
 		    poll_target, buffer, BUFFER_SIZE, &actual_size, &handle);
 
 		if (rc != EOK) {
+			printf("Error in usb_drv_async_interrupt_in(): %d\n", rc);
 			continue;
 		}
@@ -300,4 +448,5 @@
 		rc = usb_drv_async_wait_for(handle);
 		if (rc != EOK) {
+			printf("Error in usb_drv_async_wait_for(): %d\n", rc);
 			continue;
 		}
@@ -308,4 +457,5 @@
 		 */
 		if (actual_size == 0) {
+			printf("Keyboar returned NAK\n");
 			continue;
 		}
@@ -314,5 +464,7 @@
 		 * TODO: Process pressed keys.
 		 */
-		usbkbd_process_interrupt_in(kbd_dev, buffer, actual_size);
+		printf("Calling usbkbd_process_interrupt_in()\n");
+		// actual_size is not set, workaround...
+		usbkbd_process_interrupt_in(kbd_dev, buffer, /*actual_size*/8);
 	}
 
@@ -334,4 +486,8 @@
 	// initialize device (get and process descriptors, get address, etc.)
 	usb_hid_dev_kbd_t *kbd_dev = usbkbd_init_device(dev);
+	if (kbd_dev == NULL) {
+		printf("Error while initializing device.\n");
+		return -1;
+	}
 
 	usbkbd_poll_keyboard(kbd_dev);
Index: uspace/lib/usb/src/hidparser.c
===================================================================
--- uspace/lib/usb/src/hidparser.c	(revision 0a9ea4a54c709b69b98fe037fe28f5f800446742)
+++ uspace/lib/usb/src/hidparser.c	(revision 6336b6ed30c5d3025044acbae3db2d8893acd20c)
@@ -35,4 +35,5 @@
 #include <usb/classes/hidparser.h>
 #include <errno.h>
+#include <stdio.h>
 
 /** Parse HID report descriptor.
@@ -120,11 +121,11 @@
 	item.logical_max = 255;
 
-	if(size != 8){
-		return -1;
+	if (size != 8) {
+		return ERANGE;
 	}
 
 	uint8_t keys[6];
-	for(i=item.offset; i<item.count; i++) {
-		keys[i-2] = data[i];
+	for (i = 0; i < item.count; i++) {
+		keys[i] = data[i + item.offset];
 	}
 
