Index: uspace/drv/usbkbd/Makefile
===================================================================
--- uspace/drv/usbkbd/Makefile	(revision 6336b6ed30c5d3025044acbae3db2d8893acd20c)
+++ uspace/drv/usbkbd/Makefile	(revision 7c169cef1c068093084d1828dec3a4b96960c749)
@@ -36,5 +36,6 @@
 	descparser.c \
 	descdump.c \
-	conv.c
+	conv.c \
+	us_qwerty.c
 
 include $(USPACE_PREFIX)/Makefile.common
Index: uspace/drv/usbkbd/descparser.c
===================================================================
--- uspace/drv/usbkbd/descparser.c	(revision 6336b6ed30c5d3025044acbae3db2d8893acd20c)
+++ uspace/drv/usbkbd/descparser.c	(revision 7c169cef1c068093084d1828dec3a4b96960c749)
@@ -187,5 +187,5 @@
 		case USB_DESCTYPE_HID:
 			if (desc_size < sizeof(usb_standard_hid_descriptor_t)) {
-				printf("Wrong size of descriptor: %d (should be %d)\n",
+				printf("Wrong size of descriptor: %d (should be %zu)\n",
 				    desc_size, sizeof(usb_standard_hid_descriptor_t));
 				ret = EINVAL;
Index: uspace/drv/usbkbd/main.c
===================================================================
--- uspace/drv/usbkbd/main.c	(revision 6336b6ed30c5d3025044acbae3db2d8893acd20c)
+++ uspace/drv/usbkbd/main.c	(revision 7c169cef1c068093084d1828dec3a4b96960c749)
@@ -42,4 +42,5 @@
 #include "descdump.h"
 #include "conv.h"
+#include "layout.h"
 
 #define BUFFER_SIZE 32
@@ -125,6 +126,14 @@
 static unsigned lock_keys;
 
+#define NUM_LAYOUTS 3
+
+static layout_op_t *layout[NUM_LAYOUTS] = {
+	&us_qwerty_op,
+	&us_dvorak_op,
+	&cz_op
+};
+
 // TODO: put to device?
-//static int active_layout = 0;
+static int active_layout = 0;
 
 static void kbd_push_ev(int type, unsigned int key)
@@ -206,9 +215,9 @@
 	ev.mods = mods;
 
-	//ev.c = layout[active_layout]->parse_ev(&ev);
+	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);
+	async_msg_4(console_callback_phone, KBD_EVENT, ev.type, ev.key, ev.mods, ev.c);
 }
 /*
@@ -405,7 +414,7 @@
 	//usb_hid_parse_report(kbd_dev->parser, 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);
+	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);
@@ -457,5 +466,5 @@
 		 */
 		if (actual_size == 0) {
-			printf("Keyboar returned NAK\n");
+			printf("Keyboard returned NAK\n");
 			continue;
 		}
@@ -465,6 +474,5 @@
 		 */
 		printf("Calling usbkbd_process_interrupt_in()\n");
-		// actual_size is not set, workaround...
-		usbkbd_process_interrupt_in(kbd_dev, buffer, /*actual_size*/8);
+		usbkbd_process_interrupt_in(kbd_dev, buffer, actual_size);
 	}
 
