Index: uspace/lib/ui/include/ui/entry.h
===================================================================
--- uspace/lib/ui/include/ui/entry.h	(revision 9eb8d1299776320d3c0fcf343379c808b0e62866)
+++ uspace/lib/ui/include/ui/entry.h	(revision c9722c14485f5db0872d6038461396b42fc8cb54)
@@ -55,4 +55,7 @@
 extern void ui_entry_backspace(ui_entry_t *);
 extern void ui_entry_delete(ui_entry_t *);
+extern void ui_entry_copy(ui_entry_t *);
+extern void ui_entry_cut(ui_entry_t *);
+extern void ui_entry_paste(ui_entry_t *);
 extern void ui_entry_seek_start(ui_entry_t *, bool);
 extern void ui_entry_seek_end(ui_entry_t *, bool);
Index: uspace/lib/ui/private/entry.h
===================================================================
--- uspace/lib/ui/private/entry.h	(revision 9eb8d1299776320d3c0fcf343379c808b0e62866)
+++ uspace/lib/ui/private/entry.h	(revision c9722c14485f5db0872d6038461396b42fc8cb54)
@@ -80,4 +80,5 @@
 
 extern errno_t ui_entry_insert_str(ui_entry_t *, const char *);
+extern ui_evclaim_t ui_entry_key_press_ctrl(ui_entry_t *, kbd_event_t *);
 extern ui_evclaim_t ui_entry_key_press_shift(ui_entry_t *, kbd_event_t *);
 extern ui_evclaim_t ui_entry_key_press_unmod(ui_entry_t *, kbd_event_t *);
Index: uspace/lib/ui/src/entry.c
===================================================================
--- uspace/lib/ui/src/entry.c	(revision 9eb8d1299776320d3c0fcf343379c808b0e62866)
+++ uspace/lib/ui/src/entry.c	(revision c9722c14485f5db0872d6038461396b42fc8cb54)
@@ -37,4 +37,5 @@
  */
 
+#include <clipboard.h>
 #include <errno.h>
 #include <gfx/context.h>
@@ -553,4 +554,52 @@
 }
 
+/** Copy selected text to clipboard.
+ *
+ * @param entry Text entry
+ */
+void ui_entry_copy(ui_entry_t *entry)
+{
+	unsigned off1;
+	unsigned off2;
+	char c;
+
+	off1 = min(entry->pos, entry->sel_start);
+	off2 = max(entry->pos, entry->sel_start);
+
+	c = entry->text[off2];
+	entry->text[off2] = '\0';
+
+	(void) clipboard_put_str(entry->text + off1);
+
+	entry->text[off2] = c;
+}
+
+/** Cut selected text to clipboard.
+ *
+ * @param entry Text entry
+ */
+void ui_entry_cut(ui_entry_t *entry)
+{
+	ui_entry_copy(entry);
+	ui_entry_delete_sel(entry);
+}
+
+/** Paste text from clipboard.
+ *
+ * @param entry Text entry
+ */
+void ui_entry_paste(ui_entry_t *entry)
+{
+	char *str;
+	errno_t rc;
+
+	rc = clipboard_get_str(&str);
+	if (rc != EOK)
+		return;
+
+	ui_entry_insert_str(entry, str);
+	free(str);
+}
+
 /** Handle text entry key press without modifiers.
  *
@@ -626,4 +675,31 @@
 		break;
 
+	default:
+		break;
+	}
+
+	return ui_claimed;
+}
+
+/** Handle text entry key press with control modifier.
+ *
+ * @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_ctrl(ui_entry_t *entry, kbd_event_t *event)
+{
+	assert(event->type == KEY_PRESS);
+
+	switch (event->key) {
+	case KC_C:
+		ui_entry_copy(entry);
+		break;
+	case KC_V:
+		ui_entry_paste(entry);
+		break;
+	case KC_X:
+		ui_entry_cut(entry);
+		break;
 	default:
 		break;
@@ -665,4 +741,9 @@
 	    (event->mods & (KM_CTRL | KM_ALT)) == 0)
 		return ui_entry_key_press_shift(entry, event);
+
+	if (event->type == KEY_PRESS &&
+	    (event->mods & KM_CTRL) != 0 &&
+	    (event->mods & (KM_ALT | KM_SHIFT)) == 0)
+		return ui_entry_key_press_ctrl(entry, event);
 
 	return ui_claimed;
Index: uspace/lib/ui/test/entry.c
===================================================================
--- uspace/lib/ui/test/entry.c	(revision 9eb8d1299776320d3c0fcf343379c808b0e62866)
+++ uspace/lib/ui/test/entry.c	(revision c9722c14485f5db0872d6038461396b42fc8cb54)
@@ -27,4 +27,5 @@
  */
 
+#include <clipboard.h>
 #include <gfx/context.h>
 #include <gfx/coord.h>
@@ -487,4 +488,132 @@
 }
 
+/** ui_entry_copy() copies selected text to clipboard. */
+PCUT_TEST(copy)
+{
+	errno_t rc;
+	ui_t *ui = NULL;
+	ui_window_t *window = NULL;
+	ui_wnd_params_t params;
+	ui_entry_t *entry;
+	char *str;
+
+	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, "ABCDEF", &entry);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_entry_activate(entry);
+	ui_entry_seek_start(entry, false);
+	ui_entry_seek_next_char(entry, false);
+	ui_entry_seek_end(entry, true);
+	ui_entry_seek_prev_char(entry, true);
+
+	// FIXME: This is not safe unless we could create a private
+	// test clipboard
+
+	ui_entry_copy(entry);
+	rc = clipboard_get_str(&str);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_STR_EQUALS("BCDE", str);
+	PCUT_ASSERT_STR_EQUALS("ABCDEF", entry->text);
+	free(str);
+
+	ui_entry_destroy(entry);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
+/** ui_entry_cut() cuts selected text to clipboard. */
+PCUT_TEST(cut)
+{
+	errno_t rc;
+	ui_t *ui = NULL;
+	ui_window_t *window = NULL;
+	ui_wnd_params_t params;
+	ui_entry_t *entry;
+	char *str;
+
+	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, "ABCDEF", &entry);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_entry_activate(entry);
+	ui_entry_seek_start(entry, false);
+	ui_entry_seek_next_char(entry, false);
+	ui_entry_seek_end(entry, true);
+	ui_entry_seek_prev_char(entry, true);
+
+	// FIXME: This is not safe unless we could create a private
+	// test clipboard
+
+	ui_entry_cut(entry);
+	rc = clipboard_get_str(&str);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_STR_EQUALS("BCDE", str);
+	PCUT_ASSERT_STR_EQUALS("AF", entry->text);
+	free(str);
+
+	ui_entry_destroy(entry);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
+/** ui_entry_paste() pastes text from clipboard. */
+PCUT_TEST(paste)
+{
+	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, "AB", &entry);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_entry_activate(entry);
+	ui_entry_seek_start(entry, false);
+	ui_entry_seek_next_char(entry, false);
+
+	// FIXME: This is not safe unless we could create a private
+	// test clipboard
+
+	rc = clipboard_put_str("123");
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_entry_paste(entry);
+	PCUT_ASSERT_STR_EQUALS("A123B", entry->text);
+
+	ui_entry_destroy(entry);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
 /** ui_entry_seek_start() moves cursor to beginning of text */
 PCUT_TEST(seek_start)
@@ -506,8 +635,9 @@
 	PCUT_ASSERT_NOT_NULL(window);
 
-	rc = ui_entry_create(window, "ABCD", &entry);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	PCUT_ASSERT_STR_EQUALS("ABCD", entry->text);
+	rc = ui_entry_create(window, "ABCDEF", &entry);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_entry_activate(entry);
+
 	entry->pos = 2;
 	entry->sel_start = 2;
