Index: uspace/lib/display/include/disp_srv.h
===================================================================
--- uspace/lib/display/include/disp_srv.h	(revision aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/lib/display/include/disp_srv.h	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -57,5 +57,6 @@
 	errno_t (*window_create)(void *, display_wnd_params_t *, sysarg_t *);
 	errno_t (*window_destroy)(void *, sysarg_t);
-	errno_t (*window_move_req)(void *, sysarg_t, gfx_coord2_t *);
+	errno_t (*window_move_req)(void *, sysarg_t, gfx_coord2_t *,
+	    sysarg_t);
 	errno_t (*window_resize_req)(void *, sysarg_t, display_wnd_rsztype_t,
 	    gfx_coord2_t *, sysarg_t);
Index: uspace/lib/display/include/display.h
===================================================================
--- uspace/lib/display/include/display.h	(revision aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/lib/display/include/display.h	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -54,5 +54,6 @@
 extern errno_t display_window_destroy(display_window_t *);
 extern errno_t display_window_get_gc(display_window_t *, gfx_context_t **);
-extern errno_t display_window_move_req(display_window_t *, gfx_coord2_t *);
+extern errno_t display_window_move_req(display_window_t *, gfx_coord2_t *,
+    sysarg_t);
 extern errno_t display_window_resize_req(display_window_t *,
     display_wnd_rsztype_t, gfx_coord2_t *, sysarg_t);
Index: uspace/lib/display/src/disp_srv.c
===================================================================
--- uspace/lib/display/src/disp_srv.c	(revision aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/lib/display/src/disp_srv.c	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -152,4 +152,5 @@
 {
 	sysarg_t wnd_id;
+	sysarg_t pos_id;
 	ipc_call_t call;
 	gfx_coord2_t pos;
@@ -158,4 +159,5 @@
 
 	wnd_id = ipc_get_arg1(icall);
+	pos_id = ipc_get_arg2(icall);
 
 	if (!async_data_write_receive(&call, &size)) {
@@ -183,5 +185,5 @@
 	}
 
-	rc = srv->ops->window_move_req(srv->arg, wnd_id, &pos);
+	rc = srv->ops->window_move_req(srv->arg, wnd_id, &pos, pos_id);
 	async_answer_0(icall, rc);
 }
Index: uspace/lib/display/src/display.c
===================================================================
--- uspace/lib/display/src/display.c	(revision aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/lib/display/src/display.c	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -284,15 +284,18 @@
  * @param window Window
  * @param pos Position in the window where the button was pressed
- * @return EOK on success or an error code
- */
-errno_t display_window_move_req(display_window_t *window, 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_1(exch, DISPLAY_WINDOW_MOVE_REQ, window->id, &answer);
+ * @param pos_id Positioning device ID
+ * @return EOK on success or an error code
+ */
+errno_t display_window_move_req(display_window_t *window, 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_2(exch, DISPLAY_WINDOW_MOVE_REQ, window->id,
+	    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 aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/lib/display/test/display.c	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -58,5 +58,5 @@
 static errno_t test_window_create(void *, display_wnd_params_t *, sysarg_t *);
 static errno_t test_window_destroy(void *, sysarg_t);
-static errno_t test_window_move_req(void *, sysarg_t, gfx_coord2_t *);
+static errno_t test_window_move_req(void *, sysarg_t, gfx_coord2_t *, sysarg_t);
 static errno_t test_window_move(void *, sysarg_t, gfx_coord2_t *);
 static errno_t test_window_get_pos(void *, sysarg_t, gfx_coord2_t *);
@@ -124,4 +124,5 @@
 	sysarg_t move_req_wnd_id;
 	gfx_coord2_t move_req_pos;
+	sysarg_t move_req_pos_id;
 
 	bool window_move_called;
@@ -379,4 +380,5 @@
 	test_response_t resp;
 	gfx_coord2_t pos;
+	sysarg_t pos_id;
 
 	async_set_fallback_port_handler(test_display_conn, &resp);
@@ -410,6 +412,7 @@
 	pos.x = 42;
 	pos.y = 43;
-
-	rc = display_window_move_req(wnd, &pos);
+	pos_id = 44;
+
+	rc = display_window_move_req(wnd, &pos, pos_id);
 	PCUT_ASSERT_TRUE(resp.window_move_req_called);
 	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
@@ -417,4 +420,5 @@
 	PCUT_ASSERT_INT_EQUALS(pos.x, resp.move_req_pos.x);
 	PCUT_ASSERT_INT_EQUALS(pos.y, resp.move_req_pos.y);
+	PCUT_ASSERT_INT_EQUALS(pos_id, resp.move_req_pos_id);
 
 	display_window_destroy(wnd);
@@ -434,4 +438,5 @@
 	test_response_t resp;
 	gfx_coord2_t pos;
+	sysarg_t pos_id;
 
 	async_set_fallback_port_handler(test_display_conn, &resp);
@@ -465,6 +470,7 @@
 	pos.x = 42;
 	pos.y = 43;
-
-	rc = display_window_move_req(wnd, &pos);
+	pos_id = 44;
+
+	rc = display_window_move_req(wnd, &pos, pos_id);
 	PCUT_ASSERT_TRUE(resp.window_move_req_called);
 	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
@@ -472,4 +478,5 @@
 	PCUT_ASSERT_INT_EQUALS(pos.x, resp.move_req_pos.x);
 	PCUT_ASSERT_INT_EQUALS(pos.y, resp.move_req_pos.y);
+	PCUT_ASSERT_INT_EQUALS(pos_id, resp.move_req_pos_id);
 
 	display_window_destroy(wnd);
@@ -2147,5 +2154,5 @@
 
 static errno_t test_window_move_req(void *arg, sysarg_t wnd_id,
-    gfx_coord2_t *pos)
+    gfx_coord2_t *pos, sysarg_t pos_id)
 {
 	test_response_t *resp = (test_response_t *) arg;
@@ -2154,4 +2161,5 @@
 	resp->move_req_wnd_id = wnd_id;
 	resp->move_req_pos = *pos;
+	resp->move_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 aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/lib/ui/include/types/ui/wdecor.h	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -85,5 +85,5 @@
 	void (*unmaximize)(ui_wdecor_t *, void *);
 	void (*close)(ui_wdecor_t *, void *);
-	void (*move)(ui_wdecor_t *, void *, gfx_coord2_t *);
+	void (*move)(ui_wdecor_t *, void *, gfx_coord2_t *, sysarg_t);
 	void (*resize)(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
 	    gfx_coord2_t *, sysarg_t);
Index: uspace/lib/ui/private/wdecor.h
===================================================================
--- uspace/lib/ui/private/wdecor.h	(revision aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/lib/ui/private/wdecor.h	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -98,5 +98,5 @@
 extern void ui_wdecor_unmaximize(ui_wdecor_t *);
 extern void ui_wdecor_close(ui_wdecor_t *);
-extern void ui_wdecor_move(ui_wdecor_t *, gfx_coord2_t *);
+extern void ui_wdecor_move(ui_wdecor_t *, gfx_coord2_t *, sysarg_t);
 extern void ui_wdecor_resize(ui_wdecor_t *, ui_wdecor_rsztype_t,
     gfx_coord2_t *, sysarg_t);
Index: uspace/lib/ui/src/wdecor.c
===================================================================
--- uspace/lib/ui/src/wdecor.c	(revision aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/lib/ui/src/wdecor.c	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -465,9 +465,10 @@
  * @param wdecor Window decoration
  * @param pos Position where the title bar was pressed
- */
-void ui_wdecor_move(ui_wdecor_t *wdecor, gfx_coord2_t *pos)
+ * @param pos_id Positioning device ID
+ */
+void ui_wdecor_move(ui_wdecor_t *wdecor, gfx_coord2_t *pos, sysarg_t pos_id)
 {
 	if (wdecor->cb != NULL && wdecor->cb->move != NULL)
-		wdecor->cb->move(wdecor, wdecor->arg, pos);
+		wdecor->cb->move(wdecor, wdecor->arg, pos, pos_id);
 }
 
@@ -812,4 +813,5 @@
 {
 	gfx_coord2_t pos;
+	sysarg_t pos_id;
 	ui_wdecor_rsztype_t rsztype;
 	ui_stock_cursor_t cursor;
@@ -817,4 +819,5 @@
 	pos.x = event->hpos;
 	pos.y = event->vpos;
+	pos_id = event->pos_id;
 
 	/* Set appropriate resizing cursor, or set arrow cursor */
@@ -827,5 +830,5 @@
 	/* Press on window border? */
 	if (rsztype != ui_wr_none && event->type == POS_PRESS)
-		ui_wdecor_resize(wdecor, rsztype, &pos, event->pos_id);
+		ui_wdecor_resize(wdecor, rsztype, &pos, pos_id);
 }
 
@@ -839,4 +842,5 @@
 {
 	gfx_coord2_t pos;
+	sysarg_t pos_id;
 	ui_wdecor_geom_t geom;
 	ui_evclaim_t claim;
@@ -844,4 +848,5 @@
 	pos.x = event->hpos;
 	pos.y = event->vpos;
+	pos_id = event->pos_id;
 
 	ui_wdecor_get_geom(wdecor, &geom);
@@ -870,5 +875,5 @@
 		if (event->type == POS_PRESS &&
 		    gfx_pix_inside_rect(&pos, &geom.title_bar_rect)) {
-			ui_wdecor_move(wdecor, &pos);
+			ui_wdecor_move(wdecor, &pos, pos_id);
 			return ui_claimed;
 		}
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/lib/ui/src/window.c	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -78,5 +78,5 @@
 static void wd_unmaximize(ui_wdecor_t *, void *);
 static void wd_close(ui_wdecor_t *, void *);
-static void wd_move(ui_wdecor_t *, void *, gfx_coord2_t *);
+static void wd_move(ui_wdecor_t *, void *, gfx_coord2_t *, sysarg_t);
 static void wd_resize(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
     gfx_coord2_t *, sysarg_t);
@@ -973,11 +973,13 @@
  * @param arg Argument (window)
  * @param pos Position where the title bar was pressed
- */
-static void wd_move(ui_wdecor_t *wdecor, void *arg, gfx_coord2_t *pos)
+ * @param pos_id Positioning device ID
+ */
+static void wd_move(ui_wdecor_t *wdecor, void *arg, gfx_coord2_t *pos,
+    sysarg_t pos_id)
 {
 	ui_window_t *window = (ui_window_t *) arg;
 
 	if (window->dwindow != NULL)
-		(void) display_window_move_req(window->dwindow, pos);
+		(void) display_window_move_req(window->dwindow, pos, pos_id);
 }
 
Index: uspace/lib/ui/test/wdecor.c
===================================================================
--- uspace/lib/ui/test/wdecor.c	(revision aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/lib/ui/test/wdecor.c	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -66,5 +66,5 @@
 static void test_wdecor_unmaximize(ui_wdecor_t *, void *);
 static void test_wdecor_close(ui_wdecor_t *, void *);
-static void test_wdecor_move(ui_wdecor_t *, void *, gfx_coord2_t *);
+static void test_wdecor_move(ui_wdecor_t *, void *, gfx_coord2_t *, sysarg_t);
 static void test_wdecor_resize(ui_wdecor_t *, void *, ui_wdecor_rsztype_t,
     gfx_coord2_t *, sysarg_t);
@@ -339,4 +339,5 @@
 	test_cb_resp_t resp;
 	gfx_coord2_t pos;
+	sysarg_t pos_id;
 
 	rc = ui_wdecor_create(NULL, "Hello", ui_wds_none, &wdecor);
@@ -345,11 +346,12 @@
 	pos.x = 3;
 	pos.y = 4;
+	pos_id = 5;
 
 	/* Move callback with no callbacks set */
-	ui_wdecor_move(wdecor, &pos);
+	ui_wdecor_move(wdecor, &pos, pos_id);
 
 	/* Move callback with move callback not implemented */
 	ui_wdecor_set_cb(wdecor, &dummy_wdecor_cb, NULL);
-	ui_wdecor_move(wdecor, &pos);
+	ui_wdecor_move(wdecor, &pos, pos_id);
 
 	/* Move callback with real callback set */
@@ -357,9 +359,11 @@
 	resp.pos.x = 0;
 	resp.pos.y = 0;
+	resp.pos_id = 0;
 	ui_wdecor_set_cb(wdecor, &test_wdecor_cb, &resp);
-	ui_wdecor_move(wdecor, &pos);
+	ui_wdecor_move(wdecor, &pos, pos_id);
 	PCUT_ASSERT_TRUE(resp.move);
 	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);
@@ -1075,5 +1079,6 @@
 }
 
-static void test_wdecor_move(ui_wdecor_t *wdecor, void *arg, gfx_coord2_t *pos)
+static void test_wdecor_move(ui_wdecor_t *wdecor, void *arg, gfx_coord2_t *pos,
+    sysarg_t pos_id)
 {
 	test_cb_resp_t *resp = (test_cb_resp_t *) arg;
@@ -1081,4 +1086,5 @@
 	resp->move = true;
 	resp->pos = *pos;
+	resp->pos_id = pos_id;
 }
 
Index: uspace/srv/hid/display/dsops.c
===================================================================
--- uspace/srv/hid/display/dsops.c	(revision aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/srv/hid/display/dsops.c	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -46,5 +46,6 @@
 static errno_t disp_window_create(void *, display_wnd_params_t *, sysarg_t *);
 static errno_t disp_window_destroy(void *, sysarg_t);
-static errno_t disp_window_move_req(void *, sysarg_t, gfx_coord2_t *);
+static errno_t disp_window_move_req(void *, sysarg_t, gfx_coord2_t *,
+    sysarg_t);
 static errno_t disp_window_move(void *, sysarg_t, gfx_coord2_t *);
 static errno_t disp_window_get_pos(void *, sysarg_t, gfx_coord2_t *);
@@ -127,5 +128,5 @@
 
 static errno_t disp_window_move_req(void *arg, sysarg_t wnd_id,
-    gfx_coord2_t *pos)
+    gfx_coord2_t *pos, sysarg_t pos_id)
 {
 	ds_client_t *client = (ds_client_t *) arg;
@@ -141,5 +142,5 @@
 
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "disp_window_move_req()");
-	ds_window_move_req(wnd, pos);
+	ds_window_move_req(wnd, 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 aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/srv/hid/display/test/window.c	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -711,4 +711,5 @@
 	display_wnd_params_t params;
 	gfx_coord2_t pos;
+	sysarg_t pos_id;
 	errno_t rc;
 
@@ -736,9 +737,11 @@
 	pos.x = 42;
 	pos.y = 43;
-	ds_window_move_req(wnd, &pos);
+	pos_id = 44;
+	ds_window_move_req(wnd, &pos, pos_id);
 
 	PCUT_ASSERT_INT_EQUALS(dsw_moving, wnd->state);
 	PCUT_ASSERT_INT_EQUALS(pos.x, wnd->orig_pos.x);
 	PCUT_ASSERT_INT_EQUALS(pos.y, wnd->orig_pos.y);
+	PCUT_ASSERT_INT_EQUALS(pos_id, wnd->orig_pos_id);
 
 	ds_window_destroy(wnd);
@@ -791,4 +794,5 @@
 	PCUT_ASSERT_INT_EQUALS(pos.x, wnd->orig_pos.x);
 	PCUT_ASSERT_INT_EQUALS(pos.y, wnd->orig_pos.y);
+	PCUT_ASSERT_INT_EQUALS(pos_id, wnd->orig_pos_id);
 
 	ds_window_destroy(wnd);
Index: uspace/srv/hid/display/types/display/window.h
===================================================================
--- uspace/srv/hid/display/types/display/window.h	(revision aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/srv/hid/display/types/display/window.h	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -103,5 +103,5 @@
 	/** Original position before started to move or resize the window */
 	gfx_coord2_t orig_pos;
-	/** Positioning device that started the resize */
+	/** Positioning device that started the move or resize */
 	sysarg_t orig_pos_id;
 	/** Window resize type (if state is dsw_resizing) */
Index: uspace/srv/hid/display/window.c
===================================================================
--- uspace/srv/hid/display/window.c	(revision aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/srv/hid/display/window.c	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -437,6 +437,8 @@
  * @param wnd Window
  * @param pos Position where mouse button was pressed
- */
-static void ds_window_start_move(ds_window_t *wnd, gfx_coord2_t *pos)
+ * @param pos_id Positioning device ID
+ */
+static void ds_window_start_move(ds_window_t *wnd, gfx_coord2_t *pos,
+    sysarg_t pos_id)
 {
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_start_move (%d, %d)",
@@ -447,4 +449,5 @@
 
 	wnd->orig_pos = *pos;
+	wnd->orig_pos_id = pos_id;
 	wnd->state = dsw_moving;
 	wnd->preview_pos = wnd->dpos;
@@ -476,4 +479,5 @@
 	wnd->dpos = nwpos;
 	wnd->state = dsw_idle;
+	wnd->orig_pos_id = 0;
 
 	(void) ds_display_paint(wnd->display, NULL);
@@ -569,4 +573,6 @@
 		ds_seat_set_wm_cursor(seat, NULL);
 
+	wnd->orig_pos_id = 0;
+
 	(void) ds_display_paint(wnd->display, NULL);
 }
@@ -629,4 +635,5 @@
 	pos_event_t tevent;
 	gfx_coord2_t pos;
+	sysarg_t pos_id;
 	gfx_rect_t drect;
 	bool inside;
@@ -638,4 +645,5 @@
 	pos.x = event->hpos;
 	pos.y = event->vpos;
+	pos_id = event->pos_id;
 	gfx_rect_translate(&wnd->dpos, &wnd->rect, &drect);
 	inside = gfx_pix_inside_rect(&pos, &drect);
@@ -643,5 +651,5 @@
 	if (event->type == POS_PRESS && event->btn_num == 2 && inside &&
 	    (wnd->flags & wndf_maximized) == 0) {
-		ds_window_start_move(wnd, &pos);
+		ds_window_start_move(wnd, &pos, pos_id);
 		return EOK;
 	}
@@ -746,7 +754,8 @@
  * @param pos Position where the pointer was when the move started
  *            relative to the window
+ * @param pos_id Positioning device ID
  * @param event Button press event
  */
-void ds_window_move_req(ds_window_t *wnd, gfx_coord2_t *pos)
+void ds_window_move_req(ds_window_t *wnd, gfx_coord2_t *pos, sysarg_t pos_id)
 {
 	gfx_coord2_t orig_pos;
@@ -756,5 +765,5 @@
 
 	gfx_coord2_add(&wnd->dpos, pos, &orig_pos);
-	ds_window_start_move(wnd, &orig_pos);
+	ds_window_start_move(wnd, &orig_pos, pos_id);
 }
 
Index: uspace/srv/hid/display/window.h
===================================================================
--- uspace/srv/hid/display/window.h	(revision aaa3b8559887e8c56581eac6c3c9bb56468150aa)
+++ uspace/srv/hid/display/window.h	(revision 3be53668a72d42907f6124a3b95374fde7f15a53)
@@ -63,5 +63,5 @@
 extern errno_t ds_window_post_focus_event(ds_window_t *);
 extern errno_t ds_window_post_unfocus_event(ds_window_t *);
-extern void ds_window_move_req(ds_window_t *, gfx_coord2_t *);
+extern void ds_window_move_req(ds_window_t *, gfx_coord2_t *, sysarg_t);
 extern void ds_window_move(ds_window_t *, gfx_coord2_t *);
 extern void ds_window_get_pos(ds_window_t *, gfx_coord2_t *);
