Index: kernel/arch/ia32/src/drivers/ega.c
===================================================================
--- kernel/arch/ia32/src/drivers/ega.c	(revision 46d8eb9b258c351fc7a0ec7a45162776b8adc3a2)
+++ kernel/arch/ia32/src/drivers/ega.c	(revision 113c677dd068aaac3c6548693836c1980ffa5b14)
@@ -94,6 +94,4 @@
 	sysinfo_set_item_val("fb.height", NULL, ROWS);
 	sysinfo_set_item_val("fb.address.physical", NULL, VIDEORAM);
-	sysinfo_set_item_val("fb.address.color", NULL, PAGE_COLOR((uintptr_t)
-		videoram));
 }
 
Index: kernel/arch/mips32/include/drivers/msim.h
===================================================================
--- kernel/arch/mips32/include/drivers/msim.h	(revision 46d8eb9b258c351fc7a0ec7a45162776b8adc3a2)
+++ kernel/arch/mips32/include/drivers/msim.h	(revision 113c677dd068aaac3c6548693836c1980ffa5b14)
@@ -37,6 +37,6 @@
 
 /** Address of devices. */
-#define MSIM_VIDEORAM		0xB0000000
-#define MSIM_KBD_ADDRESS	0xB0000000
+#define MSIM_VIDEORAM		0x90000000
+#define MSIM_KBD_ADDRESS	0x90000000
 #define MSIM_KBD_IRQ 		2
 
Index: kernel/arch/mips32/include/drivers/serial.h
===================================================================
--- kernel/arch/mips32/include/drivers/serial.h	(revision 46d8eb9b258c351fc7a0ec7a45162776b8adc3a2)
+++ kernel/arch/mips32/include/drivers/serial.h	(revision 113c677dd068aaac3c6548693836c1980ffa5b14)
@@ -38,5 +38,5 @@
 #include <console/chardev.h>
 
-#define SERIAL_ADDRESS    0xB8000000
+#define SERIAL_ADDRESS    0x98000000
 
 #define SERIAL_MAX        4
Index: kernel/arch/mips32/src/drivers/msim.c
===================================================================
--- kernel/arch/mips32/src/drivers/msim.c	(revision 46d8eb9b258c351fc7a0ec7a45162776b8adc3a2)
+++ kernel/arch/mips32/src/drivers/msim.c	(revision 113c677dd068aaac3c6548693836c1980ffa5b14)
@@ -40,5 +40,7 @@
 #include <console/console.h>
 #include <sysinfo/sysinfo.h>
+#include <ddi/ddi.h>
 
+static parea_t msim_parea;
 static chardev_t console;
 static irq_t msim_irq;
@@ -154,4 +156,14 @@
 	sysinfo_set_item_val("kbd.inr", NULL, MSIM_KBD_IRQ);
 	sysinfo_set_item_val("kbd.address.virtual", NULL, MSIM_KBD_ADDRESS);
+	
+	msim_parea.pbase = KA2PA(MSIM_VIDEORAM);
+	msim_parea.vbase = MSIM_VIDEORAM;
+	msim_parea.frames = 1;
+	msim_parea.cacheable = false;
+	ddi_parea_register(&msim_parea);
+	
+	sysinfo_set_item_val("fb", NULL, true);
+	sysinfo_set_item_val("fb.kind", NULL, 3);
+	sysinfo_set_item_val("fb.address.physical", NULL, KA2PA(MSIM_VIDEORAM));
 }
 
Index: uspace/srv/fb/Makefile
===================================================================
--- uspace/srv/fb/Makefile	(revision 46d8eb9b258c351fc7a0ec7a45162776b8adc3a2)
+++ uspace/srv/fb/Makefile	(revision 113c677dd068aaac3c6548693836c1980ffa5b14)
@@ -51,5 +51,4 @@
 	CFLAGS += -DFB_ENABLED
 endif
-
 ifeq ($(ARCH), ia32)
 	SOURCES += ega.c
@@ -61,5 +60,6 @@
 endif
 ifeq ($(ARCH), mips32)
-	CFLAGS += -DFB_INVERT_ENDIAN
+	SOURCES += msim.c
+	CFLAGS += -DMSIM_ENABLED -DFB_INVERT_ENDIAN
 endif
 
Index: uspace/srv/fb/main.c
===================================================================
--- uspace/srv/fb/main.c	(revision 46d8eb9b258c351fc7a0ec7a45162776b8adc3a2)
+++ uspace/srv/fb/main.c	(revision 113c677dd068aaac3c6548693836c1980ffa5b14)
@@ -38,4 +38,5 @@
 #include "fb.h"
 #include "ega.h"
+#include "msim.h"
 #include "main.h"
 
@@ -59,16 +60,22 @@
 	
 	ipcarg_t phonead;
-	int initialized = 0;
+	bool initialized = false;
 
 #ifdef FB_ENABLED
 	if (sysinfo_value("fb.kind") == 1) {
 		if (fb_init() == 0)
-			initialized = 1;
+			initialized = true;
 	} 
 #endif
 #ifdef EGA_ENABLED
-	if (!initialized && sysinfo_value("fb.kind") == 2) {
+	if ((!initialized) && (sysinfo_value("fb.kind") == 2)) {
 		if (ega_init() == 0)
-			initialized = 1;
+			initialized = true;
+	}
+#endif
+#ifdef MSIM_ENABLED
+	if ((!initialized) && (sysinfo_value("fb.kind") == 3)) {
+		if (msim_init() == 0)
+			initialized = true;
 	}
 #endif
Index: uspace/srv/fb/msim.c
===================================================================
--- uspace/srv/fb/msim.c	(revision 113c677dd068aaac3c6548693836c1980ffa5b14)
+++ uspace/srv/fb/msim.c	(revision 113c677dd068aaac3c6548693836c1980ffa5b14)
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2006 Ondrej Palkovsky
+ * Copyright (c) 2008 Martin Decky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @defgroup msimfb MSIM text console
+ * @brief	HelenOS MSIM text console.
+ * @ingroup fbs
+ * @{
+ */ 
+/** @file
+ */
+
+#include <async.h>
+#include <ipc/fb.h>
+#include <ipc/ipc.h>
+#include <libc.h>
+#include <errno.h>
+#include <string.h>
+#include <libc.h>
+#include <stdio.h>
+#include <ipc/fb.h>
+#include <sysinfo.h>
+#include <as.h>
+#include <align.h>
+#include <ddi.h>
+
+#include "msim.h"
+
+#define WIDTH 80
+#define HEIGHT 25
+
+#define MAX_CONTROL 20
+
+/* Allow only 1 connection */
+static int client_connected = 0;
+
+static char *virt_addr;
+
+static void msim_putc(const char c)
+{
+	*virt_addr = c;
+}
+
+static void msim_puts(char *str)
+{
+	while (*str)
+		*virt_addr = *(str++);
+}
+
+static void msim_clrscr(void)
+{
+	msim_puts("\033[2J");
+}
+
+static void msim_goto(const unsigned int row, const unsigned int col)
+{
+	if ((row > HEIGHT) || (col > WIDTH))
+		return;
+	
+	char control[MAX_CONTROL];
+	snprintf(control, MAX_CONTROL, "\033[%u;%uf", row + 1, col + 1);
+	msim_puts(control);
+}
+
+static void msim_set_style(const unsigned int mode)
+{
+	char control[MAX_CONTROL];
+	snprintf(control, MAX_CONTROL, "\033[%um", mode);
+	msim_puts(control);
+}
+
+static void msim_cursor_disable(void)
+{
+	msim_puts("\033[?25l");
+}
+
+static void msim_cursor_enable(void)
+{
+	msim_puts("\033[?25h");
+}
+
+static void msim_scroll(int i)
+{
+	if (i > 0) {
+		msim_goto(HEIGHT - 1, 0);
+		while (i--)
+			msim_puts("\033D");
+	} else if (i < 0) {
+		msim_goto(0, 0);
+		while (i++)
+			msim_puts("\033M");
+	}
+}
+
+static void msim_client_connection(ipc_callid_t iid, ipc_call_t *icall)
+{
+	int retval;
+	ipc_callid_t callid;
+	ipc_call_t call;
+	char c;
+	int lastcol = 0;
+	int lastrow = 0;
+	int newcol;
+	int newrow;
+	int fgcolor;
+	int bgcolor;
+	int i;
+
+	if (client_connected) {
+		ipc_answer_0(iid, ELIMIT);
+		return;
+	}
+	
+	client_connected = 1;
+	ipc_answer_0(iid, EOK); 
+	
+	while (true) {
+		callid = async_get_call(&call);
+		switch (IPC_GET_METHOD(call)) {
+		case IPC_M_PHONE_HUNGUP:
+			client_connected = 0;
+			ipc_answer_0(callid, EOK);
+			return;
+		case FB_PUTCHAR:
+			c = IPC_GET_ARG1(call);
+			newrow = IPC_GET_ARG2(call);
+			newcol = IPC_GET_ARG3(call);
+			if ((lastcol != newcol) || (lastrow != newrow))
+				msim_goto(newrow, newcol);
+			lastcol = newcol + 1;
+			lastrow = newrow;
+			msim_putc(c);
+			retval = 0;
+			break;
+		case FB_CURSOR_GOTO:
+			newrow = IPC_GET_ARG1(call);
+			newcol = IPC_GET_ARG2(call);
+			msim_goto(newrow, newcol);
+			lastrow = newrow;
+			lastcol = newcol;
+			retval = 0;
+			break;
+		case FB_GET_CSIZE:
+			ipc_answer_2(callid, EOK, HEIGHT, WIDTH);
+			continue;
+		case FB_CLEAR:
+			msim_clrscr();
+			retval = 0;
+			break;
+		case FB_SET_STYLE:
+			fgcolor = IPC_GET_ARG1(call);
+			bgcolor = IPC_GET_ARG2(call);
+			if (fgcolor < bgcolor)
+				msim_set_style(0);
+			else
+				msim_set_style(7);
+			retval = 0;
+			break;
+		case FB_SCROLL:
+			i = IPC_GET_ARG1(call);
+			if ((i > HEIGHT) || (i < -HEIGHT)) {
+				retval = EINVAL;
+				break;
+			}
+			msim_scroll(i);
+			msim_goto(lastrow, lastcol);
+			retval = 0;
+			break;
+		case FB_CURSOR_VISIBILITY:
+			if(IPC_GET_ARG1(call))
+				msim_cursor_enable();
+			else
+				msim_cursor_disable();
+			retval = 0;
+			break;
+		default:
+			retval = ENOENT;
+		}
+		ipc_answer_0(callid, retval);
+	}
+}
+
+int msim_init(void)
+{
+	void *phys_addr = (void *) sysinfo_value("fb.address.physical");
+	virt_addr = (char *) as_get_mappable_page(1);
+	
+	physmem_map(phys_addr, virt_addr, 1, AS_AREA_READ | AS_AREA_WRITE);
+	
+	async_set_client_connection(msim_client_connection);
+
+	/* Clear the terminal, set scrolling region
+	   to 0 - 25 lines */
+	msim_clrscr();
+	msim_goto(0, 0);
+	msim_puts("\033[0;25r");
+
+	return 0;
+}
+
+/** 
+ * @}
+ */
Index: uspace/srv/fb/msim.h
===================================================================
--- uspace/srv/fb/msim.h	(revision 113c677dd068aaac3c6548693836c1980ffa5b14)
+++ uspace/srv/fb/msim.h	(revision 113c677dd068aaac3c6548693836c1980ffa5b14)
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2006 Ondrej Palkovsky
+ * Copyright (c) 2008 Martin Decky
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup msimfb
+ * @brief	HelenOS MSIM text console.
+ * @ingroup fbs
+ * @{
+ */ 
+/** @file
+ */
+
+#ifndef FB_MSIM_H_
+#define FB_MSIM_H_
+
+extern int msim_init(void);
+
+#endif
+
+/** @}
+ */
+
