Index: kernel/genarch/src/kbd/ns16550.c
===================================================================
--- kernel/genarch/src/kbd/ns16550.c	(revision aa8d0f724e941934ba8a46d05e4ec1c71954987a)
+++ kernel/genarch/src/kbd/ns16550.c	(revision dfd77382ed9624f5671e5680cd92fad49f395b3a)
@@ -135,4 +135,10 @@
 	sysinfo_set_item_val("kbd.address.virtual", NULL, port);
 
+#ifdef CONFIG_NS16550_INTERRUPT_DRIVEN
+	/* Enable interrupts */
+    	ns16550_ier_write(&ns16550, IER_ERBFI);
+	ns16550_mcr_write(&ns16550, MCR_OUT2);
+#endif
+
 #ifdef ia64
     	uint8_t c;
@@ -150,8 +156,5 @@
 void ns16550_interrupt(void)
 {
-	/* TODO
-	 *
-	 * ns16550 works in the polled mode so far.
-	 */
+	ns16550_poll();
 }
 
@@ -202,4 +205,5 @@
 void ns16550_poll(void)
 {
+#ifndef CONFIG_NS16550_INTERRUPT_DRIVEN 
 	ipl_t ipl;
 
@@ -221,4 +225,5 @@
 	spinlock_unlock(&ns16550_irq.lock);
 	interrupts_restore(ipl);
+#endif
 
 	while (ns16550_lsr_read(&ns16550) & LSR_DATA_READY) {
@@ -252,5 +257,8 @@
 void ns16550_irq_handler(irq_t *irq, void *arg, ...)
 {
-	panic("Not yet implemented, ns16550 works in polled mode.\n");
+	if (irq->notif_cfg.notify && irq->notif_cfg.answerbox)
+		ipc_irq_send_notif(irq);
+	else
+		ns16550_interrupt();
 }
 
