Index: uspace/app/init/init.c
===================================================================
--- uspace/app/init/init.c	(revision 4491338ddbe464a577387f85db0bc04a0e10dad3)
+++ uspace/app/init/init.c	(revision 47a350ff35743ebcc45e185d8b5218aaf60d91ea)
@@ -50,4 +50,9 @@
 #include "init.h"
 
+#define DEVFS_MOUNT_POINT  "/dev"
+
+#define SRV_CONSOLE  "/srv/console"
+#define APP_GETVC    "/app/getvc"
+
 static void info_print(void)
 {
@@ -98,5 +103,5 @@
 	
 	snprintf(null, MAX_DEVICE_NAME, "null/%d", null_id);
-	int rc = mount("devfs", "/dev", null, "", IPC_FLAG_BLOCKING);
+	int rc = mount("devfs", DEVFS_MOUNT_POINT, null, "", IPC_FLAG_BLOCKING);
 	
 	switch (rc) {
@@ -176,4 +181,29 @@
 }
 
+static void console(char *dev)
+{
+	char *argv[3];
+	char hid_in[MAX_DEVICE_NAME];
+	int rc;
+	
+	snprintf(hid_in, MAX_DEVICE_NAME, "%s/%s", DEVFS_MOUNT_POINT, dev);
+	
+	printf(NAME ": Spawning %s with %s\n", SRV_CONSOLE, hid_in);
+	
+	/* Wait for the input device to be ready */
+	dev_handle_t handle;
+	rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING);
+	
+	if (rc == EOK) {
+		argv[0] = SRV_CONSOLE;
+		argv[1] = hid_in;
+		argv[2] = NULL;
+		
+		if (!task_spawn(SRV_CONSOLE, argv))
+			printf(NAME ": Error spawning %s with %s\n", SRV_CONSOLE, hid_in);
+	} else
+		printf(NAME ": Error waiting on %s\n", hid_in);
+}
+
 static void getvc(char *dev, char *app)
 {
@@ -182,22 +212,22 @@
 	int rc;
 	
-	snprintf(vc, MAX_DEVICE_NAME, "/dev/%s", dev);
-	
-	printf(NAME ": Spawning getvc on %s\n", vc);
-	
+	snprintf(vc, MAX_DEVICE_NAME, "%s/%s", DEVFS_MOUNT_POINT, dev);
+	
+	printf(NAME ": Spawning %s on %s\n", APP_GETVC, vc);
+	
+	/* Wait for the terminal device to be ready */
 	dev_handle_t handle;
 	rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING);
 	
 	if (rc == EOK) {
-		argv[0] = "/app/getvc";
+		argv[0] = APP_GETVC;
 		argv[1] = vc;
 		argv[2] = app;
 		argv[3] = NULL;
 		
-		if (!task_spawn("/app/getvc", argv))
-			printf(NAME ": Error spawning getvc on %s\n", vc);
-	} else {
+		if (!task_spawn(APP_GETVC, argv))
+			printf(NAME ": Error spawning %s on %s\n", APP_GETVC, vc);
+	} else
 		printf(NAME ": Error waiting on %s\n", vc);
-	}
 }
 
@@ -234,5 +264,6 @@
 	spawn("/srv/fb");
 	spawn("/srv/kbd");
-	spawn("/srv/console");
+	console("hid_in/kbd");
+	
 	spawn("/srv/clip");
 	spawn("/srv/fhc");
Index: uspace/lib/libc/include/ipc/services.h
===================================================================
--- uspace/lib/libc/include/ipc/services.h	(revision 4491338ddbe464a577387f85db0bc04a0e10dad3)
+++ uspace/lib/libc/include/ipc/services.h	(revision 47a350ff35743ebcc45e185d8b5218aaf60d91ea)
@@ -41,5 +41,4 @@
 	SERVICE_LOAD = 1,
 	SERVICE_PCI,
-	SERVICE_KEYBOARD,
 	SERVICE_VIDEO,
 	SERVICE_CONSOLE,
Index: uspace/srv/console/console.c
===================================================================
--- uspace/srv/console/console.c	(revision 4491338ddbe464a577387f85db0bc04a0e10dad3)
+++ uspace/srv/console/console.c	(revision 47a350ff35743ebcc45e185d8b5218aaf60d91ea)
@@ -50,4 +50,6 @@
 #include <event.h>
 #include <devmap.h>
+#include <fcntl.h>
+#include <vfs/vfs.h>
 #include <fibril_synch.h>
 
@@ -665,18 +667,23 @@
 }
 
-static bool console_init(void)
-{
-	ipcarg_t color_cap;
-
-	/* Connect to keyboard driver */
-	kbd_phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_KEYBOARD, 0, 0);
+static bool console_init(char *input)
+{
+	/* Connect to input device */
+	int input_fd = open(input, O_RDONLY);
+	if (input_fd < 0) {
+		printf(NAME ": Failed opening %s\n", input);
+		return false;
+	}
+	
+	kbd_phone = fd_phone(input_fd);
 	if (kbd_phone < 0) {
-		printf(NAME ": Failed to connect to keyboard service\n");
+		printf(NAME ": Failed to connect to input device\n");
 		return false;
 	}
 	
+	/* NB: The callback connection is slotted for removal */
 	ipcarg_t phonehash;
 	if (ipc_connect_to_me(kbd_phone, SERVICE_CONSOLE, 0, 0, &phonehash) != 0) {
-		printf(NAME ": Failed to create callback from keyboard service\n");
+		printf(NAME ": Failed to create callback from input device\n");
 		return false;
 	}
@@ -702,4 +709,5 @@
 	
 	/* Synchronize, the gcons could put something in queue */
+	ipcarg_t color_cap;
 	async_req_0_0(fb_info.phone, FB_FLUSH);
 	async_req_0_2(fb_info.phone, FB_GET_CSIZE, &fb_info.cols, &fb_info.rows);
@@ -771,9 +779,19 @@
 }
 
+static void usage(void)
+{
+	printf("Usage: console <input>\n");
+}
+
 int main(int argc, char *argv[])
 {
+	if (argc < 2) {
+		usage();
+		return -1;
+	}
+	
 	printf(NAME ": HelenOS Console service\n");
 	
-	if (!console_init())
+	if (!console_init(argv[1]))
 		return -1;
 	
Index: uspace/srv/kbd/generic/kbd.c
===================================================================
--- uspace/srv/kbd/generic/kbd.c	(revision 4491338ddbe464a577387f85db0bc04a0e10dad3)
+++ uspace/srv/kbd/generic/kbd.c	(revision 47a350ff35743ebcc45e185d8b5218aaf60d91ea)
@@ -50,4 +50,5 @@
 #include <io/console.h>
 #include <io/keycode.h>
+#include <devmap.h>
 
 #include <kbd.h>
@@ -56,7 +57,7 @@
 #include <layout.h>
 
-#define NAME "kbd"
-
-int cons_connected = 0;
+#define NAME       "kbd"
+#define NAMESPACE  "hid_in"
+
 int phone2cons = -1;
 
@@ -172,9 +173,4 @@
 	int retval;
 
-	if (cons_connected) {
-		ipc_answer_0(iid, ELIMIT);
-		return;
-	}
-	cons_connected = 1;
 	ipc_answer_0(iid, EOK);
 
@@ -183,7 +179,9 @@
 		switch (IPC_GET_METHOD(call)) {
 		case IPC_M_PHONE_HUNGUP:
-			cons_connected = 0;
-			ipc_hangup(phone2cons);
-			phone2cons = -1;
+			if (phone2cons != -1) {
+				ipc_hangup(phone2cons);
+				phone2cons = -1;
+			}
+			
 			ipc_answer_0(callid, EOK);
 			return;
@@ -216,6 +214,4 @@
 	printf(NAME ": HelenOS Keyboard service\n");
 	
-	ipcarg_t phonead;
-	
 	if (sysinfo_value("kbd.cir.fhc") == 1)
 		cir_service = SERVICE_FHC;
@@ -241,10 +237,20 @@
 	layout[active_layout]->reset();
 	
-	async_set_client_connection(console_connection);
-
-	/* Register service at nameserver. */
-	if (ipc_connect_to_me(PHONE_NS, SERVICE_KEYBOARD, 0, 0, &phonead) != 0)
-		return -1;
-	
+	/* Register driver */
+	int rc = devmap_driver_register(NAME, console_connection);
+	if (rc < 0) {
+		printf(NAME ": Unable to register driver (%d)\n", rc);
+		return -1;
+	}
+	
+	char kbd[DEVMAP_NAME_MAXLEN + 1];
+	snprintf(kbd, DEVMAP_NAME_MAXLEN, "%s/%s", NAMESPACE, NAME);
+	
+	dev_handle_t dev_handle;
+	if (devmap_device_register(kbd, &dev_handle) != EOK) {
+		printf(NAME ": Unable to register device %s\n", kbd);
+		return -1;
+	}
+
 	printf(NAME ": Accepting connections\n");
 	async_manager();
