Index: kernel/arch/mips32/src/drivers/arc.c
===================================================================
--- kernel/arch/mips32/src/drivers/arc.c	(revision 06e1e95342d7b9a9c85c7492529a309d51a3fb6c)
+++ kernel/arch/mips32/src/drivers/arc.c	(revision 95b355086cd805dc6f9cc96f44fa2ef92cecd8b5)
@@ -354,13 +354,4 @@
 };
 
-iroutine old_timer;
-/** Do polling on timer interrupt */
-static void timer_replace(int n, istate_t *istate)
-{
-	arc_keyboard_poll();
-	old_timer(n, istate);
-	arc_keyboard_poll();
-}
-
 void arc_console(void)
 {
@@ -368,5 +359,5 @@
 	
 	chardev_initialize("arc_console", &console, &arc_ops);
-	old_timer = int_register(TIMER_IRQ, "arc_kb_poll", timer_replace);
+	timer_fnc = &arc_keyboard_poll;
 	stdin = &console;
 	stdout = &console;
Index: kernel/arch/mips32/src/drivers/msim.c
===================================================================
--- kernel/arch/mips32/src/drivers/msim.c	(revision 06e1e95342d7b9a9c85c7492529a309d51a3fb6c)
+++ kernel/arch/mips32/src/drivers/msim.c	(revision 95b355086cd805dc6f9cc96f44fa2ef92cecd8b5)
@@ -38,6 +38,14 @@
 #include <arch/cp0.h>
 #include <console/console.h>
+#include <ddi/irq.h>
+#include <sysinfo/sysinfo.h>
+
+/** Address of devices. */
+#define MSIM_VIDEORAM		0xB0000000
+#define MSIM_KBD_ADDRESS	0xB0000000
+#define MSIM_KBD_IRQ 		2
 
 static chardev_t console;
+static irq_t msim_irq;
 
 static void msim_write(chardev_t *dev, const char ch);
@@ -90,39 +98,57 @@
 
 /** Process keyboard interrupt. */
-static void msim_interrupt(int n, istate_t *istate)
+static void msim_irq_handler(irq_t *irq, void *arg, ...)
 {
-	char ch = 0;
+	if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox))
+		ipc_irq_send_notif(irq);
+	else {
+		char ch = 0;
+		
+			ch = *((char *) MSIM_KBD_ADDRESS);
+			if (ch =='\r')
+				ch = '\n';
+			if (ch == 0x7f)
+				ch = '\b';
+			chardev_push_character(&console, ch);
+	}
+}
 
-	ch = *((char *) MSIM_KBD_ADDRESS);
-	if (ch =='\r')
-		ch = '\n';
-	if (ch == 0x7f)
-		ch = '\b';
-	chardev_push_character(&console, ch);
+static irq_ownership_t msim_claim(void)
+{
+	return IRQ_ACCEPT;
+}
+
+void msim_kbd_grab(void)
+{
+	msim_irq.notif_cfg.notify = false;
+}
+
+void msim_kbd_release(void)
+{
+	if (msim_irq.notif_cfg.answerbox)
+		msim_irq.notif_cfg.notify = true;
 }
 
 
 /* Return console object representing msim console */
-void msim_console(void)
+void msim_console(devno_t devno)
 {
 	chardev_initialize("msim_console", &console, &msim_ops);
-
-	int_register(MSIM_KBD_IRQ, "msim_kbd", msim_interrupt);
-
-	cp0_unmask_int(MSIM_KBD_IRQ);
-
 	stdin = &console;
 	stdout = &console;
-}
-
-static iroutine oldvector;
-void msim_kbd_grab(void)
-{
-	oldvector = int_register(MSIM_KBD_IRQ, "msim_kbd", msim_interrupt);
-}
-void msim_kbd_release(void)
-{
-	if (oldvector)
-		int_register(MSIM_KBD_IRQ, "user_interrupt", oldvector);
+	
+	irq_initialize(&msim_irq);
+	msim_irq.devno = devno;
+	msim_irq.inr = MSIM_KBD_IRQ;
+	msim_irq.claim = msim_claim;
+	msim_irq.handler = msim_irq_handler;
+	irq_register(&msim_irq);
+	
+	cp0_unmask_int(MSIM_KBD_IRQ);
+	
+	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/mips32/src/drivers/serial.c
===================================================================
--- kernel/arch/mips32/src/drivers/serial.c	(revision 06e1e95342d7b9a9c85c7492529a309d51a3fb6c)
+++ kernel/arch/mips32/src/drivers/serial.c	(revision 95b355086cd805dc6f9cc96f44fa2ef92cecd8b5)
@@ -38,5 +38,9 @@
 #include <console/chardev.h>
 #include <console/console.h>
+#include <ddi/irq.h>
 
+#define SERIAL_IRQ 2
+
+static irq_t serial_irq;
 static chardev_t console;
 static serial_t sconf[SERIAL_MAX];
@@ -92,9 +96,7 @@
 }
 
-
-/** Process keyboard interrupt. Does not work in simics? */
-static void serial_interrupt(int n, void *stack)
+static void serial_handler(void)
 {
-	serial_t *sd = (serial_t *)console.data;
+	serial_t *sd = (serial_t *) console.data;
 	char ch;
 
@@ -108,5 +110,17 @@
 }
 
+/** Process keyboard interrupt. Does not work in simics? */
+static void serial_irq_handler(irq_t *irq, void *arg, ...)
+{
+	if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox))
+		ipc_irq_send_notif(irq);
+	else
+		serial_handler();
+}
 
+static irq_ownership_t serial_claim(void)
+{
+	return IRQ_ACCEPT;
+}
 
 static chardev_operations_t serial_ops = {
@@ -117,13 +131,5 @@
 };
 
-iroutine old_timer;
-/** Do polling on timer interrupt */
-static void timer_replace(int n, istate_t *istate)
-{
-	old_timer(n, istate);
-	serial_interrupt(n, istate);
-}
-
-void serial_console(void)
+void serial_console(devno_t devno)
 {
 	serial_t *sd = &sconf[0];
@@ -133,10 +139,16 @@
 	console.data = sd;
 	kb_enabled = true;
+	
+	irq_initialize(&serial_irq);
+	serial_irq.devno = devno;
+	serial_irq.inr = SERIAL_IRQ;
+	serial_irq.claim = serial_claim;
+	serial_irq.handler = serial_irq_handler;
+	irq_register(&serial_irq);
 
-//	int_register(2, "serial_drvr", serial_interrupt);
 	/* I don't know why, but the serial interrupts simply
 	 * don't work on simics
 	 */
-	old_timer = int_register(TIMER_IRQ, "serial_drvr_poll", timer_replace);
+	timer_fnc = &serial_handler;
 	
 	stdin = &console;
