Index: uspace/app/terminal/terminal.c
===================================================================
--- uspace/app/terminal/terminal.c	(revision ce862acf88a70a5985b57b43c19b2c0592970dbd)
+++ uspace/app/terminal/terminal.c	(revision b48e680f7fd780655df7bd1559d565a3abb1f45f)
@@ -88,4 +88,5 @@
 static void term_set_rgb_color(con_srv_t *, pixel_t, pixel_t);
 static void term_set_cursor_visibility(con_srv_t *, bool);
+static errno_t term_set_caption(con_srv_t *, const char *);
 static errno_t term_get_event(con_srv_t *, cons_event_t *);
 static errno_t term_map(con_srv_t *, sysarg_t, sysarg_t, charfield_t **);
@@ -109,4 +110,5 @@
 	.set_rgb_color = term_set_rgb_color,
 	.set_cursor_visibility = term_set_cursor_visibility,
+	.set_caption = term_set_caption,
 	.get_event = term_get_event,
 	.map = term_map,
@@ -645,4 +647,24 @@
 }
 
+static errno_t term_set_caption(con_srv_t *srv, const char *caption)
+{
+	terminal_t *term = srv_to_terminal(srv);
+	const char *cap;
+
+	fibril_mutex_lock(&term->mtx);
+
+	if (str_size(caption) > 0)
+		cap = caption;
+	else
+		cap = "Terminal";
+
+	ui_window_set_caption(term->window, cap);
+	fibril_mutex_unlock(&term->mtx);
+
+	term_update(term);
+	gfx_update(term->gc);
+	return EOK;
+}
+
 static errno_t term_get_event(con_srv_t *srv, cons_event_t *event)
 {
Index: uspace/lib/c/generic/io/con_srv.c
===================================================================
--- uspace/lib/c/generic/io/con_srv.c	(revision ce862acf88a70a5985b57b43c19b2c0592970dbd)
+++ uspace/lib/c/generic/io/con_srv.c	(revision b48e680f7fd780655df7bd1559d565a3abb1f45f)
@@ -281,4 +281,26 @@
 }
 
+static void con_set_caption_srv(con_srv_t *srv, ipc_call_t *icall)
+{
+	char *caption;
+	errno_t rc;
+
+	rc = async_data_write_accept((void **) &caption, true, 0,
+	    CON_CAPTION_MAXLEN, 0, NULL);
+	if (rc != EOK) {
+		async_answer_0(icall, rc);
+		return;
+	}
+
+	if (srv->srvs->ops->set_caption == NULL) {
+		async_answer_0(icall, ENOTSUP);
+		return;
+	}
+
+	srv->srvs->ops->set_caption(srv, caption);
+	free(caption);
+	async_answer_0(icall, EOK);
+}
+
 static void con_get_event_srv(con_srv_t *srv, ipc_call_t *icall)
 {
@@ -488,4 +510,7 @@
 			con_set_cursor_visibility_srv(srv, &call);
 			break;
+		case CONSOLE_SET_CAPTION:
+			con_set_caption_srv(srv, &call);
+			break;
 		case CONSOLE_GET_EVENT:
 			con_get_event_srv(srv, &call);
Index: uspace/lib/c/generic/io/console.c
===================================================================
--- uspace/lib/c/generic/io/console.c	(revision ce862acf88a70a5985b57b43c19b2c0592970dbd)
+++ uspace/lib/c/generic/io/console.c	(revision b48e680f7fd780655df7bd1559d565a3abb1f45f)
@@ -40,4 +40,5 @@
 #include <errno.h>
 #include <stdlib.h>
+#include <str.h>
 #include <vfs/vfs_sess.h>
 #include <io/console.h>
@@ -128,4 +129,30 @@
 	async_req_1_0(exch, CONSOLE_SET_CURSOR_VISIBILITY, (show != false));
 	async_exchange_end(exch);
+}
+
+/** Set console caption.
+ *
+ * Set caption text for the console (if the console suports captions).
+ *
+ * @param ctrl Console
+ * @param caption Caption text
+ * @return EOK on success or an error code
+ */
+errno_t console_set_caption(console_ctrl_t *ctrl, const char *caption)
+{
+	async_exch_t *exch = async_exchange_begin(ctrl->output_sess);
+	ipc_call_t answer;
+	aid_t req = async_send_0(exch, CONSOLE_SET_CAPTION, &answer);
+	errno_t retval = async_data_write_start(exch, caption, str_size(caption));
+
+	if (retval != EOK) {
+		async_forget(req);
+		async_exchange_end(exch);
+		return retval;
+	}
+
+	async_wait_for(req, &retval);
+	async_exchange_end(exch);
+	return EOK;
 }
 
Index: uspace/lib/c/include/io/con_srv.h
===================================================================
--- uspace/lib/c/include/io/con_srv.h	(revision ce862acf88a70a5985b57b43c19b2c0592970dbd)
+++ uspace/lib/c/include/io/con_srv.h	(revision b48e680f7fd780655df7bd1559d565a3abb1f45f)
@@ -51,4 +51,6 @@
 typedef struct con_ops con_ops_t;
 
+#define CON_CAPTION_MAXLEN 255
+
 /** Service setup (per sevice) */
 typedef struct {
@@ -83,4 +85,5 @@
 	void (*set_rgb_color)(con_srv_t *, pixel_t, pixel_t);
 	void (*set_cursor_visibility)(con_srv_t *, bool);
+	errno_t (*set_caption)(con_srv_t *, const char *);
 	errno_t (*get_event)(con_srv_t *, cons_event_t *);
 	errno_t (*map)(con_srv_t *, sysarg_t, sysarg_t, charfield_t **);
Index: uspace/lib/c/include/io/console.h
===================================================================
--- uspace/lib/c/include/io/console.h	(revision ce862acf88a70a5985b57b43c19b2c0592970dbd)
+++ uspace/lib/c/include/io/console.h	(revision b48e680f7fd780655df7bd1559d565a3abb1f45f)
@@ -83,4 +83,5 @@
 
 extern void console_cursor_visibility(console_ctrl_t *, bool);
+extern errno_t console_set_caption(console_ctrl_t *, const char *);
 extern errno_t console_get_color_cap(console_ctrl_t *, sysarg_t *);
 extern errno_t console_get_event(console_ctrl_t *, cons_event_t *);
Index: uspace/lib/c/include/ipc/console.h
===================================================================
--- uspace/lib/c/include/ipc/console.h	(revision ce862acf88a70a5985b57b43c19b2c0592970dbd)
+++ uspace/lib/c/include/ipc/console.h	(revision b48e680f7fd780655df7bd1559d565a3abb1f45f)
@@ -50,4 +50,5 @@
 	CONSOLE_SET_RGB_COLOR,
 	CONSOLE_SET_CURSOR_VISIBILITY,
+	CONSOLE_SET_CAPTION,
 	CONSOLE_MAP,
 	CONSOLE_UNMAP,
Index: uspace/lib/ui/include/ui/wdecor.h
===================================================================
--- uspace/lib/ui/include/ui/wdecor.h	(revision ce862acf88a70a5985b57b43c19b2c0592970dbd)
+++ uspace/lib/ui/include/ui/wdecor.h	(revision b48e680f7fd780655df7bd1559d565a3abb1f45f)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2020 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -51,4 +51,5 @@
 extern void ui_wdecor_set_rect(ui_wdecor_t *, gfx_rect_t *);
 extern void ui_wdecor_set_active(ui_wdecor_t *, bool);
+extern errno_t ui_wdecor_set_caption(ui_wdecor_t *, const char *);
 extern errno_t ui_wdecor_paint(ui_wdecor_t *);
 extern ui_evclaim_t ui_wdecor_pos_event(ui_wdecor_t *, pos_event_t *);
Index: uspace/lib/ui/include/ui/window.h
===================================================================
--- uspace/lib/ui/include/ui/window.h	(revision ce862acf88a70a5985b57b43c19b2c0592970dbd)
+++ uspace/lib/ui/include/ui/window.h	(revision b48e680f7fd780655df7bd1559d565a3abb1f45f)
@@ -51,4 +51,5 @@
     ui_window_t **);
 extern void ui_window_set_cb(ui_window_t *, ui_window_cb_t *, void *);
+extern errno_t ui_window_set_caption(ui_window_t *, const char *);
 extern void ui_window_destroy(ui_window_t *);
 extern void ui_window_add(ui_window_t *, ui_control_t *);
Index: uspace/lib/ui/private/window.h
===================================================================
--- uspace/lib/ui/private/window.h	(revision ce862acf88a70a5985b57b43c19b2c0592970dbd)
+++ uspace/lib/ui/private/window.h	(revision b48e680f7fd780655df7bd1559d565a3abb1f45f)
@@ -95,4 +95,6 @@
 	/** Current cursor */
 	ui_stock_cursor_t cursor;
+	/** Window placement */
+	ui_wnd_placement_t placement;
 };
 
Index: uspace/lib/ui/src/ui.c
===================================================================
--- uspace/lib/ui/src/ui.c	(revision ce862acf88a70a5985b57b43c19b2c0592970dbd)
+++ uspace/lib/ui/src/ui.c	(revision b48e680f7fd780655df7bd1559d565a3abb1f45f)
@@ -50,4 +50,5 @@
 #include <ui/wdecor.h>
 #include <ui/window.h>
+#include "../private/wdecor.h"
 #include "../private/window.h"
 #include "../private/ui.h"
@@ -372,4 +373,5 @@
 		return EOK;
 
+	(void) console_set_caption(ui->console, "");
 	return console_gc_suspend(ui->cgc);
 }
@@ -386,4 +388,5 @@
 {
 	errno_t rc;
+	ui_window_t *awnd;
 
 	if (ui->cgc == NULL)
@@ -393,4 +396,8 @@
 	if (rc != EOK)
 		return rc;
+
+	awnd = ui_window_get_active(ui);
+	if (awnd != NULL)
+		(void) console_set_caption(ui->console, awnd->wdecor->caption);
 
 	return gfx_cursor_set_visible(console_gc_get_ctx(ui->cgc), false);
Index: uspace/lib/ui/src/wdecor.c
===================================================================
--- uspace/lib/ui/src/wdecor.c	(revision ce862acf88a70a5985b57b43c19b2c0592970dbd)
+++ uspace/lib/ui/src/wdecor.c	(revision b48e680f7fd780655df7bd1559d565a3abb1f45f)
@@ -157,4 +157,26 @@
 {
 	wdecor->active = active;
+}
+
+/** Change caption.
+ *
+ * @param wdecor Window decoration
+ * @param caption New caption
+ *
+ * @return EOK on success or an error code
+ */
+errno_t ui_wdecor_set_caption(ui_wdecor_t *wdecor, const char *caption)
+{
+	char *cdup;
+
+	cdup = str_dup(caption);
+	if (cdup == NULL)
+		return ENOMEM;
+
+	free(wdecor->caption);
+	wdecor->caption = cdup;
+
+	ui_wdecor_paint(wdecor);
+	return EOK;
 }
 
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision ce862acf88a70a5985b57b43c19b2c0592970dbd)
+++ uspace/lib/ui/src/window.c	(revision b48e680f7fd780655df7bd1559d565a3abb1f45f)
@@ -262,4 +262,6 @@
 			gfx_coord2_add(&dparams.rect.p0, &scr_dims,
 			    &dparams.rect.p1);
+			(void) console_set_caption(ui->console,
+			    params->caption);
 		}
 	} else {
@@ -355,4 +357,5 @@
 	window->wdecor = wdecor;
 	window->cursor = ui_curs_arrow;
+	window->placement = params->placement;
 	*rwindow = window;
 
@@ -412,4 +415,9 @@
 		ui_paint(ui);
 	}
+
+	if (ui->console != NULL &&
+	    window->placement == ui_wnd_place_full_screen) {
+		(void) console_set_caption(ui->console, "");
+	}
 }
 
@@ -599,4 +607,16 @@
 	window->cb = cb;
 	window->arg = arg;
+}
+
+/** Change window caption.
+ *
+ * @param window Window
+ * @param caption New caption
+ *
+ * @return EOK on success or an error code
+ */
+errno_t ui_window_set_caption(ui_window_t *window, const char *caption)
+{
+	return ui_wdecor_set_caption(window->wdecor, caption);
 }
 
Index: uspace/srv/hid/console/console.c
===================================================================
--- uspace/srv/hid/console/console.c	(revision ce862acf88a70a5985b57b43c19b2c0592970dbd)
+++ uspace/srv/hid/console/console.c	(revision b48e680f7fd780655df7bd1559d565a3abb1f45f)
@@ -151,4 +151,5 @@
 static void cons_set_rgb_color(con_srv_t *, pixel_t, pixel_t);
 static void cons_set_cursor_visibility(con_srv_t *, bool);
+static errno_t cons_set_caption(con_srv_t *, const char *);
 static errno_t cons_get_event(con_srv_t *, cons_event_t *);
 static errno_t cons_map(con_srv_t *, sysarg_t, sysarg_t, charfield_t **);
@@ -172,4 +173,5 @@
 	.set_rgb_color = cons_set_rgb_color,
 	.set_cursor_visibility = cons_set_cursor_visibility,
+	.set_caption = cons_set_caption,
 	.get_event = cons_get_event,
 	.map = cons_map,
@@ -669,4 +671,13 @@
 }
 
+static errno_t cons_set_caption(con_srv_t *srv, const char *caption)
+{
+	console_t *cons = srv_to_console(srv);
+
+	(void) cons;
+	(void) caption;
+	return EOK;
+}
+
 static errno_t cons_get_event(con_srv_t *srv, cons_event_t *event)
 {
