Index: uspace/lib/ui/src/entry.c
===================================================================
--- uspace/lib/ui/src/entry.c	(revision 9c7dc8e93da9abc90efb24bba56e275432050f20)
+++ uspace/lib/ui/src/entry.c	(revision cd74fa821c3e13e287082a3dd6e4d121434cd360)
@@ -189,9 +189,12 @@
 	}
 
-	/* Paint inset frame */
-
-	rc = ui_paint_inset_frame(entry->res, &entry->rect, &inside);
-	if (rc != EOK)
-		goto error;
+	if (entry->res->textmode == false) {
+		/* Paint inset frame */
+		rc = ui_paint_inset_frame(entry->res, &entry->rect, &inside);
+		if (rc != EOK)
+			goto error;
+	} else {
+		inside = entry->rect;
+	}
 
 	/* Paint entry background */
@@ -214,5 +217,5 @@
 		break;
 	case gfx_halign_right:
-		pos.x = inside.p1.x - hpad;
+		pos.x = inside.p1.x - hpad - 1;
 		break;
 	}
Index: uspace/lib/ui/src/pbutton.c
===================================================================
--- uspace/lib/ui/src/pbutton.c	(revision 9c7dc8e93da9abc90efb24bba56e275432050f20)
+++ uspace/lib/ui/src/pbutton.c	(revision cd74fa821c3e13e287082a3dd6e4d121434cd360)
@@ -239,10 +239,38 @@
 }
 
-/** Paint push button.
- *
- * @param pbutton Push button
- * @return EOK on success or an error code
- */
-errno_t ui_pbutton_paint(ui_pbutton_t *pbutton)
+/** Paint button text shadow.
+ *
+ * @param pbutton Push button
+ * @return EOK on success or an error code
+ */
+static errno_t ui_pbutton_paint_text_shadow(ui_pbutton_t *pbutton)
+{
+	gfx_rect_t rect;
+	errno_t rc;
+
+	rect.p0.x = pbutton->rect.p0.x + 1;
+	rect.p0.y = pbutton->rect.p0.y + 1;
+	rect.p1.x = pbutton->rect.p1.x;
+	rect.p1.y = pbutton->rect.p1.y;
+
+	rc = gfx_set_color(pbutton->res->gc, pbutton->res->btn_shadow_color);
+	if (rc != EOK)
+		goto error;
+
+	rc = gfx_fill_rect(pbutton->res->gc, &rect);
+	if (rc != EOK)
+		goto error;
+
+	return EOK;
+error:
+	return rc;
+}
+
+/** Paint push button in graphic mode.
+ *
+ * @param pbutton Push button
+ * @return EOK on success or an error code
+ */
+static errno_t ui_pbutton_paint_gfx(ui_pbutton_t *pbutton)
 {
 	gfx_coord2_t pos;
@@ -308,4 +336,81 @@
 error:
 	return rc;
+}
+
+/** Paint push button in text mode.
+ *
+ * @param pbutton Push button
+ * @return EOK on success or an error code
+ */
+static errno_t ui_pbutton_paint_text(ui_pbutton_t *pbutton)
+{
+	gfx_coord2_t pos;
+	gfx_text_fmt_t fmt;
+	gfx_rect_t rect;
+	bool depressed;
+	errno_t rc;
+
+	depressed = pbutton->held && pbutton->inside;
+
+	rc = gfx_set_color(pbutton->res->gc, pbutton->res->wnd_face_color);
+	if (rc != EOK)
+		goto error;
+
+	rc = gfx_fill_rect(pbutton->res->gc, &pbutton->rect);
+	if (rc != EOK)
+		goto error;
+
+	rect.p0.x = pbutton->rect.p0.x + (depressed ? 1 : 0);
+	rect.p0.y = pbutton->rect.p0.y;
+	rect.p1.x = pbutton->rect.p1.x - 1 + (depressed ? 1 : 0);
+	rect.p1.y = pbutton->rect.p0.y + 1;
+
+	rc = gfx_set_color(pbutton->res->gc, pbutton->res->btn_highlight_color);
+	if (rc != EOK)
+		goto error;
+
+	rc = gfx_fill_rect(pbutton->res->gc, &rect);
+	if (rc != EOK)
+		goto error;
+
+	/* Center of button rectangle */
+	pos.x = (rect.p0.x + rect.p1.x) / 2;
+	pos.y = (rect.p0.y + rect.p1.y) / 2;
+
+	gfx_text_fmt_init(&fmt);
+	fmt.color = pbutton->res->btn_text_color;
+	fmt.halign = gfx_halign_center;
+	fmt.valign = gfx_valign_center;
+
+	rc = gfx_puttext(pbutton->res->font, &pos, &fmt, pbutton->caption);
+	if (rc != EOK)
+		goto error;
+
+	if (!depressed) {
+		rc = ui_pbutton_paint_text_shadow(pbutton);
+		if (rc != EOK)
+			goto error;
+	}
+
+	rc = gfx_update(pbutton->res->gc);
+	if (rc != EOK)
+		goto error;
+
+	return EOK;
+error:
+	return rc;
+}
+
+/** Paint push button.
+ *
+ * @param pbutton Push button
+ * @return EOK on success or an error code
+ */
+errno_t ui_pbutton_paint(ui_pbutton_t *pbutton)
+{
+	if (pbutton->res->textmode)
+		return ui_pbutton_paint_text(pbutton);
+	else
+		return ui_pbutton_paint_gfx(pbutton);
 }
 
Index: uspace/lib/ui/src/wdecor.c
===================================================================
--- uspace/lib/ui/src/wdecor.c	(revision 9c7dc8e93da9abc90efb24bba56e275432050f20)
+++ uspace/lib/ui/src/wdecor.c	(revision cd74fa821c3e13e287082a3dd6e4d121434cd360)
@@ -59,5 +59,9 @@
 	wdecor_corner_h = 24,
 	wdecor_edge_w = 4,
-	wdecor_edge_h = 4
+	wdecor_edge_h = 4,
+	wdecor_tbar_h = 22,
+	wdecor_tbar_h_text = 1,
+	wdecor_frame_w = 4,
+	wdecor_frame_w_text = 1
 };
 
@@ -180,15 +184,17 @@
 			return rc;
 
-		rc = ui_paint_bevel(wdecor->res->gc, &rect,
-		    wdecor->res->wnd_highlight_color,
-		    wdecor->res->wnd_shadow_color, 1, &rect);
-		if (rc != EOK)
-			return rc;
-
-		rc = ui_paint_bevel(wdecor->res->gc, &rect,
-		    wdecor->res->wnd_face_color,
-		    wdecor->res->wnd_face_color, 2, &rect);
-		if (rc != EOK)
-			return rc;
+		if (wdecor->res->textmode == false) {
+			rc = ui_paint_bevel(wdecor->res->gc, &rect,
+			    wdecor->res->wnd_highlight_color,
+			    wdecor->res->wnd_shadow_color, 1, &rect);
+			if (rc != EOK)
+				return rc;
+
+			rc = ui_paint_bevel(wdecor->res->gc, &rect,
+			    wdecor->res->wnd_face_color,
+			    wdecor->res->wnd_face_color, 2, &rect);
+			if (rc != EOK)
+	        		return rc;
+	        }
 	}
 
@@ -196,9 +202,11 @@
 		trect = geom.title_bar_rect;
 
-		rc = ui_paint_bevel(wdecor->res->gc, &trect,
-		    wdecor->res->wnd_shadow_color,
-		    wdecor->res->wnd_highlight_color, 1, &trect);
-		if (rc != EOK)
-			return rc;
+		if (wdecor->res->textmode == false) {
+			rc = ui_paint_bevel(wdecor->res->gc, &trect,
+			    wdecor->res->wnd_shadow_color,
+			    wdecor->res->wnd_highlight_color, 1, &trect);
+			if (rc != EOK)
+				return rc;
+		}
 
 		rc = gfx_set_color(wdecor->res->gc, wdecor->active ?
@@ -292,10 +300,16 @@
 void ui_wdecor_get_geom(ui_wdecor_t *wdecor, ui_wdecor_geom_t *geom)
 {
+	gfx_coord_t frame_w;
+	gfx_coord_t tbar_h;
+
 	/* Does window have a frame? */
 	if ((wdecor->style & ui_wds_frame) != 0) {
-		geom->interior_rect.p0.x = wdecor->rect.p0.x + 4;
-		geom->interior_rect.p0.y = wdecor->rect.p0.y + 4;
-		geom->interior_rect.p1.x = wdecor->rect.p1.x - 4;
-		geom->interior_rect.p1.y = wdecor->rect.p1.y - 4;
+		frame_w = wdecor->res->textmode ?
+		    wdecor_frame_w_text : wdecor_frame_w;
+
+		geom->interior_rect.p0.x = wdecor->rect.p0.x + frame_w;
+		geom->interior_rect.p0.y = wdecor->rect.p0.y + frame_w;
+		geom->interior_rect.p1.x = wdecor->rect.p1.x - frame_w;
+		geom->interior_rect.p1.y = wdecor->rect.p1.y - frame_w;
 	} else {
 		geom->interior_rect = wdecor->rect;
@@ -304,7 +318,10 @@
 	/* Does window have a title bar? */
 	if ((wdecor->style & ui_wds_titlebar) != 0) {
+		tbar_h = wdecor->res->textmode ?
+		    wdecor_tbar_h_text : wdecor_tbar_h;
+
 		geom->title_bar_rect.p0 = geom->interior_rect.p0;
 		geom->title_bar_rect.p1.x = geom->interior_rect.p1.x;
-		geom->title_bar_rect.p1.y = geom->interior_rect.p0.y + 22;
+		geom->title_bar_rect.p1.y = geom->interior_rect.p0.y + tbar_h;
 
 		geom->app_area_rect.p0.x = geom->interior_rect.p0.x;
@@ -322,8 +339,23 @@
 	/* Does window have a close button? */
 	if ((wdecor->style & ui_wds_close_btn) != 0) {
-		geom->btn_close_rect.p0.x = geom->title_bar_rect.p1.x - 1 - 20;
-		geom->btn_close_rect.p0.y = geom->title_bar_rect.p0.y + 1;
-		geom->btn_close_rect.p1.x = geom->title_bar_rect.p1.x - 1;
-		geom->btn_close_rect.p1.y = geom->title_bar_rect.p0.y + 1 + 20;
+		if (wdecor->res->textmode == false) {
+			geom->btn_close_rect.p0.x =
+			    geom->title_bar_rect.p1.x - 1 - 20;
+			geom->btn_close_rect.p0.y =
+			    geom->title_bar_rect.p0.y + 1;
+			geom->btn_close_rect.p1.x =
+			    geom->title_bar_rect.p1.x - 1;
+			geom->btn_close_rect.p1.y =
+			    geom->title_bar_rect.p0.y + 1 + 20;
+		} else {
+			geom->btn_close_rect.p0.x =
+			    geom->title_bar_rect.p1.x - 1 - 3;
+			geom->btn_close_rect.p0.y =
+			    geom->title_bar_rect.p0.y;
+			geom->btn_close_rect.p1.x =
+			    geom->title_bar_rect.p1.x - 1;
+			geom->btn_close_rect.p1.y =
+			    geom->title_bar_rect.p0.y + 1;
+		}
 	} else {
 		geom->btn_close_rect.p0.x = 0;
