Index: kernel/arch/ppc32/src/drivers/cuda.c
===================================================================
--- kernel/arch/ppc32/src/drivers/cuda.c	(revision 06e1e95342d7b9a9c85c7492529a309d51a3fb6c)
+++ kernel/arch/ppc32/src/drivers/cuda.c	(revision f5e39a320e357d44b5a00aee5a89c13acba9c80d)
@@ -34,4 +34,5 @@
 
 #include <arch/drivers/cuda.h>
+#include <ddi/irq.h>
 #include <arch/asm.h>
 #include <console/console.h>
@@ -42,4 +43,5 @@
 #include <stdarg.h>
 
+#define CUDA_IRQ 10
 #define SPECIAL		'?'
 
@@ -61,5 +63,7 @@
 
 static volatile uint8_t *cuda = NULL;
-static iroutine vector;
+static irq_t cuda_irq;		/**< Cuda's IRQ. */
+
+static ipc_notif_cfg_t saved_notif_cfg;
 
 
@@ -249,13 +253,22 @@
 }
 
-static void cuda_irq(int n, istate_t *istate)
-{
-	int scan_code = cuda_get_scancode();
-	
-	if (scan_code != -1) {
-		uint8_t scancode = (uint8_t) scan_code;
-		if ((scancode & 0x80) != 0x80)
-			chardev_push_character(&kbrd, lchars[scancode & 0x7f]);
+static void cuda_irq_handler(irq_t *irq, void *arg, ...)
+{
+	if (irq->notif_cfg.answerbox)
+		ipc_irq_send_notif(irq);
+	else {
+		int scan_code = cuda_get_scancode();
+		
+		if (scan_code != -1) {
+			uint8_t scancode = (uint8_t) scan_code;
+			if ((scancode & 0x80) != 0x80)
+				chardev_push_character(&kbrd, lchars[scancode & 0x7f]);
+		}
 	}
+}
+
+static irq_ownership_t cuda_claim(void)
+{
+	return IRQ_ACCEPT;
 }
 
@@ -264,5 +277,11 @@
 void cuda_grab(void)
 {
-	vector = int_register(CUDA_IRQ, "cuda", cuda_irq);
+	if (cuda_irq.notif_cfg.answerbox) {
+		saved_notif_cfg = cuda_irq.notif_cfg;
+		cuda_irq.notif_cfg.answerbox = NULL;
+		cuda_irq.notif_cfg.code = NULL;
+		cuda_irq.notif_cfg.method = 0;
+		cuda_irq.notif_cfg.counter = 0;
+	}
 }
 
@@ -271,21 +290,31 @@
 void cuda_release(void)
 {
-	if (vector)
-		int_register(CUDA_IRQ, "user_interrupt", vector);
-}
-
-
-void cuda_init(uintptr_t base, size_t size)
-{
-	cuda = (uint8_t *) hw_map(base, size);
-	
-	int_register(CUDA_IRQ, "cuda", cuda_irq);
-	pic_enable_interrupt(CUDA_IRQ);
+	if (saved_notif_cfg.answerbox)
+		cuda_irq.notif_cfg = saved_notif_cfg;
+}
+
+
+void cuda_init(devno_t devno, uintptr_t base, size_t size)
+{
+	cuda = (uint8_t *) hw_map(base, size);	
 	
 	chardev_initialize("cuda_kbd", &kbrd, &ops);
 	stdin = &kbrd;
 	
-	sysinfo_set_item_val("cuda", NULL, true);
-	sysinfo_set_item_val("cuda.irq", NULL, CUDA_IRQ);
+	irq_initialize(&cuda_irq);
+	cuda_irq.devno = devno;
+	cuda_irq.inr = CUDA_IRQ;
+	cuda_irq.claim = cuda_claim;
+	cuda_irq.handler = cuda_irq_handler;
+	irq_register(&cuda_irq);
+	
+	pic_enable_interrupt(CUDA_IRQ);
+
+	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);
+
+	cuda_grab();
 }
 
Index: kernel/arch/ppc32/src/drivers/pic.c
===================================================================
--- kernel/arch/ppc32/src/drivers/pic.c	(revision 06e1e95342d7b9a9c85c7492529a309d51a3fb6c)
+++ kernel/arch/ppc32/src/drivers/pic.c	(revision f5e39a320e357d44b5a00aee5a89c13acba9c80d)
@@ -81,11 +81,11 @@
 
 	pending = pic[PIC_PENDING_LOW];
-	if (pending) {
+	if (pending)
 		return fnzb32(pending);
-	}
+	
 	pending = pic[PIC_PENDING_HIGH];
-	if (pending) {
+	if (pending)
 		return fnzb32(pending) + 32;
-	}
+	
 	return -1;
 }
