Index: uspace/lib/ui/include/types/ui/window.h
===================================================================
--- uspace/lib/ui/include/types/ui/window.h	(revision ec50d65ee29a48534ce00b21e79ef5e2e5b04274)
+++ uspace/lib/ui/include/types/ui/window.h	(revision aba2d04878ae87232f1a04b6539d16fd7d74a626)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2024 Jiri Svoboda
  * All rights reserved.
  *
@@ -100,4 +100,5 @@
 	void (*maximize)(ui_window_t *, void *);
 	void (*unmaximize)(ui_window_t *, void *);
+	void (*resize)(ui_window_t *, void *);
 	void (*close)(ui_window_t *, void *);
 	void (*focus)(ui_window_t *, void *, unsigned);
Index: uspace/lib/ui/include/ui/window.h
===================================================================
--- uspace/lib/ui/include/ui/window.h	(revision ec50d65ee29a48534ce00b21e79ef5e2e5b04274)
+++ uspace/lib/ui/include/ui/window.h	(revision aba2d04878ae87232f1a04b6539d16fd7d74a626)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2024 Jiri Svoboda
  * All rights reserved.
  *
@@ -74,4 +74,5 @@
 extern void ui_window_def_pos(ui_window_t *, pos_event_t *);
 extern void ui_window_def_unfocus(ui_window_t *, unsigned);
+extern void ui_window_def_resize(ui_window_t *);
 
 #endif
Index: uspace/lib/ui/private/window.h
===================================================================
--- uspace/lib/ui/private/window.h	(revision ec50d65ee29a48534ce00b21e79ef5e2e5b04274)
+++ uspace/lib/ui/private/window.h	(revision aba2d04878ae87232f1a04b6539d16fd7d74a626)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2024 Jiri Svoboda
  * All rights reserved.
  *
@@ -133,4 +133,5 @@
 extern void ui_window_send_pos(ui_window_t *, pos_event_t *);
 extern void ui_window_send_unfocus(ui_window_t *, unsigned);
+extern void ui_window_send_resize(ui_window_t *);
 extern errno_t ui_window_size_change(ui_window_t *, gfx_rect_t *,
     ui_wnd_sc_op_t);
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision ec50d65ee29a48534ce00b21e79ef5e2e5b04274)
+++ uspace/lib/ui/src/window.c	(revision aba2d04878ae87232f1a04b6539d16fd7d74a626)
@@ -1047,5 +1047,5 @@
 	ui_lock(ui);
 	(void) ui_window_resize(window, rect);
-	(void) ui_window_paint(window);
+	ui_window_send_resize(window);
 	ui_unlock(ui);
 }
@@ -1395,4 +1395,16 @@
 }
 
+/** Send window resize event.
+ *
+ * @param window Window
+ */
+void ui_window_send_resize(ui_window_t *window)
+{
+	if (window->cb != NULL && window->cb->resize != NULL)
+		window->cb->resize(window, window->arg);
+	else
+		return ui_window_def_resize(window);
+}
+
 /** Default window sysmenu routine.
  *
@@ -1573,4 +1585,14 @@
 	if (window->control != NULL)
 		ui_control_unfocus(window->control, nfocus);
+}
+
+/** Default window resize routine.
+ *
+ * @param window Window
+ * @return EOK on success or an error code
+ */
+void ui_window_def_resize(ui_window_t *window)
+{
+	ui_window_paint(window);
 }
 
Index: uspace/lib/ui/test/window.c
===================================================================
--- uspace/lib/ui/test/window.c	(revision ec50d65ee29a48534ce00b21e79ef5e2e5b04274)
+++ uspace/lib/ui/test/window.c	(revision aba2d04878ae87232f1a04b6539d16fd7d74a626)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2024 Jiri Svoboda
  * All rights reserved.
  *
@@ -55,4 +55,5 @@
 static void test_window_pos(ui_window_t *, void *, pos_event_t *);
 static void test_window_unfocus(ui_window_t *, void *, unsigned);
+static void test_window_resize(ui_window_t *, void *);
 
 static ui_window_cb_t test_window_cb = {
@@ -66,5 +67,6 @@
 	.paint = test_window_paint,
 	.pos = test_window_pos,
-	.unfocus = test_window_unfocus
+	.unfocus = test_window_unfocus,
+	.resize = test_window_resize
 };
 
@@ -99,4 +101,5 @@
 	bool unfocus;
 	unsigned unfocus_nfocus;
+	bool resize;
 } test_cb_resp_t;
 
@@ -936,4 +939,40 @@
 }
 
+/** ui_window_send_resize() calls resize callback set via ui_window_set_cb() */
+PCUT_TEST(send_resize)
+{
+	errno_t rc;
+	ui_t *ui = NULL;
+	ui_wnd_params_t params;
+	ui_window_t *window = NULL;
+	test_cb_resp_t resp;
+
+	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);
+
+	/* Resize callback with no callbacks set */
+	ui_window_send_resize(window);
+
+	/* Resize callback with resize callback not implemented */
+	ui_window_set_cb(window, &dummy_window_cb, NULL);
+	ui_window_send_resize(window);
+
+	/* Resize callback with real callback set */
+	resp.close = false;
+	ui_window_set_cb(window, &test_window_cb, &resp);
+	ui_window_send_resize(window);
+	PCUT_ASSERT_TRUE(resp.resize);
+
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
 static void test_window_sysmenu(ui_window_t *window, void *arg, sysarg_t idev_id)
 {
@@ -1014,4 +1053,11 @@
 }
 
+static void test_window_resize(ui_window_t *window, void *arg)
+{
+	test_cb_resp_t *resp = (test_cb_resp_t *) arg;
+
+	resp->resize = true;
+}
+
 static errno_t test_ctl_paint(void *arg)
 {
