Index: uspace/lib/ui/include/types/ui/control.h
===================================================================
--- uspace/lib/ui/include/types/ui/control.h	(revision db3895d936f17c9389f3e8e2689bf28645fc3697)
+++ uspace/lib/ui/include/types/ui/control.h	(revision 7481ee1997171debec3493e90a7b4874f53f7e44)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2020 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -38,4 +38,5 @@
 
 #include <errno.h>
+#include <io/kbd_event.h>
 #include <io/pos_event.h>
 #include <types/ui/event.h>
@@ -50,4 +51,6 @@
 	/** Paint */
 	errno_t (*paint)(void *);
+	/** Keyboard event */
+	ui_evclaim_t (*kbd_event)(void *, kbd_event_t *);
 	/** Position event */
 	ui_evclaim_t (*pos_event)(void *, pos_event_t *);
Index: uspace/lib/ui/include/ui/control.h
===================================================================
--- uspace/lib/ui/include/ui/control.h	(revision db3895d936f17c9389f3e8e2689bf28645fc3697)
+++ uspace/lib/ui/include/ui/control.h	(revision 7481ee1997171debec3493e90a7b4874f53f7e44)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2020 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -38,4 +38,5 @@
 
 #include <errno.h>
+#include <io/kbd_event.h>
 #include <io/pos_event.h>
 #include <types/ui/control.h>
@@ -46,4 +47,5 @@
 extern void ui_control_destroy(ui_control_t *);
 extern errno_t ui_control_paint(ui_control_t *);
+extern ui_evclaim_t ui_control_kbd_event(ui_control_t *, kbd_event_t *);
 extern ui_evclaim_t ui_control_pos_event(ui_control_t *, pos_event_t *);
 extern void ui_control_unfocus(ui_control_t *);
Index: uspace/lib/ui/include/ui/entry.h
===================================================================
--- uspace/lib/ui/include/ui/entry.h	(revision db3895d936f17c9389f3e8e2689bf28645fc3697)
+++ uspace/lib/ui/include/ui/entry.h	(revision 7481ee1997171debec3493e90a7b4874f53f7e44)
@@ -50,6 +50,9 @@
 extern void ui_entry_set_rect(ui_entry_t *, gfx_rect_t *);
 extern void ui_entry_set_halign(ui_entry_t *, gfx_halign_t);
+extern void ui_entry_set_read_only(ui_entry_t *, bool);
 extern errno_t ui_entry_set_text(ui_entry_t *, const char *);
 extern errno_t ui_entry_paint(ui_entry_t *);
+extern ui_evclaim_t ui_entry_kbd_event(ui_entry_t *, kbd_event_t *);
+extern ui_evclaim_t ui_entry_pos_event(ui_entry_t *, pos_event_t *);
 
 #endif
Index: uspace/lib/ui/include/ui/fixed.h
===================================================================
--- uspace/lib/ui/include/ui/fixed.h	(revision db3895d936f17c9389f3e8e2689bf28645fc3697)
+++ uspace/lib/ui/include/ui/fixed.h	(revision 7481ee1997171debec3493e90a7b4874f53f7e44)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2020 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -49,4 +49,5 @@
 extern void ui_fixed_remove(ui_fixed_t *, ui_control_t *);
 extern errno_t ui_fixed_paint(ui_fixed_t *);
+extern ui_evclaim_t ui_fixed_kbd_event(ui_fixed_t *, kbd_event_t *);
 extern ui_evclaim_t ui_fixed_pos_event(ui_fixed_t *, pos_event_t *);
 extern void ui_fixed_unfocus(ui_fixed_t *);
Index: uspace/lib/ui/include/ui/window.h
===================================================================
--- uspace/lib/ui/include/ui/window.h	(revision db3895d936f17c9389f3e8e2689bf28645fc3697)
+++ uspace/lib/ui/include/ui/window.h	(revision 7481ee1997171debec3493e90a7b4874f53f7e44)
@@ -40,4 +40,5 @@
 #include <gfx/context.h>
 #include <gfx/coord.h>
+#include <io/kbd_event.h>
 #include <io/pos_event.h>
 #include <types/ui/control.h>
@@ -62,4 +63,5 @@
 extern void ui_window_set_ctl_cursor(ui_window_t *, ui_stock_cursor_t);
 extern errno_t ui_window_paint(ui_window_t *);
+extern void ui_window_def_kbd(ui_window_t *, kbd_event_t *);
 extern errno_t ui_window_def_paint(ui_window_t *);
 extern void ui_window_def_pos(ui_window_t *, pos_event_t *);
Index: uspace/lib/ui/private/entry.h
===================================================================
--- uspace/lib/ui/private/entry.h	(revision db3895d936f17c9389f3e8e2689bf28645fc3697)
+++ uspace/lib/ui/private/entry.h	(revision 7481ee1997171debec3493e90a7b4874f53f7e44)
@@ -54,9 +54,17 @@
 	/** Horizontal alignment */
 	gfx_halign_t halign;
+	/** Text entry is read-only */
+	bool read_only;
 	/** Text */
 	char *text;
 	/** Pointer is currently inside */
 	bool pointer_inside;
+	/** Entry is activated */
+	bool active;
 };
+
+extern errno_t ui_entry_insert_str(ui_entry_t *, const char *);
+extern void ui_entry_backspace(ui_entry_t *);
+extern ui_evclaim_t ui_entry_key_press_unmod(ui_entry_t *, kbd_event_t *);
 
 #endif
Index: uspace/lib/ui/src/control.c
===================================================================
--- uspace/lib/ui/src/control.c	(revision db3895d936f17c9389f3e8e2689bf28645fc3697)
+++ uspace/lib/ui/src/control.c	(revision 7481ee1997171debec3493e90a7b4874f53f7e44)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2020 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -35,4 +35,5 @@
 
 #include <errno.h>
+#include <io/kbd_event.h>
 #include <io/pos_event.h>
 #include <stdlib.h>
@@ -91,4 +92,18 @@
 }
 
+/** Deliver keyboard event to UI control.
+ *
+ * @param control Control
+ * @param kbd_event Keyboard event
+ * @return @c ui_claimed iff the event is claimed
+ */
+ui_evclaim_t ui_control_kbd_event(ui_control_t *control, kbd_event_t *event)
+{
+	if (control->ops->kbd_event != NULL)
+		return control->ops->kbd_event(control->ext, event);
+	else
+		return ui_unclaimed;
+}
+
 /** Paint UI control.
  *
Index: uspace/lib/ui/src/entry.c
===================================================================
--- uspace/lib/ui/src/entry.c	(revision db3895d936f17c9389f3e8e2689bf28645fc3697)
+++ uspace/lib/ui/src/entry.c	(revision 7481ee1997171debec3493e90a7b4874f53f7e44)
@@ -53,4 +53,5 @@
 static void ui_entry_ctl_destroy(void *);
 static errno_t ui_entry_ctl_paint(void *);
+static ui_evclaim_t ui_entry_ctl_kbd_event(void *, kbd_event_t *);
 static ui_evclaim_t ui_entry_ctl_pos_event(void *, pos_event_t *);
 
@@ -66,4 +67,5 @@
 	.destroy = ui_entry_ctl_destroy,
 	.paint = ui_entry_ctl_paint,
+	.kbd_event = ui_entry_ctl_kbd_event,
 	.pos_event = ui_entry_ctl_pos_event
 };
@@ -148,4 +150,14 @@
 }
 
+/** Set text entry read-only flag.
+ *
+ * @param entry Text entry
+ * @param read_only True iff entry is to be read-only.
+ */
+void ui_entry_set_read_only(ui_entry_t *entry, bool read_only)
+{
+	entry->read_only = read_only;
+}
+
 /** Set entry text.
  *
@@ -180,4 +192,5 @@
 	gfx_coord_t hpad;
 	gfx_coord_t vpad;
+	gfx_coord_t width;
 	gfx_rect_t inside;
 	errno_t rc;
@@ -212,4 +225,6 @@
 		goto error;
 
+	width = gfx_text_width(res->font, entry->text);
+
 	switch (entry->halign) {
 	case gfx_halign_left:
@@ -218,8 +233,8 @@
 		break;
 	case gfx_halign_center:
-		pos.x = (inside.p0.x + inside.p1.x) / 2;
+		pos.x = (inside.p0.x + inside.p1.x) / 2 - width / 2;
 		break;
 	case gfx_halign_right:
-		pos.x = inside.p1.x - hpad - 1;
+		pos.x = inside.p1.x - hpad - 1 - width;
 		break;
 	}
@@ -229,8 +244,29 @@
 	gfx_text_fmt_init(&fmt);
 	fmt.color = res->entry_fg_color;
-	fmt.halign = entry->halign;
+	fmt.halign = gfx_halign_left;
 	fmt.valign = gfx_valign_top;
 
+	rc = gfx_set_clip_rect(res->gc, &inside);
+	if (rc != EOK)
+		goto error;
+
 	rc = gfx_puttext(res->font, &pos, &fmt, entry->text);
+	if (rc != EOK) {
+		(void) gfx_set_clip_rect(res->gc, NULL);
+		goto error;
+	}
+
+	if (entry->active) {
+		/* Cursor */
+		pos.x += width;
+
+		rc = gfx_puttext(res->font, &pos, &fmt, "_");
+		if (rc != EOK) {
+			(void) gfx_set_clip_rect(res->gc, NULL);
+			goto error;
+		}
+	}
+
+	rc = gfx_set_clip_rect(res->gc, NULL);
 	if (rc != EOK)
 		goto error;
@@ -268,14 +304,107 @@
 }
 
-/** Handle text entry control position event.
- *
- * @param arg Argument (ui_entry_t *)
+/** Insert string at cursor position.
+ *
+ * @param entry Text entry
+ * @param str String
+ * @return EOK on success, ENOMEM if out of memory
+ */
+errno_t ui_entry_insert_str(ui_entry_t *entry, const char *str)
+{
+	char *newtext;
+	char *oldtext;
+	int rc;
+
+	rc = asprintf(&newtext, "%s%s", entry->text, str);
+	if (rc < 0)
+		return ENOMEM;
+
+	oldtext = entry->text;
+	entry->text = newtext;
+	free(oldtext);
+	ui_entry_paint(entry);
+
+	return EOK;
+}
+
+/** Delete character before cursor.
+ *
+ * @param entry Text entry
+ */
+void ui_entry_backspace(ui_entry_t *entry)
+{
+	size_t off;
+
+	off = str_size(entry->text);
+	(void) str_decode_reverse(entry->text, &off,
+	    str_size(entry->text));
+	entry->text[off] = '\0';
+	ui_entry_paint(entry);
+}
+
+/** Handle text entry key press without modifiers.
+ *
+ * @param entry Text entry
+ * @param kbd_event Keyboard event
+ * @return @c ui_claimed iff the event is claimed
+ */
+ui_evclaim_t ui_entry_key_press_unmod(ui_entry_t *entry, kbd_event_t *event)
+{
+	assert(event->type == KEY_PRESS);
+
+	if (event->key == KC_BACKSPACE)
+		ui_entry_backspace(entry);
+
+	if (event->key == KC_ESCAPE) {
+		entry->active = false;
+		(void) ui_entry_paint(entry);
+	}
+
+	return ui_claimed;
+}
+
+/** Handle text entry keyboard event.
+ *
+ * @param entry Text entry
+ * @param kbd_event Keyboard event
+ * @return @c ui_claimed iff the event is claimed
+ */
+ui_evclaim_t ui_entry_kbd_event(ui_entry_t *entry, kbd_event_t *event)
+{
+	char buf[STR_BOUNDS(1) + 1];
+	size_t off;
+	errno_t rc;
+
+	if (!entry->active)
+		return ui_unclaimed;
+
+	if (event->type == KEY_PRESS && event->c >= ' ') {
+		off = 0;
+		rc = chr_encode(event->c, buf, &off, sizeof(buf));
+		if (rc == EOK) {
+			buf[off] = '\0';
+			(void) ui_entry_insert_str(entry, buf);
+		}
+	}
+
+	if (event->type == KEY_PRESS &&
+	    (event->mods & (KM_CTRL | KM_ALT | KM_SHIFT)) == 0)
+		return ui_entry_key_press_unmod(entry, event);
+
+	return ui_claimed;
+}
+
+/** Handle text entry position event.
+ *
+ * @param entry Text entry
  * @param pos_event Position event
  * @return @c ui_claimed iff the event is claimed
  */
-ui_evclaim_t ui_entry_ctl_pos_event(void *arg, pos_event_t *event)
-{
-	ui_entry_t *entry = (ui_entry_t *) arg;
+ui_evclaim_t ui_entry_pos_event(ui_entry_t *entry, pos_event_t *event)
+{
 	gfx_coord2_t pos;
+
+	if (entry->read_only)
+		return ui_unclaimed;
 
 	if (event->type == POS_UPDATE) {
@@ -298,7 +427,52 @@
 	}
 
+	if (event->type == POS_PRESS) {
+		pos.x = event->hpos;
+		pos.y = event->vpos;
+
+		if (gfx_pix_inside_rect(&pos, &entry->rect)) {
+			if (!entry->active) {
+				entry->active = true;
+				(void) ui_entry_paint(entry);
+			}
+
+			return ui_claimed;
+		} else {
+			if (entry->active) {
+				entry->active = false;
+				(void) ui_entry_paint(entry);
+			}
+		}
+	}
+
 	return ui_unclaimed;
 }
 
+/** Handle text entry control keyboard event.
+ *
+ * @param arg Argument (ui_entry_t *)
+ * @param kbd_event Keyboard event
+ * @return @c ui_claimed iff the event is claimed
+ */
+static ui_evclaim_t ui_entry_ctl_kbd_event(void *arg, kbd_event_t *event)
+{
+	ui_entry_t *entry = (ui_entry_t *) arg;
+
+	return ui_entry_kbd_event(entry, event);
+}
+
+/** Handle text entry control position event.
+ *
+ * @param arg Argument (ui_entry_t *)
+ * @param pos_event Position event
+ * @return @c ui_claimed iff the event is claimed
+ */
+static ui_evclaim_t ui_entry_ctl_pos_event(void *arg, pos_event_t *event)
+{
+	ui_entry_t *entry = (ui_entry_t *) arg;
+
+	return ui_entry_pos_event(entry, event);
+}
+
 /** @}
  */
Index: uspace/lib/ui/src/fixed.c
===================================================================
--- uspace/lib/ui/src/fixed.c	(revision db3895d936f17c9389f3e8e2689bf28645fc3697)
+++ uspace/lib/ui/src/fixed.c	(revision 7481ee1997171debec3493e90a7b4874f53f7e44)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2020 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -46,4 +46,5 @@
 static void ui_fixed_ctl_destroy(void *);
 static errno_t ui_fixed_ctl_paint(void *);
+static ui_evclaim_t ui_fixed_ctl_kbd_event(void *, kbd_event_t *);
 static ui_evclaim_t ui_fixed_ctl_pos_event(void *, pos_event_t *);
 static void ui_fixed_ctl_unfocus(void *);
@@ -53,4 +54,5 @@
 	.destroy = ui_fixed_ctl_destroy,
 	.paint = ui_fixed_ctl_paint,
+	.kbd_event = ui_fixed_ctl_kbd_event,
 	.pos_event = ui_fixed_ctl_pos_event,
 	.unfocus = ui_fixed_ctl_unfocus
@@ -211,4 +213,27 @@
 }
 
+/** Handle fixed layout keyboard event.
+ *
+ * @param fixed Fixed layout
+ * @param kbd_event Keyboard event
+ * @return @c ui_claimed iff the event is claimed
+ */
+ui_evclaim_t ui_fixed_kbd_event(ui_fixed_t *fixed, kbd_event_t *event)
+{
+	ui_fixed_elem_t *elem;
+	ui_evclaim_t claimed;
+
+	elem = ui_fixed_first(fixed);
+	while (elem != NULL) {
+		claimed = ui_control_kbd_event(elem->control, event);
+		if (claimed == ui_claimed)
+			return ui_claimed;
+
+		elem = ui_fixed_next(elem);
+	}
+
+	return ui_unclaimed;
+}
+
 /** Handle fixed layout position event.
  *
@@ -273,4 +298,17 @@
 }
 
+/** Handle fixed layout control keyboard event.
+ *
+ * @param arg Argument (ui_fixed_t *)
+ * @param kbd_event Keyboard event
+ * @return @c ui_claimed iff the event is claimed
+ */
+ui_evclaim_t ui_fixed_ctl_kbd_event(void *arg, kbd_event_t *event)
+{
+	ui_fixed_t *fixed = (ui_fixed_t *) arg;
+
+	return ui_fixed_kbd_event(fixed, event);
+}
+
 /** Handle fixed layout control position event.
  *
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision db3895d936f17c9389f3e8e2689bf28645fc3697)
+++ uspace/lib/ui/src/window.c	(revision 7481ee1997171debec3493e90a7b4874f53f7e44)
@@ -871,4 +871,6 @@
 	if (window->cb != NULL && window->cb->kbd != NULL)
 		window->cb->kbd(window, window->arg, kbd);
+	else
+		return ui_window_def_kbd(window, kbd);
 }
 
@@ -907,4 +909,14 @@
 	else
 		return ui_window_def_unfocus(window);
+}
+
+/** Default window keyboard event routine.
+ *
+ * @param window Window
+ */
+void ui_window_def_kbd(ui_window_t *window, kbd_event_t *kbd)
+{
+	if (window->control != NULL)
+		ui_control_kbd_event(window->control, kbd);
 }
 
Index: uspace/lib/ui/test/control.c
===================================================================
--- uspace/lib/ui/test/control.c	(revision db3895d936f17c9389f3e8e2689bf28645fc3697)
+++ uspace/lib/ui/test/control.c	(revision 7481ee1997171debec3493e90a7b4874f53f7e44)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2020 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -29,4 +29,5 @@
 #include <errno.h>
 #include <mem.h>
+#include <io/kbd_event.h>
 #include <io/pos_event.h>
 #include <pcut/pcut.h>
@@ -41,4 +42,5 @@
 static void test_ctl_destroy(void *);
 static errno_t test_ctl_paint(void *);
+static ui_evclaim_t test_ctl_kbd_event(void *, kbd_event_t *);
 static ui_evclaim_t test_ctl_pos_event(void *, pos_event_t *);
 static void test_ctl_unfocus(void *);
@@ -47,4 +49,5 @@
 	.destroy = test_ctl_destroy,
 	.paint = test_ctl_paint,
+	.kbd_event = test_ctl_kbd_event,
 	.pos_event = test_ctl_pos_event,
 	.unfocus = test_ctl_unfocus
@@ -64,4 +67,9 @@
 	bool paint;
 
+	/** @c true iff kbd_event was called */
+	bool kbd;
+	/** Keyboard event that was sent */
+	kbd_event_t kevent;
+
 	/** @c true iff pos_event was called */
 	bool pos;
@@ -134,4 +142,35 @@
 	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
 	PCUT_ASSERT_TRUE(resp.paint);
+
+	ui_control_delete(control);
+}
+
+/** Test sending keyboard event to control */
+PCUT_TEST(kbd_event)
+{
+	ui_control_t *control = NULL;
+	test_resp_t resp;
+	kbd_event_t event;
+	ui_evclaim_t claim;
+	errno_t rc;
+
+	rc = ui_control_new(&test_ctl_ops, &resp, &control);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(control);
+
+	resp.claim = ui_claimed;
+	resp.kbd = false;
+	event.type = KEY_PRESS;
+	event.key = KC_2;
+	event.mods = KM_LSHIFT;
+	event.c = '@';
+
+	claim = ui_control_kbd_event(control, &event);
+	PCUT_ASSERT_EQUALS(resp.claim, claim);
+	PCUT_ASSERT_TRUE(resp.kbd);
+	PCUT_ASSERT_EQUALS(resp.kevent.type, event.type);
+	PCUT_ASSERT_INT_EQUALS(resp.kevent.key, event.key);
+	PCUT_ASSERT_INT_EQUALS(resp.kevent.mods, event.mods);
+	PCUT_ASSERT_INT_EQUALS(resp.kevent.c, event.c);
 
 	ui_control_delete(control);
@@ -205,4 +244,14 @@
 }
 
+static ui_evclaim_t test_ctl_kbd_event(void *arg, kbd_event_t *event)
+{
+	test_resp_t *resp = (test_resp_t *) arg;
+
+	resp->kbd = true;
+	resp->kevent = *event;
+
+	return resp->claim;
+}
+
 static ui_evclaim_t test_ctl_pos_event(void *arg, pos_event_t *event)
 {
Index: uspace/lib/ui/test/entry.c
===================================================================
--- uspace/lib/ui/test/entry.c	(revision db3895d936f17c9389f3e8e2689bf28645fc3697)
+++ uspace/lib/ui/test/entry.c	(revision 7481ee1997171debec3493e90a7b4874f53f7e44)
@@ -119,4 +119,21 @@
 }
 
+/** Set entry read only flag sets internal field */
+PCUT_TEST(set_read_only)
+{
+	ui_entry_t *entry;
+	errno_t rc;
+
+	rc = ui_entry_create(NULL, "Hello", &entry);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_entry_set_read_only(entry, true);
+	PCUT_ASSERT_TRUE(entry->read_only);
+	ui_entry_set_read_only(entry, false);
+	PCUT_ASSERT_FALSE(entry->read_only);
+
+	ui_entry_destroy(entry);
+}
+
 /** Set text entry rectangle sets internal field */
 PCUT_TEST(set_text)
@@ -173,3 +190,83 @@
 }
 
+/** ui_entry_insert_str() inserts string at cursor. */
+PCUT_TEST(insert_str)
+{
+	errno_t rc;
+	ui_t *ui = NULL;
+	ui_window_t *window = NULL;
+	ui_wnd_params_t params;
+	ui_entry_t *entry;
+
+	rc = ui_create_disp(NULL, &ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_wnd_params_init(&params);
+	params.caption = "Hello";
+
+	rc = ui_window_create(ui, &params, &window);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(window);
+
+	rc = ui_entry_create(window, "A", &entry);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_STR_EQUALS("A", entry->text);
+
+	rc = ui_entry_insert_str(entry, "B");
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_STR_EQUALS("AB", entry->text);
+
+	rc = ui_entry_insert_str(entry, "CD");
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_STR_EQUALS("ABCD", entry->text);
+
+	ui_entry_destroy(entry);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
+/** ui_entry_backspace() deletes character before cursor. */
+PCUT_TEST(backspace)
+{
+	errno_t rc;
+	ui_t *ui = NULL;
+	ui_window_t *window = NULL;
+	ui_wnd_params_t params;
+	ui_entry_t *entry;
+
+	rc = ui_create_disp(NULL, &ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_wnd_params_init(&params);
+	params.caption = "Hello";
+
+	rc = ui_window_create(ui, &params, &window);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(window);
+
+	rc = ui_entry_create(window, "ABC", &entry);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_STR_EQUALS("ABC", entry->text);
+
+	ui_entry_backspace(entry);
+	PCUT_ASSERT_STR_EQUALS("AB", entry->text);
+
+	ui_entry_backspace(entry);
+	PCUT_ASSERT_STR_EQUALS("A", entry->text);
+
+	ui_entry_backspace(entry);
+	PCUT_ASSERT_STR_EQUALS("", entry->text);
+
+	ui_entry_backspace(entry);
+	PCUT_ASSERT_STR_EQUALS("", entry->text);
+
+	ui_entry_destroy(entry);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
 PCUT_EXPORT(entry);
