Index: uspace/lib/gfxfont/include/gfx/text.h
===================================================================
--- uspace/lib/gfxfont/include/gfx/text.h	(revision 61bf9dd9428e2f8c95a06cdc0f80d9af3071da4a)
+++ uspace/lib/gfxfont/include/gfx/text.h	(revision d63623f92e8437001fcbc1e4f07e8e87d5441222)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2020 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -46,4 +46,8 @@
 extern errno_t gfx_puttext(gfx_font_t *, gfx_coord2_t *, gfx_text_fmt_t *,
     const char *);
+extern void gfx_text_start_pos(gfx_font_t *, gfx_coord2_t *, gfx_text_fmt_t *,
+    const char *, gfx_coord2_t *);
+extern size_t gfx_text_find_pos(gfx_font_t *, gfx_coord2_t *, gfx_text_fmt_t *,
+    const char *, gfx_coord2_t *);
 
 #endif
Index: uspace/lib/gfxfont/src/text.c
===================================================================
--- uspace/lib/gfxfont/src/text.c	(revision 61bf9dd9428e2f8c95a06cdc0f80d9af3071da4a)
+++ uspace/lib/gfxfont/src/text.c	(revision d63623f92e8437001fcbc1e4f07e8e87d5441222)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2020 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -167,5 +167,5 @@
 }
 
-/** Render text.
+/** Get text starting position.
  *
  * @param font Font
@@ -173,4 +173,57 @@
  * @param fmt Text formatting
  * @param str String
+ * @param spos Place to store starting position
+ * @return EOK on success or an error code
+ */
+void gfx_text_start_pos(gfx_font_t *font, gfx_coord2_t *pos,
+    gfx_text_fmt_t *fmt, const char *str, gfx_coord2_t *spos)
+{
+	gfx_font_metrics_t fmetrics;
+	gfx_coord2_t cpos;
+	gfx_coord_t width;
+
+	*spos = *pos;
+
+	/* Adjust position for horizontal alignment */
+	if (fmt->halign != gfx_halign_left) {
+		width = gfx_text_width(font, str);
+		switch (fmt->halign) {
+		case gfx_halign_center:
+			spos->x -= width / 2;
+			break;
+		case gfx_halign_right:
+			spos->x -= width - 1;
+			break;
+		default:
+			break;
+		}
+	}
+
+	/* Adjust position for vertical alignment */
+	gfx_font_get_metrics(font, &fmetrics);
+
+	if (fmt->valign != gfx_valign_baseline) {
+		switch (fmt->valign) {
+		case gfx_valign_top:
+			spos->y += fmetrics.ascent;
+			break;
+		case gfx_valign_center:
+			spos->y += fmetrics.ascent / 2;
+			break;
+		case gfx_valign_bottom:
+			cpos.y -= fmetrics.descent;
+			break;
+		default:
+			break;
+		}
+	}
+}
+
+/** Render text.
+ *
+ * @param font Font
+ * @param pos Anchor position
+ * @param fmt Text formatting
+ * @param str String
  * @return EOK on success or an error code
  */
@@ -178,5 +231,4 @@
     gfx_text_fmt_t *fmt, const char *str)
 {
-	gfx_font_metrics_t fmetrics;
 	gfx_glyph_metrics_t gmetrics;
 	size_t stradv;
@@ -184,42 +236,7 @@
 	gfx_glyph_t *glyph;
 	gfx_coord2_t cpos;
-	gfx_coord_t width;
 	errno_t rc;
 
-	cpos = *pos;
-
-	/* Adjust position for horizontal alignment */
-	if (fmt->halign != gfx_halign_left) {
-		width = gfx_text_width(font, str);
-		switch (fmt->halign) {
-		case gfx_halign_center:
-			cpos.x -= width / 2;
-			break;
-		case gfx_halign_right:
-			cpos.x -= width - 1;
-			break;
-		default:
-			break;
-		}
-	}
-
-	/* Adjust position for vertical alignment */
-	gfx_font_get_metrics(font, &fmetrics);
-
-	if (fmt->valign != gfx_valign_baseline) {
-		switch (fmt->valign) {
-		case gfx_valign_top:
-			cpos.y += fmetrics.ascent;
-			break;
-		case gfx_valign_center:
-			cpos.y += fmetrics.ascent / 2;
-			break;
-		case gfx_valign_bottom:
-			cpos.y -= fmetrics.descent;
-			break;
-		default:
-			break;
-		}
-	}
+	gfx_text_start_pos(font, pos, fmt, str, &cpos);
 
 	/* Text mode */
@@ -252,4 +269,68 @@
 }
 
+/** Find character position in string by X coordinate.
+ *
+ * @param font Font
+ * @param pos Anchor position
+ * @param fmt Text formatting
+ * @param str String
+ * @param fpos Position for which we need to find offset
+ *
+ * @return Byte offset in @a str of character corresponding to position
+ *         @a fpos. Note that the position is rounded, that is,
+ *         if it is before the center of character A, it will return
+ *         offset of A, if it is after the center of A, it will return
+ *         offset of the following character.
+ */
+size_t gfx_text_find_pos(gfx_font_t *font, gfx_coord2_t *pos,
+    gfx_text_fmt_t *fmt, const char *str, gfx_coord2_t *fpos)
+{
+	gfx_glyph_metrics_t gmetrics;
+	size_t stradv;
+	const char *cp;
+	gfx_glyph_t *glyph;
+	gfx_coord2_t cpos;
+	size_t off;
+	size_t strsize;
+	errno_t rc;
+
+	gfx_text_start_pos(font, pos, fmt, str, &cpos);
+
+	/* Text mode */
+	if ((font->finfo->props.flags & gff_text_mode) != 0) {
+		off = 0;
+		strsize = str_size(str);
+		while (off < strsize) {
+			if (fpos->x <= cpos.x)
+				return off;
+			(void) str_decode(str, &off, strsize);
+			cpos.x++;
+		}
+
+		return off;
+	}
+
+	cp = str;
+	off = 0;
+	while (*cp != '\0') {
+		rc = gfx_font_search_glyph(font, cp, &glyph, &stradv);
+		if (rc != EOK) {
+			++cp;
+			continue;
+		}
+
+		gfx_glyph_get_metrics(glyph, &gmetrics);
+
+		if (fpos->x < cpos.x + gmetrics.advance / 2)
+			return off;
+
+		cp += stradv;
+		off += stradv;
+		cpos.x += gmetrics.advance;
+	}
+
+	return off;
+}
+
 /** @}
  */
Index: uspace/lib/gfxfont/test/text.c
===================================================================
--- uspace/lib/gfxfont/test/text.c	(revision 61bf9dd9428e2f8c95a06cdc0f80d9af3071da4a)
+++ uspace/lib/gfxfont/test/text.c	(revision d63623f92e8437001fcbc1e4f07e8e87d5441222)
@@ -30,4 +30,5 @@
 #include <gfx/context.h>
 #include <gfx/font.h>
+#include <gfx/glyph.h>
 #include <gfx/text.h>
 #include <gfx/typeface.h>
@@ -144,4 +145,210 @@
 	gfx_typeface_destroy(tface);
 	gfx_color_delete(color);
+
+	rc = gfx_context_delete(gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** gfx_text_start_pos() correctly computes text start position */
+PCUT_TEST(text_start_pos)
+{
+	gfx_font_props_t props;
+	gfx_font_metrics_t metrics;
+	gfx_typeface_t *tface;
+	gfx_font_t *font;
+	gfx_context_t *gc;
+	gfx_color_t *color;
+	gfx_text_fmt_t fmt;
+	gfx_coord2_t pos;
+	test_gc_t tgc;
+	errno_t rc;
+
+	rc = gfx_context_new(&test_ops, (void *)&tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_color_new_rgb_i16(0, 0, 0, &color);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_typeface_create(gc, &tface);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_props_init(&props);
+	gfx_font_metrics_init(&metrics);
+	metrics.ascent = 10; // XXX
+	metrics.descent = 10; // XXX
+	rc = gfx_font_create(tface, &props, &metrics, &font);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_text_fmt_init(&fmt);
+	fmt.color = color;
+	pos.x = 0;
+	pos.y = 0;
+
+	rc = gfx_puttext(font, &pos, &fmt, "Hello world!");
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
+	gfx_color_delete(color);
+
+	rc = gfx_context_delete(gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** gfx_text_find_pos() finds position in text */
+PCUT_TEST(text_find_pos)
+{
+	gfx_font_props_t props;
+	gfx_font_metrics_t metrics;
+	gfx_typeface_t *tface;
+	gfx_font_t *font;
+	gfx_glyph_metrics_t gmetrics;
+	gfx_glyph_t *glyph1;
+	gfx_glyph_t *glyph2;
+	gfx_context_t *gc;
+	gfx_text_fmt_t fmt;
+	gfx_coord2_t anchor;
+	gfx_coord2_t fpos;
+	size_t off;
+	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);
+
+	gfx_font_props_init(&props);
+	gfx_font_metrics_init(&metrics);
+	rc = gfx_font_create(tface, &props, &metrics, &font);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Need to create some glyphs with metrics */
+	gfx_glyph_metrics_init(&gmetrics);
+	gmetrics.advance = 10;
+
+	rc = gfx_glyph_create(font, &gmetrics, &glyph1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_glyph_set_pattern(glyph1, "A");
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_glyph_metrics_init(&gmetrics);
+	gmetrics.advance = 1;
+
+	rc = gfx_glyph_create(font, &gmetrics, &glyph2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = gfx_glyph_set_pattern(glyph2, "i");
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	gfx_text_fmt_init(&fmt);
+	anchor.x = 10;
+	anchor.y = 0;
+
+	fpos.x = 9;
+	fpos.y = 0;
+	off = gfx_text_find_pos(font, &anchor, &fmt, "Aii", &fpos);
+	PCUT_ASSERT_INT_EQUALS(0, off);
+
+	fpos.x = 10;
+	fpos.y = 0;
+	off = gfx_text_find_pos(font, &anchor, &fmt, "Aii", &fpos);
+	PCUT_ASSERT_INT_EQUALS(0, off);
+
+	fpos.x = 11;
+	fpos.y = 0;
+	off = gfx_text_find_pos(font, &anchor, &fmt, "Aii", &fpos);
+	PCUT_ASSERT_INT_EQUALS(0, off);
+
+	fpos.x = 19;
+	fpos.y = 0;
+	off = gfx_text_find_pos(font, &anchor, &fmt, "Aii", &fpos);
+	PCUT_ASSERT_INT_EQUALS(1, off);
+
+	fpos.x = 20;
+	fpos.y = 0;
+	off = gfx_text_find_pos(font, &anchor, &fmt, "Aii", &fpos);
+	PCUT_ASSERT_INT_EQUALS(2, off);
+
+	fpos.x = 21;
+	fpos.y = 0;
+	off = gfx_text_find_pos(font, &anchor, &fmt, "Aii", &fpos);
+	PCUT_ASSERT_INT_EQUALS(3, off);
+
+	fpos.x = 22;
+	fpos.y = 0;
+	off = gfx_text_find_pos(font, &anchor, &fmt, "Aii", &fpos);
+	PCUT_ASSERT_INT_EQUALS(3, off);
+
+	gfx_glyph_destroy(glyph1);
+	gfx_glyph_destroy(glyph2);
+
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
+
+	rc = gfx_context_delete(gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** gfx_text_find_pos() finds position in text in text mode */
+PCUT_TEST(text_find_pos_text)
+{
+	gfx_typeface_t *tface;
+	gfx_font_t *font;
+	gfx_context_t *gc;
+	test_gc_t tgc;
+	size_t off;
+	gfx_text_fmt_t fmt;
+	gfx_coord2_t anchor;
+	gfx_coord2_t fpos;
+	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);
+
+	anchor.x = 10;
+	anchor.y = 0;
+	gfx_text_fmt_init(&fmt);
+
+	fpos.x = 9;
+	fpos.y = 0;
+	off = gfx_text_find_pos(font, &anchor, &fmt, "Abc", &fpos);
+	PCUT_ASSERT_INT_EQUALS(0, off);
+
+	fpos.x = 10;
+	fpos.y = 0;
+	off = gfx_text_find_pos(font, &anchor, &fmt, "Abc", &fpos);
+	PCUT_ASSERT_INT_EQUALS(0, off);
+
+	fpos.x = 11;
+	fpos.y = 0;
+	off = gfx_text_find_pos(font, &anchor, &fmt, "Abc", &fpos);
+	PCUT_ASSERT_INT_EQUALS(1, off);
+
+	fpos.x = 12;
+	fpos.y = 0;
+	off = gfx_text_find_pos(font, &anchor, &fmt, "Abc", &fpos);
+	PCUT_ASSERT_INT_EQUALS(2, off);
+
+	fpos.x = 13;
+	fpos.y = 0;
+	off = gfx_text_find_pos(font, &anchor, &fmt, "Abc", &fpos);
+	PCUT_ASSERT_INT_EQUALS(3, off);
+
+	fpos.x = 14;
+	fpos.y = 0;
+	off = gfx_text_find_pos(font, &anchor, &fmt, "Abc", &fpos);
+	PCUT_ASSERT_INT_EQUALS(3, off);
+
+	gfx_font_close(font);
+	gfx_typeface_destroy(tface);
 
 	rc = gfx_context_delete(gc);
Index: uspace/lib/ui/include/ui/paint.h
===================================================================
--- uspace/lib/ui/include/ui/paint.h	(revision 61bf9dd9428e2f8c95a06cdc0f80d9af3071da4a)
+++ uspace/lib/ui/include/ui/paint.h	(revision d63623f92e8437001fcbc1e4f07e8e87d5441222)
@@ -45,5 +45,9 @@
 extern errno_t ui_paint_bevel(gfx_context_t *, gfx_rect_t *, gfx_color_t *,
     gfx_color_t *, gfx_coord_t, gfx_rect_t *);
+extern void ui_paint_get_bevel_inside(gfx_context_t *, gfx_rect_t *,
+    gfx_coord_t, gfx_rect_t *);
 extern errno_t ui_paint_inset_frame(ui_resource_t *, gfx_rect_t *,
+    gfx_rect_t *);
+extern void ui_paint_get_inset_frame_inside(ui_resource_t *, gfx_rect_t *,
     gfx_rect_t *);
 extern errno_t ui_paint_outset_frame(ui_resource_t *, gfx_rect_t *,
Index: uspace/lib/ui/private/entry.h
===================================================================
--- uspace/lib/ui/private/entry.h	(revision 61bf9dd9428e2f8c95a06cdc0f80d9af3071da4a)
+++ uspace/lib/ui/private/entry.h	(revision d63623f92e8437001fcbc1e4f07e8e87d5441222)
@@ -66,6 +66,19 @@
 };
 
+/** Text entry geometry.
+ *
+ * Computed geometry of text entry elements.
+ */
+typedef struct {
+	/** Interior rectangle */
+	gfx_rect_t interior_rect;
+	/** Text anchor position */
+	gfx_coord2_t text_pos;
+} ui_entry_geom_t;
+
 extern errno_t ui_entry_insert_str(ui_entry_t *, const char *);
 extern ui_evclaim_t ui_entry_key_press_unmod(ui_entry_t *, kbd_event_t *);
+extern void ui_entry_get_geom(ui_entry_t *, ui_entry_geom_t *);
+extern size_t ui_entry_find_pos(ui_entry_t *, gfx_coord2_t *);
 extern void ui_entry_activate(ui_entry_t *);
 extern void ui_entry_deactivate(ui_entry_t *);
Index: uspace/lib/ui/src/entry.c
===================================================================
--- uspace/lib/ui/src/entry.c	(revision 61bf9dd9428e2f8c95a06cdc0f80d9af3071da4a)
+++ uspace/lib/ui/src/entry.c	(revision d63623f92e8437001fcbc1e4f07e8e87d5441222)
@@ -256,9 +256,7 @@
 {
 	ui_resource_t *res;
+	ui_entry_geom_t geom;
 	gfx_text_fmt_t fmt;
 	gfx_coord2_t pos;
-	gfx_coord_t hpad;
-	gfx_coord_t vpad;
-	gfx_coord_t width;
 	gfx_rect_t inside;
 	errno_t rc;
@@ -266,11 +264,5 @@
 	res = ui_window_get_res(entry->window);
 
-	if (res->textmode) {
-		hpad = ui_entry_hpad_text;
-		vpad = ui_entry_vpad_text;
-	} else {
-		hpad = ui_entry_hpad;
-		vpad = ui_entry_vpad;
-	}
+	ui_entry_get_geom(entry, &geom);
 
 	if (res->textmode == false) {
@@ -293,20 +285,5 @@
 		goto error;
 
-	width = gfx_text_width(res->font, entry->text);
-
-	switch (entry->halign) {
-	case gfx_halign_left:
-	case gfx_halign_justify:
-		pos.x = inside.p0.x + hpad;
-		break;
-	case gfx_halign_center:
-		pos.x = (inside.p0.x + inside.p1.x) / 2 - width / 2;
-		break;
-	case gfx_halign_right:
-		pos.x = inside.p1.x - hpad - 1 - width;
-		break;
-	}
-
-	pos.y = inside.p0.y + vpad;
+	pos = geom.text_pos;
 
 	gfx_text_fmt_init(&fmt);
@@ -347,4 +324,28 @@
 error:
 	return rc;
+}
+
+/** Find position in text entry.
+ *
+ * @param entry Text entry
+ * @param fpos Position for which we need to find text offset
+ * @return Corresponding byte offset in entry text
+ */
+size_t ui_entry_find_pos(ui_entry_t *entry, gfx_coord2_t *fpos)
+{
+	ui_resource_t *res;
+	ui_entry_geom_t geom;
+	gfx_text_fmt_t fmt;
+
+	res = ui_window_get_res(entry->window);
+
+	ui_entry_get_geom(entry, &geom);
+
+	gfx_text_fmt_init(&fmt);
+	fmt.halign = gfx_halign_left;
+	fmt.valign = gfx_valign_top;
+
+	return gfx_text_find_pos(res->font, &geom.text_pos, &fmt,
+	    entry->text, fpos);
 }
 
@@ -567,5 +568,9 @@
 
 		if (gfx_pix_inside_rect(&pos, &entry->rect)) {
-			ui_entry_activate(entry);
+			entry->pos = ui_entry_find_pos(entry, &pos);
+			if (entry->active)
+				ui_entry_paint(entry);
+			else
+				ui_entry_activate(entry);
 
 			return ui_claimed;
@@ -604,4 +609,52 @@
 }
 
+/** Get text entry geometry.
+ *
+ * @param entry Text entry
+ * @param geom Structure to fill in with computed geometry
+ */
+void ui_entry_get_geom(ui_entry_t *entry, ui_entry_geom_t *geom)
+{
+	gfx_coord_t hpad;
+	gfx_coord_t vpad;
+	gfx_coord_t width;
+	ui_resource_t *res;
+
+	res = ui_window_get_res(entry->window);
+
+	if (res->textmode) {
+		hpad = ui_entry_hpad_text;
+		vpad = ui_entry_vpad_text;
+	} else {
+		hpad = ui_entry_hpad;
+		vpad = ui_entry_vpad;
+	}
+
+	if (res->textmode == false) {
+		ui_paint_get_inset_frame_inside(res, &entry->rect,
+		    &geom->interior_rect);
+	} else {
+		geom->interior_rect = entry->rect;
+	}
+
+	width = gfx_text_width(res->font, entry->text);
+
+	switch (entry->halign) {
+	case gfx_halign_left:
+	case gfx_halign_justify:
+		geom->text_pos.x = geom->interior_rect.p0.x + hpad;
+		break;
+	case gfx_halign_center:
+		geom->text_pos.x = (geom->interior_rect.p0.x +
+		    geom->interior_rect.p1.x) / 2 - width / 2;
+		break;
+	case gfx_halign_right:
+		geom->text_pos.x = geom->interior_rect.p1.x - hpad - 1 - width;
+		break;
+	}
+
+	geom->text_pos.y = geom->interior_rect.p0.y + vpad;
+}
+
 /** Activate text entry.
  *
@@ -618,5 +671,4 @@
 
 	entry->active = true;
-	entry->pos = str_size(entry->text);
 	(void) ui_entry_paint(entry);
 
Index: uspace/lib/ui/src/paint.c
===================================================================
--- uspace/lib/ui/src/paint.c	(revision 61bf9dd9428e2f8c95a06cdc0f80d9af3071da4a)
+++ uspace/lib/ui/src/paint.c	(revision d63623f92e8437001fcbc1e4f07e8e87d5441222)
@@ -49,5 +49,5 @@
  * @param thickness Bevel thickness in pixels
  * @param inside Place to store rectangle of the interior or @c NULL
- * @reutrn EOK on success or an error code
+ * @return EOK on success or an error code
  */
 errno_t ui_paint_bevel(gfx_context_t *gc, gfx_rect_t *rect,
@@ -107,14 +107,28 @@
 	}
 
-	if (inside != NULL) {
-		inside->p0.x = rect->p0.x + thickness;
-		inside->p0.y = rect->p0.y + thickness;
-		inside->p1.x = rect->p1.x - thickness;
-		inside->p1.y = rect->p1.y - thickness;
-	}
+	if (inside != NULL)
+		ui_paint_get_bevel_inside(gc, rect, thickness, inside);
 
 	return EOK;
 error:
 	return rc;
+}
+
+/** Get bevel interior rectangle.
+ *
+ * Get the bevel interior rectangle without painting it.
+ *
+ * @param gc Graphic context
+ * @param rect Rectangle to paint into
+ * @param thickness Bevel thickness in pixels
+ * @param inside Place to store rectangle of the interior
+ */
+void ui_paint_get_bevel_inside(gfx_context_t *gc, gfx_rect_t *rect,
+    gfx_coord_t thickness, gfx_rect_t *inside)
+{
+	inside->p0.x = rect->p0.x + thickness;
+	inside->p0.y = rect->p0.y + thickness;
+	inside->p1.x = rect->p1.x - thickness;
+	inside->p1.y = rect->p1.y - thickness;
 }
 
@@ -147,4 +161,19 @@
 error:
 	return rc;
+}
+
+/** Get inset frame interior rectangle.
+ *
+ * This allows one to get the interior rectangle without actually painting
+ * the inset frame.
+ *
+ * @param resource UI resource
+ * @param rect Rectangle to paint onto
+ * @param inside Place to store inside rectangle or @c NULL
+ */
+void ui_paint_get_inset_frame_inside(ui_resource_t *resource, gfx_rect_t *rect,
+    gfx_rect_t *inside)
+{
+	ui_paint_get_bevel_inside(resource->gc, rect, 2, inside);
 }
 
Index: uspace/lib/ui/test/paint.c
===================================================================
--- uspace/lib/ui/test/paint.c	(revision 61bf9dd9428e2f8c95a06cdc0f80d9af3071da4a)
+++ uspace/lib/ui/test/paint.c	(revision d63623f92e8437001fcbc1e4f07e8e87d5441222)
@@ -96,4 +96,9 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
+	rect.p0.x = 10;
+	rect.p0.y = 20;
+	rect.p1.x = 30;
+	rect.p1.y = 40;
+
 	/* Paint bevel with NULL 'inside' output parameter */
 	rc = ui_paint_bevel(gc, &rect, color1, color2, 2, NULL);
@@ -110,4 +115,32 @@
 }
 
+/** Get bevel inside */
+PCUT_TEST(get_bevel_inside)
+{
+	errno_t rc;
+	gfx_context_t *gc = NULL;
+	test_gc_t tgc;
+	gfx_rect_t rect;
+	gfx_rect_t inside;
+
+	memset(&tgc, 0, sizeof(tgc));
+	rc = gfx_context_new(&ops, &tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rect.p0.x = 10;
+	rect.p0.y = 20;
+	rect.p1.x = 30;
+	rect.p1.y = 40;
+
+	ui_paint_get_bevel_inside(gc, &rect, 2, &inside);
+	PCUT_ASSERT_INT_EQUALS(12, inside.p0.x);
+	PCUT_ASSERT_INT_EQUALS(22, inside.p0.y);
+	PCUT_ASSERT_INT_EQUALS(28, inside.p1.x);
+	PCUT_ASSERT_INT_EQUALS(38, inside.p1.y);
+
+	rc = gfx_context_delete(gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
 /** Paint inset frame */
 PCUT_TEST(inset_frame)
@@ -128,4 +161,9 @@
 	PCUT_ASSERT_NOT_NULL(resource);
 
+	rect.p0.x = 10;
+	rect.p0.y = 20;
+	rect.p1.x = 30;
+	rect.p1.y = 40;
+
 	/* Paint inset frame with NULL 'inside' output parameter */
 	rc = ui_paint_inset_frame(resource, &rect, NULL);
@@ -135,4 +173,38 @@
 	rc = ui_paint_inset_frame(resource, &rect, &inside);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_resource_destroy(resource);
+	rc = gfx_context_delete(gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+}
+
+/** Get inset frame inside */
+PCUT_TEST(get_inset_frame_inside)
+{
+	errno_t rc;
+	gfx_context_t *gc = NULL;
+	ui_resource_t *resource = NULL;
+	test_gc_t tgc;
+	gfx_rect_t rect;
+	gfx_rect_t inside;
+
+	memset(&tgc, 0, sizeof(tgc));
+	rc = gfx_context_new(&ops, &tgc, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ui_resource_create(gc, false, &resource);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(resource);
+
+	rect.p0.x = 10;
+	rect.p0.y = 20;
+	rect.p1.x = 30;
+	rect.p1.y = 40;
+
+	ui_paint_get_inset_frame_inside(resource, &rect, &inside);
+	PCUT_ASSERT_INT_EQUALS(12, inside.p0.x);
+	PCUT_ASSERT_INT_EQUALS(22, inside.p0.y);
+	PCUT_ASSERT_INT_EQUALS(28, inside.p1.x);
+	PCUT_ASSERT_INT_EQUALS(38, inside.p1.y);
 
 	ui_resource_destroy(resource);
