Index: uspace/srv/console/console.c
===================================================================
--- uspace/srv/console/console.c	(revision 3c101bd4a1e9afc15309063fbefa099988c9efc9)
+++ uspace/srv/console/console.c	(revision 10270a87f786b94f67dffeb907acdc813fee25cd)
@@ -142,4 +142,14 @@
 }
 
+static void screen_grab(void)
+{
+	ipc_call_sync_0_0(fb_info.phone, FB_SCREEN_GRAB);
+}
+
+static void screen_relinquish(void)
+{
+	ipc_call_sync_0_0(fb_info.phone, FB_SCREEN_RELINQUISH);
+}
+
 static void set_style(int style)
 {
@@ -331,5 +341,7 @@
 		curs_hide_sync();
 		gcons_in_kernel();
+		screen_relinquish();
 		async_serialize_end();
+
 		
 		if (__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE)) {
@@ -343,6 +355,8 @@
 		async_serialize_start();
 		
-		if (active_console == KERNEL_CONSOLE)
+		if (active_console == KERNEL_CONSOLE) {
+			screen_grab();
 			gcons_redraw_console();
+		}
 		
 		active_console = newcons;
Index: uspace/srv/fb/ega.c
===================================================================
--- uspace/srv/fb/ega.c	(revision 3c101bd4a1e9afc15309063fbefa099988c9efc9)
+++ uspace/srv/fb/ega.c	(revision 10270a87f786b94f67dffeb907acdc813fee25cd)
@@ -392,5 +392,8 @@
 			retval = 0;
 			break;
-
+		case FB_SCREEN_GRAB:
+		case FB_SCREEN_RELINQUISH:
+			retval = EOK;
+			break;
 		default:
 			retval = EINVAL;
Index: uspace/srv/fb/fb.c
===================================================================
--- uspace/srv/fb/fb.c	(revision 3c101bd4a1e9afc15309063fbefa099988c9efc9)
+++ uspace/srv/fb/fb.c	(revision 10270a87f786b94f67dffeb907acdc813fee25cd)
@@ -1714,4 +1714,8 @@
 			retval = EOK;
 			break;
+		case FB_SCREEN_GRAB:
+		case FB_SCREEN_RELINQUISH:
+			retval = EOK;
+			break;
 		default:
 			retval = ENOENT;
Index: uspace/srv/fb/serial_console.c
===================================================================
--- uspace/srv/fb/serial_console.c	(revision 3c101bd4a1e9afc15309063fbefa099988c9efc9)
+++ uspace/srv/fb/serial_console.c	(revision 10270a87f786b94f67dffeb907acdc813fee25cd)
@@ -275,7 +275,4 @@
 
 		for (i = 0; i < w; i++) {
-			unsigned int col = x + i;
-			unsigned int row = y + j;
-
 			field = &data[j * w + i];
 
@@ -305,10 +302,7 @@
 	wchar_t c;
 	int col, row, w, h;
-	int fgcolor;
-	int bgcolor;
-	int flags;
-	int style;
 	int i;
 
+	attrs_t cur_attr;
 	
 	if (client_connected) {
@@ -319,4 +313,7 @@
 	client_connected = 1;
 	ipc_answer_0(iid, EOK);
+
+	cur_attr.t = at_style;
+	cur_attr.a.s.style = STYLE_NORMAL;
 	
 	/* Clear the terminal, set scrolling region
@@ -389,21 +386,26 @@
 			break;
 		case FB_SET_STYLE:
-			style = IPC_GET_ARG1(call);
-			serial_set_style(style);
+			cur_attr.t = at_style;
+			cur_attr.a.s.style = IPC_GET_ARG1(call);
+			cur_attr.a.i.bg_color = IPC_GET_ARG2(call);
+			serial_set_attrs(&cur_attr);
+
 			retval = 0;
 			break;
 		case FB_SET_COLOR:
-			fgcolor = IPC_GET_ARG1(call);
-			bgcolor = IPC_GET_ARG2(call);
-			flags = IPC_GET_ARG3(call);
-
-			serial_set_idx(fgcolor, bgcolor, flags);
+			cur_attr.t = at_idx;
+			cur_attr.a.i.fg_color = IPC_GET_ARG1(call);
+			cur_attr.a.i.bg_color = IPC_GET_ARG2(call);
+			cur_attr.a.i.flags = IPC_GET_ARG3(call);
+			serial_set_attrs(&cur_attr);
+
 			retval = 0;
 			break;
 		case FB_SET_RGB_COLOR:
-			fgcolor = IPC_GET_ARG1(call);
-			bgcolor = IPC_GET_ARG2(call);
-
-			serial_set_rgb(fgcolor, bgcolor);
+			cur_attr.t = at_rgb;
+			cur_attr.a.i.fg_color = IPC_GET_ARG1(call);
+			cur_attr.a.i.bg_color = IPC_GET_ARG2(call);
+			serial_set_attrs(&cur_attr);
+
 			retval = 0;
 			break;
@@ -425,4 +427,16 @@
 			retval = 0;
 			break;
+		case FB_SCREEN_GRAB:
+			serial_clrscr();
+			serial_set_attrs(&cur_attr);
+			retval = 0;
+			break;
+		case FB_SCREEN_RELINQUISH:
+			serial_sgr(SGR_RESET);
+			serial_puts("\033[2J");
+			serial_goto(0, 0);
+			serial_cursor_enable();
+			retval = 0;
+			break;
 		default:
 			retval = ENOENT;
