Index: uspace/drv/usbhid/kbd/kbddev.c
===================================================================
--- uspace/drv/usbhid/kbd/kbddev.c	(revision 5f8829315f6bebf5769560deb1bd34bc914628c4)
+++ uspace/drv/usbhid/kbd/kbddev.c	(revision 60e5a8569c8ec6ff69c5bdc746d53f4ae2c3a4f4)
@@ -101,4 +101,6 @@
 const char *HID_KBD_FUN_NAME = "keyboard";
 const char *HID_KBD_CLASS_NAME = "keyboard";
+
+static void usb_kbd_set_led(usb_hid_dev_t *hid_dev, usb_kbd_t *kbd_dev);
 
 /*----------------------------------------------------------------------------*/
@@ -174,4 +176,5 @@
 {
 	sysarg_t method = IPC_GET_IMETHOD(*icall);
+	int callback;
 	
 	usb_kbd_t *kbd_dev = (usb_kbd_t *)fun->driver_data;
@@ -183,6 +186,7 @@
 	}
 
-	if (method == IPC_M_CONNECT_TO_ME) {
-		int callback = IPC_GET_ARG5(*icall);
+	switch (method) {
+	case IPC_M_CONNECT_TO_ME:
+		callback = IPC_GET_ARG5(*icall);
 
 		if (kbd_dev->console_phone != -1) {
@@ -197,9 +201,15 @@
 		usb_log_debug("default_connection_handler: OK\n");
 		async_answer_0(icallid, EOK);
-		return;
-	}
-	
-	usb_log_debug("default_connection_handler: Wrong function.\n");
-	async_answer_0(icallid, EINVAL);
+		break;
+	case KBDEV_SET_IND:
+		kbd_dev->mods = IPC_GET_ARG1(*icall);
+		usb_kbd_set_led(kbd_dev->hid_dev, kbd_dev);
+		async_answer_0(icallid, EOK);
+		break;
+	default:
+		usb_log_debug("default_connection_handler: Wrong function.\n");
+		async_answer_0(icallid, EINVAL);
+		break;
+	}
 }
 
@@ -615,4 +625,7 @@
 		return ENOMEM;  // TODO: some other code??
 	}
+
+	/* Store link to HID device */
+	kbd_dev->hid_dev = hid_dev;
 	
 	/*
Index: uspace/drv/usbhid/kbd/kbddev.h
===================================================================
--- uspace/drv/usbhid/kbd/kbddev.h	(revision 5f8829315f6bebf5769560deb1bd34bc914628c4)
+++ uspace/drv/usbhid/kbd/kbddev.h	(revision 60e5a8569c8ec6ff69c5bdc746d53f4ae2c3a4f4)
@@ -65,4 +65,7 @@
  */
 typedef struct usb_kbd_t {
+	/** Link to HID device structure */
+	struct usb_hid_dev *hid_dev;
+
 	/** Previously pressed keys (not translated to key codes). */
 	int32_t *keys_old;
Index: uspace/srv/hid/input/ctl/apple.c
===================================================================
--- uspace/srv/hid/input/ctl/apple.c	(revision 5f8829315f6bebf5769560deb1bd34bc914628c4)
+++ uspace/srv/hid/input/ctl/apple.c	(revision 60e5a8569c8ec6ff69c5bdc746d53f4ae2c3a4f4)
@@ -44,5 +44,5 @@
 static void apple_ctl_parse_scancode(int);
 static int apple_ctl_init(kbd_dev_t *);
-static void apple_ctl_set_ind(unsigned);
+static void apple_ctl_set_ind(kbd_dev_t *, unsigned);
 
 kbd_ctl_ops_t apple_ctl = {
@@ -84,5 +84,5 @@
 }
 
-static void apple_ctl_set_ind(unsigned mods)
+static void apple_ctl_set_ind(kbd_dev_t *kdev, unsigned mods)
 {
 	(void) mods;
Index: uspace/srv/hid/input/ctl/gxe_fb.c
===================================================================
--- uspace/srv/hid/input/ctl/gxe_fb.c	(revision 5f8829315f6bebf5769560deb1bd34bc914628c4)
+++ uspace/srv/hid/input/ctl/gxe_fb.c	(revision 60e5a8569c8ec6ff69c5bdc746d53f4ae2c3a4f4)
@@ -46,5 +46,5 @@
 static void gxe_fb_ctl_parse_scancode(int);
 static int gxe_fb_ctl_init(kbd_dev_t *);
-static void gxe_fb_ctl_set_ind(unsigned);
+static void gxe_fb_ctl_set_ind(kbd_dev_t *, unsigned);
 
 kbd_ctl_ops_t gxe_fb_ctl = {
@@ -239,5 +239,5 @@
 }
 
-static void gxe_fb_ctl_set_ind(unsigned mods)
+static void gxe_fb_ctl_set_ind(kbd_dev_t *kdev, unsigned mods)
 {
 	(void) mods;
Index: uspace/srv/hid/input/ctl/pc.c
===================================================================
--- uspace/srv/hid/input/ctl/pc.c	(revision 5f8829315f6bebf5769560deb1bd34bc914628c4)
+++ uspace/srv/hid/input/ctl/pc.c	(revision 60e5a8569c8ec6ff69c5bdc746d53f4ae2c3a4f4)
@@ -45,5 +45,5 @@
 static void pc_ctl_parse_scancode(int);
 static int pc_ctl_init(kbd_dev_t *);
-static void pc_ctl_set_ind(unsigned);
+static void pc_ctl_set_ind(kbd_dev_t *, unsigned);
 
 kbd_ctl_ops_t pc_ctl = {
@@ -265,5 +265,5 @@
 }
 
-static void pc_ctl_set_ind(unsigned mods)
+static void pc_ctl_set_ind(kbd_dev_t *kdev, unsigned mods)
 {
 	uint8_t b;
Index: uspace/srv/hid/input/ctl/stty.c
===================================================================
--- uspace/srv/hid/input/ctl/stty.c	(revision 5f8829315f6bebf5769560deb1bd34bc914628c4)
+++ uspace/srv/hid/input/ctl/stty.c	(revision 60e5a8569c8ec6ff69c5bdc746d53f4ae2c3a4f4)
@@ -45,5 +45,5 @@
 static void stty_ctl_parse_scancode(int);
 static int stty_ctl_init(kbd_dev_t *);
-static void stty_ctl_set_ind(unsigned);
+static void stty_ctl_set_ind(kbd_dev_t *, unsigned);
 
 kbd_ctl_ops_t stty_ctl = {
@@ -238,5 +238,5 @@
 }
 
-static void stty_ctl_set_ind(unsigned mods)
+static void stty_ctl_set_ind(kbd_dev_t *kdev, unsigned mods)
 {
 	(void) mods;
Index: uspace/srv/hid/input/ctl/sun.c
===================================================================
--- uspace/srv/hid/input/ctl/sun.c	(revision 5f8829315f6bebf5769560deb1bd34bc914628c4)
+++ uspace/srv/hid/input/ctl/sun.c	(revision 60e5a8569c8ec6ff69c5bdc746d53f4ae2c3a4f4)
@@ -45,5 +45,5 @@
 static void sun_ctl_parse_scancode(int);
 static int sun_ctl_init(kbd_dev_t *);
-static void sun_ctl_set_ind(unsigned);
+static void sun_ctl_set_ind(kbd_dev_t *, unsigned);
 
 kbd_ctl_ops_t sun_ctl = {
@@ -89,5 +89,5 @@
 }
 
-static void sun_ctl_set_ind(unsigned mods)
+static void sun_ctl_set_ind(kbd_dev_t *kdev, unsigned mods)
 {
 	(void) mods;
Index: uspace/srv/hid/input/generic/input.c
===================================================================
--- uspace/srv/hid/input/generic/input.c	(revision 5f8829315f6bebf5769560deb1bd34bc914628c4)
+++ uspace/srv/hid/input/generic/input.c	(revision 60e5a8569c8ec6ff69c5bdc746d53f4ae2c3a4f4)
@@ -138,5 +138,5 @@
 
 			/* Update keyboard lock indicator lights. */
-			(*kdev->ctl_ops->set_ind)(mods);
+			(*kdev->ctl_ops->set_ind)(kdev, mods);
 		} else {
 			lock_keys = lock_keys & ~mod_mask;
Index: uspace/srv/hid/input/include/kbd.h
===================================================================
--- uspace/srv/hid/input/include/kbd.h	(revision 5f8829315f6bebf5769560deb1bd34bc914628c4)
+++ uspace/srv/hid/input/include/kbd.h	(revision 60e5a8569c8ec6ff69c5bdc746d53f4ae2c3a4f4)
@@ -60,4 +60,7 @@
 	/** Ctl ops */
 	struct kbd_ctl_ops *ctl_ops;
+
+	/** Controller-private data */
+	void *ctl_private;
 } kbd_dev_t;
 
Index: uspace/srv/hid/input/include/kbd_ctl.h
===================================================================
--- uspace/srv/hid/input/include/kbd_ctl.h	(revision 5f8829315f6bebf5769560deb1bd34bc914628c4)
+++ uspace/srv/hid/input/include/kbd_ctl.h	(revision 60e5a8569c8ec6ff69c5bdc746d53f4ae2c3a4f4)
@@ -45,5 +45,5 @@
 	void (*parse_scancode)(int);
 	int (*init)(struct kbd_dev *);
-	void (*set_ind)(unsigned);
+	void (*set_ind)(struct kbd_dev *, unsigned);
 } kbd_ctl_ops_t;
 
