Index: kernel/genarch/include/fb/fb.h
===================================================================
--- kernel/genarch/include/fb/fb.h	(revision 50b3d30327db668601e634b172ccd903000bfbad)
+++ kernel/genarch/include/fb/fb.h	(revision 2b1f8608eb11a5a5a4ef29c4d03641eff9b079ac)
@@ -39,6 +39,32 @@
 #include <synch/spinlock.h>
 
+/**
+ * Properties of the framebuffer device.
+ */
+typedef struct fb_properties {
+	/** Physical address of the framebuffer device. */
+	uintptr_t addr;
+
+	/**
+	 * Address where the first (top left) pixel is mapped,
+	 * relative to "addr".
+	 */
+	unsigned int offset;	
+
+	/** Screen width in pixels. */
+	unsigned int x;
+
+	/** Screen height in pixels. */
+	unsigned int y;
+
+	/** Bytes per one scanline. */
+	unsigned int scan;
+
+	/** Color model. */
+	unsigned int visual;
+} fb_properties_t;
+
 SPINLOCK_EXTERN(fb_lock);
-void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int scan, unsigned int visual);
+void fb_init(fb_properties_t *props);
 
 #endif
Index: kernel/genarch/include/fb/visuals.h
===================================================================
--- kernel/genarch/include/fb/visuals.h	(revision 50b3d30327db668601e634b172ccd903000bfbad)
+++ kernel/genarch/include/fb/visuals.h	(revision 2b1f8608eb11a5a5a4ef29c4d03641eff9b079ac)
@@ -45,4 +45,5 @@
 
 #define VISUAL_BGR_0_8_8_8	6
+#define VISUAL_SB1500_PALETTE	7
 
 #endif
Index: kernel/genarch/include/ofw/ofw_tree.h
===================================================================
--- kernel/genarch/include/ofw/ofw_tree.h	(revision 50b3d30327db668601e634b172ccd903000bfbad)
+++ kernel/genarch/include/ofw/ofw_tree.h	(revision 2b1f8608eb11a5a5a4ef29c4d03641eff9b079ac)
@@ -173,4 +173,6 @@
 extern ofw_tree_node_t *ofw_tree_find_peer_by_device_type(ofw_tree_node_t *,
     const char *);
+extern ofw_tree_node_t *ofw_tree_find_peer_by_name(ofw_tree_node_t *node,
+    const char *name);
 extern ofw_tree_node_t *ofw_tree_find_node_by_handle(ofw_tree_node_t *,
     uint32_t);
Index: kernel/genarch/src/fb/fb.c
===================================================================
--- kernel/genarch/src/fb/fb.c	(revision 50b3d30327db668601e634b172ccd903000bfbad)
+++ kernel/genarch/src/fb/fb.c	(revision 2b1f8608eb11a5a5a4ef29c4d03641eff9b079ac)
@@ -190,4 +190,24 @@
 	*((uint8_t *) dst) = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 |
 	    BLUE(rgb, 3);
+}
+
+static void sb1500rgb_byte8(void *dst, int rgb)
+{
+	if (RED(rgb, 1) && GREEN(rgb, 1) && BLUE(rgb, 1))
+		*((uint8_t *) dst) = 255;
+	else if (RED(rgb, 1) && GREEN(rgb, 1))
+		*((uint8_t *) dst) = 150;
+	else if (GREEN(rgb, 1) && BLUE(rgb, 1))
+		*((uint8_t *) dst) = 47;
+	else if (RED(rgb, 1) && BLUE(rgb, 1))
+		*((uint8_t *) dst) = 48;
+	else if (RED(rgb, 1))
+		*((uint8_t *) dst) = 32;
+	else if (GREEN(rgb, 1))
+		*((uint8_t *) dst) = 47;
+	else if (BLUE(rgb, 1))
+		*((uint8_t *) dst) = 2;
+	else 
+		*((uint8_t *) dst) = 1;
 }
 
@@ -437,15 +457,9 @@
 /** Initialize framebuffer as a chardev output device
  *
- * @param addr   Physical address of the framebuffer
- * @param x      Screen width in pixels
- * @param y      Screen height in pixels
- * @param scan   Bytes per one scanline
- * @param visual Color model
- *
- */
-void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int scan,
-    unsigned int visual)
-{
-	switch (visual) {
+ * @param props  	Properties of the framebuffer device.
+ */
+void fb_init(fb_properties_t *props)
+{
+	switch (props->visual) {
 	case VISUAL_INDIRECT_8:
 		rgb2scr = rgb_byte8;
@@ -453,4 +467,9 @@
 		pixelbytes = 1;
 		break;
+	case VISUAL_SB1500_PALETTE:
+		rgb2scr = sb1500rgb_byte8;
+		scr2rgb = byte8_rgb;
+		pixelbytes = 1;
+		break;
 	case VISUAL_RGB_5_5_5:
 		rgb2scr = rgb_byte555;
@@ -487,17 +506,18 @@
 	}
 	
-	unsigned int fbsize = scan * y;
+	unsigned int fbsize = props->scan * props->y + props->offset;
 	
 	/* Map the framebuffer */
-	fbaddress = (uint8_t *) hw_map((uintptr_t) addr, fbsize);
-	
-	xres = x;
-	yres = y;
-	scanline = scan;
-	
-	rows = y / FONT_SCANLINES;
-	columns = x / COL_WIDTH;
-
-	fb_parea.pbase = (uintptr_t) addr;
+	fbaddress = (uint8_t *) hw_map((uintptr_t) props->addr, fbsize);
+	fbaddress += props->offset;
+	
+	xres = props->x;
+	yres = props->y;
+	scanline = props->scan;
+	
+	rows = props->y / FONT_SCANLINES;
+	columns = props->x / COL_WIDTH;
+
+	fb_parea.pbase = (uintptr_t) props->addr;
 	fb_parea.vbase = (uintptr_t) fbaddress;
 	fb_parea.frames = SIZE2FRAMES(fbsize);
@@ -509,7 +529,7 @@
 	sysinfo_set_item_val("fb.width", NULL, xres);
 	sysinfo_set_item_val("fb.height", NULL, yres);
-	sysinfo_set_item_val("fb.scanline", NULL, scan);
-	sysinfo_set_item_val("fb.visual", NULL, visual);
-	sysinfo_set_item_val("fb.address.physical", NULL, addr);
+	sysinfo_set_item_val("fb.scanline", NULL, props->scan);
+	sysinfo_set_item_val("fb.visual", NULL, props->visual);
+	sysinfo_set_item_val("fb.address.physical", NULL, props->addr);
 	sysinfo_set_item_val("fb.invert-colors", NULL, invert_colors);
 
@@ -525,4 +545,5 @@
 	if (!blankline)
 		panic("Failed to allocate blank line for framebuffer.");
+	unsigned int x, y;
 	for (y = 0; y < FONT_SCANLINES; y++)
 		for (x = 0; x < xres; x++)
Index: kernel/genarch/src/ofw/ofw_tree.c
===================================================================
--- kernel/genarch/src/ofw/ofw_tree.c	(revision 50b3d30327db668601e634b172ccd903000bfbad)
+++ kernel/genarch/src/ofw/ofw_tree.c	(revision 2b1f8608eb11a5a5a4ef29c4d03641eff9b079ac)
@@ -55,10 +55,12 @@
 /** Get OpenFirmware node property.
  *
- * @param node Node in which to lookup the property.
- * @param name Name of the property.
- *
- * @return Pointer to the property structure or NULL if no such property.
- */
-ofw_tree_property_t *ofw_tree_getprop(const ofw_tree_node_t *node, const char *name)
+ * @param node		Node in which to lookup the property.
+ * @param name		Name of the property.
+ *
+ * @return		Pointer to the property structure or NULL if no such
+ * 			property.
+ */
+ofw_tree_property_t *
+ofw_tree_getprop(const ofw_tree_node_t *node, const char *name)
 {
 	unsigned int i;
@@ -74,7 +76,7 @@
 /** Return value of the 'name' property.
  *
- * @param node Node of interest.
- *
- * @return Value of the 'name' property belonging to the node.
+ * @param node		Node of interest.
+ *
+ * @return		Value of the 'name' property belonging to the node.
  */
 const char *ofw_tree_node_name(const ofw_tree_node_t *node)
@@ -94,8 +96,9 @@
 /** Lookup child of given name.
  *
- * @param node Node whose child is being looked up.
- * @param name Name of the child being looked up.
- *
- * @return NULL if there is no such child or pointer to the matching child node.
+ * @param node		Node whose child is being looked up.
+ * @param name		Name of the child being looked up.
+ *
+ * @return		NULL if there is no such child or pointer to the
+ * 			matching child node.
  */
 ofw_tree_node_t *ofw_tree_find_child(ofw_tree_node_t *node, const char *name)
@@ -128,10 +131,12 @@
 /** Lookup first child of given device type.
  *
- * @param node Node whose child is being looked up.
- * @param name Device type of the child being looked up.
- *
- * @return NULL if there is no such child or pointer to the matching child node.
- */
-ofw_tree_node_t *ofw_tree_find_child_by_device_type(ofw_tree_node_t *node, const char *name)
+ * @param node		Node whose child is being looked up.
+ * @param name		Device type of the child being looked up.
+ *
+ * @return		NULL if there is no such child or pointer to the
+ * 			matching child node.
+ */
+ofw_tree_node_t *
+ofw_tree_find_child_by_device_type(ofw_tree_node_t *node, const char *name)
 {
 	ofw_tree_node_t *cur;
@@ -154,10 +159,12 @@
  * are looked up iteratively to avoid stack overflow.
  *
- * @param root Root of the searched subtree.
- * @param handle OpenFirmware handle.
- *
- * @return NULL if there is no such node or pointer to the matching node.
- */
-ofw_tree_node_t *ofw_tree_find_node_by_handle(ofw_tree_node_t *root, uint32_t handle)
+ * @param root		Root of the searched subtree.
+ * @param handle	OpenFirmware handle.
+ *
+ * @return		NULL if there is no such node or pointer to the matching
+ * 			node.
+ */
+ofw_tree_node_t *
+ofw_tree_find_node_by_handle(ofw_tree_node_t *root, uint32_t handle)
 {
 	ofw_tree_node_t *cur;
@@ -181,10 +188,12 @@
 /** Lookup first peer of given device type.
  *
- * @param node Node whose peer is being looked up.
- * @param name Device type of the child being looked up.
- *
- * @return NULL if there is no such child or pointer to the matching child node.
- */
-ofw_tree_node_t *ofw_tree_find_peer_by_device_type(ofw_tree_node_t *node, const char *name)
+ * @param node		Node whose peer is being looked up.
+ * @param name		Device type of the child being looked up.
+ *
+ * @return		NULL if there is no such child or pointer to the
+ * 			matching child node.
+ */
+ofw_tree_node_t *
+ofw_tree_find_peer_by_device_type(ofw_tree_node_t *node, const char *name)
 {
 	ofw_tree_node_t *cur;
@@ -203,13 +212,39 @@
 
 
+/** Lookup first peer of given name.
+ *
+ * @param node		Node whose peer is being looked up.
+ * @param name		Name of the child being looked up.
+ *
+ * @return		NULL if there is no such peer or pointer to the matching
+ * 			peer node.
+ */
+ofw_tree_node_t *
+ofw_tree_find_peer_by_name(ofw_tree_node_t *node, const char *name)
+{
+	ofw_tree_node_t *cur;
+	ofw_tree_property_t *prop;
+	
+	for (cur = node->peer; cur; cur = cur->peer) {
+		prop = ofw_tree_getprop(cur, "name");
+		if (!prop || !prop->value)
+			continue;
+		if (strcmp(prop->value, name) == 0)
+			return cur;
+	}
+			
+	return NULL;
+}
+
 /** Lookup OpenFirmware node by its path.
  *
- * @param path Path to the node.
- *
- * @return NULL if there is no such node or pointer to the leaf node.
+ * @param path		Path to the node.
+ *
+ * @return		NULL if there is no such node or pointer to the leaf
+ * 			node.
  */
 ofw_tree_node_t *ofw_tree_lookup(const char *path)
 {
-	char buf[NAME_BUF_LEN+1];
+	char buf[NAME_BUF_LEN + 1];
 	ofw_tree_node_t *node = ofw_root;
 	index_t i, j;
@@ -237,6 +272,6 @@
  * iteratively in order to avoid stack overflow.
  *
- * @param node Root of the subtree.
- * @param path Current path, NULL for the very root of the entire tree.
+ * @param node		Root of the subtree.
+ * @param path		Current path, NULL for the very root of the entire tree.
  */
 static void ofw_tree_node_print(const ofw_tree_node_t *node, const char *path)
