Index: uspace/app/vdemo/vdemo.c
===================================================================
--- uspace/app/vdemo/vdemo.c	(revision ca05e9b4adeb153722312de6de1588a0dade8ed4)
+++ uspace/app/vdemo/vdemo.c	(revision 296e124ed71cc3d8a1fb740bd2b6f54384eeb944)
@@ -117,12 +117,18 @@
 
 		pixel_t grd_bg = PIXEL(255, 240, 240, 240);
-		pixel_t btn_bg = PIXEL(255, 0, 0, 0);
-		pixel_t btn_fg = PIXEL(255, 240, 240, 240);
+		
+		pixel_t btn_bg = PIXEL(255, 240, 240, 240);
+		pixel_t btn_fg = PIXEL(255, 186, 186, 186);
+		pixel_t btn_text = PIXEL(255, 0, 0, 0);
+		
 		pixel_t lbl_bg = PIXEL(255, 240, 240, 240);
-		pixel_t lbl_fg = PIXEL(255, 0, 0, 0);
+		pixel_t lbl_text = PIXEL(255, 0, 0, 0);
 
-		my_label_t *lbl_action = create_my_label(NULL, "Hello there!", 16, lbl_bg, lbl_fg);
-		button_t *btn_confirm = create_button(NULL, "Confirm", 16, btn_bg, btn_fg);
-		button_t *btn_cancel = create_button(NULL, "Cancel", 16, btn_bg, btn_fg);
+		my_label_t *lbl_action = create_my_label(NULL, "Hello there!", 16,
+		    lbl_bg, lbl_text);
+		button_t *btn_confirm = create_button(NULL, "Confirm", 16, btn_bg,
+		    btn_fg, btn_text);
+		button_t *btn_cancel = create_button(NULL, "Cancel", 16, btn_bg,
+		    btn_fg, btn_text);
 		grid_t *grid = create_grid(window_root(main_window), 2, 2, grd_bg);
 		if (!lbl_action || !btn_confirm || !btn_cancel || !grid) {
Index: uspace/app/vlaunch/vlaunch.c
===================================================================
--- uspace/app/vlaunch/vlaunch.c	(revision ca05e9b4adeb153722312de6de1588a0dade8ed4)
+++ uspace/app/vlaunch/vlaunch.c	(revision 296e124ed71cc3d8a1fb740bd2b6f54384eeb944)
@@ -122,19 +122,22 @@
 	
 	pixel_t grd_bg = PIXEL(255, 255, 255, 255);
-	pixel_t btn_bg = PIXEL(255, 0, 0, 0);
-	pixel_t btn_fg = PIXEL(255, 240, 240, 240);
+	
+	pixel_t btn_bg = PIXEL(255, 255, 255, 255);
+	pixel_t btn_fg = PIXEL(255, 186, 186, 186);
+	pixel_t btn_text = PIXEL(255, 0, 0, 0);
+	
 	pixel_t lbl_bg = PIXEL(255, 255, 255, 255);
-	pixel_t lbl_fg = PIXEL(255, 0, 0, 0);
+	pixel_t lbl_text = PIXEL(255, 0, 0, 0);
 	
 	canvas_t *logo_canvas = create_canvas(NULL, LOGO_WIDTH, LOGO_HEIGHT,
 	    logo);
 	label_t *lbl_caption = create_label(NULL, "Launch application:", 16,
-	    lbl_bg, lbl_fg);
+	    lbl_bg, lbl_text);
 	button_t *btn_vterm = create_button(NULL, "vterm", 16, btn_bg,
-	    btn_fg);
+	    btn_fg, btn_text);
 	button_t *btn_vdemo = create_button(NULL, "vdemo", 16, btn_bg,
-	    btn_fg);
+	    btn_fg, btn_text);
 	button_t *btn_vlaunch = create_button(NULL, "vlaunch", 16, btn_bg,
-	    btn_fg);
+	    btn_fg, btn_text);
 	grid_t *grid = create_grid(window_root(main_window), 1, 5, grd_bg);
 	
Index: uspace/app/vterm/vterm.c
===================================================================
--- uspace/app/vterm/vterm.c	(revision ca05e9b4adeb153722312de6de1588a0dade8ed4)
+++ uspace/app/vterm/vterm.c	(revision 296e124ed71cc3d8a1fb740bd2b6f54384eeb944)
@@ -55,5 +55,5 @@
 	}
 	
-	window_resize(main_window, 650, 510);
+	window_resize(main_window, 648, 510);
 	terminal_t *terminal_widget =
 	    create_terminal(window_root(main_window), 640, 480);
Index: uspace/lib/gui/Makefile
===================================================================
--- uspace/lib/gui/Makefile	(revision ca05e9b4adeb153722312de6de1588a0dade8ed4)
+++ uspace/lib/gui/Makefile	(revision 296e124ed71cc3d8a1fb740bd2b6f54384eeb944)
@@ -34,4 +34,5 @@
 
 SOURCES = \
+	common.c \
 	button.c \
 	canvas.c \
Index: uspace/lib/gui/button.c
===================================================================
--- uspace/lib/gui/button.c	(revision ca05e9b4adeb153722312de6de1588a0dade8ed4)
+++ uspace/lib/gui/button.c	(revision 296e124ed71cc3d8a1fb740bd2b6f54384eeb944)
@@ -36,45 +36,57 @@
 #include <str.h>
 #include <malloc.h>
-
 #include <drawctx.h>
 #include <surface.h>
-
+#include "common.h"
 #include "window.h"
 #include "button.h"
 
-static void paint_internal(widget_t *w)
-{
-	button_t *btn = (button_t *) w;
-
+static pixel_t color_highlight = PIXEL(255, 255, 255, 255);
+static pixel_t color_shadow = PIXEL(255, 85, 85, 85);
+
+static void paint_internal(widget_t *widget)
+{
+	button_t *btn = (button_t *) widget;
+	
 	surface_t *surface = window_claim(btn->widget.window);
-	if (!surface) {
+	if (!surface)
 		window_yield(btn->widget.window);
+	
+	source_t source;
+	source_init(&source);
+	
+	drawctx_t drawctx;
+	drawctx_init(&drawctx, surface);
+	
+	drawctx_set_source(&drawctx, &btn->background);
+	drawctx_transfer(&drawctx, widget->hpos, widget->vpos,
+	    widget->width, widget->height);
+	
+	if ((widget->width >= 8) && (widget->height >= 8)) {
+		drawctx_set_source(&drawctx, &source);
+		draw_bevel(&drawctx, &source, widget->hpos + 3, widget->vpos + 3,
+		    widget->width - 6, widget->height - 6, color_highlight,
+		    color_shadow);
+		
+		drawctx_set_source(&drawctx, &btn->foreground);
+		drawctx_transfer(&drawctx, widget->hpos + 4, widget->vpos + 4,
+		    widget->width - 8, widget->height - 8);
 	}
-
-	drawctx_t drawctx;
-
-	drawctx_init(&drawctx, surface);
-	drawctx_set_source(&drawctx, &btn->foreground);
-	drawctx_transfer(&drawctx, w->hpos, w->vpos, w->width, w->height);
-
-	if (w->width >= 6 && w->height >= 6) {
-		drawctx_set_source(&drawctx, &btn->background);
-		drawctx_transfer(&drawctx,
-		    w->hpos + 3, w->vpos + 3, w->width - 6, w->height - 6);
-	}
-
+	
 	sysarg_t cpt_width;
 	sysarg_t cpt_height;
 	font_get_box(&btn->font, btn->caption, &cpt_width, &cpt_height);
-	if (w->width >= cpt_width && w->height >= cpt_height) {
-		drawctx_set_source(&drawctx, &btn->foreground);
+	
+	if ((widget->width >= cpt_width) && (widget->height >= cpt_height)) {
+		sysarg_t x = ((widget->width - cpt_width) / 2) + widget->hpos;
+		sysarg_t y = ((widget->height - cpt_height) / 2) + widget->vpos;
+		
+		drawctx_set_source(&drawctx, &btn->text);
 		drawctx_set_font(&drawctx, &btn->font);
-		sysarg_t x = ((w->width - cpt_width) / 2) + w->hpos;
-		sysarg_t y = ((w->height - cpt_height) / 2) + w->vpos;
-		if (btn->caption) {
+		
+		if (btn->caption)
 			drawctx_print(&drawctx, btn->caption, x, y);
-		}
 	}
-
+	
 	window_yield(btn->widget.window);
 }
@@ -90,7 +102,6 @@
 {
 	button_t *btn = (button_t *) widget;
-
+	
 	deinit_button(btn);
-	
 	free(btn);
 }
@@ -117,7 +128,7 @@
 {
 	button_t *btn = (button_t *) widget;
-	if (event.key == KC_ENTER && event.type == KEY_PRESS) {
+	
+	if (event.key == KC_ENTER && event.type == KEY_PRESS)
 		sig_send(&btn->clicked, NULL);
-	}
 }
 
@@ -126,18 +137,17 @@
 	button_t *btn = (button_t *) widget;
 	widget->window->focus = widget;
-
+	
 	// TODO make the click logic more robust (mouse grabbing, mouse moves)
 	if (event.btn_num == 1) {
-		if (event.type == POS_RELEASE) {
+		if (event.type == POS_RELEASE)
 			sig_send(&btn->clicked, NULL);
-		}
 	}
 }
 
-bool init_button(button_t *btn, widget_t *parent,
-    const char *caption, uint16_t points, pixel_t background, pixel_t foreground)
+bool init_button(button_t *btn, widget_t *parent, const char *caption,
+    uint16_t points, pixel_t background, pixel_t foreground, pixel_t text)
 {
 	widget_init(&btn->widget, parent);
-
+	
 	btn->widget.destroy = button_destroy;
 	btn->widget.reconfigure = button_reconfigure;
@@ -146,42 +156,45 @@
 	btn->widget.handle_keyboard_event = button_handle_keyboard_event;
 	btn->widget.handle_position_event = button_handle_position_event;
-
+	
 	source_init(&btn->background);
 	source_set_color(&btn->background, background);
+	
 	source_init(&btn->foreground);
 	source_set_color(&btn->foreground, foreground);
-
-	if (caption == NULL) {
+	
+	source_init(&btn->text);
+	source_set_color(&btn->text, text);
+	
+	if (caption == NULL)
 		btn->caption = NULL;
-	} else {
+	else
 		btn->caption = str_dup(caption);
-	}
+	
 	font_init(&btn->font, FONT_DECODER_EMBEDDED, NULL, points);
-
+	
 	sysarg_t cpt_width;
 	sysarg_t cpt_height;
 	font_get_box(&btn->font, btn->caption, &cpt_width, &cpt_height);
-	btn->widget.width_min = cpt_width + 8;
-	btn->widget.height_min = cpt_height + 8;
-	btn->widget.width_ideal = cpt_width + 28;
-	btn->widget.height_ideal = cpt_height + 8;
-
+	btn->widget.width_min = cpt_width + 10;
+	btn->widget.height_min = cpt_height + 10;
+	btn->widget.width_ideal = cpt_width + 30;
+	btn->widget.height_ideal = cpt_height + 10;
+	
 	return true;
 }
 
-button_t *create_button(widget_t *parent,
-    const char *caption, uint16_t points, pixel_t background, pixel_t foreground)
+button_t *create_button(widget_t *parent, const char *caption, uint16_t points,
+    pixel_t background, pixel_t foreground, pixel_t text)
 {
 	button_t *btn = (button_t *) malloc(sizeof(button_t));
-	if (!btn) {
+	if (!btn)
 		return NULL;
-	}
-
-	if (init_button(btn, parent, caption, points, background, foreground)) {
+	
+	if (init_button(btn, parent, caption, points, background, foreground,
+	    text))
 		return btn;
-	} else {
-		free(btn);
-		return NULL;
-	}
+	
+	free(btn);
+	return NULL;
 }
 
Index: uspace/lib/gui/button.h
===================================================================
--- uspace/lib/gui/button.h	(revision ca05e9b4adeb153722312de6de1588a0dade8ed4)
+++ uspace/lib/gui/button.h	(revision 296e124ed71cc3d8a1fb740bd2b6f54384eeb944)
@@ -50,4 +50,5 @@
 	source_t background;
 	source_t foreground;
+	source_t text;
 	char *caption;
 	font_t font;
@@ -55,6 +56,8 @@
 } button_t;
 
-extern bool init_button(button_t *, widget_t *, const char *, uint16_t, pixel_t, pixel_t);
-extern button_t *create_button(widget_t *, const char *, uint16_t, pixel_t, pixel_t);
+extern bool init_button(button_t *, widget_t *, const char *, uint16_t, pixel_t,
+    pixel_t, pixel_t);
+extern button_t *create_button(widget_t *, const char *, uint16_t, pixel_t,
+    pixel_t, pixel_t);
 extern void deinit_button(button_t *);
 
Index: uspace/lib/gui/common.c
===================================================================
--- uspace/lib/gui/common.c	(revision 296e124ed71cc3d8a1fb740bd2b6f54384eeb944)
+++ uspace/lib/gui/common.c	(revision 296e124ed71cc3d8a1fb740bd2b6f54384eeb944)
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2014 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 gui
+ * @{
+ */
+/**
+ * @file
+ */
+
+#include <sys/types.h>
+#include <drawctx.h>
+#include "common.h"
+
+void draw_bevel(drawctx_t *drawctx, source_t *source, sysarg_t hpos,
+    sysarg_t vpos, sysarg_t width, sysarg_t height, pixel_t highlight,
+    pixel_t shadow)
+{
+	source_set_color(source, highlight);
+	drawctx_transfer(drawctx, hpos, vpos, width - 1, 1);
+	drawctx_transfer(drawctx, hpos, vpos + 1, 1, height - 2);
+	
+	source_set_color(source, shadow);
+	drawctx_transfer(drawctx, hpos, vpos + height - 1, width, 1);
+	drawctx_transfer(drawctx, hpos + width - 1, vpos, 1, height);
+}
+
+/** @}
+ */
Index: uspace/lib/gui/common.h
===================================================================
--- uspace/lib/gui/common.h	(revision 296e124ed71cc3d8a1fb740bd2b6f54384eeb944)
+++ uspace/lib/gui/common.h	(revision 296e124ed71cc3d8a1fb740bd2b6f54384eeb944)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2014 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 gui
+ * @{
+ */
+/**
+ * @file
+ */
+
+#ifndef GUI_COMMON_H_
+#define GUI_COMMON_H_
+
+#include <sys/types.h>
+#include <drawctx.h>
+
+extern void draw_bevel(drawctx_t *, source_t *, sysarg_t, sysarg_t, sysarg_t,
+    sysarg_t, pixel_t, pixel_t);
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/gui/label.c
===================================================================
--- uspace/lib/gui/label.c	(revision ca05e9b4adeb153722312de6de1588a0dade8ed4)
+++ uspace/lib/gui/label.c	(revision 296e124ed71cc3d8a1fb740bd2b6f54384eeb944)
@@ -36,39 +36,39 @@
 #include <str.h>
 #include <malloc.h>
-
 #include <drawctx.h>
 #include <surface.h>
-
 #include "window.h"
 #include "label.h"
 
-static void paint_internal(widget_t *w)
+static void paint_internal(widget_t *widget)
 {
-	label_t *lbl = (label_t *) w;
+	label_t *lbl = (label_t *) widget;
 
 	surface_t *surface = window_claim(lbl->widget.window);
-	if (!surface) {
+	if (!surface)
 		window_yield(lbl->widget.window);
-	}
-
+	
 	drawctx_t drawctx;
-
 	drawctx_init(&drawctx, surface);
+	
 	drawctx_set_source(&drawctx, &lbl->background);
-	drawctx_transfer(&drawctx, w->hpos, w->vpos, w->width, w->height);
-
+	drawctx_transfer(&drawctx, widget->hpos, widget->vpos, widget->width,
+	    widget->height);
+	
 	sysarg_t cpt_width;
 	sysarg_t cpt_height;
 	font_get_box(&lbl->font, lbl->caption, &cpt_width, &cpt_height);
-	if (w->width >= cpt_width && w->height >= cpt_height) {
-		drawctx_set_source(&drawctx, &lbl->foreground);
+	
+	if ((widget->width >= cpt_width) && (widget->height >= cpt_height)) {
+		sysarg_t x = ((widget->width - cpt_width) / 2) + widget->hpos;
+		sysarg_t y = ((widget->height - cpt_height) / 2) + widget->vpos;
+		
+		drawctx_set_source(&drawctx, &lbl->text);
 		drawctx_set_font(&drawctx, &lbl->font);
-		sysarg_t x = ((w->width - cpt_width) / 2) + w->hpos;
-		sysarg_t y = ((w->height - cpt_height) / 2) + w->vpos;
-		if (lbl->caption) {
+		
+		if (lbl->caption)
 			drawctx_print(&drawctx, lbl->caption, x, y);
-		}
 	}
-
+	
 	window_yield(lbl->widget.window);
 }
@@ -78,15 +78,17 @@
 	if (data != NULL) {
 		label_t *lbl = (label_t *) widget;
+		
 		const char *new_caption = (const char *) data;
 		lbl->caption = str_dup(new_caption);
-
+		
 		sysarg_t cpt_width;
 		sysarg_t cpt_height;
 		font_get_box(&lbl->font, lbl->caption, &cpt_width, &cpt_height);
+		
 		lbl->widget.width_min = cpt_width + 4;
 		lbl->widget.height_min = cpt_height + 4;
 		lbl->widget.width_ideal = lbl->widget.width_min;
 		lbl->widget.height_ideal = lbl->widget.height_min;
-
+		
 		window_refresh(lbl->widget.window);
 	}
@@ -103,7 +105,6 @@
 {
 	label_t *lbl = (label_t *) widget;
-
+	
 	deinit_label(lbl);
-	
 	free(lbl);
 }
@@ -137,9 +138,9 @@
 }
 
-bool init_label(label_t *lbl, widget_t *parent,
-    const char *caption, uint16_t points, pixel_t background, pixel_t foreground)
+bool init_label(label_t *lbl, widget_t *parent, const char *caption,
+    uint16_t points, pixel_t background, pixel_t text)
 {
 	widget_init(&lbl->widget, parent);
-
+	
 	lbl->widget.destroy = label_destroy;
 	lbl->widget.reconfigure = label_reconfigure;
@@ -148,47 +149,46 @@
 	lbl->widget.handle_keyboard_event = label_handle_keyboard_event;
 	lbl->widget.handle_position_event = label_handle_position_event;
-
+	
 	source_init(&lbl->background);
 	source_set_color(&lbl->background, background);
-	source_init(&lbl->foreground);
-	source_set_color(&lbl->foreground, foreground);
-
-	if (caption == NULL) {
+	
+	source_init(&lbl->text);
+	source_set_color(&lbl->text, text);
+	
+	if (caption == NULL)
 		lbl->caption = NULL;
-	} else {
+	else
 		lbl->caption = str_dup(caption);
-	}
+	
 	font_init(&lbl->font, FONT_DECODER_EMBEDDED, NULL, points);
-
+	
 	sysarg_t cpt_width;
 	sysarg_t cpt_height;
 	font_get_box(&lbl->font, lbl->caption, &cpt_width, &cpt_height);
+	
 	lbl->widget.width_min = cpt_width + 4;
 	lbl->widget.height_min = cpt_height + 4;
 	lbl->widget.width_ideal = lbl->widget.width_min;
 	lbl->widget.height_ideal = lbl->widget.height_min;
-
+	
 	lbl->rewrite = on_rewrite;
-
+	
 	return true;
 }
 
-label_t *create_label(widget_t *parent,
-    const char *caption, uint16_t points, pixel_t background, pixel_t foreground)
+label_t *create_label(widget_t *parent, const char *caption, uint16_t points,
+    pixel_t background, pixel_t text)
 {
 	label_t *lbl = (label_t *) malloc(sizeof(label_t));
-	if (!lbl) {
+	if (!lbl)
 		return NULL;
-	}
-
-	if (init_label(lbl, parent, caption, points, background, foreground)) {
+	
+	if (init_label(lbl, parent, caption, points, background, text))
 		return lbl;
-	} else {
-		free(lbl);
-		return NULL;
-	}
+	
+	free(lbl);
+	return NULL;
 }
 
 /** @}
  */
-
Index: uspace/lib/gui/label.h
===================================================================
--- uspace/lib/gui/label.h	(revision ca05e9b4adeb153722312de6de1588a0dade8ed4)
+++ uspace/lib/gui/label.h	(revision 296e124ed71cc3d8a1fb740bd2b6f54384eeb944)
@@ -49,5 +49,5 @@
 	widget_t widget;
 	source_t background;
-	source_t foreground;
+	source_t text;
 	char *caption;
 	font_t font;
@@ -55,6 +55,8 @@
 } label_t;
 
-extern bool init_label(label_t *, widget_t *, const char *, uint16_t, pixel_t, pixel_t);
-extern label_t *create_label(widget_t *, const char *, uint16_t, pixel_t, pixel_t);
+extern bool init_label(label_t *, widget_t *, const char *, uint16_t, pixel_t,
+    pixel_t);
+extern label_t *create_label(widget_t *, const char *, uint16_t, pixel_t,
+    pixel_t);
 extern void deinit_label(label_t *);
 
Index: uspace/lib/gui/window.c
===================================================================
--- uspace/lib/gui/window.c	(revision ca05e9b4adeb153722312de6de1588a0dade8ed4)
+++ uspace/lib/gui/window.c	(revision 296e124ed71cc3d8a1fb740bd2b6f54384eeb944)
@@ -56,75 +56,134 @@
 #include <surface.h>
 
+#include "common.h"
 #include "connection.h"
 #include "widget.h"
 #include "window.h"
 
-static sysarg_t border_thickness = 5;
-static sysarg_t header_height = 20;
+static sysarg_t border_thickness = 4;
+static sysarg_t bevel_thickness = 1;
+static sysarg_t header_height = 22;
 static sysarg_t header_min_width = 40;
-static sysarg_t close_width = 20;
-
-static pixel_t border_color = PIXEL(255, 0, 0, 0);
-static pixel_t header_bg_focus_color = PIXEL(255, 88, 106, 196);
-static pixel_t header_fg_focus_color = PIXEL(255, 255, 255, 255);
-static pixel_t header_bg_unfocus_color = PIXEL(255, 12, 57, 92);
-static pixel_t header_fg_unfocus_color = PIXEL(255, 255, 255, 255);
-
-static void paint_internal(widget_t *w)
-{
-	surface_t *surface = window_claim(w->window);
-	if (!surface) {
-		window_yield(w->window);
-	}
-
+static sysarg_t close_thickness = 22;
+
+static pixel_t color_highlight = PIXEL(255, 255, 255, 255);
+static pixel_t color_shadow = PIXEL(255, 85, 85, 85);
+static pixel_t color_surface = PIXEL(255, 186, 186, 186);
+
+static pixel_t color_header_focus_highlight = PIXEL(255, 120, 145, 255);
+static pixel_t color_header_focus_shadow = PIXEL(255, 40, 48, 89);
+static pixel_t color_header_focus_surface = PIXEL(255, 88, 106, 196);
+
+static pixel_t color_header_unfocus_highlight = PIXEL(255, 16, 78, 126);
+static pixel_t color_header_unfocus_shadow = PIXEL(255, 5, 26, 42);
+static pixel_t color_header_unfocus_surface = PIXEL(255, 12, 57, 92);
+
+static pixel_t color_caption_focus = PIXEL(255, 255, 255, 255);
+static pixel_t color_caption_unfocus = PIXEL(255, 207, 207, 207);
+
+static void paint_internal(widget_t *widget)
+{
+	surface_t *surface = window_claim(widget->window);
+	if (!surface)
+		window_yield(widget->window);
+	
 	source_t source;
-	font_t font;
+	source_init(&source);
+	
 	drawctx_t drawctx;
-
-	source_init(&source);
-	font_init(&font, FONT_DECODER_EMBEDDED, NULL, 16);
 	drawctx_init(&drawctx, surface);
 	drawctx_set_source(&drawctx, &source);
+	
+	/* Window border outer bevel */
+	
+	draw_bevel(&drawctx, &source, widget->vpos, widget->hpos,
+	    widget->width, widget->height, color_highlight, color_shadow);
+	
+	/* Window border surface */
+	
+	source_set_color(&source, color_surface);
+	drawctx_transfer(&drawctx, widget->hpos + 1, widget->vpos + 1,
+	    widget->width - 2, 2);
+	drawctx_transfer(&drawctx, widget->hpos + 1, widget->vpos + 1,
+	    2, widget->height - 2);
+	drawctx_transfer(&drawctx, widget->hpos + 1,
+	    widget->vpos + widget->height - 3, widget->width - 2, 2);
+	drawctx_transfer(&drawctx, widget->hpos + widget->width - 3,
+	    widget->vpos + 1, 2, widget->height - 4);
+	
+	/* Window border inner bevel */
+	
+	draw_bevel(&drawctx, &source, widget->hpos + 3, widget->vpos + 3,
+	    widget->width - 6, widget->height - 6, color_shadow,
+	    color_highlight);
+	
+	/* Header bevel */
+	
+	sysarg_t header_hpos = widget->hpos + border_thickness;
+	sysarg_t header_vpos = widget->vpos + border_thickness;
+	sysarg_t header_width = widget->width - 2 * border_thickness -
+	    close_thickness;
+	
+	draw_bevel(&drawctx, &source, header_hpos, header_vpos,
+	    header_width, header_height, widget->window->is_focused ?
+	    color_header_focus_highlight : color_header_unfocus_highlight,
+	    widget->window->is_focused ?
+	    color_header_focus_shadow : color_header_unfocus_shadow);
+	
+	/* Header surface */
+	
+	source_set_color(&source, widget->window->is_focused ?
+	    color_header_focus_surface : color_header_unfocus_surface);
+	drawctx_transfer(&drawctx, header_hpos + 1, header_vpos + 1,
+	    header_width - 2, header_height - 2);
+	
+	/* Close button bevel */
+	
+	sysarg_t close_hpos = widget->hpos + widget->width -
+	    border_thickness - close_thickness;
+	sysarg_t close_vpos = widget->vpos + border_thickness;
+	
+	draw_bevel(&drawctx, &source, close_hpos, close_vpos,
+	    close_thickness, close_thickness, color_highlight, color_shadow);
+	
+	/* Close button surface */
+	
+	source_set_color(&source, color_surface);
+	drawctx_transfer(&drawctx, close_hpos + 1, close_vpos + 1,
+	    close_thickness - 2, close_thickness - 2);
+	
+	/* Close button icon */
+	
+	draw_bevel(&drawctx, &source, close_hpos + 6, close_vpos + 9,
+	    close_thickness - 12, close_thickness - 18, color_highlight,
+	    color_shadow);
+	
+	/* Window caption */
+	
+	font_t font;
+	font_init(&font, FONT_DECODER_EMBEDDED, NULL, 16);
+	
 	drawctx_set_font(&drawctx, &font);
-
-	source_set_color(&source, border_color);
-	drawctx_transfer(&drawctx, w->hpos, w->vpos, border_thickness, w->height);
-	drawctx_transfer(&drawctx, w->hpos + w->width - border_thickness,
-	    w->vpos, border_thickness, w->height);
-	drawctx_transfer(&drawctx, w->hpos, w->vpos, w->width, border_thickness);
-	drawctx_transfer(&drawctx, w->hpos,
-	    w->vpos + w->height - border_thickness, w->width, border_thickness);
-
-	source_set_color(&source, 
-	    w->window->is_focused ? header_bg_focus_color : header_bg_unfocus_color);
-	drawctx_transfer(&drawctx,
-	    w->hpos + border_thickness, w->vpos + border_thickness,
-		w->width - 2 * border_thickness, header_height);
-
+	source_set_color(&source, widget->window->is_focused ?
+	    color_caption_focus : color_caption_unfocus);
+	
 	sysarg_t cpt_width;
 	sysarg_t cpt_height;
-	font_get_box(&font, w->window->caption, &cpt_width, &cpt_height);
-	sysarg_t cls_width;
-	sysarg_t cls_height;
-	char cls_pict[] = "x";
-	font_get_box(&font, cls_pict, &cls_width, &cls_height);
-	source_set_color(&source, 
-	    w->window->is_focused ? header_fg_focus_color : header_fg_unfocus_color);
-	sysarg_t cls_x = ((close_width - cls_width) / 2) + w->hpos + w->width -
-	    border_thickness - close_width;
-	sysarg_t cls_y = ((header_height - cls_height) / 2) + w->vpos + border_thickness;
-	drawctx_print(&drawctx, cls_pict, cls_x, cls_y);
-
-	bool draw_title = (w->width >= 2 * border_thickness + close_width + cpt_width);
+	font_get_box(&font, widget->window->caption, &cpt_width, &cpt_height);
+	
+	bool draw_title =
+	    (widget->width >= 2 * border_thickness + 2 * bevel_thickness +
+	    close_thickness + cpt_width);
 	if (draw_title) {
-		sysarg_t cpt_x = ((w->width - cpt_width) / 2) + w->hpos;
-		sysarg_t cpt_y = ((header_height - cpt_height) / 2) + w->vpos + border_thickness;
-		if (w->window->caption) {
-			drawctx_print(&drawctx, w->window->caption, cpt_x, cpt_y);
-		}
-	}
-
+		sysarg_t cpt_x = ((widget->width - cpt_width) / 2) + widget->hpos;
+		sysarg_t cpt_y = ((header_height - cpt_height) / 2) +
+		    widget->vpos + border_thickness;
+		
+		if (widget->window->caption)
+			drawctx_print(&drawctx, widget->window->caption, cpt_x, cpt_y);
+	}
+	
 	font_release(&font);
-	window_yield(w->window);
+	window_yield(widget->window);
 }
 
@@ -138,5 +197,5 @@
 	if (widget->window->is_decorated) {
 		list_foreach(widget->children, link, widget_t, child) {
-			child->rearrange(child, 
+			child->rearrange(child,
 			    widget->hpos + border_thickness,
 			    widget->vpos + border_thickness + header_height,
@@ -211,5 +270,6 @@
 		    (event.vpos >= border_thickness) &&
 		    (event.vpos < border_thickness + header_height);
-		bool close = header && (event.hpos >= width - border_thickness - close_width);
+		bool close = (header) &&
+		    (event.hpos >= width - border_thickness - close_thickness);
 
 		if (top && left && allowed_button) {
