Index: kernel/genarch/src/kbd/z8530.c
===================================================================
--- kernel/genarch/src/kbd/z8530.c	(revision 5f9b4d9af46404a0fa7382a0a6d74b1fbf1e2334)
+++ kernel/genarch/src/kbd/z8530.c	(revision fc468841de2b95bece0894c87ba698651aa540fe)
@@ -63,4 +63,6 @@
 static irq_t z8530_irq;		/**< z8530's IRQ. */ 
 
+static ipc_notif_cfg_t saved_notif_cfg;
+
 static void z8530_suspend(chardev_t *);
 static void z8530_resume(chardev_t *);
@@ -75,4 +77,26 @@
 void z8530_grab(void)
 {
+	(void) z8530_read_a(&z8530, RR8);
+
+	/*
+	 * Clear any pending TX interrupts or we never manage
+	 * to set FHC UART interrupt state to idle.
+	 */
+	z8530_write_a(&z8530, WR0, WR0_TX_IP_RST);
+
+	z8530_write_a(&z8530, WR1, WR1_IARCSC);		/* interrupt on all characters */
+
+	/* 8 bits per character and enable receiver */
+	z8530_write_a(&z8530, WR3, WR3_RX8BITSCH | WR3_RX_ENABLE);
+	
+	z8530_write_a(&z8530, WR9, WR9_MIE);		/* Master Interrupt Enable. */
+	
+	if (z8530_irq.notif_cfg.answerbox) {
+		saved_notif_cfg = z8530_irq.notif_cfg;
+		z8530_irq.notif_cfg.answerbox = NULL;
+		z8530_irq.notif_cfg.code = NULL;
+		z8530_irq.notif_cfg.method = 0;
+		z8530_irq.notif_cfg.counter = 0;
+	}
 }
 
@@ -80,4 +104,6 @@
 void z8530_release(void)
 {
+	if (saved_notif_cfg.answerbox)
+		z8530_irq.notif_cfg = saved_notif_cfg;
 }
 
@@ -103,18 +129,5 @@
 	sysinfo_set_item_val("kbd.address.virtual", NULL, vaddr);
 
-	(void) z8530_read_a(&z8530, RR8);
-
-	/*
-	 * Clear any pending TX interrupts or we never manage
-	 * to set FHC UART interrupt state to idle.
-	 */
-	z8530_write_a(&z8530, WR0, WR0_TX_IP_RST);
-
-	z8530_write_a(&z8530, WR1, WR1_IARCSC);		/* interrupt on all characters */
-
-	/* 8 bits per character and enable receiver */
-	z8530_write_a(&z8530, WR3, WR3_RX8BITSCH | WR3_RX_ENABLE);
-	
-	z8530_write_a(&z8530, WR9, WR9_MIE);		/* Master Interrupt Enable. */
+	z8530_grab();
 }
 
