Index: uspace/app/launcher/launcher.c
===================================================================
--- uspace/app/launcher/launcher.c	(revision 4f64b7b8a1c8a6f636852d38f13d561af8e3ab04)
+++ uspace/app/launcher/launcher.c	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
@@ -228,8 +228,13 @@
 	}
 
-	off.x = 5;
+	off.x = 6;
 	off.y = 32;
 	gfx_rect_translate(&off, &logo_rect, &rect);
+
+	/* Adjust for frame width (2 x 1 pixel) */
+	rect.p1.x += 2;
+	rect.p1.y += 2;
 	ui_image_set_rect(launcher.image, &rect);
+	ui_image_set_flags(launcher.image, ui_imgf_frame);
 
 	rc = ui_fixed_add(launcher.fixed, ui_image_ctl(launcher.image));
@@ -238,4 +243,5 @@
 		return rc;
 	}
+
 	rc = ui_label_create(ui_res, "Launch application", &launcher.label);
 	if (rc != EOK) {
Index: uspace/app/uidemo/uidemo.c
===================================================================
--- uspace/app/uidemo/uidemo.c	(revision 4f64b7b8a1c8a6f636852d38f13d561af8e3ab04)
+++ uspace/app/uidemo/uidemo.c	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
@@ -33,8 +33,12 @@
  */
 
+#include <gfx/bitmap.h>
 #include <gfx/coord.h>
+#include <io/pixelmap.h>
 #include <stdio.h>
 #include <str.h>
+#include <ui/entry.h>
 #include <ui/fixed.h>
+#include <ui/image.h>
 #include <ui/label.h>
 #include <ui/pbutton.h>
@@ -44,4 +48,6 @@
 #include "uidemo.h"
 
+static errno_t bitmap_moire(gfx_bitmap_t *, gfx_coord_t, gfx_coord_t);
+
 static void wnd_close(ui_window_t *, void *);
 
@@ -79,13 +85,13 @@
 
 	if (pbutton == demo->pb1) {
-		rc = ui_label_set_text(demo->label, "Confirmed");
+		rc = ui_entry_set_text(demo->entry, "OK pressed");
 		if (rc != EOK)
-			printf("Error changing label text.\n");
-		(void) ui_label_paint(demo->label);
+			printf("Error changing entry text.\n");
+		(void) ui_entry_paint(demo->entry);
 	} else {
-		rc = ui_label_set_text(demo->label, "Cancelled");
+		rc = ui_entry_set_text(demo->entry, "Cancel pressed");
 		if (rc != EOK)
-			printf("Error changing label text.\n");
-		(void) ui_label_paint(demo->label);
+			printf("Error changing entry text.\n");
+		(void) ui_entry_paint(demo->entry);
 	}
 }
@@ -99,5 +105,9 @@
 	ui_demo_t demo;
 	gfx_rect_t rect;
+	gfx_context_t *gc;
 	ui_resource_t *ui_res;
+	gfx_bitmap_params_t bparams;
+	gfx_bitmap_t *bitmap;
+	gfx_coord2_t off;
 	errno_t rc;
 
@@ -113,5 +123,5 @@
 	params.rect.p0.y = 0;
 	params.rect.p1.x = 220;
-	params.rect.p1.y = 100;
+	params.rect.p1.y = 180;
 
 	memset((void *) &demo, 0, sizeof(demo));
@@ -128,4 +138,5 @@
 
 	ui_res = ui_window_get_res(window);
+	gc = ui_window_get_gc(window);
 
 	rc = ui_fixed_create(&demo.fixed);
@@ -135,5 +146,5 @@
 	}
 
-	rc = ui_label_create(ui_res, "Hello there!", &demo.label);
+	rc = ui_label_create(ui_res, "Text label", &demo.label);
 	if (rc != EOK) {
 		printf("Error creating label.\n");
@@ -154,5 +165,5 @@
 	}
 
-	rc = ui_pbutton_create(ui_res, "Confirm", &demo.pb1);
+	rc = ui_pbutton_create(ui_res, "OK", &demo.pb1);
 	if (rc != EOK) {
 		printf("Error creating button.\n");
@@ -163,7 +174,7 @@
 
 	rect.p0.x = 15;
-	rect.p0.y = 60;
+	rect.p0.y = 70;
 	rect.p1.x = 105;
-	rect.p1.y = 88;
+	rect.p1.y = 98;
 	ui_pbutton_set_rect(demo.pb1, &rect);
 
@@ -185,10 +196,65 @@
 
 	rect.p0.x = 115;
-	rect.p0.y = 60;
+	rect.p0.y = 70;
 	rect.p1.x = 205;
-	rect.p1.y = 88;
+	rect.p1.y = 98;
 	ui_pbutton_set_rect(demo.pb2, &rect);
 
 	rc = ui_fixed_add(demo.fixed, ui_pbutton_ctl(demo.pb2));
+	if (rc != EOK) {
+		printf("Error adding control to layout.\n");
+		return rc;
+	}
+
+	rc = ui_entry_create(ui_res, "", &demo.entry);
+	if (rc != EOK) {
+		printf("Error creating entry.\n");
+		return rc;
+	}
+
+	rect.p0.x = 15;
+	rect.p0.y = 110;
+	rect.p1.x = 205;
+	rect.p1.y = 135;
+	ui_entry_set_rect(demo.entry, &rect);
+	ui_entry_set_halign(demo.entry, gfx_halign_center);
+
+	rc = ui_fixed_add(demo.fixed, ui_entry_ctl(demo.entry));
+	if (rc != EOK) {
+		printf("Error adding control to layout.\n");
+		return rc;
+	}
+
+	gfx_bitmap_params_init(&bparams);
+	bparams.rect.p0.x = 0;
+	bparams.rect.p0.y = 0;
+	bparams.rect.p1.x = 188;
+	bparams.rect.p1.y = 24;
+
+	rc = gfx_bitmap_create(gc, &bparams, NULL, &bitmap);
+	if (rc != EOK)
+		return rc;
+
+	rc = bitmap_moire(bitmap, bparams.rect.p1.x, bparams.rect.p1.y);
+	if (rc != EOK)
+		return rc;
+
+	rc = ui_image_create(ui_res, bitmap, &params.rect, &demo.image);
+	if (rc != EOK) {
+		printf("Error creating label.\n");
+		return rc;
+	}
+
+	off.x = 15;
+	off.y = 145;
+	gfx_rect_translate(&off, &bparams.rect, &rect);
+
+	/* Adjust for frame width (2 x 1 pixel) */
+	rect.p1.x += 2;
+	rect.p1.y += 2;
+	ui_image_set_rect(demo.image, &rect);
+	ui_image_set_flags(demo.image, ui_imgf_frame);
+
+	rc = ui_fixed_add(demo.fixed, ui_image_ctl(demo.image));
 	if (rc != EOK) {
 		printf("Error adding control to layout.\n");
@@ -208,4 +274,39 @@
 	ui_window_destroy(window);
 	ui_destroy(ui);
+
+	return EOK;
+}
+
+/** Fill bitmap with moire pattern.
+ *
+ * @param bitmap Bitmap
+ * @param w Bitmap width
+ * @param h Bitmap height
+ * @return EOK on success or an error code
+ */
+static errno_t bitmap_moire(gfx_bitmap_t *bitmap, gfx_coord_t w, gfx_coord_t h)
+{
+	int i, j;
+	int k;
+	pixelmap_t pixelmap;
+	gfx_bitmap_alloc_t alloc;
+	errno_t rc;
+
+	rc = gfx_bitmap_get_alloc(bitmap, &alloc);
+	if (rc != EOK)
+		return rc;
+
+	/* In absence of anything else, use pixelmap */
+	pixelmap.width = w;
+	pixelmap.height = h;
+	pixelmap.data = alloc.pixels;
+
+	for (i = 0; i < w; i++) {
+		for (j = 0; j < h; j++) {
+			k = i * i + j * j;
+			pixelmap_put_pixel(&pixelmap, i, j,
+			    PIXEL(255, k, k, 255 - k));
+		}
+	}
 
 	return EOK;
Index: uspace/app/uidemo/uidemo.h
===================================================================
--- uspace/app/uidemo/uidemo.h	(revision 4f64b7b8a1c8a6f636852d38f13d561af8e3ab04)
+++ uspace/app/uidemo/uidemo.h	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
@@ -38,4 +38,5 @@
 
 #include <display.h>
+#include <ui/entry.h>
 #include <ui/fixed.h>
 #include <ui/label.h>
@@ -49,4 +50,6 @@
 	ui_window_t *window;
 	ui_fixed_t *fixed;
+	ui_entry_t *entry;
+	ui_image_t *image;
 	ui_label_t *label;
 	ui_pbutton_t *pb1;
Index: uspace/lib/ui/include/types/ui/image.h
===================================================================
--- uspace/lib/ui/include/types/ui/image.h	(revision 4f64b7b8a1c8a6f636852d38f13d561af8e3ab04)
+++ uspace/lib/ui/include/types/ui/image.h	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
@@ -40,4 +40,10 @@
 typedef struct ui_image ui_image_t;
 
+/** UI image flags */
+typedef enum {
+	/** Draw a frame around the image */
+	ui_imgf_frame = 0x1
+} ui_image_flags_t;
+
 #endif
 
Index: uspace/lib/ui/include/ui/image.h
===================================================================
--- uspace/lib/ui/include/ui/image.h	(revision 4f64b7b8a1c8a6f636852d38f13d561af8e3ab04)
+++ uspace/lib/ui/include/ui/image.h	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
@@ -50,4 +50,5 @@
 extern void ui_image_set_bmp(ui_image_t *, gfx_bitmap_t *, gfx_rect_t *);
 extern void ui_image_set_rect(ui_image_t *, gfx_rect_t *);
+extern void ui_image_set_flags(ui_image_t *, ui_image_flags_t);
 extern errno_t ui_image_paint(ui_image_t *);
 
Index: uspace/lib/ui/private/image.h
===================================================================
--- uspace/lib/ui/private/image.h	(revision 4f64b7b8a1c8a6f636852d38f13d561af8e3ab04)
+++ uspace/lib/ui/private/image.h	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
@@ -52,6 +52,9 @@
 	/** Image rectangle */
 	gfx_rect_t rect;
+	/** Flags */
+	ui_image_flags_t flags;
 	/** Bitmap */
 	gfx_bitmap_t *bitmap;
+	/** Bitmap rectangle */
 	gfx_rect_t brect;
 };
Index: uspace/lib/ui/src/image.c
===================================================================
--- uspace/lib/ui/src/image.c	(revision 4f64b7b8a1c8a6f636852d38f13d561af8e3ab04)
+++ uspace/lib/ui/src/image.c	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
@@ -124,4 +124,14 @@
 }
 
+/** Set image flags.
+ *
+ * @param image Image
+ * @param flags Flags
+ */
+void ui_image_set_flags(ui_image_t *image, ui_image_flags_t flags)
+{
+	image->flags = flags;
+}
+
 /** Paint image.
  *
@@ -131,9 +141,27 @@
 errno_t ui_image_paint(ui_image_t *image)
 {
+	gfx_rect_t irect;
 	gfx_rect_t srect;
 	gfx_coord2_t offs;
+	errno_t rc;
+
+	if ((image->flags & ui_imgf_frame) != 0) {
+		rc = ui_paint_bevel(image->res->gc, &image->rect,
+		    image->res->btn_frame_color, image->res->btn_frame_color,
+		    1, NULL);
+		if (rc != EOK)
+			return rc;
+	}
 
 	if (image->bitmap == NULL)
 		return EOK;
+
+	irect = image->rect;
+	if ((image->flags & ui_imgf_frame) != 0) {
+		irect.p0.x++;
+		irect.p0.y++;
+		irect.p1.x--;
+		irect.p1.y--;
+	}
 
 	/*
@@ -141,13 +169,14 @@
 	 * we need to subtract it.
 	 */
-	offs.x = image->rect.p0.x - image->brect.p0.x;
-	offs.y = image->rect.p0.y - image->brect.p0.y;
+	offs.x = irect.p0.x - image->brect.p0.x;
+	offs.y = irect.p0.y - image->brect.p0.y;
 
 	/*
-	 * Transalte image rectangle back to bitmap coordinate space.
+	 * Translate image rectangle back to bitmap coordinate space.
 	 * Thus the bitmap will be clipped to the image rectangle.
 	 */
-	gfx_rect_rtranslate(&offs, &image->rect, &srect);
+	gfx_rect_rtranslate(&offs, &irect, &srect);
 	return gfx_bitmap_render(image->bitmap, &srect, &offs);
+
 }
 
Index: uspace/lib/ui/test/image.c
===================================================================
--- uspace/lib/ui/test/image.c	(revision 4f64b7b8a1c8a6f636852d38f13d561af8e3ab04)
+++ uspace/lib/ui/test/image.c	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
@@ -110,4 +110,23 @@
 }
 
+/** Set image flags sets internal field */
+PCUT_TEST(set_flags)
+{
+	ui_image_t *image = NULL;
+	gfx_rect_t brect;
+	errno_t rc;
+
+	rc = ui_image_create(NULL, NULL, &brect, &image);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(image);
+
+	PCUT_ASSERT_INT_EQUALS(0, image->flags);
+
+	ui_image_set_flags(image, ui_imgf_frame);
+	PCUT_ASSERT_INT_EQUALS(ui_imgf_frame, image->flags);
+
+	ui_image_destroy(image);
+}
+
 /** Set image bitmap */
 PCUT_TEST(set_bmp)
