Index: uspace/srv/console/console.c
===================================================================
--- uspace/srv/console/console.c	(revision d3e69353929ddbf51ebfe9f5f9ddabbfceeec750)
+++ uspace/srv/console/console.c	(revision 2f08ff553b4b50a1b4ed9ffcbbc17baa71d59800)
@@ -49,4 +49,5 @@
 #include <sys/mman.h>
 #include <stdio.h>
+#include <sysinfo.h>
 
 #include "gcons.h"
@@ -59,4 +60,5 @@
  */
 int active_console = 0;
+int prev_console = 0;
 
 /** Information about framebuffer
@@ -208,7 +210,8 @@
 		async_serialize_end();
 		
-		if (__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE))
+		if (__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE)) {
+			prev_console = active_console;
 			active_console = KERNEL_CONSOLE;
-		else
+		} else
 			newcons = active_console;
 	}
@@ -236,5 +239,5 @@
 				}
 			/* This call can preempt, but we are already at the end */
-			rc = async_req_0_0(fb_info.phone, FB_DRAW_TEXT_DATA);		
+			rc = async_req_0_0(fb_info.phone, FB_DRAW_TEXT_DATA);
 		}
 		
@@ -244,5 +247,5 @@
 			style = &conn->screenbuffer.style;
 			
-			for (j = 0; j < conn->screenbuffer.size_y; j++) 
+			for (j = 0; j < conn->screenbuffer.size_y; j++)
 				for (i = 0; i < conn->screenbuffer.size_x; i++) {
 					field = get_field_at(&conn->screenbuffer, i, j);
@@ -341,5 +344,5 @@
 	ipcarg_t arg1, arg2;
 	connection_t *conn;
-
+	
 	if ((consnum = find_free_connection()) == -1) {
 		ipc_answer_0(iid, ELIMIT);
@@ -356,10 +359,10 @@
 	/* Accept the connection */
 	ipc_answer_0(iid, EOK);
-
+	
 	while (1) {
 		async_serialize_end();
 		callid = async_get_call(&call);
 		async_serialize_start();
-
+		
 		arg1 = 0;
 		arg2 = 0;
@@ -369,5 +372,5 @@
 			
 			/* Answer all pending requests */
-			while (conn->keyrequest_counter > 0) {		
+			while (conn->keyrequest_counter > 0) {
 				conn->keyrequest_counter--;
 				ipc_answer_0(fifo_pop(conn->keyrequests),
@@ -444,4 +447,9 @@
 }
 
+static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
+{
+	change_console(prev_console);
+}
+
 int main(int argc, char *argv[])
 {
@@ -451,9 +459,9 @@
 	int kbd_phone;
 	int i;
-
+	
 	async_set_client_connection(client_connection);
 	
 	/* Connect to keyboard driver */
-
+	
 	kbd_phone = ipc_connect_me_to(PHONE_NS, SERVICE_KEYBOARD, 0, 0);
 	while (kbd_phone < 0) {
@@ -512,18 +520,28 @@
 		}
 	}
-
+	
 	curs_goto(0, 0);
 	curs_visibility(
 	    connections[active_console].screenbuffer.is_cursor_visible);
-
+	
 	/* Register at NS */
 	if (ipc_connect_to_me(PHONE_NS, SERVICE_CONSOLE, 0, 0, &phonehash) != 0)
 		return -1;
 	
+	/* Receive kernel notifications */
+	if (sysinfo_value("kconsole.present")) {
+		int devno = sysinfo_value("kconsole.devno");
+		int inr = sysinfo_value("kconsole.inr");
+		if (ipc_register_irq(inr, devno, 0, NULL) != EOK)
+			printf(NAME ": Error registering kconsole notifications\n");
+		
+		async_set_interrupt_received(interrupt_received);
+	}
+	
 	// FIXME: avoid connectiong to itself, keep using klog
 	// printf(NAME ": Accepting connections\n");
 	async_manager();
-
-	return 0;	
+	
+	return 0;
 }
  
