Index: uspace/app/gfxdemo/gfxdemo.c
===================================================================
--- uspace/app/gfxdemo/gfxdemo.c	(revision 26853ebcc36f8ada7a3516d36987217d14f1a3c3)
+++ uspace/app/gfxdemo/gfxdemo.c	(revision 6a87f28649c2b69a111649bbe080f5526f112635)
@@ -185,5 +185,5 @@
 		for (j = 0; j < h; j++) {
 			pixelmap_put_pixel(&pixelmap, i, j,
-			    PIXEL(255, (i % 30) < 3 ? 255 : 0,
+			    PIXEL(0, (i % 30) < 3 ? 255 : 0,
 			    (j % 30) < 3 ? 255 : 0, i / 2));
 		}
@@ -221,5 +221,5 @@
 			k = i * i + j * j;
 			pixelmap_put_pixel(&pixelmap, i, j,
-			    PIXEL(255, k, k, k));
+			    PIXEL(0, k, k, k));
 		}
 	}
@@ -256,5 +256,5 @@
 			k = i * i + j * j;
 			pixelmap_put_pixel(&pixelmap, i, j,
-			    k < w * w / 2 ? PIXEL(255, 0, 255, 0) :
+			    k < w * w / 2 ? PIXEL(0, 0, 255, 0) :
 			    PIXEL(0, 255, 0, 255));
 		}
@@ -469,21 +469,38 @@
 		return EOK;
 
-	rc = gfx_typeface_open(gc, "/data/font/helena.tpf", &tface);
-	if (rc != EOK) {
-		printf("Error opening typeface\n");
-		goto error;
-	}
-
-	finfo = gfx_typeface_first_font(tface);
-	if (finfo == NULL) {
-		printf("Typeface contains no font.\n");
-		rc = ENOENT;
-		goto error;
-	}
-
-	rc = gfx_font_open(finfo, &font);
-	if (rc != EOK) {
-		printf("Error opening font.\n");
-		goto error;
+	/* XXX Crude way of detecting text mode */
+	if (w < 256) {
+		/* Create dummy font for text mode */
+		rc = gfx_typeface_create(gc, &tface);
+		if (rc != EOK) {
+			printf("Error creating typeface\n");
+			goto error;
+		}
+
+		rc = gfx_font_create_textmode(tface, &font);
+		if (rc != EOK) {
+			printf("Error creating font\n");
+			goto error;
+		}
+	} else {
+		/* Load font */
+		rc = gfx_typeface_open(gc, "/data/font/helena.tpf", &tface);
+		if (rc != EOK) {
+			printf("Error opening typeface\n");
+			goto error;
+		}
+
+		finfo = gfx_typeface_first_font(tface);
+		if (finfo == NULL) {
+			printf("Typeface contains no font.\n");
+			rc = ENOENT;
+			goto error;
+		}
+
+		rc = gfx_font_open(finfo, &font);
+		if (rc != EOK) {
+			printf("Error opening font.\n");
+			goto error;
+		}
 	}
 
Index: uspace/lib/congfx/src/console.c
===================================================================
--- uspace/lib/congfx/src/console.c	(revision 26853ebcc36f8ada7a3516d36987217d14f1a3c3)
+++ uspace/lib/congfx/src/console.c	(revision 6a87f28649c2b69a111649bbe080f5526f112635)
@@ -102,8 +102,8 @@
 	cols = cgc->rect.p1.x - cgc->rect.p0.x;
 
-	ch.ch = 0;
+	ch.ch = cgc->clr >> 24;
 	ch.flags = CHAR_FLAG_DIRTY;
 	ch.attrs.type = CHAR_ATTR_RGB;
-	ch.attrs.val.rgb.fgcolor = cgc->clr;
+	ch.attrs.val.rgb.fgcolor = cgc->clr ^ 0xffffff;
 	ch.attrs.val.rgb.bgcolor = cgc->clr;
 
@@ -320,8 +320,8 @@
 				    y - offs.y - cbm->rect.p0.y);
 
-				ch.ch = 0;
+				ch.ch = clr >> 24;
 				ch.flags = CHAR_FLAG_DIRTY;
 				ch.attrs.type = CHAR_ATTR_RGB;
-				ch.attrs.val.rgb.fgcolor = clr;
+				ch.attrs.val.rgb.fgcolor = clr ^ 0xffffff;
 				ch.attrs.val.rgb.bgcolor = clr;
 
@@ -338,8 +338,8 @@
 				    y - offs.y - cbm->rect.p0.y);
 
-				ch.ch = 0;
+				ch.ch = clr >> 24;
 				ch.flags = CHAR_FLAG_DIRTY;
 				ch.attrs.type = CHAR_ATTR_RGB;
-				ch.attrs.val.rgb.fgcolor = clr;
+				ch.attrs.val.rgb.fgcolor = clr ^ 0xffffff;
 				ch.attrs.val.rgb.bgcolor = clr;
 
Index: uspace/lib/gfxfont/include/gfx/font.h
===================================================================
--- uspace/lib/gfxfont/include/gfx/font.h	(revision 26853ebcc36f8ada7a3516d36987217d14f1a3c3)
+++ uspace/lib/gfxfont/include/gfx/font.h	(revision 6a87f28649c2b69a111649bbe080f5526f112635)
@@ -50,4 +50,5 @@
 extern errno_t gfx_font_create(gfx_typeface_t *, gfx_font_props_t *,
     gfx_font_metrics_t *, gfx_font_t **);
+extern errno_t gfx_font_create_textmode(gfx_typeface_t *, gfx_font_t **);
 extern errno_t gfx_font_open(gfx_font_info_t *, gfx_font_t **);
 extern void gfx_font_close(gfx_font_t *);
Index: uspace/lib/gfxfont/include/types/gfx/font.h
===================================================================
--- uspace/lib/gfxfont/include/types/gfx/font.h	(revision 26853ebcc36f8ada7a3516d36987217d14f1a3c3)
+++ uspace/lib/gfxfont/include/types/gfx/font.h	(revision 6a87f28649c2b69a111649bbe080f5526f112635)
@@ -52,5 +52,7 @@
 	gff_italic = 0x2,
 	/** Bold, italic */
-	gff_bold_italic = gff_bold | gff_italic
+	gff_bold_italic = gff_bold | gff_italic,
+	/** Text mode */
+	gff_text_mode = 0x4
 } gfx_font_flags_t;
 
Index: uspace/lib/gfxfont/src/font.c
===================================================================
--- uspace/lib/gfxfont/src/font.c	(revision 26853ebcc36f8ada7a3516d36987217d14f1a3c3)
+++ uspace/lib/gfxfont/src/font.c	(revision 6a87f28649c2b69a111649bbe080f5526f112635)
@@ -180,4 +180,30 @@
 }
 
+/** Create dummy font for printing text in text mode.
+ *
+ * @param tface Typeface
+ * @param rfont Place to store pointer to new font
+ *
+ * @return EOK on success, EINVAL if parameters are invald,
+ *         ENOMEM if insufficient resources, EIO if graphic device connection
+ *         was lost
+ */
+errno_t gfx_font_create_textmode(gfx_typeface_t *tface, gfx_font_t **rfont)
+{
+	gfx_font_props_t props;
+	gfx_font_metrics_t metrics;
+
+	gfx_font_props_init(&props);
+	props.size = 1;
+	props.flags = gff_text_mode;
+
+	gfx_font_metrics_init(&metrics);
+	metrics.ascent = 0;
+	metrics.descent = 0;
+	metrics.leading = 1;
+
+	return gfx_font_create(tface, &props, &metrics, rfont);
+}
+
 /** Open font.
  *
@@ -229,5 +255,11 @@
 void gfx_font_get_metrics(gfx_font_t *font, gfx_font_metrics_t *metrics)
 {
-	*metrics = font->metrics;
+	if (font != NULL) {
+		*metrics = font->metrics;
+	} else {
+		metrics->ascent = 0;
+		metrics->descent = 0;
+		metrics->leading = 1;
+	}
 }
 
Index: uspace/lib/gfxfont/src/text.c
===================================================================
--- uspace/lib/gfxfont/src/text.c	(revision 26853ebcc36f8ada7a3516d36987217d14f1a3c3)
+++ uspace/lib/gfxfont/src/text.c	(revision 6a87f28649c2b69a111649bbe080f5526f112635)
@@ -35,8 +35,13 @@
 
 #include <errno.h>
+#include <gfx/bitmap.h>
 #include <gfx/font.h>
 #include <gfx/glyph.h>
 #include <gfx/text.h>
+#include <io/pixelmap.h>
 #include <mem.h>
+#include <str.h>
+#include "../private/font.h"
+#include "../private/typeface.h"
 
 /** Initialize text formatting structure.
@@ -66,4 +71,7 @@
 	gfx_coord_t width;
 	errno_t rc;
+
+	if ((font->finfo->props.flags & gff_text_mode) != 0)
+		return str_width(str);
 
 	width = 0;
@@ -83,4 +91,59 @@
 
 	return width;
+}
+
+/** Print string using text characters in text mode.
+ *
+ * @param font Font
+ * @param pos Position of top-left corner of text
+ * @param str String
+ * @return EOK on success or an error code
+ */
+static errno_t gfx_puttext_textmode(gfx_font_t *font, gfx_coord2_t *pos,
+    const char *str)
+{
+	gfx_context_t *gc = font->typeface->gc;
+	gfx_bitmap_params_t params;
+	gfx_bitmap_t *bitmap;
+	gfx_bitmap_alloc_t alloc;
+	pixelmap_t pmap;
+	gfx_coord_t x;
+	pixel_t pixel;
+	errno_t rc;
+
+	/*
+	 * NOTE: Creating and destroying bitmap each time is not probably
+	 * the most efficient way.
+	 */
+
+	gfx_bitmap_params_init(&params);
+	params.rect.p0.x = 0;
+	params.rect.p0.y = 0;
+	params.rect.p1.x = str_width(str);
+	params.rect.p1.y = 1;
+
+	rc = gfx_bitmap_create(gc, &params, NULL, &bitmap);
+	if (rc != EOK)
+		return rc;
+
+	rc = gfx_bitmap_get_alloc(bitmap, &alloc);
+	if (rc != EOK) {
+		gfx_bitmap_destroy(bitmap);
+		return rc;
+	}
+
+	pmap.width = params.rect.p1.x;
+	pmap.height = 1;
+	pmap.data = alloc.pixels;
+
+	for (x = 0; x < params.rect.p1.x; x++) {
+		pixel = PIXEL(str[x], 0xff, 0xff, 0xff);
+		pixelmap_put_pixel(&pmap, x, 0, pixel);
+	}
+
+	rc = gfx_bitmap_render(bitmap, NULL, pos);
+
+	gfx_bitmap_destroy(bitmap);
+	return rc;
 }
 
@@ -141,4 +204,8 @@
 	}
 
+	/* Text mode */
+	if ((font->finfo->props.flags & gff_text_mode) != 0)
+		return gfx_puttext_textmode(font, &cpos, str);
+
 	cp = str;
 	while (*cp != '\0') {
Index: uspace/lib/gfxfont/test/font.c
===================================================================
--- uspace/lib/gfxfont/test/font.c	(revision 26853ebcc36f8ada7a3516d36987217d14f1a3c3)
+++ uspace/lib/gfxfont/test/font.c	(revision 6a87f28649c2b69a111649bbe080f5526f112635)
@@ -98,4 +98,29 @@
 }
 
+/** Test creating and destroying text-mode font */
+PCUT_TEST(create_textmode_destroy)
+{
+	gfx_typeface_t *tface;
+	gfx_font_t *font;
+	gfx_context_t *gc;
+	test_gc_t tgc;
+	errno_t rc;
+
+	rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_font_create_textmode(tface, &font);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
+
+	rc = gfx_context_delete(gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
 /** Test gfx_font_get_metrics() */
 PCUT_TEST(get_metrics)
