Index: uspace/app/bdsh/input.c
===================================================================
--- uspace/app/bdsh/input.c	(revision ed372da20ce2fc304d6e55122d47f5426cd62a85)
+++ uspace/app/bdsh/input.c	(revision 371a012cc2887f1f1866601f7d6d91881259b78c)
@@ -38,4 +38,5 @@
 #include <io/color.h>
 #include <vfs/vfs.h>
+#include <clipboard.h>
 #include <errno.h>
 #include <assert.h>
@@ -449,4 +450,59 @@
 }
 
+static void tinput_sel_copy_to_cb(tinput_t *ti)
+{
+	int sa, sb;
+	wchar_t tmp_c;
+	char *str;
+
+	tinput_sel_get_bounds(ti, &sa, &sb);
+
+	if (sb < ti->nc) {
+		tmp_c = ti->buffer[sb];
+		ti->buffer[sb] = '\0';
+	}
+
+	str = wstr_to_astr(ti->buffer + sa);
+
+	if (sb < ti->nc)
+		ti->buffer[sb] = tmp_c;
+
+	if (str == NULL)
+		goto error;
+
+	if (clipboard_put_str(str) != EOK)
+		goto error;
+
+	free(str);
+	return;
+error:
+	return;
+	/* TODO: Give the user some warning. */
+}
+
+static void tinput_paste_from_cb(tinput_t *ti)
+{
+	char *str;
+	size_t off;
+	wchar_t c;
+	int rc;
+
+	rc = clipboard_get_str(&str);
+	if (rc != EOK || str == NULL)
+		return; /* TODO: Give the user some warning. */
+
+	off = 0;
+
+	while (true) {
+		c = str_decode(str, &off, STR_NO_LIMIT);
+		if (c == '\0')
+			break;
+
+		tinput_insert_char(ti, c);
+	}
+
+	free(str);
+}
+
 static void tinput_history_seek(tinput_t *ti, int offs)
 {
@@ -564,4 +620,10 @@
 		tinput_seek_vertical(ti, seek_forward, false);
 		break;
+	case KC_C:
+		tinput_sel_copy_to_cb(ti);
+		break;
+	case KC_V:
+		tinput_paste_from_cb(ti);
+		break;
 	default:
 		break;
