Index: console/console.c
===================================================================
--- console/console.c	(revision 9996ed56130d52f2e19a6f9a37c19b831440ca91)
+++ console/console.c	(revision e9073f240239cbd48fb09793c7ed5cc32ff493fb)
@@ -334,4 +334,5 @@
 	int consnum;
 	ipcarg_t arg1, arg2;
+	connection_t *conn;
 
 	if ((consnum = find_free_connection()) == -1) {
@@ -339,9 +340,10 @@
 		return;
 	}
+	conn = &connections[consnum];
 	
 	gcons_notify_connect(consnum);
-	connections[consnum].used = 1;
-	connections[consnum].client_phone = IPC_GET_ARG3(call);
-	screenbuffer_clear(&(connections[consnum].screenbuffer));
+	conn->used = 1;
+	conn->client_phone = IPC_GET_ARG3(call);
+	screenbuffer_clear(&conn->screenbuffer);
 	
 	/* Accept the connection */
@@ -353,5 +355,13 @@
 		switch (IPC_GET_METHOD(call)) {
 		case IPC_M_PHONE_HUNGUP:
-			/* TODO */
+			gcons_notify_disconnect(consnum);
+			/* Answer all pending requests */
+			while (conn->keyrequest_counter > 0) {		
+				conn->keyrequest_counter--;
+				ipc_answer_fast(fifo_pop(conn->keyrequests), ENOENT, 0, 0);
+				break;
+			}
+			
+			/* Commit hangup */
 			ipc_answer_fast(callid, 0,0,0);
 			return;
@@ -366,10 +376,10 @@
 			}
 			
-			screenbuffer_clear(&(connections[consnum].screenbuffer));
+			screenbuffer_clear(&conn->screenbuffer);
 			
 			break;
 		case CONSOLE_GOTO:
 			
-			screenbuffer_goto(&(connections[consnum].screenbuffer), IPC_GET_ARG2(call), IPC_GET_ARG1(call));
+			screenbuffer_goto(&conn->screenbuffer, IPC_GET_ARG2(call), IPC_GET_ARG1(call));
 			if (consnum == active_console)
 				curs_goto(IPC_GET_ARG1(call),IPC_GET_ARG2(call));
@@ -388,5 +398,5 @@
 			arg1 = IPC_GET_ARG1(call);
 			arg2 = IPC_GET_ARG2(call);
-			screenbuffer_set_style(&(connections[consnum].screenbuffer),arg1, arg2);
+			screenbuffer_set_style(&conn->screenbuffer,arg1, arg2);
 			if (consnum == active_console)
 				set_style_col(arg1, arg2);
@@ -395,14 +405,14 @@
 		case CONSOLE_CURSOR_VISIBILITY:
 			arg1 = IPC_GET_ARG1(call);
-			connections[consnum].screenbuffer.is_cursor_visible = arg1;
+			conn->screenbuffer.is_cursor_visible = arg1;
 			if (consnum == active_console)
 				curs_visibility(arg1);
 			break;
 		case CONSOLE_GETCHAR:
-			if (keybuffer_empty(&(connections[consnum].keybuffer))) {
+			if (keybuffer_empty(&conn->keybuffer)) {
 				/* buffer is empty -> store request */
-				if (connections[consnum].keyrequest_counter < MAX_KEYREQUESTS_BUFFERED) {		
-					fifo_push(connections[consnum].keyrequests, callid);
-					connections[consnum].keyrequest_counter++;
+				if (conn->keyrequest_counter < MAX_KEYREQUESTS_BUFFERED) {		
+					fifo_push(conn->keyrequests, callid);
+					conn->keyrequest_counter++;
 				} else {
 					/* no key available and too many requests => fail */
@@ -411,5 +421,5 @@
 				continue;
 			};
-			keybuffer_pop(&(connections[consnum].keybuffer), (int *)&arg1);
+			keybuffer_pop(&conn->keybuffer, (int *)&arg1);
 			
 			break;
Index: console/gcons.c
===================================================================
--- console/gcons.c	(revision 9996ed56130d52f2e19a6f9a37c19b831440ca91)
+++ console/gcons.c	(revision e9073f240239cbd48fb09793c7ed5cc32ff493fb)
@@ -170,4 +170,21 @@
 	redraw_state(consnum);
 	
+	vp_switch(console_vp);
+}
+
+/** Notification function called on service disconnect from console */
+void gcons_notify_disconnect(int consnum)
+{
+	if (!use_gcons)
+		return;
+	if (active_console == consnum)
+		console_state[consnum] = CONS_DISCONNECTED_SEL;
+	else
+		console_state[consnum] = CONS_DISCONNECTED;
+
+	if (active_console == KERNEL_CONSOLE)
+		return;
+
+	redraw_state(consnum);
 	vp_switch(console_vp);
 }
Index: console/gcons.h
===================================================================
--- console/gcons.h	(revision 9996ed56130d52f2e19a6f9a37c19b831440ca91)
+++ console/gcons.h	(revision e9073f240239cbd48fb09793c7ed5cc32ff493fb)
@@ -35,4 +35,5 @@
 void gcons_in_kernel(void);
 void gcons_notify_connect(int consnum);
+void gcons_notify_disconnect(int consnum);
 
 #endif
