Index: kernel/arch/arm32/include/machine.h
===================================================================
--- kernel/arch/arm32/include/machine.h	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/arch/arm32/include/machine.h	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -103,16 +103,15 @@
 
 
-#ifdef MACHINE_GXEMUL_TESTARM 	
-#define machine_console_init(devno)           gxemul_console_init(devno)
-#define machine_grab_console                  gxemul_grab_console
-#define machine_release_console               gxemul_release_console 
-#define machine_hw_map_init                   gxemul_hw_map_init
-#define machine_timer_irq_start               gxemul_timer_irq_start
-#define machine_cpu_halt                      gxemul_cpu_halt
-#define machine_get_memory_size               gxemul_get_memory_size
-#define machine_debug_putc(ch)                gxemul_debug_putc(ch)
-#define machine_irq_exception(exc_no, istate) \
-        gxemul_irq_exception(exc_no, istate)
-#define machine_get_fb_address                gxemul_get_fb_address
+#ifdef MACHINE_GXEMUL_TESTARM
+	#define machine_console_init(devno)            gxemul_console_init(devno)
+	#define machine_grab_console                   gxemul_grab_console
+	#define machine_release_console                gxemul_release_console 
+	#define machine_hw_map_init                    gxemul_hw_map_init
+	#define machine_timer_irq_start                gxemul_timer_irq_start
+	#define machine_cpu_halt                       gxemul_cpu_halt
+	#define machine_get_memory_size                gxemul_get_memory_size
+	#define machine_debug_putc(ch)                 gxemul_debug_putc(ch)
+	#define machine_irq_exception(exc_no, istate)  gxemul_irq_exception(exc_no, istate)
+	#define machine_get_fb_address                 gxemul_get_fb_address
 #endif
 
Index: kernel/arch/arm32/src/drivers/gxemul.c
===================================================================
--- kernel/arch/arm32/src/drivers/gxemul.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/arch/arm32/src/drivers/gxemul.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -134,7 +134,8 @@
  * @param ch Characted to be printed.
  */
-static void gxemul_write(chardev_t *dev, const char ch)
-{
-	*((char *) gxemul_hw_map.videoram) = ch;
+static void gxemul_write(chardev_t *dev, const char ch, bool silent)
+{
+	if (!silent)
+		*((char *) gxemul_hw_map.videoram) = ch;
 }
 
Index: kernel/arch/ia32xen/src/drivers/xconsole.c
===================================================================
--- kernel/arch/ia32xen/src/drivers/xconsole.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/arch/ia32xen/src/drivers/xconsole.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -56,26 +56,28 @@
 }
 
-void xen_putchar(chardev_t *d, const char ch)
+void xen_putchar(chardev_t *d, const char ch, bool silent)
 {
-	if (start_info.console.domU.evtchn != 0) {
-		uint32_t cons = console_page.out_cons;
-		uint32_t prod = console_page.out_prod;
-		
-		memory_barrier();
-		
-		if ((prod - cons) > sizeof(console_page.out))
-			return;
-		
-		if (ch == '\n')
-			console_page.out[MASK_INDEX(prod++, console_page.out)] = '\r';
-		console_page.out[MASK_INDEX(prod++, console_page.out)] = ch;
-		
-		write_barrier();
-		
-		console_page.out_prod = prod;
-		
-		xen_notify_remote(start_info.console.domU.evtchn);
-	} else
-		xen_console_io(CONSOLE_IO_WRITE, 1, &ch);
+	if (!silent) {
+		if (start_info.console.domU.evtchn != 0) {
+			uint32_t cons = console_page.out_cons;
+			uint32_t prod = console_page.out_prod;
+			
+			memory_barrier();
+			
+			if ((prod - cons) > sizeof(console_page.out))
+				return;
+			
+			if (ch == '\n')
+				console_page.out[MASK_INDEX(prod++, console_page.out)] = '\r';
+			console_page.out[MASK_INDEX(prod++, console_page.out)] = ch;
+			
+			write_barrier();
+			
+			console_page.out_prod = prod;
+			
+			xen_notify_remote(start_info.console.domU.evtchn);
+		} else
+			xen_console_io(CONSOLE_IO_WRITE, 1, &ch);
+	}
 }
 
Index: kernel/arch/ia64/src/ia64.c
===================================================================
--- kernel/arch/ia64/src/ia64.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/arch/ia64/src/ia64.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -255,6 +255,6 @@
 #else
 	i8042_grab();
-#endif	
-#endif	
+#endif
+#endif
 }
 
Index: kernel/arch/ia64/src/ski/ski.c
===================================================================
--- kernel/arch/ia64/src/ski/ski.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/arch/ia64/src/ski/ski.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -57,7 +57,4 @@
 static bool kbd_disabled;
 
-static void ski_putchar(chardev_t *d, const char ch);
-static int32_t ski_getchar(void);
-
 /** Display character on debug console
  *
@@ -68,17 +65,19 @@
  * @param ch Character to be printed.
  */
-void ski_putchar(chardev_t *d, const char ch)
-{
-	asm volatile (
-		"mov r15 = %0\n"
-		"mov r32 = %1\n"	/* r32 is in0 */
-		"break 0x80000\n"	/* modifies r8 */
-		:
-		: "i" (SKI_PUTCHAR), "r" (ch)
-		: "r15", "in0", "r8"
-	);
-	
-	if (ch == '\n')
-		ski_putchar(d, '\r');
+static void ski_putchar(chardev_t *d, const char ch, bool silent)
+{
+	if (!silent) {
+		asm volatile (
+			"mov r15 = %0\n"
+			"mov r32 = %1\n"   /* r32 is in0 */
+			"break 0x80000\n"  /* modifies r8 */
+			:
+			: "i" (SKI_PUTCHAR), "r" (ch)
+			: "r15", "in0", "r8"
+		);
+		
+		if (ch == '\n')
+			ski_putchar(d, '\r');
+	}
 }
 
@@ -92,5 +91,5 @@
  * @return ASCII code of pressed key or 0 if no key pressed.
  */
-int32_t ski_getchar(void)
+static int32_t ski_getchar(void)
 {
 	uint64_t ch;
Index: kernel/arch/mips32/src/drivers/msim.c
===================================================================
--- kernel/arch/mips32/src/drivers/msim.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/arch/mips32/src/drivers/msim.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup mips32	
+/** @addtogroup mips32
  * @{
  */
@@ -59,7 +59,8 @@
 
 /** Putchar that works with MSIM & gxemul */
-void msim_write(chardev_t *dev, const char ch)
+void msim_write(chardev_t *dev, const char ch, bool silent)
 {
-	*((char *) MSIM_VIDEORAM) = ch;
+	if (!silent)
+		*((char *) MSIM_VIDEORAM) = ch;
 }
 
@@ -81,5 +82,5 @@
 {
 	char ch;
-
+	
 	while (1) {
 		ch = *((volatile char *) MSIM_KBD_ADDRESS);
@@ -102,10 +103,10 @@
 		char ch = 0;
 		
-			ch = *((char *) MSIM_KBD_ADDRESS);
-			if (ch =='\r')
-				ch = '\n';
-			if (ch == 0x7f)
-				ch = '\b';
-			chardev_push_character(&console, ch);
+		ch = *((char *) MSIM_KBD_ADDRESS);
+		if (ch =='\r')
+			ch = '\n';
+		if (ch == 0x7f)
+			ch = '\b';
+		chardev_push_character(&console, ch);
 	}
 }
Index: kernel/arch/mips32/src/drivers/serial.c
===================================================================
--- kernel/arch/mips32/src/drivers/serial.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/arch/mips32/src/drivers/serial.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -27,5 +27,5 @@
  */
 
-/** @addtogroup mips32	
+/** @addtogroup mips32
  * @{
  */
@@ -47,14 +47,16 @@
 static bool kb_enabled;
 
-static void serial_write(chardev_t *d, const char ch)
+static void serial_write(chardev_t *d, const char ch, bool silent)
 {
-	serial_t *sd = (serial_t *)d->data;
-
-	if (ch == '\n')
-		serial_write(d, '\r');
-	/* Wait until transmit buffer empty */
-	while (! (SERIAL_READ_LSR(sd->port) & (1<<TRANSMIT_EMPTY_BIT)))
-		;
-	SERIAL_WRITE(sd->port, ch);
+	if (!silent) {
+		serial_t *sd = (serial_t *)d->data;
+		
+		if (ch == '\n')
+			serial_write(d, '\r');
+		
+		/* Wait until transmit buffer empty */
+		while (!(SERIAL_READ_LSR(sd->port) & (1 << TRANSMIT_EMPTY_BIT)));
+		SERIAL_WRITE(sd->port, ch);
+	}
 }
 
@@ -134,6 +136,5 @@
 {
 	serial_t *sd = &sconf[0];
-
-
+	
 	chardev_initialize("serial_console", &console, &serial_ops);
 	console.data = sd;
@@ -146,8 +147,7 @@
 	serial_irq.handler = serial_irq_handler;
 	irq_register(&serial_irq);
-
+	
 	/* I don't know why, but the serial interrupts simply
-	 * don't work on simics
-	 */
+	   don't work on simics */
 	virtual_timer_fnc = &serial_handler;
 	
Index: kernel/arch/ppc32/src/ppc32.c
===================================================================
--- kernel/arch/ppc32/src/ppc32.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/arch/ppc32/src/ppc32.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -148,6 +148,5 @@
 	
 	/* Unreachable */
-	for (;;)
-		;
+	while (true);
 }
 
Index: kernel/arch/sparc64/src/drivers/sgcn.c
===================================================================
--- kernel/arch/sparc64/src/drivers/sgcn.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/arch/sparc64/src/drivers/sgcn.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -296,14 +296,15 @@
  * written straight away. 
  */
-static void sgcn_putchar(struct chardev * cd, const char c)
-{
-	spinlock_lock(&sgcn_output_lock);
-	
-	sgcn_do_putchar(c);
-	if (c == '\n') {
-		sgcn_do_putchar('\r');
+static void sgcn_putchar(struct chardev * cd, const char c, bool silent)
+{
+	if (!silent) {
+		spinlock_lock(&sgcn_output_lock);
+		
+		sgcn_do_putchar(c);
+		if (c == '\n')
+			sgcn_do_putchar('\r');
+		
+		spinlock_unlock(&sgcn_output_lock);
 	}
-	
-	spinlock_unlock(&sgcn_output_lock);
 }
 
Index: kernel/genarch/src/drivers/ega/ega.c
===================================================================
--- kernel/genarch/src/drivers/ega/ega.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/genarch/src/drivers/ega/ega.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -63,51 +63,5 @@
 static ioport_t ega_base;
 
-static void ega_putchar(chardev_t *d, const char ch);
-
 chardev_t ega_console;
-static chardev_operations_t ega_ops = {
-	.write = ega_putchar
-};
-
-static void ega_move_cursor(void);
-
-void ega_init(ioport_t base, uintptr_t videoram_phys)
-{
-	/* Initialize the software structure. */	
-	ega_base = base;
-
-	backbuf = (uint8_t *) malloc(SCREEN * 2, 0);
-	if (!backbuf)
-		panic("Unable to allocate backbuffer.");
-	
-	videoram = (uint8_t *) hw_map(videoram_phys, SCREEN * 2);
-	
-	/* Clear the screen and set the cursor position. */
-	memsetw(videoram, SCREEN, 0x0720);
-	memsetw(backbuf, SCREEN, 0x0720);
-	ega_move_cursor();
-
-	chardev_initialize("ega_out", &ega_console, &ega_ops);
-	stdout = &ega_console;
-	
-	ega_parea.pbase = videoram_phys;
-	ega_parea.vbase = (uintptr_t) videoram;
-	ega_parea.frames = 1;
-	ega_parea.cacheable = false;
-	ddi_parea_register(&ega_parea);
-
-	sysinfo_set_item_val("fb", NULL, true);
-	sysinfo_set_item_val("fb.kind", NULL, 2);
-	sysinfo_set_item_val("fb.width", NULL, ROW);
-	sysinfo_set_item_val("fb.height", NULL, ROWS);
-	sysinfo_set_item_val("fb.blinking", NULL, true);
-	sysinfo_set_item_val("fb.address.physical", NULL, videoram_phys);
-}
-
-static void ega_display_char(char ch)
-{
-	videoram[ega_cursor * 2] = ch;
-	backbuf[ega_cursor * 2] = ch;
-}
 
 /*
@@ -128,11 +82,27 @@
 }
 
-void ega_putchar(chardev_t *d __attribute__((unused)), const char ch)
+static void ega_move_cursor(void)
+{
+	outb(ega_base + EGA_INDEX_REG, 0xe);
+	outb(ega_base + EGA_DATA_REG, (uint8_t) ((ega_cursor >> 8) & 0xff));
+	outb(ega_base + EGA_INDEX_REG, 0xf);
+	outb(ega_base + EGA_DATA_REG, (uint8_t) (ega_cursor & 0xff));	
+}
+
+static void ega_display_char(char ch, bool silent)
+{
+	backbuf[ega_cursor * 2] = ch;
+	
+	if (!silent)
+		videoram[ega_cursor * 2] = ch;
+}
+
+static void ega_putchar(chardev_t *d __attribute__((unused)), const char ch, bool silent)
 {
 	ipl_t ipl;
-
+	
 	ipl = interrupts_disable();
 	spinlock_lock(&egalock);
-
+	
 	switch (ch) {
 	case '\n':
@@ -147,21 +117,52 @@
 		break;
 	default:
-		ega_display_char(ch);
+		ega_display_char(ch, silent);
 		ega_cursor++;
 		break;
 	}
 	ega_check_cursor();
-	ega_move_cursor();
-
+	
+	if (!silent)
+		ega_move_cursor();
+	
 	spinlock_unlock(&egalock);
 	interrupts_restore(ipl);
 }
 
-void ega_move_cursor(void)
+static chardev_operations_t ega_ops = {
+	.write = ega_putchar
+};
+
+void ega_init(ioport_t base, uintptr_t videoram_phys)
 {
-	outb(ega_base + EGA_INDEX_REG, 0xe);
-	outb(ega_base + EGA_DATA_REG, (uint8_t) ((ega_cursor >> 8) & 0xff));
-	outb(ega_base + EGA_INDEX_REG, 0xf);
-	outb(ega_base + EGA_DATA_REG, (uint8_t) (ega_cursor & 0xff));	
+	/* Initialize the software structure. */	
+	ega_base = base;
+	
+	backbuf = (uint8_t *) malloc(SCREEN * 2, 0);
+	if (!backbuf)
+		panic("Unable to allocate backbuffer.");
+	
+	videoram = (uint8_t *) hw_map(videoram_phys, SCREEN * 2);
+	
+	/* Clear the screen and set the cursor position. */
+	memsetw(videoram, SCREEN, 0x0720);
+	memsetw(backbuf, SCREEN, 0x0720);
+	ega_move_cursor();
+	
+	chardev_initialize("ega_out", &ega_console, &ega_ops);
+	stdout = &ega_console;
+	
+	ega_parea.pbase = videoram_phys;
+	ega_parea.vbase = (uintptr_t) videoram;
+	ega_parea.frames = 1;
+	ega_parea.cacheable = false;
+	ddi_parea_register(&ega_parea);
+	
+	sysinfo_set_item_val("fb", NULL, true);
+	sysinfo_set_item_val("fb.kind", NULL, 2);
+	sysinfo_set_item_val("fb.width", NULL, ROW);
+	sysinfo_set_item_val("fb.height", NULL, ROWS);
+	sysinfo_set_item_val("fb.blinking", NULL, true);
+	sysinfo_set_item_val("fb.address.physical", NULL, videoram_phys);
 }
 
Index: kernel/genarch/src/fb/fb.c
===================================================================
--- kernel/genarch/src/fb/fb.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/genarch/src/fb/fb.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -185,10 +185,11 @@
  *
  */
-static void logo_hide(void)
+static void logo_hide(bool silent)
 {
 	ylogo = 0;
 	ytrim = yres;
 	rowtrim = rows;
-	fb_redraw();
+	if (!silent)
+		fb_redraw();
 }
 
@@ -197,5 +198,5 @@
  *
  */
-static void glyph_draw(uint8_t glyph, unsigned int col, unsigned int row)
+static void glyph_draw(uint8_t glyph, unsigned int col, unsigned int row, bool silent)
 {
 	unsigned int x = COL2X(col);
@@ -204,11 +205,13 @@
 	
 	if (y >= ytrim)
-		logo_hide();
+		logo_hide(silent);
 	
 	backbuf[BB_POS(col, row)] = glyph;
 	
-	for (yd = 0; yd < FONT_SCANLINES; yd++)
-		memcpy(&fb_addr[FB_POS(x, y + yd + ylogo)],
-		    &glyphs[GLYPH_POS(glyph, yd)], glyphscanline);
+	if (!silent) {
+		for (yd = 0; yd < FONT_SCANLINES; yd++)
+			memcpy(&fb_addr[FB_POS(x, y + yd + ylogo)],
+			    &glyphs[GLYPH_POS(glyph, yd)], glyphscanline);
+	}
 }
 
@@ -218,37 +221,39 @@
  *
  */
-static void screen_scroll(void)
+static void screen_scroll(bool silent)
 {
 	if (ylogo > 0) {
-		logo_hide();
+		logo_hide(silent);
 		return;
 	}
 	
-	unsigned int row;
-	
-	for (row = 0; row < rows; row++) {
-		unsigned int y = ROW2Y(row);
-		unsigned int yd;
+	if (!silent) {
+		unsigned int row;
 		
-		for (yd = 0; yd < FONT_SCANLINES; yd++) {
-			unsigned int x;
-			unsigned int col;
+		for (row = 0; row < rows; row++) {
+			unsigned int y = ROW2Y(row);
+			unsigned int yd;
 			
-			for (col = 0, x = 0; col < cols; col++,
-			    x += FONT_WIDTH) {
-				uint8_t glyph;
+			for (yd = 0; yd < FONT_SCANLINES; yd++) {
+				unsigned int x;
+				unsigned int col;
 				
-				if (row < rows - 1) {
-					if (backbuf[BB_POS(col, row)] ==
-					    backbuf[BB_POS(col, row + 1)])
-						continue;
+				for (col = 0, x = 0; col < cols; col++,
+				    x += FONT_WIDTH) {
+					uint8_t glyph;
 					
-					glyph = backbuf[BB_POS(col, row + 1)];
-				} else
-					glyph = 0;
-				
-				memcpy(&fb_addr[FB_POS(x, y + yd)],
-				    &glyphs[GLYPH_POS(glyph, yd)],
-				    glyphscanline);
+					if (row < rows - 1) {
+						if (backbuf[BB_POS(col, row)] ==
+						    backbuf[BB_POS(col, row + 1)])
+							continue;
+						
+						glyph = backbuf[BB_POS(col, row + 1)];
+					} else
+						glyph = 0;
+					
+					memcpy(&fb_addr[FB_POS(x, y + yd)],
+					    &glyphs[GLYPH_POS(glyph, yd)],
+					    glyphscanline);
+				}
 			}
 		}
@@ -260,13 +265,13 @@
 
 
-static void cursor_put(void)
-{
-	glyph_draw(CURSOR, position % cols, position / cols);
-}
-
-
-static void cursor_remove(void)
-{
-	glyph_draw(0, position % cols, position / cols);
+static void cursor_put(bool silent)
+{
+	glyph_draw(CURSOR, position % cols, position / cols, silent);
+}
+
+
+static void cursor_remove(bool silent)
+{
+	glyph_draw(0, position % cols, position / cols, silent);
 }
 
@@ -277,5 +282,5 @@
  *
  */
-static void fb_putchar(chardev_t *dev, char ch)
+static void fb_putchar(chardev_t *dev, char ch, bool silent)
 {
 	spinlock_lock(&fb_lock);
@@ -283,27 +288,28 @@
 	switch (ch) {
 	case '\n':
-		cursor_remove();
+		cursor_remove(silent);
 		position += cols;
 		position -= position % cols;
 		break;
 	case '\r':
-		cursor_remove();
+		cursor_remove(silent);
 		position -= position % cols;
 		break;
 	case '\b':
-		cursor_remove();
+		cursor_remove(silent);
 		if (position % cols)
 			position--;
 		break;
 	case '\t':
-		cursor_remove();
+		cursor_remove(silent);
 		do {
 			glyph_draw((uint8_t) ' ', position % cols,
-			    position / cols);
+			    position / cols, silent);
 			position++;
 		} while ((position % 8) && (position < cols * rows));
 		break;
 	default:
-		glyph_draw((uint8_t) ch, position % cols, position / cols);
+		glyph_draw((uint8_t) ch, position % cols,
+		    position / cols, silent);
 		position++;
 	}
@@ -311,8 +317,8 @@
 	if (position >= cols * rows) {
 		position -= cols;
-		screen_scroll();
-	}
-	
-	cursor_put();
+		screen_scroll(silent);
+	}
+	
+	cursor_put(silent);
 	
 	spinlock_unlock(&fb_lock);
Index: kernel/generic/include/console/chardev.h
===================================================================
--- kernel/generic/include/console/chardev.h	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/generic/include/console/chardev.h	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -51,5 +51,5 @@
 	void (* resume)(struct chardev *);
 	/** Write character to stream. */
-	void (* write)(struct chardev *, char c);
+	void (* write)(struct chardev *, char c, bool silent);
 	/** Read character directly from device, assume interrupts disabled. */
 	char (* read)(struct chardev *); 
Index: kernel/generic/include/console/console.h
===================================================================
--- kernel/generic/include/console/console.h	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/generic/include/console/console.h	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -50,4 +50,7 @@
 extern void putchar(char c);
 
+extern void grab_console(void);
+extern void release_console(void);
+
 extern void arch_grab_console(void);
 extern void arch_release_console(void);
Index: kernel/generic/include/syscall/syscall.h
===================================================================
--- kernel/generic/include/syscall/syscall.h	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/generic/include/syscall/syscall.h	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -80,4 +80,5 @@
 	
 	SYS_DEBUG_ENABLE_CONSOLE,
+	SYS_DEBUG_DISABLE_CONSOLE,
 	SYS_IPC_CONNECT_KBOX,
 	SYSCALL_END
Index: kernel/generic/src/console/cmd.c
===================================================================
--- kernel/generic/src/console/cmd.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/generic/src/console/cmd.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -977,5 +977,5 @@
 {
 	printf("The kernel will now relinquish the console.\n");
-	arch_release_console();
+	release_console();
 	
 	if ((kconsole_notify) && (kconsole_irq.notif_cfg.notify))
Index: kernel/generic/src/console/console.c
===================================================================
--- kernel/generic/src/console/console.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/generic/src/console/console.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -66,4 +66,7 @@
 static size_t klog_uspace = 0;
 
+/**< Silent output */
+static bool silent = false;
+
 /**< Kernel log spinlock */
 SPINLOCK_INITIALIZE(klog_lock);
@@ -71,5 +74,5 @@
 /** Physical memory area used for klog buffer */
 static parea_t klog_parea;
-	
+
 /*
  * For now, we use 0 as INR.
@@ -143,4 +146,16 @@
 	klog_inited = true;
 	spinlock_unlock(&klog_lock);
+}
+
+void grab_console(void)
+{
+	silent = false;
+	arch_grab_console();
+}
+
+void release_console(void)
+{
+	silent = true;
+	arch_release_console();
 }
 
@@ -200,5 +215,5 @@
 	index_t index = 0;
 	char ch;
-
+	
 	while (index < buflen) {
 		ch = _getc(chardev);
@@ -214,5 +229,5 @@
 		} 
 		putchar(ch);
-
+		
 		if (ch == '\n') { /* end of string => write 0, return */
 			buf[index] = '\0';
@@ -254,5 +269,5 @@
 		index_t i;
 		for (i = klog_len - klog_stored; i < klog_len; i++)
-			stdout->op->write(stdout, klog[(klog_start + i) % KLOG_SIZE]);
+			stdout->op->write(stdout, klog[(klog_start + i) % KLOG_SIZE], silent);
 		klog_stored = 0;
 	}
@@ -266,5 +281,5 @@
 	
 	if (stdout->op->write)
-		stdout->op->write(stdout, c);
+		stdout->op->write(stdout, c, silent);
 	else {
 		/* The character is just in the kernel log */
Index: kernel/generic/src/syscall/syscall.c
===================================================================
--- kernel/generic/src/syscall/syscall.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ kernel/generic/src/syscall/syscall.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -93,9 +93,16 @@
 {
 #ifdef CONFIG_KCONSOLE
-	arch_grab_console();
+	grab_console();
 	return true;
 #else
 	return false;
 #endif
+}
+
+/** Tell kernel to relinquish keyboard/console access */
+static unative_t sys_debug_disable_console(void)
+{
+	release_console();
+	return true;
 }
 
@@ -185,5 +192,6 @@
 	/* Debug calls */
 	(syshandler_t) sys_debug_enable_console,
-
+	(syshandler_t) sys_debug_disable_console,
+	
 	(syshandler_t) sys_ipc_connect_kbox
 };
Index: uspace/srv/console/console.c
===================================================================
--- uspace/srv/console/console.c	(revision 96a2e45d41bf3367cd7ec049870161e948f7515e)
+++ uspace/srv/console/console.c	(revision 516ff92eec3001ee20baaf6f01de87b1ffef0b48)
@@ -501,5 +501,4 @@
 	
 	/* Connect to keyboard driver */
-	
 	kbd_phone = ipc_connect_me_to(PHONE_NS, SERVICE_KEYBOARD, 0, 0);
 	while (kbd_phone < 0) {
@@ -518,4 +517,7 @@
 		fb_info.phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0, 0);
 	}
+	
+	/* Disable kernel output to the console */
+	__SYSCALL0(SYS_DEBUG_DISABLE_CONSOLE);
 	
 	/* Initialize gcons */
@@ -588,5 +590,5 @@
 	return 0;
 }
- 
+
 /** @}
  */
