Index: kernel/genarch/include/kbd/ns16550.h
===================================================================
--- kernel/genarch/include/kbd/ns16550.h	(revision 33b1903874cd850ebac379b21a620e3f022b3fe1)
+++ kernel/genarch/include/kbd/ns16550.h	(revision 0d107f313852cf9ca1abc289a98baf2c22f6c95c)
@@ -39,4 +39,5 @@
 
 #include <typedefs.h>
+#include <irq.h>
 
 extern void ns16550_init(void);
@@ -45,4 +46,6 @@
 extern void ns16550_release(void);
 extern char ns16550_key_read(chardev_t *d);
+extern irq_ownership_t ns16550_claim(void);
+extern void ns16550_irq_handler(irq_t *irq, void *arg, ...);
 
 #endif
Index: kernel/genarch/include/kbd/z8530.h
===================================================================
--- kernel/genarch/include/kbd/z8530.h	(revision 33b1903874cd850ebac379b21a620e3f022b3fe1)
+++ kernel/genarch/include/kbd/z8530.h	(revision 0d107f313852cf9ca1abc289a98baf2c22f6c95c)
@@ -38,7 +38,6 @@
 #define KERN_Z8530_H_
 
+#include <irq.h>
 #include <typedefs.h>
-
-#define Z8530_INTRCV_DATA0	0x39	/* hardcoded for use in Simics */
 
 extern bool z8530_belongs_to_kernel;
@@ -50,4 +49,6 @@
 extern void z8530_interrupt(void);
 extern char z8530_key_read(chardev_t *d);
+extern irq_ownership_t z8530_claim(void);
+extern void z8530_irq_handler(irq_t *irq, void *arg, ...);
 
 #endif
Index: kernel/genarch/src/kbd/ns16550.c
===================================================================
--- kernel/genarch/src/kbd/ns16550.c	(revision 33b1903874cd850ebac379b21a620e3f022b3fe1)
+++ kernel/genarch/src/kbd/ns16550.c	(revision 0d107f313852cf9ca1abc289a98baf2c22f6c95c)
@@ -40,4 +40,5 @@
 #include <genarch/kbd/scanc_sun.h>
 #include <arch/drivers/ns16550.h>
+#include <irq.h>
 #include <arch/interrupt.h>
 #include <cpu.h>
@@ -161,4 +162,15 @@
 }
 
+irq_ownership_t ns16550_claim(void)
+{
+	/* TODO */
+	return IRQ_ACCEPT;
+}
+
+void ns16550_irq_handler(irq_t *irq, void *arg, ...)
+{
+	panic("Not yet implemented.\n");
+}
+
 /** @}
  */
Index: kernel/genarch/src/kbd/z8530.c
===================================================================
--- kernel/genarch/src/kbd/z8530.c	(revision 33b1903874cd850ebac379b21a620e3f022b3fe1)
+++ kernel/genarch/src/kbd/z8530.c	(revision 0d107f313852cf9ca1abc289a98baf2c22f6c95c)
@@ -40,6 +40,8 @@
 #include <genarch/kbd/scanc_sun.h>
 #include <arch/drivers/z8530.h>
+#include <irq.h>
 #include <arch/interrupt.h>
 #include <arch/drivers/kbd.h>
+#include <arch/drivers/fhc.h>
 #include <cpu.h>
 #include <arch/asm.h>
@@ -170,4 +172,25 @@
 }
 
+irq_ownership_t z8530_claim(void)
+{
+	return (z8530_read_a(RR0) & RR0_RCA);
+}
+
+void z8530_irq_handler(irq_t *irq, void *arg, ...)
+{
+	/*
+	 * So far, we know we got this interrupt through the FHC.
+	 * Since we don't have enough information about the FHC and
+	 * because the interrupt looks like level sensitive,
+	 * we cannot handle it by scheduling one of the level
+	 * interrupt traps. Process the interrupt directly.
+	 */
+	if (z8530_belongs_to_kernel)
+		z8530_interrupt();
+	else
+		ipc_irq_send_notif(0);
+	fhc_clear_interrupt(central_fhc, irq->inr);
+}
+
 /** @}
  */
