Index: uspace/app/gfxdemo/gfxdemo.c
===================================================================
--- uspace/app/gfxdemo/gfxdemo.c	(revision a4e4e29582605f2e737857233774bc39670b3e19)
+++ uspace/app/gfxdemo/gfxdemo.c	(revision 2c121350f3836f946a3a5cb351e69eff90b37256)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2025 Jiri Svoboda
+ * Copyright (c) 2026 Jiri Svoboda
  * All rights reserved.
  *
@@ -61,8 +61,10 @@
 };
 
+static void uiwnd_resize_event(ui_window_t *, void *);
 static void uiwnd_close_event(ui_window_t *, void *);
 static void uiwnd_kbd_event(ui_window_t *, void *, kbd_event_t *);
 
 static ui_window_cb_t ui_window_cb = {
+	.resize = uiwnd_resize_event,
 	.close = uiwnd_close_event,
 	.kbd = uiwnd_kbd_event
@@ -1169,6 +1171,8 @@
 
 	/* Do not decorate the window in fullscreen mode */
-	if (ui_is_fullscreen(ui))
+	if (ui_is_fullscreen(ui)) {
 		params.style &= ~ui_wds_decorated;
+		params.placement = ui_wnd_place_full_screen;
+	}
 
 	/*
@@ -1328,4 +1332,15 @@
 	(void)arg;
 	demo_kbd_event(event);
+}
+
+static void uiwnd_resize_event(ui_window_t *window, void *arg)
+{
+	gfx_rect_t rect;
+	gfx_coord2_t dims;
+
+	ui_window_get_app_rect(window, &rect);
+	gfx_rect_dims(&rect, &dims);
+	scr_width = dims.x;
+	scr_height = dims.y;
 }
 
Index: uspace/lib/ui/src/ui.c
===================================================================
--- uspace/lib/ui/src/ui.c	(revision a4e4e29582605f2e737857233774bc39670b3e19)
+++ uspace/lib/ui/src/ui.c	(revision 2c121350f3836f946a3a5cb351e69eff90b37256)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2025 Jiri Svoboda
+ * Copyright (c) 2026 Jiri Svoboda
  * All rights reserved.
  *
@@ -326,4 +326,29 @@
 }
 
+/** Resize UI after screen size change.
+ *
+ * @param ui UI
+ * @param rect New screen rectangle.
+ */
+static void ui_resize(ui_t *ui, gfx_rect_t *rect)
+{
+	ui_window_t *wnd;
+
+	ui->rect = *rect;
+
+	/* Resize all fullscreen windows */
+	wnd = ui_window_first(ui);
+	while (wnd != NULL) {
+		if (wnd->placement == ui_wnd_place_full_screen) {
+			(void)ui_window_resize(wnd, rect);
+			ui_window_send_resize(wnd);
+		}
+
+		wnd = ui_window_next(wnd);
+	}
+
+	(void)ui_paint(ui);
+}
+
 static void ui_cons_event_process(ui_t *ui, cons_event_t *event)
 {
@@ -331,4 +356,7 @@
 	ui_evclaim_t claim;
 	pos_event_t pos;
+	sysarg_t cols, rows;
+	gfx_rect_t rect;
+	errno_t rc;
 
 	awnd = ui_window_get_active(ui);
@@ -358,6 +386,26 @@
 		break;
 	case CEV_RESIZE:
+		rc = console_gc_resize(ui->cgc);
+		if (rc != EOK) {
+			/* XXX No good way to recover. */
+			console_done(ui->console);
+			exit(1);
+		}
+
+		rc = console_get_size(ui->console, &cols, &rows);
+		if (rc != EOK) {
+			/* XXX No good way to recover. */
+			console_done(ui->console);
+			exit(1);
+		}
+
 		ui_lock(ui);
-		ui_window_send_resize(awnd);
+
+		rect.p0.x = 0;
+		rect.p0.y = 0;
+		rect.p1.x = cols;
+		rect.p1.y = rows;
+
+		ui_resize(ui, &rect);
 		ui_unlock(ui);
 		break;
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision a4e4e29582605f2e737857233774bc39670b3e19)
+++ uspace/lib/ui/src/window.c	(revision 2c121350f3836f946a3a5cb351e69eff90b37256)
@@ -767,5 +767,6 @@
 		/* Window is resized, now we can map the window bitmap again */
 		gfx_bitmap_params_init(&win_params);
-		win_params.flags |= bmpf_direct_output;
+		if (window->ui->display != NULL)
+			win_params.flags |= bmpf_direct_output;
 		win_params.rect = nrect;
 
