Index: uspace/app/uidemo/uidemo.c
===================================================================
--- uspace/app/uidemo/uidemo.c	(revision f6df5a3d9b2985d969e8f80c26d0cec2273f3b7e)
+++ uspace/app/uidemo/uidemo.c	(revision c9a7adc60e8a06ec755f8e0e3414d8fd68faa35e)
@@ -34,4 +34,7 @@
 
 #include <display.h>
+#include <gfx/color.h>
+#include <gfx/coord.h>
+#include <gfx/render.h>
 #include <stdio.h>
 #include <str.h>
@@ -135,4 +138,5 @@
 	ui_demo_t demo;
 	gfx_rect_t rect;
+	gfx_color_t *color = NULL;
 	errno_t rc;
 
@@ -184,4 +188,6 @@
 	ui_pbutton_set_rect(demo.pb1, &rect);
 
+	ui_pbutton_set_default(demo.pb1, true);
+
 	rc = ui_pbutton_create(ui_res, "Cancel", &demo.pb2);
 	if (rc != EOK) {
@@ -195,4 +201,25 @@
 	rect.p1.y = 80;
 	ui_pbutton_set_rect(demo.pb2, &rect);
+
+	rc = gfx_color_new_rgb_i16(0xc8c8, 0xc8c8, 0xc8c8, &color);
+	if (rc != EOK) {
+		printf("Error allocating color.\n");
+		return rc;
+	}
+
+	rc = gfx_set_color(gc, color);
+	if (rc != EOK) {
+		printf("Error setting color.\n");
+		return rc;
+	}
+
+	rc = gfx_fill_rect(gc, &params.rect);
+	if (rc != EOK) {
+		printf("Error filling background.\n");
+		return rc;
+	}
+
+	gfx_color_delete(color);
+	color = NULL;
 
 	rc = ui_pbutton_paint(demo.pb1);
Index: uspace/lib/ui/include/ui/pbutton.h
===================================================================
--- uspace/lib/ui/include/ui/pbutton.h	(revision f6df5a3d9b2985d969e8f80c26d0cec2273f3b7e)
+++ uspace/lib/ui/include/ui/pbutton.h	(revision c9a7adc60e8a06ec755f8e0e3414d8fd68faa35e)
@@ -41,4 +41,5 @@
 #include <types/ui/pbutton.h>
 #include <types/ui/resource.h>
+#include <stdbool.h>
 
 extern errno_t ui_pbutton_create(ui_resource_t *, const char *,
@@ -46,4 +47,5 @@
 extern void ui_pbutton_destroy(ui_pbutton_t *);
 extern void ui_pbutton_set_rect(ui_pbutton_t *, gfx_rect_t *);
+extern void ui_pbutton_set_default(ui_pbutton_t *, bool);
 extern errno_t ui_pbutton_paint(ui_pbutton_t *);
 extern void ui_pbutton_press(ui_pbutton_t *);
Index: uspace/lib/ui/private/pbutton.h
===================================================================
--- uspace/lib/ui/private/pbutton.h	(revision f6df5a3d9b2985d969e8f80c26d0cec2273f3b7e)
+++ uspace/lib/ui/private/pbutton.h	(revision c9a7adc60e8a06ec755f8e0e3414d8fd68faa35e)
@@ -53,4 +53,6 @@
 	/** Caption */
 	const char *caption;
+	/** Button is selected as default */
+	bool isdefault;
 	/** Button is currently held down */
 	bool held;
Index: uspace/lib/ui/src/pbutton.c
===================================================================
--- uspace/lib/ui/src/pbutton.c	(revision f6df5a3d9b2985d969e8f80c26d0cec2273f3b7e)
+++ uspace/lib/ui/src/pbutton.c	(revision c9a7adc60e8a06ec755f8e0e3414d8fd68faa35e)
@@ -47,6 +47,6 @@
 /** Caption movement when button is pressed down */
 enum {
-	ui_pb_press_dx = 2,
-	ui_pb_press_dy = 2
+	ui_pb_press_dx = 1,
+	ui_pb_press_dy = 1
 };
 
@@ -100,35 +100,30 @@
 }
 
-/** Paint push button.
+/** Set default flag.
+ *
+ * Default button is the one activated by Enter key, it is marked
+ * by thicker frame.
+ *
+ * @param pbutton Button
+ * @param isdefault @c true iff button is default
+ */
+void ui_pbutton_set_default(ui_pbutton_t *pbutton, bool isdefault)
+{
+	pbutton->isdefault = isdefault;
+}
+
+/** Paint outer button frame.
  *
  * @param pbutton Push button
  * @return EOK on success or an error code
  */
-errno_t ui_pbutton_paint(ui_pbutton_t *pbutton)
+static errno_t ui_pbutton_paint_frame(ui_pbutton_t *pbutton)
 {
 	gfx_color_t *color = NULL;
-	gfx_coord2_t pos;
-	gfx_text_fmt_t fmt;
+	gfx_rect_t rect;
+	gfx_coord_t thickness;
 	errno_t rc;
 
-	if (pbutton->held) {
-		rc = gfx_color_new_rgb_i16(0x8000, 0, 0, &color);
-		if (rc != EOK)
-			goto error;
-	} else {
-		rc = gfx_color_new_rgb_i16(0xc8c8, 0xc8c8, 0xc8c8, &color);
-		if (rc != EOK)
-			goto error;
-	}
-
-	rc = gfx_set_color(pbutton->res->gc, color);
-	if (rc != EOK)
-		goto error;
-
-	rc = gfx_fill_rect(pbutton->res->gc, &pbutton->rect);
-	if (rc != EOK)
-		goto error;
-
-	gfx_color_delete(color);
+	thickness = pbutton->isdefault ? 2 : 1;
 
 	rc = gfx_color_new_rgb_i16(0, 0, 0, &color);
@@ -140,23 +135,37 @@
 		goto error;
 
-	/* Center of button rectangle */
-	pos.x = (pbutton->rect.p0.x + pbutton->rect.p1.x) / 2;
-	pos.y = (pbutton->rect.p0.y + pbutton->rect.p1.y) / 2;
-
-	if (pbutton->held) {
-		pos.x += ui_pb_press_dx;
-		pos.y += ui_pb_press_dy;
-	}
-
-	gfx_text_fmt_init(&fmt);
-	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;
-
-	gfx_color_delete(color);
-
+	rect.p0.x = pbutton->rect.p0.x + 1;
+	rect.p0.y = pbutton->rect.p0.y;
+	rect.p1.x = pbutton->rect.p1.x - 1;
+	rect.p1.y = pbutton->rect.p0.y + thickness;
+	rc = gfx_fill_rect(pbutton->res->gc, &rect);
+	if (rc != EOK)
+		goto error;
+
+	rect.p0.x = pbutton->rect.p0.x + 1;
+	rect.p0.y = pbutton->rect.p1.y - thickness;
+	rect.p1.x = pbutton->rect.p1.x - 1;
+	rect.p1.y = pbutton->rect.p1.y;
+	rc = gfx_fill_rect(pbutton->res->gc, &rect);
+	if (rc != EOK)
+		goto error;
+
+	rect.p0.x = pbutton->rect.p0.x;
+	rect.p0.y = pbutton->rect.p0.y + 1;
+	rect.p1.x = pbutton->rect.p0.x + thickness;
+	rect.p1.y = pbutton->rect.p1.y - 1;
+	rc = gfx_fill_rect(pbutton->res->gc, &rect);
+	if (rc != EOK)
+		goto error;
+
+	rect.p0.x = pbutton->rect.p1.x - thickness;
+	rect.p0.y = pbutton->rect.p0.y + 1;
+	rect.p1.x = pbutton->rect.p1.x;
+	rect.p1.y = pbutton->rect.p1.y - 1;
+	rc = gfx_fill_rect(pbutton->res->gc, &rect);
+	if (rc != EOK)
+		goto error;
+
+	gfx_color_delete(color);
 	return EOK;
 error:
@@ -166,4 +175,215 @@
 }
 
+/** Paint outset button bevel.
+ *
+ * @param pbutton Push button
+ * @return EOK on success or an error code
+ */
+static errno_t ui_pbutton_paint_outset(ui_pbutton_t *pbutton,
+    gfx_rect_t *rect)
+{
+	gfx_color_t *color = NULL;
+	gfx_rect_t frect;
+	gfx_coord_t i;
+	errno_t rc;
+
+	/* Highlight */
+
+	rc = gfx_color_new_rgb_i16(0xffff, 0xffff, 0xffff, &color);
+	if (rc != EOK)
+		goto error;
+
+	rc = gfx_set_color(pbutton->res->gc, color);
+	if (rc != EOK)
+		goto error;
+
+	for (i = 0; i < 2; i++) {
+		frect.p0.x = rect->p0.x + i;
+		frect.p0.y = rect->p0.y + i;
+		frect.p1.x = rect->p1.x - i - 1;
+		frect.p1.y = rect->p0.y + i + 1;
+		rc = gfx_fill_rect(pbutton->res->gc, &frect);
+		if (rc != EOK)
+			goto error;
+
+		frect.p0.x = rect->p0.x + i;
+		frect.p0.y = rect->p0.y + i + 1;
+		frect.p1.x = rect->p0.x + i + 1;
+		frect.p1.y = rect->p1.y - i - 1;
+		rc = gfx_fill_rect(pbutton->res->gc, &frect);
+		if (rc != EOK)
+			goto error;
+	}
+
+	gfx_color_delete(color);
+	color = NULL;
+
+	/* Shadow */
+
+	rc = gfx_color_new_rgb_i16(0x8888, 0x8888, 0x8888, &color);
+	if (rc != EOK)
+		goto error;
+
+	rc = gfx_set_color(pbutton->res->gc, color);
+	if (rc != EOK)
+		goto error;
+
+	for (i = 0; i < 2; i++) {
+		frect.p0.x = rect->p0.x + i;
+		frect.p0.y = rect->p1.y - i - 1;
+		frect.p1.x = rect->p1.x - i - 1;
+		frect.p1.y = rect->p1.y - i;
+		rc = gfx_fill_rect(pbutton->res->gc, &frect);
+		if (rc != EOK)
+			goto error;
+
+		frect.p0.x = rect->p1.x - i - 1;
+		frect.p0.y = rect->p0.y + i;
+		frect.p1.x = rect->p1.x - i;
+		frect.p1.y = rect->p1.y - i;
+		rc = gfx_fill_rect(pbutton->res->gc, &frect);
+		if (rc != EOK)
+			goto error;
+	}
+
+	gfx_color_delete(color);
+
+	return EOK;
+error:
+	if (color != NULL)
+		gfx_color_delete(color);
+	return rc;
+}
+
+/** Paint inset button bevel.
+ *
+ * @param pbutton Push button
+ * @return EOK on success or an error code
+ */
+static errno_t ui_pbutton_paint_inset(ui_pbutton_t *pbutton,
+    gfx_rect_t *rect)
+{
+	gfx_color_t *color = NULL;
+	gfx_rect_t frect;
+	errno_t rc;
+
+	rc = gfx_color_new_rgb_i16(0x8888, 0x8888, 0x8888, &color);
+	if (rc != EOK)
+		goto error;
+
+	rc = gfx_set_color(pbutton->res->gc, color);
+	if (rc != EOK)
+		goto error;
+
+	frect.p0.x = rect->p0.x;
+	frect.p0.y = rect->p0.y;
+	frect.p1.x = rect->p1.x;
+	frect.p1.y = rect->p0.y + 2;
+	rc = gfx_fill_rect(pbutton->res->gc, &frect);
+	if (rc != EOK)
+		goto error;
+
+	frect.p0.x = rect->p0.x;
+	frect.p0.y = rect->p0.y + 2;
+	frect.p1.x = rect->p0.x + 2;
+	frect.p1.y = rect->p1.y;
+	rc = gfx_fill_rect(pbutton->res->gc, &frect);
+	if (rc != EOK)
+		goto error;
+
+	gfx_color_delete(color);
+
+	return EOK;
+error:
+	if (color != NULL)
+		gfx_color_delete(color);
+	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)
+{
+	gfx_color_t *color = NULL;
+	gfx_coord2_t pos;
+	gfx_text_fmt_t fmt;
+	gfx_rect_t rect;
+	gfx_coord_t thickness;
+	errno_t rc;
+
+	thickness = pbutton->isdefault ? 2 : 1;
+
+	rect.p0.x = pbutton->rect.p0.x + thickness;
+	rect.p0.y = pbutton->rect.p0.y + thickness;
+	rect.p1.x = pbutton->rect.p1.x - thickness;
+	rect.p1.y = pbutton->rect.p1.y - thickness;
+
+	rc = gfx_color_new_rgb_i16(0xc8c8, 0xc8c8, 0xc8c8, &color);
+	if (rc != EOK)
+		goto error;
+
+	rc = gfx_set_color(pbutton->res->gc, color);
+	if (rc != EOK)
+		goto error;
+
+	rc = gfx_fill_rect(pbutton->res->gc, &rect);
+	if (rc != EOK)
+		goto error;
+
+	gfx_color_delete(color);
+	color = NULL;
+
+	rc = gfx_color_new_rgb_i16(0, 0, 0, &color);
+	if (rc != EOK)
+		goto error;
+
+	rc = gfx_set_color(pbutton->res->gc, color);
+	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;
+
+	if (pbutton->held) {
+		pos.x += ui_pb_press_dx;
+		pos.y += ui_pb_press_dy;
+	}
+
+	gfx_text_fmt_init(&fmt);
+	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;
+
+	gfx_color_delete(color);
+	color = NULL;
+
+	rc = ui_pbutton_paint_frame(pbutton);
+	if (rc != EOK)
+		goto error;
+
+	if (pbutton->held) {
+		rc = ui_pbutton_paint_inset(pbutton, &rect);
+		if (rc != EOK)
+			goto error;
+	} else {
+		rc = ui_pbutton_paint_outset(pbutton, &rect);
+		if (rc != EOK)
+			goto error;
+	}
+
+	return EOK;
+error:
+	if (color != NULL)
+		gfx_color_delete(color);
+	return rc;
+}
+
 /** Press down button.
  *
