Index: uspace/srv/hid/display/cursimg.c
===================================================================
--- uspace/srv/hid/display/cursimg.c	(revision 4c4d61427539c3f155a625d0603af062e2800048)
+++ uspace/srv/hid/display/cursimg.c	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
@@ -61,8 +61,100 @@
 };
 
+static uint8_t size_ud_img[] = {
+	0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 1, 2, 2, 2, 1, 0, 0, 0, 0,
+	0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0,
+	0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0,
+	0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0,
+	1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1,
+	0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0,
+	0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0,
+	0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0,
+	0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0,
+	0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0,
+	0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0,
+	0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0,
+	1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1,
+	0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0,
+	0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0,
+	0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0,
+	0, 0, 0, 0, 1, 2, 2, 2, 1, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0
+};
+
+static uint8_t size_lr_img[] = {
+	0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0,
+	0, 0, 0, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 0, 0, 0,
+	0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0,
+	0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0,
+	1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1,
+	0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0,
+	0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0,
+	0, 0, 0, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 0, 0, 0,
+	0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0
+};
+
+static uint8_t size_uldr_img[] = {
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+	1, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0,
+	1, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0,
+	1, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+	1, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0,
+	1, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 1,
+	1, 2, 2, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0, 1, 1,
+	1, 2, 1, 0, 1, 2, 2, 2, 2, 2, 1, 0, 1, 2, 1,
+	1, 1, 0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 2, 2, 1,
+	1, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 1,
+	0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 1,
+	0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 1,
+	0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 1,
+	0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 1,
+	0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+};
+
+static uint8_t size_urdl_img[] = {
+	0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 1,
+	0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 1,
+	0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 1,
+	0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 1,
+	1, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 1,
+	1, 1, 0, 0, 0, 1, 2, 2, 2, 2, 2, 1, 2, 2, 1,
+	1, 2, 1, 0, 1, 2, 2, 2, 2, 2, 1, 0, 1, 2, 1,
+	1, 2, 2, 1, 2, 2, 2, 2, 2, 1, 0, 0, 0, 1, 1,
+	1, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 1,
+	1, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0,
+	1, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+	1, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0,
+	1, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0,
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
+};
+
 ds_cursimg_t ds_cursimg[dcurs_limit] = {
 	{
 		.rect = { 0, 0, 13, 21 },
 		.image = arrow_img
+	},
+	{
+		.rect = { -6, -10, 7, 11 },
+		.image = size_ud_img
+	},
+	{
+		.rect = { -10, -6, 11, 7 },
+		.image = size_lr_img
+	},
+	{
+		.rect = { -7, -7, 8, 8 },
+		.image = size_uldr_img
+	},
+	{
+		.rect = { -7, -7, 8, 8 },
+		.image = size_urdl_img
 	}
 };
Index: uspace/srv/hid/display/dsops.c
===================================================================
--- uspace/srv/hid/display/dsops.c	(revision 4c4d61427539c3f155a625d0603af062e2800048)
+++ uspace/srv/hid/display/dsops.c	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
@@ -52,4 +52,5 @@
 static errno_t disp_window_resize(void *, sysarg_t, gfx_coord2_t *,
     gfx_rect_t *);
+static errno_t disp_window_set_cursor(void *, sysarg_t, display_stock_cursor_t);
 static errno_t disp_get_event(void *, sysarg_t *, display_wnd_ev_t *);
 static errno_t disp_get_info(void *, display_info_t *);
@@ -62,4 +63,5 @@
 	.window_resize_req = disp_window_resize_req,
 	.window_resize = disp_window_resize,
+	.window_set_cursor = disp_window_set_cursor,
 	.get_event = disp_get_event,
 	.get_info = disp_get_info
@@ -202,4 +204,25 @@
 }
 
+static errno_t disp_window_set_cursor(void *arg, sysarg_t wnd_id,
+    display_stock_cursor_t cursor)
+{
+	ds_client_t *client = (ds_client_t *) arg;
+	ds_window_t *wnd;
+	errno_t rc;
+
+	ds_display_lock(client->display);
+
+	wnd = ds_client_find_window(client, wnd_id);
+	if (wnd == NULL) {
+		ds_display_unlock(client->display);
+		return ENOENT;
+	}
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "disp_window_set_cursor()");
+	rc = ds_window_set_cursor(wnd, cursor);
+	ds_display_unlock(client->display);
+	return rc;
+}
+
 static errno_t disp_get_event(void *arg, sysarg_t *wnd_id,
     display_wnd_ev_t *event)
Index: uspace/srv/hid/display/seat.c
===================================================================
--- uspace/srv/hid/display/seat.c	(revision 4c4d61427539c3f155a625d0603af062e2800048)
+++ uspace/srv/hid/display/seat.c	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
@@ -278,7 +278,13 @@
 	wnd = ds_display_window_by_pos(seat->display, &seat->pntpos);
 	if (wnd != NULL) {
+		/* Moving over a window */
+		seat->cursor = wnd->cursor;
+
 		rc = ds_window_post_pos_event(wnd, event);
 		if (rc != EOK)
 			return rc;
+	} else {
+		/* Not over a window */
+		seat->cursor = seat->display->cursor[dcurs_arrow];
 	}
 
Index: uspace/srv/hid/display/test/window.c
===================================================================
--- uspace/srv/hid/display/test/window.c	(revision 4c4d61427539c3f155a625d0603af062e2800048)
+++ uspace/srv/hid/display/test/window.c	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
@@ -590,4 +590,54 @@
 }
 
+/** Test ds_window_set_cursor() */
+PCUT_TEST(window_set_cursor)
+{
+	gfx_context_t *gc;
+	ds_display_t *disp;
+	ds_client_t *client;
+	ds_window_t *wnd;
+	display_wnd_params_t params;
+	errno_t rc;
+
+	rc = gfx_context_new(&dummy_ops, NULL, &gc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ds_display_create(gc, &disp);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ds_client_create(disp, NULL, NULL, &client);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	display_wnd_params_init(&params);
+	params.rect.p0.x = params.rect.p0.y = 0;
+	params.rect.p1.x = params.rect.p1.y = 1;
+
+	rc = ds_window_create(client, &params, &wnd);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_EQUALS(wnd->display->cursor[dcurs_arrow], wnd->cursor);
+
+	rc = ds_window_set_cursor(wnd, -1);
+	PCUT_ASSERT_ERRNO_VAL(EINVAL, rc);
+	PCUT_ASSERT_EQUALS(wnd->display->cursor[dcurs_arrow], wnd->cursor);
+
+	rc = ds_window_set_cursor(wnd, dcurs_limit);
+	PCUT_ASSERT_ERRNO_VAL(EINVAL, rc);
+	PCUT_ASSERT_EQUALS(wnd->display->cursor[dcurs_arrow], wnd->cursor);
+
+	rc = ds_window_set_cursor(wnd, dcurs_limit + 1);
+	PCUT_ASSERT_ERRNO_VAL(EINVAL, rc);
+	PCUT_ASSERT_EQUALS(wnd->display->cursor[dcurs_arrow], wnd->cursor);
+
+	rc = ds_window_set_cursor(wnd, dcurs_size_lr);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_EQUALS(wnd->display->cursor[dcurs_size_lr], wnd->cursor);
+
+	ds_window_destroy(wnd);
+	ds_client_destroy(client);
+	ds_display_destroy(disp);
+}
+
+
 static errno_t dummy_set_color(void *arg, gfx_color_t *color)
 {
Index: uspace/srv/hid/display/types/display/window.h
===================================================================
--- uspace/srv/hid/display/types/display/window.h	(revision 4c4d61427539c3f155a625d0603af062e2800048)
+++ uspace/srv/hid/display/types/display/window.h	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
@@ -86,4 +86,6 @@
 	/** Current drawing color */
 	pixel_t color;
+	/** Cursor set by client */
+	struct ds_cursor *cursor;
 
 	/** State */
Index: uspace/srv/hid/display/window.c
===================================================================
--- uspace/srv/hid/display/window.c	(revision 4c4d61427539c3f155a625d0603af062e2800048)
+++ uspace/srv/hid/display/window.c	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
@@ -309,4 +309,5 @@
 	wnd->min_size = params->min_size;
 	wnd->gc = gc;
+	wnd->cursor = wnd->display->cursor[dcurs_arrow];
 	*rgc = wnd;
 	return EOK;
@@ -822,4 +823,20 @@
 }
 
+/** Set window cursor.
+ *
+ * @param wnd Window
+ * @return EOK on success, EINVAL if @a cursor is invalid
+ */
+errno_t ds_window_set_cursor(ds_window_t *wnd, display_stock_cursor_t cursor)
+{
+	if (cursor >= dcurs_arrow &&
+	    cursor < (display_stock_cursor_t) dcurs_limit) {
+		wnd->cursor = wnd->display->cursor[cursor];
+		return EOK;
+	} else {
+		return EINVAL;
+	}
+}
+
 /** @}
  */
Index: uspace/srv/hid/display/window.h
===================================================================
--- uspace/srv/hid/display/window.h	(revision 4c4d61427539c3f155a625d0603af062e2800048)
+++ uspace/srv/hid/display/window.h	(revision 9242ad96749c6886b0320f48e90dcb84d6e773cc)
@@ -44,4 +44,5 @@
 #include <types/gfx/coord.h>
 #include <types/gfx/ops/context.h>
+#include "types/display/cursor.h"
 #include "types/display/display.h"
 #include "types/display/window.h"
@@ -66,4 +67,5 @@
 extern void ds_window_calc_resize(ds_window_t *, gfx_coord2_t *,
     gfx_rect_t *);
+extern errno_t ds_window_set_cursor(ds_window_t *, display_stock_cursor_t);
 
 #endif
