Index: genarch/include/i8042/i8042.h
===================================================================
--- genarch/include/i8042/i8042.h	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ genarch/include/i8042/i8042.h	(revision e7ed98680bd5e7de4b6d0a2a5bed181a601437e5)
@@ -47,4 +47,6 @@
 extern void i8042_init(void);
 extern void i8042_poll(void);
+extern void i8042_grab(void);
+extern void i8042_release(void);
 
 #endif
Index: genarch/src/i8042/i8042.c
===================================================================
--- genarch/src/i8042/i8042.c	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ genarch/src/i8042/i8042.c	(revision e7ed98680bd5e7de4b6d0a2a5bed181a601437e5)
@@ -268,10 +268,9 @@
 static void i8042_wait(void);
 
-/** Initialize i8042. */
-void i8042_init(void)
-{
-	int i;
-
-	exc_register(VECTOR_KBD, "i8042_interrupt", (iroutine) i8042_interrupt);
+static iroutine oldvector;
+/** Initialize keyboard and service interrupts using kernel routine */
+void i8042_grab(void)
+{
+	oldvector = exc_register(VECTOR_KBD, "i8042_interrupt", (iroutine) i8042_interrupt);
 	i8042_wait();
 	i8042_command_write(i8042_SET_COMMAND);
@@ -279,4 +278,22 @@
 	i8042_data_write(i8042_COMMAND);
 	i8042_wait();
+}
+/** Resume the former interrupt vector */
+void i8042_release(void)
+{
+	if (oldvector)
+		exc_register(VECTOR_KBD, "user_interrupt", oldvector);
+}
+
+/** Initialize i8042. */
+void i8042_init(void)
+{
+	int i;
+
+	i8042_grab();
+        /* Prevent user from accidentaly releasing calling i8042_resume
+	 * and disabling keyboard 
+	 */
+	oldvector = NULL; 
 
 	trap_virtual_enable_irqs(1<<IRQ_KBD);
