Index: arch/amd64/src/amd64.c
===================================================================
--- arch/amd64/src/amd64.c	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ arch/amd64/src/amd64.c	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -51,4 +51,5 @@
 #include <arch/debugger.h>
 #include <syscall/syscall.h>
+#include <console/console.h>
 
 
@@ -186,2 +187,17 @@
 	return 0;
 }
+
+/** Acquire console back for kernel
+ *
+ */
+void arch_grab_console(void)
+{
+	i8042_grab();
+}
+/** Return console to userspace
+ *
+ */
+void arch_release_console(void)
+{
+	i8042_release();
+}
Index: arch/ia32/src/ia32.c
===================================================================
--- arch/ia32/src/ia32.c	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ arch/ia32/src/ia32.c	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -55,4 +55,5 @@
 #include <proc/thread.h>
 #include <syscall/syscall.h>
+#include <console/console.h>
 
 void arch_pre_mm_init(void)
@@ -133,2 +134,17 @@
 	return 0;
 }
+
+/** Acquire console back for kernel
+ *
+ */
+void arch_grab_console(void)
+{
+	i8042_grab();
+}
+/** Return console to userspace
+ *
+ */
+void arch_release_console(void)
+{
+	i8042_release();
+}
Index: arch/ia64/src/ia64.c
===================================================================
--- arch/ia64/src/ia64.c	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ arch/ia64/src/ia64.c	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -115,2 +115,15 @@
         return 0;
 }
+
+/** Acquire console back for kernel
+ *
+ */
+void arch_grab_console(void)
+{
+}
+/** Return console to userspace
+ *
+ */
+void arch_release_console(void)
+{
+}
Index: arch/mips32/include/drivers/msim.h
===================================================================
--- arch/mips32/include/drivers/msim.h	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ arch/mips32/include/drivers/msim.h	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -38,4 +38,6 @@
 
 void msim_console(void);
+void msim_kbd_release(void);
+void msim_kbd_grab(void);
 
 #endif
Index: arch/mips32/src/console.c
===================================================================
--- arch/mips32/src/console.c	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ arch/mips32/src/console.c	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -43,2 +43,17 @@
 	}
 }
+
+/** Acquire console back for kernel
+ *
+ */
+void arch_grab_console(void)
+{
+	msim_kbd_grab();
+}
+/** Return console to userspace
+ *
+ */
+void arch_release_console(void)
+{
+	msim_kbd_release();
+}
Index: arch/mips32/src/drivers/msim.c
===================================================================
--- arch/mips32/src/drivers/msim.c	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ arch/mips32/src/drivers/msim.c	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -109,2 +109,12 @@
 	stdout = &console;
 }
+
+static iroutine oldvector;
+void msim_kbd_grab(void)
+{
+	oldvector = int_register(MSIM_KBD_IRQ, "msim_kbd", msim_interrupt);
+}
+void msim_kbd_release(void)
+{
+	int_register(MSIM_KBD_IRQ, "user_interrupt", oldvector);
+}
Index: arch/mips32/src/mips32.c
===================================================================
--- arch/mips32/src/mips32.c	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ arch/mips32/src/mips32.c	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -172,2 +172,3 @@
 	return 0;
 }
+
Index: arch/ppc32/src/ppc32.c
===================================================================
--- arch/ppc32/src/ppc32.c	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ arch/ppc32/src/ppc32.c	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -35,4 +35,5 @@
 #include <userspace.h>
 #include <proc/uarg.h>
+#include <console/console.h>
 
 bootinfo_t bootinfo;
@@ -92,2 +93,15 @@
 		;
 }
+
+/** Acquire console back for kernel
+ *
+ */
+void arch_grab_console(void)
+{
+}
+/** Return console to userspace
+ *
+ */
+void arch_release_console(void)
+{
+}
Index: arch/ppc64/src/ppc64.c
===================================================================
--- arch/ppc64/src/ppc64.c	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ arch/ppc64/src/ppc64.c	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -34,4 +34,5 @@
 #include <userspace.h>
 #include <proc/uarg.h>
+#include <console/console.h>
 
 bootinfo_t bootinfo;
@@ -90,2 +91,15 @@
 		;
 }
+
+/** Acquire console back for kernel
+ *
+ */
+void arch_grab_console(void)
+{
+}
+/** Return console to userspace
+ *
+ */
+void arch_release_console(void)
+{
+}
Index: arch/sparc64/src/sparc64.c
===================================================================
--- arch/sparc64/src/sparc64.c	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ arch/sparc64/src/sparc64.c	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -33,4 +33,5 @@
 #include <arch/drivers/tick.h>
 #include <proc/thread.h>
+#include <console/console.h>
 
 void arch_pre_mm_init(void)
@@ -75,2 +76,15 @@
 {
 }
+
+/** Acquire console back for kernel
+ *
+ */
+void arch_grab_console(void)
+{
+}
+/** Return console to userspace
+ *
+ */
+void arch_release_console(void)
+{
+}
Index: genarch/include/i8042/i8042.h
===================================================================
--- genarch/include/i8042/i8042.h	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ genarch/include/i8042/i8042.h	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -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 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -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);
Index: generic/include/console/console.h
===================================================================
--- generic/include/console/console.h	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ generic/include/console/console.h	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -41,3 +41,6 @@
 extern void putchar(char c);
 
+extern void arch_grab_console(void);
+extern void arch_release_console(void);
+
 #endif /* __CHARDEV_H__ */
Index: generic/include/syscall/syscall.h
===================================================================
--- generic/include/syscall/syscall.h	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ generic/include/syscall/syscall.h	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -59,4 +59,5 @@
 	SYS_SYSINFO_VALID,
 	SYS_SYSINFO_VALUE,
+	SYS_DEBUG_ENABLE_CONSOLE,
 	SYSCALL_END
 } syscall_t;
Index: generic/src/console/cmd.c
===================================================================
--- generic/src/console/cmd.c	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ generic/src/console/cmd.c	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -38,4 +38,5 @@
 
 #include <console/cmd.h>
+#include <console/console.h>
 #include <console/kconsole.h>
 #include <print.h>
@@ -71,4 +72,12 @@
 	.name = "exit",
 	.description ="Exit kconsole",
+	.argc = 0
+};
+
+static int cmd_continue(cmd_arg_t *argv);
+static cmd_info_t continue_info = {
+	.name = "continue",
+	.description ="Return console back to userspace",
+	.func = cmd_continue,
 	.argc = 0
 };
@@ -333,4 +342,5 @@
 	&call2_info,
 	&call3_info,
+	&continue_info,
 	&cpus_info,
 	&desc_info,
@@ -700,2 +710,14 @@
 	return 1;
 }
+
+/** Command for returning console back to userspace.
+ *
+ * @param argv Ignored.
+ *
+ * return Always 1.
+ */
+int cmd_continue(cmd_arg_t *argv)
+{
+	arch_release_console();
+	return 1;
+}
Index: generic/src/syscall/syscall.c
===================================================================
--- generic/src/syscall/syscall.c	(revision 018f95aaadbfd191dea48069ab135be087e8c3e3)
+++ generic/src/syscall/syscall.c	(revision 41d33aca6323fda79c1a11fc827a1a73ba58c85f)
@@ -47,4 +47,5 @@
 #include <syscall/copy.h>
 #include <sysinfo/sysinfo.h>
+#include <console/console.h>
 
 /** Print using kernel facility
@@ -77,4 +78,11 @@
 	
 	return count;
+}
+
+/** Tell kernel to get keyboard/console access again */
+static __native sys_debug_enable_console(void)
+{
+	arch_grab_console();
+	return 0;
 }
 
@@ -131,4 +139,7 @@
 	/* Sysinfo syscalls */
 	sys_sysinfo_valid,
-	sys_sysinfo_value
+	sys_sysinfo_value,
+	
+	/* Debug calls */
+	sys_debug_enable_console
 };
