Index: uspace/srv/hid/console/console.c
===================================================================
--- uspace/srv/hid/console/console.c	(revision f2f99aed0bc86b7a8fe3b5bb4754d25c62169247)
+++ uspace/srv/hid/console/console.c	(revision af897ff040ad9cb7f8e8ffc17a4e6dad75be2498)
@@ -973,5 +973,4 @@
 	
 	/* Start fibril for checking on hot-plugged keyboards. */
-//	check_new_devices_in_background(connect_keyboard, "keyboard");
 	check_new_devices_in_background(connect_mouse, "mouse");
 	
Index: uspace/srv/hid/kbd/generic/kbd.c
===================================================================
--- uspace/srv/hid/kbd/generic/kbd.c	(revision f2f99aed0bc86b7a8fe3b5bb4754d25c62169247)
+++ uspace/srv/hid/kbd/generic/kbd.c	(revision af897ff040ad9cb7f8e8ffc17a4e6dad75be2498)
@@ -62,6 +62,6 @@
 #include <kernel/ipc/ipc_methods.h>
 
-#define NAME       "kbd"
-#define NAMESPACE  "hid_in"
+/* In microseconds */
+#define DISCOVERY_POLL_INTERVAL		(10*1000*1000)
 
 static void kbd_devs_yield(void);
@@ -223,5 +223,5 @@
 }
 
-/** Add new keyboard device. */
+/** Add new legacy keyboard device. */
 static void kbd_add_dev(kbd_port_ops_t *port, kbd_ctl_ops_t *ctl)
 {
@@ -235,12 +235,11 @@
 
 	link_initialize(&kdev->kbd_devs);
+	kdev->dev_path = NULL;
 	kdev->port_ops = port;
 	kdev->ctl_ops = ctl;
 
 	/* Initialize port driver. */
-	if (kdev->port_ops != NULL) {
-		if ((*kdev->port_ops->init)(kdev) != 0)
-			goto fail;
-	}
+	if ((*kdev->port_ops->init)(kdev) != 0)
+		goto fail;
 
 	/* Initialize controller driver. */
@@ -254,4 +253,35 @@
 fail:
 	free(kdev);
+}
+
+/** Add new kbdev device.
+ *
+ * @param dev_path	Filesystem path to the device (/dev/class/...)
+ */
+static int kbd_add_kbdev(const char *dev_path)
+{
+	kbd_dev_t *kdev;
+
+	kdev = malloc(sizeof(kbd_dev_t));
+	if (kdev == NULL) {
+		printf(NAME ": Failed adding keyboard device. Out of memory.\n");
+		return -1;
+	}
+
+	link_initialize(&kdev->kbd_devs);
+	kdev->dev_path = dev_path;
+	kdev->port_ops = NULL;
+	kdev->ctl_ops = &kbdev_ctl;
+
+	/* Initialize controller driver. */
+	if ((*kdev->ctl_ops->init)(kdev) != 0) {
+		goto fail;
+	}
+
+	list_append(&kdev->kbd_devs, &kbd_devs);
+	return EOK;
+fail:
+	free(kdev);
+	return -1;
 }
 
@@ -309,4 +339,6 @@
 	kbd_add_dev(&ns16550_port, &sun_ctl);
 #endif
+	/* Silence warning on abs32le about kbd_add_dev() being unused */
+	(void) kbd_add_dev;
 }
 
@@ -337,4 +369,49 @@
 }
 
+/** Periodically check for new kbdev devices in /dev/class/keyboard.
+ *
+ * @param arg	Ignored
+ */
+static int dev_discovery_fibril(void *arg)
+{
+	char *dev_path;
+	size_t id = 1;
+	int rc;
+
+	while (true) {
+		async_usleep(DISCOVERY_POLL_INTERVAL);
+
+		rc = asprintf(&dev_path, "/dev/class/keyboard\\%zu", id);
+		if (rc < 0)
+			continue;
+
+		if (kbd_add_kbdev(dev_path) == EOK) {
+			printf(NAME ": Connected kbdev device '%s'\n",
+			    dev_path);
+
+			/* XXX Handle device removal */
+			++id;
+		}
+
+		free(dev_path);
+	}
+
+	return EOK;
+}
+
+/** Start a fibril for discovering new devices. */
+static void kbd_start_dev_discovery(void)
+{
+	fid_t fid;
+
+	fid = fibril_create(dev_discovery_fibril, NULL);
+	if (!fid) {
+		printf(NAME ": Failed to create device discovery fibril.\n");
+		return;
+	}
+
+	fibril_add_ready(fid);
+}
+
 int main(int argc, char **argv)
 {
@@ -357,7 +434,4 @@
 	/* Add legacy devices. */
 	kbd_add_legacy_devs();
-
-	/* Add kbdev device */
-	kbd_add_dev(NULL, &kbdev_ctl);
 
 	/* Initialize (reset) layout. */
@@ -380,4 +454,7 @@
 	}
 
+	/* Start looking for new kbdev devices */
+	kbd_start_dev_discovery();
+
 	printf(NAME ": Accepting connections\n");
 	async_manager();
Index: uspace/srv/hid/kbd/include/kbd.h
===================================================================
--- uspace/srv/hid/kbd/include/kbd.h	(revision f2f99aed0bc86b7a8fe3b5bb4754d25c62169247)
+++ uspace/srv/hid/kbd/include/kbd.h	(revision af897ff040ad9cb7f8e8ffc17a4e6dad75be2498)
@@ -42,4 +42,7 @@
 #include <bool.h>
 
+#define NAME       "kbd"
+#define NAMESPACE  "hid_in"
+
 struct kbd_port_ops;
 struct kbd_ctl_ops;
@@ -48,4 +51,7 @@
 	/** Link to kbd_devs list */
 	link_t kbd_devs;
+
+	/** Path to the device (only for kbdev devices) */
+	const char *dev_path;
 
 	/** Port ops */
Index: uspace/srv/hid/kbd/port/chardev.c
===================================================================
--- uspace/srv/hid/kbd/port/chardev.c	(revision f2f99aed0bc86b7a8fe3b5bb4754d25c62169247)
+++ uspace/srv/hid/kbd/port/chardev.c	(revision af897ff040ad9cb7f8e8ffc17a4e6dad75be2498)
@@ -44,6 +44,4 @@
 #include <errno.h>
 #include <stdio.h>
-
-#define NAME  "kbd/chardev"
 
 static void kbd_port_events(ipc_callid_t iid, ipc_call_t *icall);
