Index: kernel/arch/ia64/src/drivers/ski.c
===================================================================
--- kernel/arch/ia64/src/drivers/ski.c	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ kernel/arch/ia64/src/drivers/ski.c	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -216,12 +216,12 @@
 void ski_kbd_grab(void)
 {
+	kbd_disabled = false;
+}
+
+void ski_kbd_release(void)
+{
 	kbd_disabled = true;
 }
 
-void ski_kbd_release(void)
-{
-	kbd_disabled = false;
-}
-
 /** @}
  */
Index: kernel/arch/sparc64/src/drivers/sgcn.c
===================================================================
--- kernel/arch/sparc64/src/drivers/sgcn.c	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ kernel/arch/sparc64/src/drivers/sgcn.c	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -280,5 +280,5 @@
 void sgcn_grab(void)
 {
-	kbd_disabled = true;
+	kbd_disabled = false;
 }
 
Index: uspace/srv/console/console.c
===================================================================
--- uspace/srv/console/console.c	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ uspace/srv/console/console.c	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -65,4 +65,7 @@
 int prev_console = 0;
 
+/** Phone to the keyboard driver. */
+static int kbd_phone;
+
 /** Information about framebuffer */
 struct {
@@ -150,4 +153,14 @@
 {
 	ipc_call_sync_0_0(fb_info.phone, FB_SCREEN_RECLAIM);
+}
+
+static void kbd_yield(void)
+{
+	ipc_call_sync_0_0(kbd_phone, KBD_YIELD);
+}
+
+static void kbd_reclaim(void)
+{
+	ipc_call_sync_0_0(kbd_phone, KBD_RECLAIM);
 }
 
@@ -342,4 +355,5 @@
 		gcons_in_kernel();
 		screen_yield();
+		kbd_yield();
 		async_serialize_end();
 
@@ -357,4 +371,5 @@
 		if (active_console == KERNEL_CONSOLE) {
 			screen_reclaim();
+			kbd_reclaim();
 			gcons_redraw_console();
 		}
@@ -666,5 +681,4 @@
 	
 	ipcarg_t phonehash;
-	int kbd_phone;
 	size_t ib_size;
 	int i;
Index: uspace/srv/kbd/generic/kbd.c
===================================================================
--- uspace/srv/kbd/generic/kbd.c	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ uspace/srv/kbd/generic/kbd.c	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -194,4 +194,12 @@
 			retval = 0;
 			break;
+		case KBD_YIELD:
+			kbd_port_yield();
+			retval = 0;
+			break;
+		case KBD_RECLAIM:
+			kbd_port_reclaim();
+			retval = 0;
+			break;
 		default:
 			retval = EINVAL;
Index: uspace/srv/kbd/include/kbd.h
===================================================================
--- uspace/srv/kbd/include/kbd.h	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ uspace/srv/kbd/include/kbd.h	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -39,4 +39,5 @@
 
 #include <key_buffer.h>
+#include <ipc/ipc.h>
 
 #define KBD_EVENT	1024
@@ -45,4 +46,9 @@
 #define KBD_MS_MIDDLE	1027
 #define KBD_MS_MOVE	1028
+
+typedef enum {
+	KBD_YIELD	= IPC_FIRST_USER_METHOD,
+	KBD_RECLAIM
+} kbd_request_t;
 
 extern int cir_service;
Index: uspace/srv/kbd/include/kbd_port.h
===================================================================
--- uspace/srv/kbd/include/kbd_port.h	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ uspace/srv/kbd/include/kbd_port.h	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -39,4 +39,6 @@
 
 extern int kbd_port_init(void);
+extern void kbd_port_yield(void);
+extern void kbd_port_reclaim(void);
 
 #endif
Index: uspace/srv/kbd/port/dummy.c
===================================================================
--- uspace/srv/kbd/port/dummy.c	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ uspace/srv/kbd/port/dummy.c	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -43,4 +43,12 @@
 }
 
+void kbd_port_yield(void)
+{
+}
+
+void kbd_port_reclaim(void)
+{
+}
+
 /** @}
 */
Index: uspace/srv/kbd/port/gxemul.c
===================================================================
--- uspace/srv/kbd/port/gxemul.c	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ uspace/srv/kbd/port/gxemul.c	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -70,4 +70,12 @@
 }
 
+void kbd_port_yield(void)
+{
+}
+
+void kbd_port_reclaim(void)
+{
+}
+
 /** Process data sent when a key is pressed.
  *  
Index: uspace/srv/kbd/port/i8042.c
===================================================================
--- uspace/srv/kbd/port/i8042.c	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ uspace/srv/kbd/port/i8042.c	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -152,4 +152,12 @@
 }
 
+void kbd_port_yield(void)
+{
+}
+
+void kbd_port_reclaim(void)
+{
+}
+
 static void i8042_irq_handler(ipc_callid_t iid, ipc_call_t *call)
 {
Index: uspace/srv/kbd/port/msim.c
===================================================================
--- uspace/srv/kbd/port/msim.c	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ uspace/srv/kbd/port/msim.c	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -70,20 +70,15 @@
 }
 
+void kbd_port_yield(void)
+{
+}
+
+void kbd_port_reclaim(void)
+{
+}
+
 static void msim_irq_handler(ipc_callid_t iid, ipc_call_t *call)
 {
 	int scan_code = IPC_GET_ARG2(*call);
-//	static int esc_count=0;
-
-//	if (scan_code == 0x1b) {
-//		esc_count++;
-//		if (esc_count == 3)
-//			__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE);
-//	} else {
-//		esc_count=0;
-//	}
-
-//	if (fb_fb)
-//		return kbd_arch_process_fb(keybuffer, scan_code);
-
 	kbd_push_scancode(scan_code);
 }
Index: uspace/srv/kbd/port/ns16550.c
===================================================================
--- uspace/srv/kbd/port/ns16550.c	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ uspace/srv/kbd/port/ns16550.c	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -107,4 +107,12 @@
 }
 
+void ns16550_port_yield(void)
+{
+}
+
+void ns16550_port_reclaim(void)
+{
+}
+
 static void ns16550_irq_handler(ipc_callid_t iid, ipc_call_t *call)
 {
Index: uspace/srv/kbd/port/sgcn.c
===================================================================
--- uspace/srv/kbd/port/sgcn.c	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ uspace/srv/kbd/port/sgcn.c	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -121,4 +121,12 @@
 }
 
+void kbd_port_yield(void)
+{
+}
+
+void kbd_port_reclaim(void)
+{
+}
+
 /**
  * Handler of the "key pressed" event. Reads codes of all the pressed keys from
Index: uspace/srv/kbd/port/ski.c
===================================================================
--- uspace/srv/kbd/port/ski.c	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ uspace/srv/kbd/port/ski.c	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -43,4 +43,5 @@
 #include <sys/types.h>
 #include <thread.h>
+#include <bool.h>
 
 #define SKI_GETCHAR		21
@@ -50,4 +51,6 @@
 static void *ski_thread_impl(void *arg);
 static int32_t ski_getchar(void);
+
+static volatile bool polling_disabled = false;
 
 /** Initialize Ski port driver. */
@@ -65,4 +68,14 @@
 }
 
+void kbd_port_yield(void)
+{
+	polling_disabled = true;
+}
+
+void kbd_port_reclaim(void)
+{
+	polling_disabled = false;
+}
+
 /** Thread to poll Ski for keypresses. */
 static void *ski_thread_impl(void *arg)
@@ -72,5 +85,5 @@
 
 	while (1) {
-		while (1) {
+		while (polling_disabled == false) {
 			c = ski_getchar();
 			if (c == 0)
Index: uspace/srv/kbd/port/sun.c
===================================================================
--- uspace/srv/kbd/port/sun.c	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ uspace/srv/kbd/port/sun.c	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -63,4 +63,12 @@
 }
 
+void kbd_port_yield(void)
+{
+}
+
+void kbd_port_reclaim(void)
+{
+}
+
 /** @}
 */
Index: uspace/srv/kbd/port/z8530.c
===================================================================
--- uspace/srv/kbd/port/z8530.c	(revision ebfabf6380f038fae3fc5fe621e478743080cd48)
+++ uspace/srv/kbd/port/z8530.c	(revision ccd1a14e21fb8efa476a06bf841a6d8d784c11a8)
@@ -96,4 +96,12 @@
 }
 
+void z8530_port_yield(void)
+{
+}
+
+void z8530_port_reclaim(void)
+{
+}
+
 static void z8530_irq_handler(ipc_callid_t iid, ipc_call_t *call)
 {
