Index: kernel/arch/amd64/src/amd64.c
===================================================================
--- kernel/arch/amd64/src/amd64.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/arch/amd64/src/amd64.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -66,5 +66,4 @@
 #include <console/console.h>
 #include <ddi/irq.h>
-#include <ddi/device.h>
 #include <sysinfo/sysinfo.h>
 
@@ -195,11 +194,9 @@
 {
 #ifdef CONFIG_PC_KBD
-	devno_t devno = device_assign_devno();
-	
 	/*
 	 * Initialize the i8042 controller. Then initialize the keyboard
 	 * module and connect it to i8042. Enable keyboard interrupts.
 	 */
-	indev_t *kbrdin = i8042_init((i8042_t *) I8042_BASE, devno, IRQ_KBD);
+	indev_t *kbrdin = i8042_init((i8042_t *) I8042_BASE, IRQ_KBD);
 	if (kbrdin) {
 		kbrd_init(kbrdin);
@@ -212,5 +209,4 @@
 	 */
 	sysinfo_set_item_val("kbd", NULL, true);
-	sysinfo_set_item_val("kbd.devno", NULL, devno);
 	sysinfo_set_item_val("kbd.inr", NULL, IRQ_KBD);
 	sysinfo_set_item_val("kbd.address.physical", NULL,
Index: kernel/arch/arm32/src/arm32.c
===================================================================
--- kernel/arch/arm32/src/arm32.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/arch/arm32/src/arm32.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -37,5 +37,4 @@
 #include <config.h>
 #include <arch/console.h>
-#include <ddi/device.h>
 #include <genarch/fb/fb.h>
 #include <genarch/fb/visuals.h>
@@ -129,11 +128,9 @@
 {
 #ifdef CONFIG_ARM_KBD
-	devno_t devno = device_assign_devno();
-	
 	/*
 	 * Initialize the msim/GXemul keyboard port. Then initialize the serial line
 	 * module and connect it to the msim/GXemul keyboard. Enable keyboard interrupts.
 	 */
-	indev_t *kbrdin = dsrlnin_init((dsrlnin_t *) gxemul_kbd, devno, GXEMUL_KBD_IRQ);
+	indev_t *kbrdin = dsrlnin_init((dsrlnin_t *) gxemul_kbd, GXEMUL_KBD_IRQ);
 	if (kbrdin)
 		srln_init(kbrdin);
@@ -144,5 +141,4 @@
 	 */
 	sysinfo_set_item_val("kbd", NULL, true);
-	sysinfo_set_item_val("kbd.devno", NULL, devno);
 	sysinfo_set_item_val("kbd.inr", NULL, GXEMUL_KBD_IRQ);
 	sysinfo_set_item_val("kbd.address.virtual", NULL, (unative_t) gxemul_kbd);
Index: kernel/arch/ia32/src/drivers/i8254.c
===================================================================
--- kernel/arch/ia32/src/drivers/i8254.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/arch/ia32/src/drivers/i8254.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -27,10 +27,10 @@
  */
 
-/** @addtogroup ia32	
+/** @addtogroup ia32
  * @{
  */
 /**
  * @file
- * @brief	i8254 chip driver.
+ * @brief i8254 chip driver.
  *
  * Low level time functions.
Index: kernel/arch/ia32/src/ia32.c
===================================================================
--- kernel/arch/ia32/src/ia32.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/arch/ia32/src/ia32.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -66,5 +66,4 @@
 #include <syscall/syscall.h>
 #include <console/console.h>
-#include <ddi/device.h>
 #include <sysinfo/sysinfo.h>
 #include <arch/boot/boot.h>
@@ -153,11 +152,9 @@
 {
 #ifdef CONFIG_PC_KBD
-	devno_t devno = device_assign_devno();
-	
 	/*
 	 * Initialize the i8042 controller. Then initialize the keyboard
 	 * module and connect it to i8042. Enable keyboard interrupts.
 	 */
-	indev_t *kbrdin = i8042_init((i8042_t *) I8042_BASE, devno, IRQ_KBD);
+	indev_t *kbrdin = i8042_init((i8042_t *) I8042_BASE, IRQ_KBD);
 	if (kbrdin) {
 		kbrd_init(kbrdin);
@@ -170,5 +167,4 @@
 	 */
 	sysinfo_set_item_val("kbd", NULL, true);
-	sysinfo_set_item_val("kbd.devno", NULL, devno);
 	sysinfo_set_item_val("kbd.inr", NULL, IRQ_KBD);
 	sysinfo_set_item_val("kbd.address.physical", NULL,
Index: kernel/arch/ia32/src/smp/apic.c
===================================================================
--- kernel/arch/ia32/src/smp/apic.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/arch/ia32/src/smp/apic.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup ia32	
+/** @addtogroup ia32
  * @{
  */
Index: kernel/arch/ia64/src/drivers/it.c
===================================================================
--- kernel/arch/ia64/src/drivers/it.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/arch/ia64/src/drivers/it.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup ia64	
+/** @addtogroup ia64
  * @{
  */
Index: kernel/arch/ia64/src/ia64.c
===================================================================
--- kernel/arch/ia64/src/ia64.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/arch/ia64/src/ia64.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -51,5 +51,4 @@
 #include <syscall/syscall.h>
 #include <ddi/irq.h>
-#include <ddi/device.h>
 #include <arch/bootinfo.h>
 #include <genarch/drivers/legacy/ia32/io.h>
@@ -163,12 +162,10 @@
 	
 #ifdef CONFIG_NS16550
-	devno_t devno_ns16550 = device_assign_devno();
 	indev_t *kbrdin_ns16550
-	    = ns16550_init((ns16550_t *) NS16550_BASE, devno_ns16550, NS16550_IRQ, NULL, NULL);
+	    = ns16550_init((ns16550_t *) NS16550_BASE, NS16550_IRQ, NULL, NULL);
 	if (kbrdin_ns16550)
 		srln_init(kbrdin_ns16550);
 	
 	sysinfo_set_item_val("kbd", NULL, true);
-	sysinfo_set_item_val("kbd.devno", NULL, devno_ns16550);
 	sysinfo_set_item_val("kbd.inr", NULL, NS16550_IRQ);
 	sysinfo_set_item_val("kbd.type", NULL, KBD_NS16550);
@@ -180,11 +177,9 @@
 	
 #ifdef CONFIG_I8042
-	devno_t devno_i8042 = device_assign_devno();
-	indev_t *kbrdin_i8042 = i8042_init((i8042_t *) I8042_BASE, devno_i8042, IRQ_KBD);
+	indev_t *kbrdin_i8042 = i8042_init((i8042_t *) I8042_BASE, IRQ_KBD);
 	if (kbrdin_i8042)
 		kbrd_init(kbrdin_i8042);
 	
 	sysinfo_set_item_val("kbd", NULL, true);
-	sysinfo_set_item_val("kbd.devno", NULL, devno_i8042);
 	sysinfo_set_item_val("kbd.inr", NULL, IRQ_KBD);
 	sysinfo_set_item_val("kbd.type", NULL, KBD_LEGACY);
Index: kernel/arch/mips32/src/mips32.c
===================================================================
--- kernel/arch/mips32/src/mips32.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/arch/mips32/src/mips32.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -57,5 +57,4 @@
 #include <genarch/srln/srln.h>
 #include <macros.h>
-#include <ddi/device.h>
 #include <config.h>
 #include <string.h>
@@ -167,11 +166,9 @@
 {
 #ifdef CONFIG_MIPS_KBD
-	devno_t devno = device_assign_devno();
-	
 	/*
 	 * Initialize the msim/GXemul keyboard port. Then initialize the serial line
 	 * module and connect it to the msim/GXemul keyboard. Enable keyboard interrupts.
 	 */
-	indev_t *kbrdin = dsrlnin_init((dsrlnin_t *) MSIM_KBD_ADDRESS, devno, MSIM_KBD_IRQ);
+	indev_t *kbrdin = dsrlnin_init((dsrlnin_t *) MSIM_KBD_ADDRESS, MSIM_KBD_IRQ);
 	if (kbrdin) {
 		srln_init(kbrdin);
@@ -184,5 +181,4 @@
 	 */
 	sysinfo_set_item_val("kbd", NULL, true);
-	sysinfo_set_item_val("kbd.devno", NULL, devno);
 	sysinfo_set_item_val("kbd.inr", NULL, MSIM_KBD_IRQ);
 	sysinfo_set_item_val("kbd.address.virtual", NULL, MSIM_KBD_ADDRESS);
Index: kernel/arch/ppc32/include/drivers/cuda.h
===================================================================
--- kernel/arch/ppc32/include/drivers/cuda.h	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/arch/ppc32/include/drivers/cuda.h	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -39,5 +39,5 @@
 #include <typedefs.h>
 
-extern void cuda_init(devno_t devno, uintptr_t base, size_t size);
+extern void cuda_init(uintptr_t base, size_t size);
 extern int cuda_get_scancode(void);
 
Index: kernel/arch/ppc32/src/drivers/cuda.c
===================================================================
--- kernel/arch/ppc32/src/drivers/cuda.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/arch/ppc32/src/drivers/cuda.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -41,4 +41,5 @@
 #include <interrupt.h>
 #include <stdarg.h>
+#include <ddi/device.h>
 
 #define CUDA_IRQ 10
@@ -242,5 +243,5 @@
 }
 
-void cuda_init(devno_t devno, uintptr_t base, size_t size)
+void cuda_init(uintptr_t base, size_t size)
 {
 	cuda = (uint8_t *) hw_map(base, size);
@@ -250,5 +251,5 @@
 	
 	irq_initialize(&cuda_irq);
-	cuda_irq.devno = devno;
+	cuda_irq.devno = device_assign_devno();
 	cuda_irq.inr = CUDA_IRQ;
 	cuda_irq.claim = cuda_claim;
@@ -259,5 +260,4 @@
 	
 	sysinfo_set_item_val("kbd", NULL, true);
-	sysinfo_set_item_val("kbd.devno", NULL, devno);
 	sysinfo_set_item_val("kbd.inr", NULL, CUDA_IRQ);
 	sysinfo_set_item_val("kbd.address.virtual", NULL, base);
Index: kernel/arch/ppc32/src/ppc32.c
===================================================================
--- kernel/arch/ppc32/src/ppc32.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/arch/ppc32/src/ppc32.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -43,5 +43,4 @@
 #include <proc/uarg.h>
 #include <console/console.h>
-#include <ddi/device.h>
 #include <ddi/irq.h>
 #include <arch/drivers/pic.h>
@@ -122,6 +121,5 @@
 			
 			/* Initialize I/O controller */
-			cuda_init(device_assign_devno(),
-			    bootinfo.macio.addr + 0x16000, 2 * PAGE_SIZE);
+			cuda_init(bootinfo.macio.addr + 0x16000, 2 * PAGE_SIZE);
 		}
 		
Index: kernel/arch/sparc64/src/drivers/kbd.c
===================================================================
--- kernel/arch/sparc64/src/drivers/kbd.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/arch/sparc64/src/drivers/kbd.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -47,5 +47,4 @@
 
 #include <console/console.h>
-#include <ddi/device.h>
 #include <ddi/irq.h>
 #include <arch/mm/page.h>
@@ -75,5 +74,5 @@
 	cir_t cir;
 	void *cir_arg;
-
+	
 #ifdef CONFIG_NS16550
 	ns16550_t *ns16550;
@@ -116,5 +115,4 @@
 	uintptr_t pa;
 	size_t size;
-	devno_t devno;
 	inr_t inr;
 	
@@ -165,9 +163,8 @@
 #ifdef CONFIG_Z8530
 	case KBD_Z8530:
-		devno = device_assign_devno();
 		z8530 = (z8530_t *) hw_map(aligned_addr, offset + size) +
 		    offset;
 		
-		indev_t *kbrdin_z8530 = z8530_init(z8530, devno, inr, cir, cir_arg);
+		indev_t *kbrdin_z8530 = z8530_init(z8530, inr, cir, cir_arg);
 		if (kbrdin_z8530)
 			kbrd_init(kbrdin_z8530);
@@ -179,5 +176,4 @@
 		sysinfo_set_item_val("kbd", NULL, true);
 		sysinfo_set_item_val("kbd.type", NULL, KBD_Z8530);
-		sysinfo_set_item_val("kbd.devno", NULL, devno);
 		sysinfo_set_item_val("kbd.inr", NULL, inr);
 		sysinfo_set_item_val("kbd.address.kernel", NULL,
@@ -188,9 +184,8 @@
 #ifdef CONFIG_NS16550
 	case KBD_NS16550:
-		devno = device_assign_devno();
 		ns16550 = (ns16550_t *) hw_map(aligned_addr, offset + size) +
 		    offset;
 		
-		indev_t *kbrdin_ns16550 = ns16550_init(ns16550, devno, inr, cir, cir_arg);
+		indev_t *kbrdin_ns16550 = ns16550_init(ns16550, inr, cir, cir_arg);
 		if (kbrdin_ns16550)
 			kbrd_init(kbrdin_ns16550);
@@ -202,5 +197,4 @@
 		sysinfo_set_item_val("kbd", NULL, true);
 		sysinfo_set_item_val("kbd.type", NULL, KBD_NS16550);
-		sysinfo_set_item_val("kbd.devno", NULL, devno);
 		sysinfo_set_item_val("kbd.inr", NULL, inr);
 		sysinfo_set_item_val("kbd.address.kernel", NULL,
Index: kernel/genarch/include/drivers/dsrln/dsrlnin.h
===================================================================
--- kernel/genarch/include/drivers/dsrln/dsrlnin.h	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/genarch/include/drivers/dsrln/dsrlnin.h	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -48,5 +48,4 @@
 
 typedef struct {
-	devno_t devno;
 	irq_t irq;
 	dsrlnin_t *dsrlnin;
@@ -54,5 +53,5 @@
 } dsrlnin_instance_t;
 
-extern indev_t *dsrlnin_init(dsrlnin_t *, devno_t, inr_t);
+extern indev_t *dsrlnin_init(dsrlnin_t *, inr_t);
 
 #endif
Index: kernel/genarch/include/drivers/i8042/i8042.h
===================================================================
--- kernel/genarch/include/drivers/i8042/i8042.h	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/genarch/include/drivers/i8042/i8042.h	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -48,5 +48,4 @@
 
 typedef struct {
-	devno_t devno;
 	irq_t irq;
 	i8042_t *i8042;
@@ -54,5 +53,5 @@
 } i8042_instance_t;
 
-extern indev_t *i8042_init(i8042_t *, devno_t, inr_t);
+extern indev_t *i8042_init(i8042_t *, inr_t);
 
 #endif
Index: kernel/genarch/include/drivers/ns16550/ns16550.h
===================================================================
--- kernel/genarch/include/drivers/ns16550/ns16550.h	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/genarch/include/drivers/ns16550/ns16550.h	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -63,5 +63,4 @@
 /** Structure representing the ns16550 device. */
 typedef struct {
-	devno_t devno;
 	ns16550_t *ns16550;
 	irq_t irq;
@@ -69,5 +68,5 @@
 } ns16550_instance_t;
 
-extern indev_t *ns16550_init(ns16550_t *, devno_t, inr_t, cir_t, void *);
+extern indev_t *ns16550_init(ns16550_t *, inr_t, cir_t, void *);
 
 #endif
Index: kernel/genarch/include/drivers/z8530/z8530.h
===================================================================
--- kernel/genarch/include/drivers/z8530/z8530.h	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/genarch/include/drivers/z8530/z8530.h	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -115,5 +115,4 @@
 /** Structure representing the z8530 device. */
 typedef struct {
-	devno_t devno;
 	irq_t irq;
 	z8530_t *z8530;
@@ -121,5 +120,5 @@
 } z8530_instance_t;
 
-extern indev_t *z8530_init(z8530_t *, devno_t, inr_t, cir_t, void *);
+extern indev_t *z8530_init(z8530_t *, inr_t, cir_t, void *);
 
 #endif
Index: kernel/genarch/src/drivers/dsrln/dsrlnin.c
===================================================================
--- kernel/genarch/src/drivers/dsrln/dsrlnin.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/genarch/src/drivers/dsrln/dsrlnin.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -39,4 +39,5 @@
 #include <mm/slab.h>
 #include <arch/asm.h>
+#include <ddi/device.h>
 
 static indev_operations_t kbrdin_ops = {
@@ -57,5 +58,5 @@
 }
 
-indev_t *dsrlnin_init(dsrlnin_t *dev, devno_t devno, inr_t inr)
+indev_t *dsrlnin_init(dsrlnin_t *dev, inr_t inr)
 {
 	dsrlnin_instance_t *instance
@@ -66,9 +67,8 @@
 	indev_initialize("dsrlnin", &instance->kbrdin, &kbrdin_ops);
 	
-	instance->devno = devno;
 	instance->dsrlnin = dev;
 	
 	irq_initialize(&instance->irq);
-	instance->irq.devno = devno;
+	instance->irq.devno = device_assign_devno();
 	instance->irq.inr = inr;
 	instance->irq.claim = dsrlnin_claim;
Index: kernel/genarch/src/drivers/i8042/i8042.c
===================================================================
--- kernel/genarch/src/drivers/i8042/i8042.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/genarch/src/drivers/i8042/i8042.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -42,4 +42,5 @@
 #include <console/chardev.h>
 #include <mm/slab.h>
+#include <ddi/device.h>
 
 static indev_operations_t kbrdin_ops = {
@@ -77,5 +78,5 @@
 
 /** Initialize i8042. */
-indev_t *i8042_init(i8042_t *dev, devno_t devno, inr_t inr)
+indev_t *i8042_init(i8042_t *dev, inr_t inr)
 {
 	i8042_instance_t *instance
@@ -86,9 +87,8 @@
 	indev_initialize("i8042", &instance->kbrdin, &kbrdin_ops);
 	
-	instance->devno = devno;
 	instance->i8042 = dev;
 	
 	irq_initialize(&instance->irq);
-	instance->irq.devno = devno;
+	instance->irq.devno = device_assign_devno();
 	instance->irq.inr = inr;
 	instance->irq.claim = i8042_claim;
Index: kernel/genarch/src/drivers/ns16550/ns16550.c
===================================================================
--- kernel/genarch/src/drivers/ns16550/ns16550.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/genarch/src/drivers/ns16550/ns16550.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -40,4 +40,5 @@
 #include <console/chardev.h>
 #include <mm/slab.h>
+#include <ddi/device.h>
 
 #define LSR_DATA_READY  0x01
@@ -80,5 +81,5 @@
  *
  */
-indev_t *ns16550_init(ns16550_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg)
+indev_t *ns16550_init(ns16550_t *dev, inr_t inr, cir_t cir, void *cir_arg)
 {
 	ns16550_instance_t *instance
@@ -89,9 +90,8 @@
 	indev_initialize("ns16550", &instance->kbrdin, &kbrdin_ops);
 	
-	instance->devno = devno;
 	instance->ns16550 = dev;
 	
 	irq_initialize(&instance->irq);
-	instance->irq.devno = devno;
+	instance->irq.devno = device_assign_devno();
 	instance->irq.inr = inr;
 	instance->irq.claim = ns16550_claim;
Index: kernel/genarch/src/drivers/z8530/z8530.c
===================================================================
--- kernel/genarch/src/drivers/z8530/z8530.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/genarch/src/drivers/z8530/z8530.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -40,4 +40,5 @@
 #include <arch/asm.h>
 #include <mm/slab.h>
+#include <ddi/device.h>
 
 static indev_operations_t kbrdin_ops = {
@@ -88,5 +89,5 @@
 
 /** Initialize z8530. */
-indev_t *z8530_init(z8530_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg)
+indev_t *z8530_init(z8530_t *dev, inr_t inr, cir_t cir, void *cir_arg)
 {
 	z8530_instance_t *instance
@@ -97,9 +98,8 @@
 	indev_initialize("z8530", &instance->kbrdin, &kbrdin_ops);
 	
-	instance->devno = devno;
 	instance->z8530 = dev;
 	
 	irq_initialize(&instance->irq);
-	instance->irq.devno = devno;
+	instance->irq.devno = device_assign_devno();
 	instance->irq.inr = inr;
 	instance->irq.claim = z8530_claim;
Index: kernel/generic/include/ddi/device.h
===================================================================
--- kernel/generic/include/ddi/device.h	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/generic/include/ddi/device.h	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -40,4 +40,5 @@
 
 extern devno_t device_assign_devno(void);
+extern unative_t sys_device_assign_devno(void);
 
 #endif
Index: kernel/generic/include/syscall/syscall.h
===================================================================
--- kernel/generic/include/syscall/syscall.h	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/generic/include/syscall/syscall.h	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -73,4 +73,5 @@
 	SYS_CAP_REVOKE,
 	
+	SYS_DEVICE_ASSIGN_DEVNO,
 	SYS_PHYSMEM_MAP,
 	SYS_IOSPACE_ENABLE,
Index: kernel/generic/src/console/kconsole.c
===================================================================
--- kernel/generic/src/console/kconsole.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/generic/src/console/kconsole.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -135,12 +135,9 @@
 void kconsole_notify_init(void)
 {
-	devno_t devno = device_assign_devno();
-	
 	sysinfo_set_item_val("kconsole.present", NULL, true);
-	sysinfo_set_item_val("kconsole.devno", NULL, devno);
 	sysinfo_set_item_val("kconsole.inr", NULL, KCONSOLE_VIRT_INR);
 	
 	irq_initialize(&kconsole_irq);
-	kconsole_irq.devno = devno;
+	kconsole_irq.devno = device_assign_devno();
 	kconsole_irq.inr = KCONSOLE_VIRT_INR;
 	kconsole_irq.claim = kconsole_claim;
Index: kernel/generic/src/ddi/device.c
===================================================================
--- kernel/generic/src/ddi/device.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/generic/src/ddi/device.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -32,5 +32,5 @@
 /**
  * @file
- * @brief	Device numbers.
+ * @brief Device numbers.
  */
 
@@ -48,10 +48,13 @@
 devno_t device_assign_devno(void)
 {
-	devno_t devno;	
+	devno_t devno = (devno_t) atomic_postinc(&last);
+	ASSERT(devno >= 0);
+	
+	return devno;
+}
 
-	devno = (devno_t) atomic_postinc(&last);
-	ASSERT(devno >= 0);
-
-	return devno;
+unative_t sys_device_assign_devno(void)
+{
+	return (unative_t) device_assign_devno();
 }
 
Index: kernel/generic/src/syscall/syscall.c
===================================================================
--- kernel/generic/src/syscall/syscall.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ kernel/generic/src/syscall/syscall.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -33,7 +33,7 @@
 /**
  * @file
- * @brief	Syscall table and syscall wrappers.
+ * @brief Syscall table and syscall wrappers.
  */
- 
+
 #include <syscall/syscall.h>
 #include <proc/thread.h>
@@ -43,7 +43,7 @@
 #include <print.h>
 #include <putchar.h>
-#include <errno.h>
 #include <arch.h>
 #include <debug.h>
+#include <ddi/device.h>
 #include <ipc/sysipc.h>
 #include <synch/futex.h>
@@ -51,59 +51,7 @@
 #include <ddi/ddi.h>
 #include <security/cap.h>
-#include <syscall/copy.h>
 #include <sysinfo/sysinfo.h>
 #include <console/console.h>
 #include <udebug/udebug.h>
-
-/** Print using kernel facility
- *
- * Print to kernel log.
- *
- */
-static unative_t sys_klog(int fd, const void * buf, size_t count) 
-{
-	char *data;
-	int rc;
-
-	if (count > PAGE_SIZE)
-		return ELIMIT;
-	
-	if (count > 0) {
-		data = (char *) malloc(count + 1, 0);
-		if (!data)
-			return ENOMEM;
-		
-		rc = copy_from_uspace(data, buf, count);
-		if (rc) {
-			free(data);
-			return rc;
-		}
-		data[count] = 0;
-		
-		printf("%s", data);
-		free(data);
-	} else
-		klog_update();
-	
-	return count;
-}
-
-/** Tell kernel to get keyboard/console access again */
-static unative_t sys_debug_enable_console(void)
-{
-#ifdef CONFIG_KCONSOLE
-	grab_console();
-	return true;
-#else
-	return false;
-#endif
-}
-
-/** Tell kernel to relinquish keyboard/console access */
-static unative_t sys_debug_disable_console(void)
-{
-	release_console();
-	return true;
-}
 
 /** Dispatch system call */
@@ -112,9 +60,10 @@
 {
 	unative_t rc;
-
+	
 #ifdef CONFIG_UDEBUG
 	udebug_syscall_event(a1, a2, a3, a4, a5, a6, id, 0, false);
 #endif
-	if (id < SYSCALL_END) {	
+	
+	if (id < SYSCALL_END) {
 		rc = syscall_table[id](a1, a2, a3, a4, a5, a6);
 	} else {
@@ -123,11 +72,11 @@
 		thread_exit();
 	}
-		
+	
 	if (THREAD->interrupted)
 		thread_exit();
-
+	
 #ifdef CONFIG_UDEBUG
 	udebug_syscall_event(a1, a2, a3, a4, a5, a6, id, rc, true);
-
+	
 	/*
 	 * Stopping point needed for tasks that only invoke non-blocking
@@ -136,5 +85,6 @@
 	udebug_stoppable_begin();
 	udebug_stoppable_end();
-#endif	
+#endif
+	
 	return rc;
 }
@@ -183,4 +133,5 @@
 	
 	/* DDI related syscalls. */
+	(syshandler_t) sys_device_assign_devno,
 	(syshandler_t) sys_physmem_map,
 	(syshandler_t) sys_iospace_enable,
Index: uspace/app/klog/klog.c
===================================================================
--- uspace/app/klog/klog.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ uspace/app/klog/klog.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -82,10 +82,9 @@
 	}
 	
-	int devno = sysinfo_value("klog.devno");
-	int inr = sysinfo_value("klog.inr");
-	if (ipc_register_irq(inr, devno, 0, NULL) != EOK) {
-		printf(NAME ": Error registering klog notifications\n");
-		return -1;
-	}
+//	int inr = sysinfo_value("klog.inr");
+//	if (ipc_register_irq(inr, devno, 0, NULL) != EOK) {
+//		printf(NAME ": Error registering klog notifications\n");
+//		return -1;
+//	}
 	
 	async_set_interrupt_received(interrupt_received);
Index: uspace/lib/libc/generic/ddi.c
===================================================================
--- uspace/lib/libc/generic/ddi.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ uspace/lib/libc/generic/ddi.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -41,4 +41,14 @@
 #include <libarch/config.h>
 #include <kernel/ddi/ddi_arg.h>
+
+/** Return unique device number.
+ *
+ * @return New unique device number.
+ *
+ */
+int device_assign_devno(void)
+{
+	return __SYSCALL0(SYS_DEVICE_ASSIGN_DEVNO);
+}
 
 /** Map piece of physical memory to task.
Index: uspace/lib/libc/include/ddi.h
===================================================================
--- uspace/lib/libc/include/ddi.h	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ uspace/lib/libc/include/ddi.h	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -38,4 +38,5 @@
 #include <task.h>
 
+extern int device_assign_devno(void);
 extern int physmem_map(void *, void *, unsigned long, int);
 extern int iospace_enable(task_id_t, void *, unsigned long);
Index: uspace/srv/console/console.c
===================================================================
--- uspace/srv/console/console.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ uspace/srv/console/console.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -587,12 +587,11 @@
 	
 	/* Receive kernel notifications */
-	if (sysinfo_value("kconsole.present")) {
-		int devno = sysinfo_value("kconsole.devno");
-		int inr = sysinfo_value("kconsole.inr");
-		if (ipc_register_irq(inr, devno, 0, NULL) != EOK)
-			printf(NAME ": Error registering kconsole notifications\n");
-		
-		async_set_interrupt_received(interrupt_received);
-	}
+//	if (sysinfo_value("kconsole.present")) {
+//		int inr = sysinfo_value("kconsole.inr");
+//		if (ipc_register_irq(inr, device_assign_devno(), 0, NULL) != EOK)
+//			printf(NAME ": Error registering kconsole notifications\n");
+//		
+//		async_set_interrupt_received(interrupt_received);
+//	}
 	
 	// FIXME: avoid connectiong to itself, keep using klog
Index: uspace/srv/kbd/port/gxemul.c
===================================================================
--- uspace/srv/kbd/port/gxemul.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ uspace/srv/kbd/port/gxemul.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -40,4 +40,5 @@
 #include <kbd_port.h>
 #include <kbd.h>
+#include <ddi.h>
 
 static irq_cmd_t gxemul_cmds[] = {
@@ -64,5 +65,5 @@
 	async_set_interrupt_received(gxemul_irq_handler);
 	gxemul_cmds[0].addr = (void *) sysinfo_value("kbd.address.virtual");
-	ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"),
+	ipc_register_irq(sysinfo_value("kbd.inr"), device_assign_devno(),
 	    0, &gxemul_kbd);
 	return 0;
Index: uspace/srv/kbd/port/i8042.c
===================================================================
--- uspace/srv/kbd/port/i8042.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ uspace/srv/kbd/port/i8042.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -44,4 +44,5 @@
 #include <kbd_port.h>
 #include <kbd.h>
+#include <ddi.h>
 #include "i8042.h"
 
@@ -137,5 +138,5 @@
 	i8042_kbd.cmds[0].addr = &((i8042_t *) i8042_kernel)->status;
 	i8042_kbd.cmds[3].addr = &((i8042_t *) i8042_kernel)->data;
-	ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &i8042_kbd);
+	ipc_register_irq(sysinfo_value("kbd.inr"), device_assign_devno(), 0, &i8042_kbd);
 
 	int newcontrol = i8042_KBD_IE | i8042_KBD_TRANSLATE;
Index: uspace/srv/kbd/port/msim.c
===================================================================
--- uspace/srv/kbd/port/msim.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ uspace/srv/kbd/port/msim.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -40,4 +40,5 @@
 #include <kbd_port.h>
 #include <kbd.h>
+#include <ddi.h>
 
 irq_cmd_t msim_cmds[] = {
@@ -64,5 +65,5 @@
 	async_set_interrupt_received(msim_irq_handler);
 	msim_cmds[0].addr = sysinfo_value("kbd.address.virtual");
-	ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"),
+	ipc_register_irq(sysinfo_value("kbd.inr"), device_assign_devno(),
 	    0, &msim_kbd);
 	return 0;
Index: uspace/srv/kbd/port/ns16550.c
===================================================================
--- uspace/srv/kbd/port/ns16550.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ uspace/srv/kbd/port/ns16550.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -100,5 +100,5 @@
 	ns16550_kbd.cmds[0].addr = (void *) (ns16550_kernel + LSR_REG);
 	ns16550_kbd.cmds[3].addr = (void *) (ns16550_kernel + RBR_REG);
-	ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"),
+	ipc_register_irq(sysinfo_value("kbd.inr"), device_assign_devno(),
 	    0, &ns16550_kbd);
 	return pio_enable((void *) ns16550_physical, 8, &vaddr);
Index: uspace/srv/kbd/port/z8530.c
===================================================================
--- uspace/srv/kbd/port/z8530.c	(revision 8015eeeca49b33fa24f838db9d0debfdaa86b938)
+++ uspace/srv/kbd/port/z8530.c	(revision 84afc7bf42bf4b5e22750a7f377f4bfc31636630)
@@ -90,5 +90,5 @@
 	z8530_cmds[3].addr = (void *) sysinfo_value("kbd.address.kernel") +
 	    CHAN_A_DATA;
-	ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"),
+	ipc_register_irq(sysinfo_value("kbd.inr"), device_assign_devno(),
 	    sysinfo_value("kbd.inr"), &z8530_kbd);
 	return 0;
