Index: uspace/srv/hid/input/include/kbd.h
===================================================================
--- uspace/srv/hid/input/include/kbd.h	(revision 60e5a8569c8ec6ff69c5bdc746d53f4ae2c3a4f4)
+++ uspace/srv/hid/input/include/kbd.h	(revision ef15fbbac0915e003c970e47614ca22e47e3ed96)
@@ -47,4 +47,5 @@
 struct kbd_port_ops;
 struct kbd_ctl_ops;
+struct layout;
 
 typedef struct kbd_dev {
@@ -63,4 +64,13 @@
 	/** Controller-private data */
 	void *ctl_private;
+
+	/** Currently active modifiers. */
+	unsigned mods;
+
+	/** Currently pressed lock keys. We track these to tackle autorepeat. */
+	unsigned lock_keys;
+
+	/** Active keyboard layout */
+	struct layout *active_layout;
 } kbd_dev_t;
 
Index: uspace/srv/hid/input/include/layout.h
===================================================================
--- uspace/srv/hid/input/include/layout.h	(revision 60e5a8569c8ec6ff69c5bdc746d53f4ae2c3a4f4)
+++ uspace/srv/hid/input/include/layout.h	(revision ef15fbbac0915e003c970e47614ca22e47e3ed96)
@@ -41,12 +41,27 @@
 #include <io/console.h>
 
-typedef struct {
-	void (*reset)(void);
-	wchar_t (*parse_ev)(kbd_event_t *);
-} layout_op_t;
+/** Layout instance state */
+typedef struct layout {
+	/** Ops structure */
+	struct layout_ops *ops;
 
-extern layout_op_t us_qwerty_op;
-extern layout_op_t us_dvorak_op;
-extern layout_op_t cz_op;
+	/* Layout-private data */
+	void *layout_priv;
+} layout_t;
+
+/** Layout ops */
+typedef struct layout_ops {
+	int (*create)(layout_t *);
+	void (*destroy)(layout_t *);
+	wchar_t (*parse_ev)(layout_t *, kbd_event_t *);
+} layout_ops_t;
+
+extern layout_ops_t us_qwerty_ops;
+extern layout_ops_t us_dvorak_ops;
+extern layout_ops_t cz_ops;
+
+extern layout_t *layout_create(layout_ops_t *);
+extern void layout_destroy(layout_t *);
+extern wchar_t layout_parse_ev(layout_t *, kbd_event_t *);
 
 #endif
