Index: uspace/srv/hid/display/dsops.c
===================================================================
--- uspace/srv/hid/display/dsops.c	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
+++ uspace/srv/hid/display/dsops.c	(revision 9901f267fac70e209d0629a3ceaef9c8a6e15fa6)
@@ -169,4 +169,7 @@
 	ds_window_t *wnd;
 
+	if (!display_wndrsz_valid(rsztype))
+		return EINVAL;
+
 	ds_display_lock(client->display);
 
Index: uspace/srv/hid/display/seat.c
===================================================================
--- uspace/srv/hid/display/seat.c	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
+++ uspace/srv/hid/display/seat.c	(revision 9901f267fac70e209d0629a3ceaef9c8a6e15fa6)
@@ -45,4 +45,7 @@
 #include "window.h"
 
+static errno_t ds_seat_clear_pointer(ds_seat_t *);
+static errno_t ds_seat_draw_pointer(ds_seat_t *);
+
 /** Create seat.
  *
@@ -63,5 +66,6 @@
 	seat->pntpos.y = 0;
 
-	seat->cursor = display->cursor[dcurs_arrow];
+	seat->client_cursor = display->cursor[dcurs_arrow];
+	seat->wm_cursor = NULL;
 
 	*rseat = seat;
@@ -145,4 +149,77 @@
 }
 
+/** Get current cursor used by seat.
+ *
+ * @param wmcurs WM curor
+ * @param ccurs Client cursor
+ * @return
+ */
+static ds_cursor_t *ds_seat_compute_cursor(ds_cursor_t *wmcurs, ds_cursor_t *ccurs)
+{
+	if (wmcurs != NULL)
+		return wmcurs;
+
+	return ccurs;
+}
+
+/** Get current cursor used by seat.
+ *
+ * @param seat Seat
+ * @return Current cursor
+ */
+static ds_cursor_t *ds_seat_get_cursor(ds_seat_t *seat)
+{
+	return ds_seat_compute_cursor(seat->wm_cursor, seat->client_cursor);
+}
+
+/** Set client cursor.
+ *
+ * Set cursor selected by client. This may update the actual cursor
+ * if WM is not overriding the cursor.
+ *
+ * @param seat Seat
+ * @param cursor Client cursor
+ */
+static void ds_seat_set_client_cursor(ds_seat_t *seat, ds_cursor_t *cursor)
+{
+	ds_cursor_t *old_cursor;
+	ds_cursor_t *new_cursor;
+
+	old_cursor = ds_seat_get_cursor(seat);
+	new_cursor = ds_seat_compute_cursor(seat->wm_cursor, cursor);
+
+	if (new_cursor != old_cursor)
+		ds_seat_clear_pointer(seat);
+
+	seat->client_cursor = cursor;
+
+	if (new_cursor != old_cursor)
+		ds_seat_draw_pointer(seat);
+}
+
+/** Set WM cursor.
+ *
+ * Set cursor override for window management.
+ *
+ * @param seat Seat
+ * @param cursor WM cursor override or @c NULL not to override the cursor
+ */
+void ds_seat_set_wm_cursor(ds_seat_t *seat, ds_cursor_t *cursor)
+{
+	ds_cursor_t *old_cursor;
+	ds_cursor_t *new_cursor;
+
+	old_cursor = ds_seat_get_cursor(seat);
+	new_cursor = ds_seat_compute_cursor(cursor, seat->client_cursor);
+
+	if (new_cursor != old_cursor)
+		ds_seat_clear_pointer(seat);
+
+	seat->wm_cursor = cursor;
+
+	if (new_cursor != old_cursor)
+		ds_seat_draw_pointer(seat);
+}
+
 /** Draw seat pointer
  *
@@ -153,5 +230,8 @@
 static errno_t ds_seat_draw_pointer(ds_seat_t *seat)
 {
-	return ds_cursor_paint(seat->cursor, &seat->pntpos);
+	ds_cursor_t *cursor;
+
+	cursor = ds_seat_get_cursor(seat);
+	return ds_cursor_paint(cursor, &seat->pntpos);
 }
 
@@ -165,7 +245,10 @@
 {
 	gfx_rect_t rect;
+	ds_cursor_t *cursor;
+
+	cursor = ds_seat_get_cursor(seat);
 
 	/* Get rectangle covered by cursor */
-	ds_cursor_get_rect(seat->cursor, &seat->pntpos, &rect);
+	ds_cursor_get_rect(cursor, &seat->pntpos, &rect);
 
 	/* Repaint it */
@@ -182,5 +265,4 @@
  * @return EOK on success or an error code
  */
-#include <stdio.h>
 errno_t ds_seat_post_ptd_event(ds_seat_t *seat, ptd_event_t *event)
 {
@@ -279,5 +361,5 @@
 	if (wnd != NULL) {
 		/* Moving over a window */
-		seat->cursor = wnd->cursor;
+		ds_seat_set_client_cursor(seat, wnd->cursor);
 
 		rc = ds_window_post_pos_event(wnd, event);
@@ -286,5 +368,5 @@
 	} else {
 		/* Not over a window */
-		seat->cursor = seat->display->cursor[dcurs_arrow];
+		ds_seat_set_client_cursor(seat, seat->display->cursor[dcurs_arrow]);
 	}
 
Index: uspace/srv/hid/display/seat.h
===================================================================
--- uspace/srv/hid/display/seat.h	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
+++ uspace/srv/hid/display/seat.h	(revision 9901f267fac70e209d0629a3ceaef9c8a6e15fa6)
@@ -52,4 +52,5 @@
 extern errno_t ds_seat_post_ptd_event(ds_seat_t *, ptd_event_t *);
 extern errno_t ds_seat_post_pos_event(ds_seat_t *, pos_event_t *);
+extern void ds_seat_set_wm_cursor(ds_seat_t *, ds_cursor_t *);
 
 #endif
Index: uspace/srv/hid/display/test/seat.c
===================================================================
--- uspace/srv/hid/display/test/seat.c	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
+++ uspace/srv/hid/display/test/seat.c	(revision 9901f267fac70e209d0629a3ceaef9c8a6e15fa6)
@@ -353,3 +353,29 @@
 }
 
+/** Set WM cursor */
+PCUT_TEST(set_wm_cursor)
+{
+	ds_display_t *disp;
+	ds_client_t *client;
+	ds_seat_t *seat;
+	bool called_cb = false;
+	errno_t rc;
+
+	rc = ds_display_create(NULL, &disp);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ds_client_create(disp, &test_ds_client_cb, &called_cb, &client);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ds_seat_create(disp, &seat);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ds_seat_set_wm_cursor(seat, disp->cursor[dcurs_size_ud]);
+	ds_seat_set_wm_cursor(seat, NULL);
+
+	ds_seat_destroy(seat);
+	ds_client_destroy(client);
+	ds_display_destroy(disp);
+}
+
 PCUT_EXPORT(seat);
Index: uspace/srv/hid/display/test/window.c
===================================================================
--- uspace/srv/hid/display/test/window.c	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
+++ uspace/srv/hid/display/test/window.c	(revision 9901f267fac70e209d0629a3ceaef9c8a6e15fa6)
@@ -36,4 +36,5 @@
 #include "../client.h"
 #include "../display.h"
+#include "../seat.h"
 #include "../window.h"
 
@@ -55,4 +56,5 @@
 	ds_display_t *disp;
 	ds_client_t *client;
+	ds_seat_t *seat;
 	ds_window_t *wnd;
 	display_wnd_params_t params;
@@ -65,4 +67,7 @@
 
 	rc = ds_client_create(disp, NULL, NULL, &client);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ds_seat_create(disp, &seat);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -89,4 +94,5 @@
 
 	ds_window_destroy(wnd);
+	ds_seat_destroy(seat);
 	ds_client_destroy(client);
 	ds_display_destroy(disp);
@@ -288,4 +294,5 @@
 	ds_display_t *disp;
 	ds_client_t *client;
+	ds_seat_t *seat;
 	ds_window_t *wnd;
 	display_wnd_params_t params;
@@ -300,4 +307,7 @@
 
 	rc = ds_client_create(disp, NULL, NULL, &client);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ds_seat_create(disp, &seat);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -321,4 +331,5 @@
 
 	ds_window_destroy(wnd);
+	ds_seat_destroy(seat);
 	ds_client_destroy(client);
 	ds_display_destroy(disp);
@@ -639,5 +650,4 @@
 }
 
-
 static errno_t dummy_set_color(void *arg, gfx_color_t *color)
 {
Index: uspace/srv/hid/display/types/display/seat.h
===================================================================
--- uspace/srv/hid/display/types/display/seat.h	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
+++ uspace/srv/hid/display/types/display/seat.h	(revision 9901f267fac70e209d0629a3ceaef9c8a6e15fa6)
@@ -48,6 +48,8 @@
 	/** Window this seat is focused on */
 	struct ds_window *focus;
-	/** Current seat cursor */
-	struct ds_cursor *cursor;
+	/** Cursor selected by client */
+	struct ds_cursor *client_cursor;
+	/** Cursor override for window management or @c NULL */
+	struct ds_cursor *wm_cursor;
 	/** Pointer position */
 	gfx_coord2_t pntpos;
Index: uspace/srv/hid/display/window.c
===================================================================
--- uspace/srv/hid/display/window.c	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
+++ uspace/srv/hid/display/window.c	(revision 9901f267fac70e209d0629a3ceaef9c8a6e15fa6)
@@ -45,4 +45,5 @@
 #include "client.h"
 #include "display.h"
+#include "seat.h"
 #include "window.h"
 
@@ -515,4 +516,7 @@
     display_wnd_rsztype_t rsztype, gfx_coord2_t *pos)
 {
+	ds_seat_t *seat;
+	display_stock_cursor_t ctype;
+
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_start_resize (%d, %d)",
 	    (int) pos->x, (int) pos->y);
@@ -525,4 +529,9 @@
 	wnd->rsztype = rsztype;
 	wnd->preview_rect = wnd->rect;
+
+	// XXX 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]);
 }
 
@@ -536,4 +545,5 @@
 	gfx_coord2_t dresize;
 	gfx_rect_t nrect;
+	ds_seat_t *seat;
 
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_finish_resize (%d, %d)",
@@ -552,4 +562,8 @@
 	wnd->state = dsw_idle;
 	ds_client_post_resize_event(wnd->client, wnd, &nrect);
+
+	// XXX Need to know which seat started the resize!
+	seat = ds_display_first_seat(wnd->display);
+	ds_seat_set_wm_cursor(seat, NULL);
 }
 
