Index: uspace/lib/display/include/disp_srv.h
===================================================================
--- uspace/lib/display/include/disp_srv.h	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/lib/display/include/disp_srv.h	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -59,5 +59,5 @@
 	errno_t (*window_move_req)(void *, sysarg_t, gfx_coord2_t *);
 	errno_t (*window_resize_req)(void *, sysarg_t, display_wnd_rsztype_t,
-	    gfx_coord2_t *);
+	    gfx_coord2_t *, sysarg_t);
 	errno_t (*window_move)(void *, sysarg_t, gfx_coord2_t *);
 	errno_t (*window_get_pos)(void *, sysarg_t, gfx_coord2_t *);
Index: uspace/lib/display/include/display.h
===================================================================
--- uspace/lib/display/include/display.h	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/lib/display/include/display.h	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -56,5 +56,5 @@
 extern errno_t display_window_move_req(display_window_t *, gfx_coord2_t *);
 extern errno_t display_window_resize_req(display_window_t *,
-    display_wnd_rsztype_t, gfx_coord2_t *);
+    display_wnd_rsztype_t, gfx_coord2_t *, sysarg_t);
 extern errno_t display_window_move(display_window_t *, gfx_coord2_t *);
 extern errno_t display_window_get_pos(display_window_t *, gfx_coord2_t *);
Index: uspace/lib/display/src/disp_srv.c
===================================================================
--- uspace/lib/display/src/disp_srv.c	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/lib/display/src/disp_srv.c	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -320,4 +320,5 @@
 	display_wnd_rsztype_t rsztype;
 	gfx_coord2_t pos;
+	sysarg_t pos_id;
 	size_t size;
 	errno_t rc;
@@ -325,4 +326,5 @@
 	wnd_id = ipc_get_arg1(icall);
 	rsztype = (display_wnd_rsztype_t) ipc_get_arg2(icall);
+	pos_id = ipc_get_arg3(icall);
 
 	if (!async_data_write_receive(&call, &size)) {
@@ -350,5 +352,6 @@
 	}
 
-	rc = srv->ops->window_resize_req(srv->arg, wnd_id, rsztype, &pos);
+	rc = srv->ops->window_resize_req(srv->arg, wnd_id, rsztype, &pos,
+	    pos_id);
 	async_answer_0(icall, rc);
 }
Index: uspace/lib/display/src/display.c
===================================================================
--- uspace/lib/display/src/display.c	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/lib/display/src/display.c	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -414,17 +414,18 @@
  * @param rsztype Resize type (which part of window frame is being dragged)
  * @param pos Position in the window where the button was pressed
+ * @param pos_id Positioning device ID
  * @return EOK on success or an error code
  */
 errno_t display_window_resize_req(display_window_t *window,
-    display_wnd_rsztype_t rsztype, gfx_coord2_t *pos)
-{
-	async_exch_t *exch;
-	aid_t req;
-	ipc_call_t answer;
-	errno_t rc;
-
-	exch = async_exchange_begin(window->display->sess);
-	req = async_send_2(exch, DISPLAY_WINDOW_RESIZE_REQ, window->id,
-	    (sysarg_t) rsztype, &answer);
+    display_wnd_rsztype_t rsztype, gfx_coord2_t *pos, sysarg_t pos_id)
+{
+	async_exch_t *exch;
+	aid_t req;
+	ipc_call_t answer;
+	errno_t rc;
+
+	exch = async_exchange_begin(window->display->sess);
+	req = async_send_3(exch, DISPLAY_WINDOW_RESIZE_REQ, window->id,
+	    (sysarg_t) rsztype, pos_id, &answer);
 	rc = async_data_write_start(exch, (void *)pos, sizeof (gfx_coord2_t));
 	async_exchange_end(exch);
Index: uspace/lib/display/test/display.c
===================================================================
--- uspace/lib/display/test/display.c	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/lib/display/test/display.c	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -63,5 +63,5 @@
 static errno_t test_window_get_max_rect(void *, sysarg_t, gfx_rect_t *);
 static errno_t test_window_resize_req(void *, sysarg_t, display_wnd_rsztype_t,
-    gfx_coord2_t *);
+    gfx_coord2_t *, sysarg_t);
 static errno_t test_window_resize(void *, sysarg_t, gfx_coord2_t *,
     gfx_rect_t *);
@@ -141,4 +141,5 @@
 	display_wnd_rsztype_t resize_req_rsztype;
 	gfx_coord2_t resize_req_pos;
+	sysarg_t resize_req_pos_id;
 
 	bool window_resize_called;
@@ -831,4 +832,5 @@
 	display_wnd_rsztype_t rsztype;
 	gfx_coord2_t pos;
+	sysarg_t pos_id;
 
 	async_set_fallback_port_handler(test_display_conn, &resp);
@@ -863,6 +865,7 @@
 	pos.x = 42;
 	pos.y = 43;
-
-	rc = display_window_resize_req(wnd, rsztype, &pos);
+	pos_id = 44;
+
+	rc = display_window_resize_req(wnd, rsztype, &pos, pos_id);
 	PCUT_ASSERT_TRUE(resp.window_resize_req_called);
 	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
@@ -871,4 +874,5 @@
 	PCUT_ASSERT_INT_EQUALS(pos.x, resp.resize_req_pos.x);
 	PCUT_ASSERT_INT_EQUALS(pos.y, resp.resize_req_pos.y);
+	PCUT_ASSERT_INT_EQUALS(pos_id, resp.resize_req_pos_id);
 
 	display_window_destroy(wnd);
@@ -889,4 +893,5 @@
 	display_wnd_rsztype_t rsztype;
 	gfx_coord2_t pos;
+	sysarg_t pos_id;
 
 	async_set_fallback_port_handler(test_display_conn, &resp);
@@ -921,6 +926,7 @@
 	pos.x = 42;
 	pos.y = 43;
-
-	rc = display_window_resize_req(wnd, rsztype, &pos);
+	pos_id = 44;
+
+	rc = display_window_resize_req(wnd, rsztype, &pos, pos_id);
 	PCUT_ASSERT_TRUE(resp.window_resize_req_called);
 	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
@@ -929,4 +935,5 @@
 	PCUT_ASSERT_INT_EQUALS(pos.x, resp.resize_req_pos.x);
 	PCUT_ASSERT_INT_EQUALS(pos.y, resp.resize_req_pos.y);
+	PCUT_ASSERT_INT_EQUALS(pos_id, resp.resize_req_pos_id);
 
 	display_window_destroy(wnd);
@@ -2188,5 +2195,5 @@
 
 static errno_t test_window_resize_req(void *arg, sysarg_t wnd_id,
-    display_wnd_rsztype_t rsztype, gfx_coord2_t *pos)
+    display_wnd_rsztype_t rsztype, gfx_coord2_t *pos, sysarg_t pos_id)
 {
 	test_response_t *resp = (test_response_t *) arg;
@@ -2196,4 +2203,5 @@
 	resp->resize_req_wnd_id = wnd_id;
 	resp->resize_req_pos = *pos;
+	resp->resize_req_pos_id = pos_id;
 	return resp->rc;
 }
Index: uspace/lib/ui/include/types/ui/wdecor.h
===================================================================
--- uspace/lib/ui/include/types/ui/wdecor.h	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/lib/ui/include/types/ui/wdecor.h	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -87,5 +87,5 @@
 	void (*move)(ui_wdecor_t *, void *, gfx_coord2_t *);
 	void (*resize)(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
-	    gfx_coord2_t *);
+	    gfx_coord2_t *, sysarg_t);
 	void (*set_cursor)(ui_wdecor_t *, void *, ui_stock_cursor_t);
 } ui_wdecor_cb_t;
Index: uspace/lib/ui/private/wdecor.h
===================================================================
--- uspace/lib/ui/private/wdecor.h	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/lib/ui/private/wdecor.h	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -100,5 +100,5 @@
 extern void ui_wdecor_move(ui_wdecor_t *, gfx_coord2_t *);
 extern void ui_wdecor_resize(ui_wdecor_t *, ui_wdecor_rsztype_t,
-    gfx_coord2_t *);
+    gfx_coord2_t *, sysarg_t);
 extern void ui_wdecor_set_cursor(ui_wdecor_t *, ui_stock_cursor_t);
 extern void ui_wdecor_get_geom(ui_wdecor_t *, ui_wdecor_geom_t *);
Index: uspace/lib/ui/src/wdecor.c
===================================================================
--- uspace/lib/ui/src/wdecor.c	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/lib/ui/src/wdecor.c	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -477,10 +477,11 @@
  * @param rsztype Resize type
  * @param pos Position where the button was pressed
+ * @param pos_id Positioning device ID
  */
 void ui_wdecor_resize(ui_wdecor_t *wdecor, ui_wdecor_rsztype_t rsztype,
-    gfx_coord2_t *pos)
+    gfx_coord2_t *pos, sysarg_t pos_id)
 {
 	if (wdecor->cb != NULL && wdecor->cb->resize != NULL)
-		wdecor->cb->resize(wdecor, wdecor->arg, rsztype, pos);
+		wdecor->cb->resize(wdecor, wdecor->arg, rsztype, pos, pos_id);
 }
 
@@ -826,5 +827,5 @@
 	/* Press on window border? */
 	if (rsztype != ui_wr_none && event->type == POS_PRESS)
-		ui_wdecor_resize(wdecor, rsztype, &pos);
+		ui_wdecor_resize(wdecor, rsztype, &pos, event->pos_id);
 }
 
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/lib/ui/src/window.c	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -80,5 +80,5 @@
 static void wd_move(ui_wdecor_t *, void *, gfx_coord2_t *);
 static void wd_resize(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
-    gfx_coord2_t *);
+    gfx_coord2_t *, sysarg_t);
 static void wd_set_cursor(ui_wdecor_t *, void *, ui_stock_cursor_t);
 
@@ -988,12 +988,15 @@
  * @param rsztype Resize type
  * @param pos Position where the button was pressed
+ * @param pos_id Positioning device ID
  */
 static void wd_resize(ui_wdecor_t *wdecor, void *arg,
-    ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos)
-{
-	ui_window_t *window = (ui_window_t *) arg;
-
-	if (window->dwindow != NULL)
-		(void) display_window_resize_req(window->dwindow, rsztype, pos);
+    ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos, sysarg_t pos_id)
+{
+	ui_window_t *window = (ui_window_t *) arg;
+
+	if (window->dwindow != NULL) {
+		(void) display_window_resize_req(window->dwindow, rsztype,
+		    pos, pos_id);
+	}
 }
 
Index: uspace/lib/ui/test/wdecor.c
===================================================================
--- uspace/lib/ui/test/wdecor.c	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/lib/ui/test/wdecor.c	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -68,5 +68,5 @@
 static void test_wdecor_move(ui_wdecor_t *, void *, gfx_coord2_t *);
 static void test_wdecor_resize(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
-    gfx_coord2_t *);
+    gfx_coord2_t *, sysarg_t);
 static void test_wdecor_set_cursor(ui_wdecor_t *, void *, ui_stock_cursor_t);
 
@@ -108,4 +108,5 @@
 	bool move;
 	gfx_coord2_t pos;
+	sysarg_t pos_id;
 	bool resize;
 	ui_wdecor_rsztype_t rsztype;
@@ -373,4 +374,5 @@
 	ui_wdecor_rsztype_t rsztype;
 	gfx_coord2_t pos;
+	sysarg_t pos_id;
 
 	rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
@@ -380,11 +382,12 @@
 	pos.x = 3;
 	pos.y = 4;
+	pos_id = 5;
 
 	/* Resize callback with no callbacks set */
-	ui_wdecor_resize(wdecor, rsztype, &pos);
+	ui_wdecor_resize(wdecor, rsztype, &pos, pos_id);
 
 	/* Resize callback with move callback not implemented */
 	ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
-	ui_wdecor_resize(wdecor, rsztype, &pos);
+	ui_wdecor_resize(wdecor, rsztype, &pos, pos_id);
 
 	/* Resize callback with real callback set */
@@ -394,9 +397,10 @@
 	resp.pos.y = 0;
 	ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
-	ui_wdecor_resize(wdecor, rsztype, &pos);
+	ui_wdecor_resize(wdecor, rsztype, &pos, pos_id);
 	PCUT_ASSERT_TRUE(resp.resize);
 	PCUT_ASSERT_INT_EQUALS(rsztype, resp.rsztype);
 	PCUT_ASSERT_INT_EQUALS(pos.x, resp.pos.x);
 	PCUT_ASSERT_INT_EQUALS(pos.y, resp.pos.y);
+	PCUT_ASSERT_INT_EQUALS(pos_id, resp.pos_id);
 
 	ui_wdecor_destroy(wdecor);
@@ -1080,5 +1084,5 @@
 
 static void test_wdecor_resize(ui_wdecor_t *wdecor, void *arg,
-    ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos)
+    ui_wdecor_rsztype_t rsztype, gfx_coord2_t *pos, sysarg_t pos_id)
 {
 	test_cb_resp_t *resp = (test_cb_resp_t *) arg;
@@ -1087,4 +1091,5 @@
 	resp->rsztype = rsztype;
 	resp->pos = *pos;
+	resp->pos_id = pos_id;
 }
 
Index: uspace/srv/hid/display/dsops.c
===================================================================
--- uspace/srv/hid/display/dsops.c	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/srv/hid/display/dsops.c	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2022 Jiri Svoboda
+ * Copyright (c) 2023 Jiri Svoboda
  * All rights reserved.
  *
@@ -51,5 +51,5 @@
 static errno_t disp_window_get_max_rect(void *, sysarg_t, gfx_rect_t *);
 static errno_t disp_window_resize_req(void *, sysarg_t,
-    display_wnd_rsztype_t, gfx_coord2_t *);
+    display_wnd_rsztype_t, gfx_coord2_t *, sysarg_t);
 static errno_t disp_window_resize(void *, sysarg_t, gfx_coord2_t *,
     gfx_rect_t *);
@@ -206,5 +206,5 @@
 
 static errno_t disp_window_resize_req(void *arg, sysarg_t wnd_id,
-    display_wnd_rsztype_t rsztype, gfx_coord2_t *pos)
+    display_wnd_rsztype_t rsztype, gfx_coord2_t *pos, sysarg_t pos_id)
 {
 	ds_client_t *client = (ds_client_t *) arg;
@@ -223,5 +223,5 @@
 
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "disp_window_resize_req()");
-	ds_window_resize_req(wnd, rsztype, pos);
+	ds_window_resize_req(wnd, rsztype, pos, pos_id);
 	ds_display_unlock(client->display);
 	return EOK;
Index: uspace/srv/hid/display/test/window.c
===================================================================
--- uspace/srv/hid/display/test/window.c	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/srv/hid/display/test/window.c	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -758,4 +758,5 @@
 	display_wnd_params_t params;
 	gfx_coord2_t pos;
+	sysarg_t pos_id;
 	errno_t rc;
 
@@ -783,5 +784,6 @@
 	pos.x = 42;
 	pos.y = 43;
-	ds_window_resize_req(wnd, display_wr_top_right, &pos);
+	pos_id = 44;
+	ds_window_resize_req(wnd, display_wr_top_right, &pos, pos_id);
 
 	PCUT_ASSERT_INT_EQUALS(dsw_resizing, wnd->state);
Index: uspace/srv/hid/display/types/display/window.h
===================================================================
--- uspace/srv/hid/display/types/display/window.h	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/srv/hid/display/types/display/window.h	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -103,4 +103,6 @@
 	/** Original position before started to move or resize the window */
 	gfx_coord2_t orig_pos;
+	/** Positioning device that started the resize */
+	sysarg_t orig_pos_id;
 	/** Window resize type (if state is dsw_resizing) */
 	display_wnd_rsztype_t rsztype;
Index: uspace/srv/hid/display/window.c
===================================================================
--- uspace/srv/hid/display/window.c	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/srv/hid/display/window.c	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -510,7 +510,8 @@
  * @param rsztype Resize type (which part of window is being dragged)
  * @param pos Position where mouse button was pressed
+ * @param pos_id Positioning device ID
  */
 static void ds_window_start_resize(ds_window_t *wnd,
-    display_wnd_rsztype_t rsztype, gfx_coord2_t *pos)
+    display_wnd_rsztype_t rsztype, gfx_coord2_t *pos, sysarg_t pos_id)
 {
 	ds_seat_t *seat;
@@ -523,11 +524,15 @@
 		return;
 
+	/* Determine which seat started the resize */
+	seat = ds_display_seat_by_idev(wnd->display, pos_id);
+	if (seat == NULL)
+		return;
+
 	wnd->orig_pos = *pos;
+	wnd->orig_pos_id = pos_id;
 	wnd->state = dsw_resizing;
 	wnd->rsztype = rsztype;
 	wnd->preview_rect = wnd->rect;
 
-	// TODO Multi-seat: need client to tell us which seat started the resize!
-	seat = ds_display_first_seat(wnd->display);
 	ctype = display_cursor_from_wrsz(rsztype);
 	ds_seat_set_wm_cursor(seat, wnd->display->cursor[ctype]);
@@ -559,7 +564,8 @@
 	ds_client_post_resize_event(wnd->client, wnd, &nrect);
 
-	// TODO Multi-seat: Need to know which seat started the resize!
-	seat = ds_display_first_seat(wnd->display);
-	ds_seat_set_wm_cursor(seat, NULL);
+	/* Determine which seat started the resize */
+	seat = ds_display_seat_by_idev(wnd->display, wnd->orig_pos_id);
+	if (seat != NULL)
+		ds_seat_set_wm_cursor(seat, NULL);
 
 	(void) ds_display_paint(wnd->display, NULL);
@@ -787,16 +793,17 @@
  * @param pos Position where the pointer was when the resize started
  *            relative to the window
+ * @param pos_id Positioning device ID
  * @param event Button press event
  */
 void ds_window_resize_req(ds_window_t *wnd, display_wnd_rsztype_t rsztype,
-    gfx_coord2_t *pos)
+    gfx_coord2_t *pos, sysarg_t pos_id)
 {
 	gfx_coord2_t orig_pos;
 
-	log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_resize_req (%d, %d, %d)",
-	    (int) rsztype, (int) pos->x, (int) pos->y);
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_resize_req (%d, %d, %d, %d)",
+	    (int)rsztype, (int)pos->x, (int)pos->y, (int)pos_id);
 
 	gfx_coord2_add(&wnd->dpos, pos, &orig_pos);
-	ds_window_start_resize(wnd, rsztype, &orig_pos);
+	ds_window_start_resize(wnd, rsztype, &orig_pos, pos_id);
 }
 
Index: uspace/srv/hid/display/window.h
===================================================================
--- uspace/srv/hid/display/window.h	(revision 46a47c0ecde5eec9824d8b22b70d9238a2b3a58e)
+++ uspace/srv/hid/display/window.h	(revision b0ae23fe23288a6b5e26debedde1069676c9544e)
@@ -68,5 +68,5 @@
 extern void ds_window_get_max_rect(ds_window_t *, gfx_rect_t *);
 extern void ds_window_resize_req(ds_window_t *, display_wnd_rsztype_t,
-    gfx_coord2_t *);
+    gfx_coord2_t *, sysarg_t);
 extern errno_t ds_window_resize(ds_window_t *, gfx_coord2_t *, gfx_rect_t *);
 extern errno_t ds_window_minimize(ds_window_t *);
