Index: kernel/arch/sparc64/Makefile.inc
===================================================================
--- kernel/arch/sparc64/Makefile.inc	(revision d7e3f1ade9ff58d20053f91aafb424534a868c2e)
+++ kernel/arch/sparc64/Makefile.inc	(revision 253f35a1d714bef0e93e4a79768b7342ccc84123)
@@ -77,4 +77,6 @@
 	
 	DEFS += -DKBD_ADDR_OVRD=0x1fff13083f8ULL
+	
+	DEFS += -DFB_INVERT_COLORS
 endif
 
Index: kernel/arch/sparc64/include/drivers/z8530.h
===================================================================
--- kernel/arch/sparc64/include/drivers/z8530.h	(revision d7e3f1ade9ff58d20053f91aafb424534a868c2e)
+++ kernel/arch/sparc64/include/drivers/z8530.h	(revision 253f35a1d714bef0e93e4a79768b7342ccc84123)
@@ -72,4 +72,5 @@
 
 /* Write Register 0 */
+#define WR0_TX_IP_RST	(0x5<<3)	/** Reset pending TX interrupt. */
 #define WR0_ERR_RST	(0x6<<3)
 
Index: kernel/arch/sparc64/src/console.c
===================================================================
--- kernel/arch/sparc64/src/console.c	(revision d7e3f1ade9ff58d20053f91aafb424534a868c2e)
+++ kernel/arch/sparc64/src/console.c	(revision 253f35a1d714bef0e93e4a79768b7342ccc84123)
@@ -94,4 +94,23 @@
 }
 
+/** Acquire console back for kernel
+ *
+ */
+void arch_grab_console(void)
+{
+#ifdef CONFIG_Z8530
+	z8530_grab();
+#endif
+}
+
+/** Return console to userspace
+ *
+ */
+void arch_release_console(void)
+{
+#ifdef CONFIG_Z8530
+	z8530_release();
+#endif
+}
 /** @}
  */
Index: kernel/arch/sparc64/src/drivers/fhc.c
===================================================================
--- kernel/arch/sparc64/src/drivers/fhc.c	(revision d7e3f1ade9ff58d20053f91aafb424534a868c2e)
+++ kernel/arch/sparc64/src/drivers/fhc.c	(revision 253f35a1d714bef0e93e4a79768b7342ccc84123)
@@ -58,15 +58,10 @@
 	fhc = (void *) hw_map(FHC_UART_ADDR, PAGE_SIZE);
 
-	(void) fhc[FHC_UART_ICLR];
 	fhc[FHC_UART_ICLR] = 0;
-	(void) fhc[FHC_UART_IMAP];
-	fhc[FHC_UART_IMAP] = Z8530_INTRCV_DATA0;	/* hardcoded for Simics simulation */
-	(void) fhc[FHC_UART_IMAP];
-	fhc[FHC_UART_IMAP] = 0x80000000;		/* hardcoded for Simics simulation */
+	fhc[FHC_UART_IMAP] = 0x80000000;
 }
 
 void fhc_uart_reset(void)
 {
-	(void) fhc[FHC_UART_ICLR];
 	fhc[FHC_UART_ICLR] = 0;
 }
Index: kernel/arch/sparc64/src/sparc64.c
===================================================================
--- kernel/arch/sparc64/src/sparc64.c	(revision d7e3f1ade9ff58d20053f91aafb424534a868c2e)
+++ kernel/arch/sparc64/src/sparc64.c	(revision 253f35a1d714bef0e93e4a79768b7342ccc84123)
@@ -94,17 +94,4 @@
 }
 
-/** Acquire console back for kernel
- *
- */
-void arch_grab_console(void)
-{
-}
-/** Return console to userspace
- *
- */
-void arch_release_console(void)
-{
-}
-
 /** Switch to userspace. */
 void userspace(uspace_arg_t *kernel_uarg)
Index: kernel/arch/sparc64/src/trap/interrupt.c
===================================================================
--- kernel/arch/sparc64/src/trap/interrupt.c	(revision d7e3f1ade9ff58d20053f91aafb424534a868c2e)
+++ kernel/arch/sparc64/src/trap/interrupt.c	(revision 253f35a1d714bef0e93e4a79768b7342ccc84123)
@@ -43,5 +43,5 @@
 #include <arch/asm.h>
 #include <arch/barrier.h>
-
+#include <print.h>
 #include <genarch/kbd/z8530.h>
 
@@ -62,5 +62,7 @@
 void irq_ipc_bind_arch(unative_t irq)
 {
-	/* TODO */
+#ifdef CONFIG_Z8530
+	z8530_belongs_to_kernel = false;
+#endif
 }
 
@@ -83,7 +85,12 @@
 		 * interrupt traps. Call the interrupt handler directly.
 		 */
+
+		if (z8530_belongs_to_kernel)
+			z8530_interrupt();
+		else
+			ipc_irq_send_notif(0);
 		fhc_uart_reset();
-		z8530_interrupt();
 		break;
+
 #endif
 	}
Index: kernel/genarch/include/kbd/z8530.h
===================================================================
--- kernel/genarch/include/kbd/z8530.h	(revision d7e3f1ade9ff58d20053f91aafb424534a868c2e)
+++ kernel/genarch/include/kbd/z8530.h	(revision 253f35a1d714bef0e93e4a79768b7342ccc84123)
@@ -38,5 +38,9 @@
 #define KERN_Z8530_H_
 
+#include <typedefs.h>
+
 #define Z8530_INTRCV_DATA0	0x39	/* hardcoded for use in Simics */
+
+extern bool z8530_belongs_to_kernel;
 
 extern void z8530_init(void);
Index: kernel/genarch/src/fb/fb.c
===================================================================
--- kernel/genarch/src/fb/fb.c	(revision d7e3f1ade9ff58d20053f91aafb424534a868c2e)
+++ kernel/genarch/src/fb/fb.c	(revision 253f35a1d714bef0e93e4a79768b7342ccc84123)
@@ -61,4 +61,9 @@
 static unsigned int bitspp = 0;
 static unsigned int pixelbytes = 0;
+#ifdef FB_INVERT_COLORS
+static bool invert_colors = true;
+#else
+static bool invert_colors = false;
+#endif
 
 static unsigned int position = 0;
@@ -66,5 +71,4 @@
 static unsigned int rows = 0;
 
-
 #define COL_WIDTH	8
 #define ROW_BYTES	(scanline * FONT_SCANLINES)
@@ -85,4 +89,9 @@
 static void (*rgb2scr)(void *, int);
 static int (*scr2rgb)(void *);
+
+static inline int COLOR(int color)
+{
+	return invert_colors ? ~color : color;
+}
 
 /* Conversion routines between different color representations */
@@ -160,9 +169,9 @@
 static void putpixel(unsigned int x, unsigned int y, int color)
 {
-	(*rgb2scr)(&fbaddress[POINTPOS(x,y)],color);
+	(*rgb2scr)(&fbaddress[POINTPOS(x,y)], COLOR(color));
 
 	if (dbbuffer) {
 		int dline = (y + dboffset) % yres;
-		(*rgb2scr)(&dbbuffer[POINTPOS(x,dline)],color);
+		(*rgb2scr)(&dbbuffer[POINTPOS(x,dline)], COLOR(color));
 	}
 }
@@ -173,7 +182,7 @@
 	if (dbbuffer) {
 		int dline = (y + dboffset) % yres;
-		return (*scr2rgb)(&dbbuffer[POINTPOS(x,dline)]);
-	}
-	return (*scr2rgb)(&fbaddress[POINTPOS(x,y)]);
+		return COLOR((*scr2rgb)(&dbbuffer[POINTPOS(x,dline)]));
+	}
+	return COLOR((*scr2rgb)(&fbaddress[POINTPOS(x,y)]));
 }
 
@@ -275,5 +284,5 @@
 			byte >>= x % 8;
 			if (byte & 1)
-				putpixel(startx + x, starty + y, LOGOCOLOR);
+				putpixel(startx + x, starty + y, COLOR(LOGOCOLOR));
 		}
 }
@@ -398,4 +407,5 @@
 	sysinfo_set_item_val("fb.scanline", NULL, scan);
 	sysinfo_set_item_val("fb.address.physical", NULL, addr);
+	sysinfo_set_item_val("fb.invert-colors", NULL, invert_colors);
 
 	/* Allocate double buffer */
@@ -417,7 +427,9 @@
 	if (!blankline)
 		panic("Failed to allocate blank line for framebuffer.");
-	for (y=0; y < FONT_SCANLINES; y++)
-		for (x=0; x < xres; x++)
-			(*rgb2scr)(&blankline[POINTPOS(x,y)],BGCOLOR);
+	for (y=0; y < FONT_SCANLINES; y++) {
+		for (x=0; x < xres; x++) {
+			(*rgb2scr)(&blankline[POINTPOS(x,y)], COLOR(BGCOLOR));
+		}
+	}
 
 	clear_screen();
Index: kernel/genarch/src/kbd/key.c
===================================================================
--- kernel/genarch/src/kbd/key.c	(revision d7e3f1ade9ff58d20053f91aafb424534a868c2e)
+++ kernel/genarch/src/kbd/key.c	(revision 253f35a1d714bef0e93e4a79768b7342ccc84123)
@@ -68,9 +68,9 @@
 	spinlock_lock(&keylock);
 	switch (sc) {
-	    case SC_LSHIFT:
-	    case SC_RSHIFT:
+	case SC_LSHIFT:
+	case SC_RSHIFT:
 		keyflags &= ~PRESSED_SHIFT;
 		break;
-	    case SC_CAPSLOCK:
+	case SC_CAPSLOCK:
 		keyflags &= ~PRESSED_CAPSLOCK;
 		if (lockflags & LOCKED_CAPSLOCK)
@@ -79,5 +79,5 @@
 			lockflags |= LOCKED_CAPSLOCK;
 		break;
-	    default:
+	default:
 		break;
 	}
Index: kernel/genarch/src/kbd/z8530.c
===================================================================
--- kernel/genarch/src/kbd/z8530.c	(revision d7e3f1ade9ff58d20053f91aafb424534a868c2e)
+++ kernel/genarch/src/kbd/z8530.c	(revision 253f35a1d714bef0e93e4a79768b7342ccc84123)
@@ -42,4 +42,5 @@
 #include <arch/drivers/z8530.h>
 #include <arch/interrupt.h>
+#include <arch/drivers/kbd.h>
 #include <cpu.h>
 #include <arch/asm.h>
@@ -49,4 +50,6 @@
 #include <console/console.h>
 #include <interrupt.h>
+#include <sysinfo/sysinfo.h>
+#include <print.h>
 
 /*
@@ -54,4 +57,6 @@
  */
 #define IGNORE_CODE	0x7f		/* all keys up */
+
+bool z8530_belongs_to_kernel = true;
 
 static void z8530_suspend(chardev_t *);
@@ -70,4 +75,5 @@
 void z8530_grab(void)
 {
+	z8530_belongs_to_kernel = true;
 }
 
@@ -75,4 +81,5 @@
 void z8530_release(void)
 {
+	z8530_belongs_to_kernel = false;
 }
 
@@ -83,12 +90,22 @@
 	stdin = &kbrd;
 
+	sysinfo_set_item_val("kbd", NULL, true);
+	sysinfo_set_item_val("kbd.irq", NULL, 0);
+	sysinfo_set_item_val("kbd.address.virtual", NULL, (uintptr_t) kbd_virt_address);
+
 	(void) z8530_read_a(RR8);
 
-	z8530_write_a(WR1, WR1_IARCSC);	/* interrupt on all characters */
+	/*
+	 * Clear any pending TX interrupts or we never manage
+	 * to set FHC UART interrupt state to idle.
+	 */
+	z8530_write_a(WR0, WR0_TX_IP_RST);
+
+	z8530_write_a(WR1, WR1_IARCSC);		/* interrupt on all characters */
 
 	/* 8 bits per character and enable receiver */
 	z8530_write_a(WR3, WR3_RX8BITSCH | WR3_RX_ENABLE);
 	
-	z8530_write_a(WR9, WR9_MIE);	/* Master Interrupt Enable. */
+	z8530_write_a(WR9, WR9_MIE);		/* Master Interrupt Enable. */
 	
 	/*
Index: kernel/generic/src/ipc/irq.c
===================================================================
--- kernel/generic/src/ipc/irq.c	(revision d7e3f1ade9ff58d20053f91aafb424534a868c2e)
+++ kernel/generic/src/ipc/irq.c	(revision 253f35a1d714bef0e93e4a79768b7342ccc84123)
@@ -56,4 +56,5 @@
 #include <syscall/copy.h>
 #include <console/console.h>
+#include <print.h>
 
 typedef struct {
@@ -68,5 +69,5 @@
 static int irq_conns_size;
 
-#include <print.h>
+
 /* Execute code associated with IRQ notification */
 static void code_execute(call_t *call, irq_code_t *code)
Index: kernel/generic/src/ipc/sysipc.c
===================================================================
--- kernel/generic/src/ipc/sysipc.c	(revision d7e3f1ade9ff58d20053f91aafb424534a868c2e)
+++ kernel/generic/src/ipc/sysipc.c	(revision 253f35a1d714bef0e93e4a79768b7342ccc84123)
@@ -48,4 +48,5 @@
 #include <security/cap.h>
 #include <mm/as.h>
+#include <print.h>
 
 #define GET_CHECK_PHONE(phone,phoneid,err) { \
