Index: kernel/arch/ppc32/src/drivers/cuda.c
===================================================================
--- kernel/arch/ppc32/src/drivers/cuda.c	(revision 8513ad77da21520006dc3e18de1e95a2b6f59c6f)
+++ kernel/arch/ppc32/src/drivers/cuda.c	(revision 4874c2dc3da3748951cb71f24805c35b88106d0f)
@@ -64,7 +64,4 @@
 static volatile uint8_t *cuda = NULL;
 static irq_t cuda_irq;		/**< Cuda's IRQ. */
-
-static ipc_notif_cfg_t saved_notif_cfg;
-
 
 static char lchars[0x80] = {
@@ -255,5 +252,5 @@
 static void cuda_irq_handler(irq_t *irq, void *arg, ...)
 {
-	if (irq->notif_cfg.answerbox)
+	if (irq->notif_cfg.notify && irq->notif_cfg.answerbox)
 		ipc_irq_send_notif(irq);
 	else {
@@ -277,11 +274,5 @@
 void cuda_grab(void)
 {
-	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;
-	}
+	cuda_irq.notif_cfg.notify = false;
 }
 
@@ -290,6 +281,6 @@
 void cuda_release(void)
 {
-	if (saved_notif_cfg.answerbox)
-		cuda_irq.notif_cfg = saved_notif_cfg;
+	if (cuda_irq.notif_cfg.answerbox)
+		cuda_irq.notif_cfg.notify = true;
 }
 
Index: kernel/genarch/src/kbd/ns16550.c
===================================================================
--- kernel/genarch/src/kbd/ns16550.c	(revision 8513ad77da21520006dc3e18de1e95a2b6f59c6f)
+++ kernel/genarch/src/kbd/ns16550.c	(revision 4874c2dc3da3748951cb71f24805c35b88106d0f)
@@ -62,6 +62,4 @@
 static irq_t ns16550_irq;
 
-static ipc_notif_cfg_t saved_notif_cfg;
-
 /*
  * These codes read from ns16550 data register are silently ignored.
@@ -88,11 +86,5 @@
 		(void) ns16550_rbr_read(&ns16550);
 
-	if (ns16550_irq.notif_cfg.answerbox) {
-		saved_notif_cfg = ns16550_irq.notif_cfg;
-		ns16550_irq.notif_cfg.answerbox = NULL;
-		ns16550_irq.notif_cfg.code = NULL;
-		ns16550_irq.notif_cfg.method = 0;
-		ns16550_irq.notif_cfg.counter = 0;
-	}
+	ns16550_irq.notif_cfg.notify = false;
 }
 
@@ -100,6 +92,6 @@
 void ns16550_release(void)
 {
-	if (saved_notif_cfg.answerbox)
-		ns16550_irq.notif_cfg = saved_notif_cfg;
+	if (ns16550_irq.notif_cfg.answerbox)
+		ns16550_irq.notif_cfg.notify = true;
 }
 
@@ -184,5 +176,5 @@
 
 	if (ns16550_lsr_read(&ns16550) & LSR_DATA_READY) {
-		if (ns16550_irq.notif_cfg.answerbox) {
+		if (ns16550_irq.notif_cfg.notify && ns16550_irq.notif_cfg.answerbox) {
 			/*
 			 * Send IPC notification.
Index: kernel/genarch/src/kbd/z8530.c
===================================================================
--- kernel/genarch/src/kbd/z8530.c	(revision 8513ad77da21520006dc3e18de1e95a2b6f59c6f)
+++ kernel/genarch/src/kbd/z8530.c	(revision 4874c2dc3da3748951cb71f24805c35b88106d0f)
@@ -63,6 +63,4 @@
 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 *);
@@ -92,11 +90,5 @@
 	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;
-	}
+	z8530_irq.notif_cfg.notify = false;
 }
 
@@ -104,6 +96,6 @@
 void z8530_release(void)
 {
-	if (saved_notif_cfg.answerbox)
-		z8530_irq.notif_cfg = saved_notif_cfg;
+	if (z8530_irq.notif_cfg.answerbox)
+		z8530_irq.notif_cfg.notify = true;
 }
 
@@ -205,5 +197,5 @@
 	 * interrupt traps. Process the interrupt directly.
 	 */
-	if (irq->notif_cfg.answerbox)
+	if (irq->notif_cfg.notify && irq->notif_cfg.answerbox)
 		ipc_irq_send_notif(irq);
 	else
Index: kernel/generic/include/ipc/irq.h
===================================================================
--- kernel/generic/include/ipc/irq.h	(revision 8513ad77da21520006dc3e18de1e95a2b6f59c6f)
+++ kernel/generic/include/ipc/irq.h	(revision 4874c2dc3da3748951cb71f24805c35b88106d0f)
@@ -79,4 +79,5 @@
  */
 struct ipc_notif_cfg {
+	bool notify;			/**< When false, notifications are not sent. */
 	answerbox_t *answerbox;		/**< Answerbox for notifications. */
 	unative_t method;		/**< Method to be used for the notification. */
Index: kernel/generic/src/ipc/irq.c
===================================================================
--- kernel/generic/src/ipc/irq.c	(revision 8513ad77da21520006dc3e18de1e95a2b6f59c6f)
+++ kernel/generic/src/ipc/irq.c	(revision 4874c2dc3da3748951cb71f24805c35b88106d0f)
@@ -177,9 +177,10 @@
 	if (irq) {
 		if (irq->notif_cfg.answerbox == box) {
-			code_free(irq->notif_cfg.code);
+			irq->notif_cfg.notify = false;
+			irq->notif_cfg.answerbox = NULL;
 			irq->notif_cfg.code = NULL;
-			irq->notif_cfg.answerbox = NULL;
 			irq->notif_cfg.method = 0;
 			irq->notif_cfg.counter = 0;
+			code_free(irq->notif_cfg.code);
 			spinlock_unlock(&irq->lock);
 		}
@@ -227,4 +228,5 @@
 	}
 	
+	irq->notif_cfg.notify = true;
 	irq->notif_cfg.answerbox = box;
 	irq->notif_cfg.method = method;
