Index: uspace/lib/c/generic/io/con_srv.c
===================================================================
--- uspace/lib/c/generic/io/con_srv.c	(revision 8edec5347eb33f22b1815db3609ff69c0f618d63)
+++ uspace/lib/c/generic/io/con_srv.c	(revision ec8a1bf729633d598cbbcad31d55f267ed2c6237)
@@ -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 8edec5347eb33f22b1815db3609ff69c0f618d63)
+++ uspace/lib/c/generic/io/console.c	(revision ec8a1bf729633d598cbbcad31d55f267ed2c6237)
@@ -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 8edec5347eb33f22b1815db3609ff69c0f618d63)
+++ uspace/lib/c/include/io/con_srv.h	(revision ec8a1bf729633d598cbbcad31d55f267ed2c6237)
@@ -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 8edec5347eb33f22b1815db3609ff69c0f618d63)
+++ uspace/lib/c/include/io/console.h	(revision ec8a1bf729633d598cbbcad31d55f267ed2c6237)
@@ -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 8edec5347eb33f22b1815db3609ff69c0f618d63)
+++ uspace/lib/c/include/ipc/console.h	(revision ec8a1bf729633d598cbbcad31d55f267ed2c6237)
@@ -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 8edec5347eb33f22b1815db3609ff69c0f618d63)
+++ uspace/lib/ui/include/ui/wdecor.h	(revision ec8a1bf729633d598cbbcad31d55f267ed2c6237)
@@ -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 8edec5347eb33f22b1815db3609ff69c0f618d63)
+++ uspace/lib/ui/include/ui/window.h	(revision ec8a1bf729633d598cbbcad31d55f267ed2c6237)
@@ -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 8edec5347eb33f22b1815db3609ff69c0f618d63)
+++ uspace/lib/ui/private/window.h	(revision ec8a1bf729633d598cbbcad31d55f267ed2c6237)
@@ -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 8edec5347eb33f22b1815db3609ff69c0f618d63)
+++ uspace/lib/ui/src/ui.c	(revision ec8a1bf729633d598cbbcad31d55f267ed2c6237)
@@ -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 8edec5347eb33f22b1815db3609ff69c0f618d63)
+++ uspace/lib/ui/src/wdecor.c	(revision ec8a1bf729633d598cbbcad31d55f267ed2c6237)
@@ -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 8edec5347eb33f22b1815db3609ff69c0f618d63)
+++ uspace/lib/ui/src/window.c	(revision ec8a1bf729633d598cbbcad31d55f267ed2c6237)
@@ -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);
 }
 
