Index: uspace/lib/display/include/types/display.h
===================================================================
--- uspace/lib/display/include/types/display.h	(revision 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
+++ uspace/lib/display/include/types/display.h	(revision e0228190e56b2405620ccda32362ae157ee28834)
@@ -70,4 +70,6 @@
 	/** Position event */
 	void (*pos_event)(void *, pos_event_t *);
+	/** Resize event */
+	void (*resize_event)(void *, gfx_rect_t *);
 	/** Unfocus event */
 	void (*unfocus_event)(void *);
Index: uspace/lib/display/include/types/display/event.h
===================================================================
--- uspace/lib/display/include/types/display/event.h	(revision 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
+++ uspace/lib/display/include/types/display/event.h	(revision e0228190e56b2405620ccda32362ae157ee28834)
@@ -36,4 +36,5 @@
 #define _LIBDISPLAY_TYPES_DISPLAY_EVENT_H_
 
+#include <gfx/coord.h>
 #include <io/kbd_event.h>
 #include <io/pos_event.h>
@@ -49,7 +50,14 @@
 	/** Position event */
 	wev_pos,
+	/** Resize event */
+	wev_resize,
 	/** Window lost focus */
 	wev_unfocus
 } display_wnd_ev_type_t;
+
+/** Display window resize event */
+typedef struct {
+	gfx_rect_t rect;
+} display_wnd_resize_ev_t;
 
 /** Display window event */
@@ -62,4 +70,6 @@
 		/** Position event data */
 		pos_event_t pos;
+		/** Resize event data */
+		display_wnd_resize_ev_t resize;
 	} ev;
 } display_wnd_ev_t;
Index: uspace/lib/display/src/display.c
===================================================================
--- uspace/lib/display/src/display.c	(revision 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
+++ uspace/lib/display/src/display.c	(revision e0228190e56b2405620ccda32362ae157ee28834)
@@ -460,4 +460,10 @@
 			}
 			break;
+		case wev_resize:
+			if (window->cb != NULL && window->cb->resize_event != NULL) {
+				window->cb->resize_event(window->cb_arg,
+				    &event.ev.resize.rect);
+			}
+			break;
 		case wev_unfocus:
 			if (window->cb != NULL && window->cb->unfocus_event != NULL) {
Index: uspace/lib/gui/window.c
===================================================================
--- uspace/lib/gui/window.c	(revision 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
+++ uspace/lib/gui/window.c	(revision e0228190e56b2405620ccda32362ae157ee28834)
@@ -87,4 +87,5 @@
 static void window_kbd_event(void *, kbd_event_t *);
 static void window_pos_event(void *, pos_event_t *);
+static void window_resize_event(void *, gfx_rect_t *);
 static void window_unfocus_event(void *);
 
@@ -94,4 +95,5 @@
 	.kbd_event = window_kbd_event,
 	.pos_event = window_pos_event,
+	.resize_event = window_resize_event,
 	.unfocus_event = window_unfocus_event
 };
@@ -313,5 +315,5 @@
 		} else if (left && btn_left) {
 			(void) display_window_resize_req(widget->window->dwindow,
-			    display_wr_bottom, &pos);
+			    display_wr_left, &pos);
 		} else if (bottom && btn_left) {
 			(void) display_window_resize_req(widget->window->dwindow,
@@ -319,5 +321,5 @@
 		} else if (right && btn_left) {
 			(void) display_window_resize_req(widget->window->dwindow,
-			    display_wr_bottom, &pos);
+			    display_wr_right, &pos);
 		} else if (close && btn_left) {
 			window_close(widget->window);
@@ -815,4 +817,23 @@
 }
 
+static void window_resize_event(void *arg, gfx_rect_t *nrect)
+{
+	window_t *win = (window_t *) arg;
+	window_event_t *event;
+
+	event = (window_event_t *) calloc(1, sizeof(window_event_t));
+	if (event == NULL)
+		return;
+
+	link_initialize(&event->link);
+	event->type = ET_WINDOW_RESIZE;
+	event->data.resize.offset_x = nrect->p0.x;
+	event->data.resize.offset_y = nrect->p0.y;
+	event->data.resize.width = nrect->p1.x - nrect->p0.x;
+	event->data.resize.height = nrect->p1.y - nrect->p0.y;
+	event->data.resize.placement_flags = WINDOW_PLACEMENT_ANY;
+	prodcons_produce(&win->events, &event->link);
+}
+
 static void window_unfocus_event(void *arg)
 {
Index: uspace/srv/hid/display/client.c
===================================================================
--- uspace/srv/hid/display/client.c	(revision 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
+++ uspace/srv/hid/display/client.c	(revision e0228190e56b2405620ccda32362ae157ee28834)
@@ -316,4 +316,34 @@
 }
 
+/** Post resize event to the client's message queue.
+ *
+ * @param client Client
+ * @param ewindow Window that the message is targetted to
+ * @param rect New window rectangle
+ *
+ * @return EOK on success or an error code
+ */
+errno_t ds_client_post_resize_event(ds_client_t *client, ds_window_t *ewindow,
+    gfx_rect_t *rect)
+{
+	ds_window_ev_t *wevent;
+
+	wevent = calloc(1, sizeof(ds_window_ev_t));
+	if (wevent == NULL)
+		return ENOMEM;
+
+	wevent->window = ewindow;
+	wevent->event.etype = wev_resize;
+	wevent->event.ev.resize.rect = *rect;
+	list_append(&wevent->levents, &client->events);
+
+	/* Notify the client */
+	// TODO Do not send more than once until client drains the queue
+	if (client->cb != NULL && client->cb->ev_pending != NULL)
+		client->cb->ev_pending(client->cb_arg);
+
+	return EOK;
+}
+
 /** Post unfocus event to the client's message queue.
  *
Index: uspace/srv/hid/display/client.h
===================================================================
--- uspace/srv/hid/display/client.h	(revision 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
+++ uspace/srv/hid/display/client.h	(revision e0228190e56b2405620ccda32362ae157ee28834)
@@ -59,4 +59,6 @@
 extern errno_t ds_client_post_pos_event(ds_client_t *, ds_window_t *,
     pos_event_t *);
+extern errno_t ds_client_post_resize_event(ds_client_t *, ds_window_t *,
+    gfx_rect_t *);
 extern errno_t ds_client_post_unfocus_event(ds_client_t *, ds_window_t *);
 
Index: uspace/srv/hid/display/dsops.c
===================================================================
--- uspace/srv/hid/display/dsops.c	(revision 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
+++ uspace/srv/hid/display/dsops.c	(revision e0228190e56b2405620ccda32362ae157ee28834)
@@ -47,4 +47,6 @@
 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_resize_req(void *, sysarg_t,
+    display_wnd_rsztype_t, gfx_coord2_t *);
 static errno_t disp_window_resize(void *, sysarg_t, gfx_coord2_t *,
     gfx_rect_t *);
@@ -55,4 +57,5 @@
 	.window_destroy = disp_window_destroy,
 	.window_move_req = disp_window_move_req,
+	.window_resize_req = disp_window_resize_req,
 	.window_resize = disp_window_resize,
 	.get_event = disp_get_event
@@ -119,4 +122,19 @@
 }
 
+static errno_t disp_window_resize_req(void *arg, sysarg_t wnd_id,
+    display_wnd_rsztype_t rsztype, gfx_coord2_t *pos)
+{
+	ds_client_t *client = (ds_client_t *) arg;
+	ds_window_t *wnd;
+
+	wnd = ds_client_find_window(client, wnd_id);
+	if (wnd == NULL)
+		return ENOENT;
+
+	log_msg(LVL_NOTE, LVL_DEBUG, "disp_window_resize_req()");
+	ds_window_resize_req(wnd, rsztype, pos);
+	return EOK;
+}
+
 static errno_t disp_window_resize(void *arg, sysarg_t wnd_id,
     gfx_coord2_t *offs, gfx_rect_t *nbound)
Index: uspace/srv/hid/display/test/client.c
===================================================================
--- uspace/srv/hid/display/test/client.c	(revision 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
+++ uspace/srv/hid/display/test/client.c	(revision e0228190e56b2405620ccda32362ae157ee28834)
@@ -369,4 +369,61 @@
 }
 
+/** Test ds_client_get_event(), ds_client_post_resize_event(). */
+PCUT_TEST(client_get_post_resize_event)
+{
+	ds_display_t *disp;
+	ds_client_t *client;
+	ds_window_t *wnd;
+	display_wnd_params_t params;
+	gfx_rect_t rect;
+	ds_window_t *rwindow;
+	display_wnd_ev_t revent;
+	bool called_cb = NULL;
+	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);
+
+	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);
+
+	rect.p0.x = 1;
+	rect.p0.y = 2;
+	rect.p1.x = 3;
+	rect.p1.y = 4;
+
+	PCUT_ASSERT_FALSE(called_cb);
+
+	rc = ds_client_get_event(client, &rwindow, &revent);
+	PCUT_ASSERT_ERRNO_VAL(ENOENT, rc);
+
+	rc = ds_client_post_resize_event(client, wnd, &rect);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_TRUE(called_cb);
+
+	rc = ds_client_get_event(client, &rwindow, &revent);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_EQUALS(wnd, rwindow);
+	PCUT_ASSERT_EQUALS(wev_resize, revent.etype);
+	PCUT_ASSERT_EQUALS(rect.p0.x, revent.ev.resize.rect.p0.x);
+	PCUT_ASSERT_EQUALS(rect.p0.y, revent.ev.resize.rect.p0.y);
+	PCUT_ASSERT_EQUALS(rect.p1.x, revent.ev.resize.rect.p1.x);
+	PCUT_ASSERT_EQUALS(rect.p1.y, revent.ev.resize.rect.p1.y);
+
+	rc = ds_client_get_event(client, &rwindow, &revent);
+	PCUT_ASSERT_ERRNO_VAL(ENOENT, rc);
+
+	ds_window_destroy(wnd);
+	ds_client_destroy(client);
+	ds_display_destroy(disp);
+}
+
 /** Test ds_client_get_event(), ds_client_post_unfocus_event(). */
 PCUT_TEST(client_get_post_unfocus_event)
Index: uspace/srv/hid/display/test/window.c
===================================================================
--- uspace/srv/hid/display/test/window.c	(revision 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
+++ uspace/srv/hid/display/test/window.c	(revision e0228190e56b2405620ccda32362ae157ee28834)
@@ -281,4 +281,137 @@
 }
 
+/** Test ds_window_resize_req() */
+PCUT_TEST(window_resize_req)
+{
+	gfx_context_t *gc;
+	ds_display_t *disp;
+	ds_client_t *client;
+	ds_window_t *wnd;
+	display_wnd_params_t params;
+	gfx_coord2_t pos;
+	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_INT_EQUALS(dsw_idle, wnd->state);
+
+	pos.x = 42;
+	pos.y = 43;
+	ds_window_resize_req(wnd, display_wr_top_right, &pos);
+
+	PCUT_ASSERT_INT_EQUALS(dsw_resizing, wnd->state);
+	PCUT_ASSERT_INT_EQUALS(display_wr_top_right, wnd->rsztype);
+	PCUT_ASSERT_INT_EQUALS(pos.x, wnd->orig_pos.x);
+	PCUT_ASSERT_INT_EQUALS(pos.y, wnd->orig_pos.y);
+
+	ds_window_destroy(wnd);
+	ds_client_destroy(client);
+	ds_display_destroy(disp);
+}
+
+PCUT_TEST(window_calc_resize)
+{
+	ds_display_t *disp;
+	ds_client_t *client;
+	ds_window_t *wnd;
+	display_wnd_params_t params;
+	gfx_coord2_t dresize;
+	gfx_rect_t nrect;
+	errno_t rc;
+
+	rc = ds_display_create(NULL, &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 = 10;
+	params.rect.p0.y = 11;
+	params.rect.p1.x = 20;
+	params.rect.p1.y = 21;
+
+	rc = ds_window_create(client, &params, &wnd);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	wnd->state = dsw_resizing;
+	dresize.x = 5;
+	dresize.y = 6;
+
+	wnd->rsztype = display_wr_top;
+	ds_window_calc_resize(wnd, &dresize, &nrect);
+	PCUT_ASSERT_INT_EQUALS(10, nrect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(17, nrect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(20, nrect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(21, nrect.p1.y);
+
+	wnd->rsztype = display_wr_top_left;
+	ds_window_calc_resize(wnd, &dresize, &nrect);
+	PCUT_ASSERT_INT_EQUALS(15, nrect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(17, nrect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(20, nrect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(21, nrect.p1.y);
+
+	wnd->rsztype = display_wr_left;
+	ds_window_calc_resize(wnd, &dresize, &nrect);
+	PCUT_ASSERT_INT_EQUALS(15, nrect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(11, nrect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(20, nrect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(21, nrect.p1.y);
+
+	wnd->rsztype = display_wr_bottom_left;
+	ds_window_calc_resize(wnd, &dresize, &nrect);
+	PCUT_ASSERT_INT_EQUALS(15, nrect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(11, nrect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(20, nrect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(27, nrect.p1.y);
+
+	wnd->rsztype = display_wr_bottom;
+	ds_window_calc_resize(wnd, &dresize, &nrect);
+	PCUT_ASSERT_INT_EQUALS(10, nrect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(11, nrect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(20, nrect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(27, nrect.p1.y);
+
+	wnd->rsztype = display_wr_bottom_right;
+	ds_window_calc_resize(wnd, &dresize, &nrect);
+	PCUT_ASSERT_INT_EQUALS(10, nrect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(11, nrect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(25, nrect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(27, nrect.p1.y);
+
+	wnd->rsztype = display_wr_right;
+	ds_window_calc_resize(wnd, &dresize, &nrect);
+	PCUT_ASSERT_INT_EQUALS(10, nrect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(11, nrect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(25, nrect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(21, nrect.p1.y);
+
+	wnd->rsztype = display_wr_top_right;
+	ds_window_calc_resize(wnd, &dresize, &nrect);
+	PCUT_ASSERT_INT_EQUALS(10, nrect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(17, nrect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(25, nrect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(21, nrect.p1.y);
+
+	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 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
+++ uspace/srv/hid/display/types/display/window.h	(revision e0228190e56b2405620ccda32362ae157ee28834)
@@ -39,4 +39,5 @@
 #include <adt/list.h>
 #include <display/event.h>
+#include <display/wndresize.h>
 #include <gfx/context.h>
 #include <gfx/coord.h>
@@ -50,5 +51,7 @@
 	dsw_idle,
 	/** Moving by mouse drag */
-	dsw_moving
+	dsw_moving,
+	/** Resizing by mouse drag */
+	dsw_resizing
 } ds_window_state_t;
 
@@ -80,6 +83,8 @@
 	/** State */
 	ds_window_state_t state;
-	/** Original position before started to move the window */
+	/** Original position before started to move or resize the window */
 	gfx_coord2_t orig_pos;
+	/** Window resize type (if state is dsw_resizing) */
+	display_wnd_rsztype_t rsztype;
 } ds_window_t;
 
Index: uspace/srv/hid/display/window.c
===================================================================
--- uspace/srv/hid/display/window.c	(revision 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
+++ uspace/srv/hid/display/window.c	(revision e0228190e56b2405620ccda32362ae157ee28834)
@@ -436,23 +436,4 @@
 }
 
-/** Start moving a window, detected by client.
- *
- * @param wnd Window
- * @param pos Position where the pointer was when the move started
- *            relative to the window
- * @param event Button press event
- */
-void ds_window_move_req(ds_window_t *wnd, gfx_coord2_t *pos)
-{
-	log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_move_req (%d, %d)",
-	    (int) pos->x, (int) pos->y);
-
-	if (wnd->state != dsw_idle)
-		return;
-
-	gfx_coord2_add(&wnd->dpos, pos, &wnd->orig_pos);
-	wnd->state = dsw_moving;
-}
-
 /** Start moving a window by mouse drag.
  *
@@ -553,4 +534,81 @@
 }
 
+/** Finish resizing a window by mouse drag.
+ *
+ * @param wnd Window
+ * @param event Button release event
+ */
+static void ds_window_finish_resize(ds_window_t *wnd, pos_event_t *event)
+{
+	gfx_coord2_t pos;
+	gfx_coord2_t dresize;
+	gfx_rect_t nrect;
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_finish_resize (%d, %d)",
+	    (int) event->hpos, (int) event->vpos);
+
+	if (wnd->state != dsw_resizing)
+		return;
+
+	pos.x = event->hpos;
+	pos.y = event->vpos;
+	gfx_coord2_subtract(&pos, &wnd->orig_pos, &dresize);
+
+	/* Compute new rectangle */
+	ds_window_calc_resize(wnd, &dresize, &nrect);
+
+	wnd->state = dsw_idle;
+	ds_client_post_resize_event(wnd->client, wnd, &nrect);
+}
+
+/** Update window position when resizing by mouse drag.
+ *
+ * @param wnd Window
+ * @param event Position update event
+ */
+static void ds_window_update_resize(ds_window_t *wnd, pos_event_t *event)
+{
+	gfx_coord2_t pos;
+	gfx_coord2_t dresize;
+	gfx_rect_t nrect;
+	gfx_rect_t drect;
+	gfx_color_t *color;
+	gfx_context_t *gc;
+	errno_t rc;
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_update_resize (%d, %d)",
+	    (int) event->hpos, (int) event->vpos);
+
+	if (wnd->state != dsw_resizing)
+		return;
+
+	gfx_rect_translate(&wnd->dpos, &wnd->rect, &drect);
+
+	gc = ds_display_get_gc(wnd->display); // XXX
+	if (gc != NULL) {
+		gfx_set_color(gc, wnd->display->bg_color);
+		gfx_fill_rect(gc, &drect);
+	}
+
+	pos.x = event->hpos;
+	pos.y = event->vpos;
+	gfx_coord2_subtract(&pos, &wnd->orig_pos, &dresize);
+
+	ds_window_calc_resize(wnd, &dresize, &nrect);
+	gfx_rect_translate(&wnd->dpos, &nrect, &drect);
+
+	rc = gfx_color_new_rgb_i16(0xffff, 0xffff, 0xffff, &color);
+	if (rc != EOK)
+		return;
+
+	gc = ds_display_get_gc(wnd->display); // XXX
+	if (gc != NULL) {
+		gfx_set_color(gc, color);
+		gfx_fill_rect(gc, &drect);
+	}
+
+	gfx_color_delete(color);
+}
+
 /** Post keyboard event to window.
  *
@@ -599,9 +657,13 @@
 		ds_window_start_move(wnd, event);
 
-	if (event->type == POS_RELEASE)
+	if (event->type == POS_RELEASE) {
 		ds_window_finish_move(wnd, event);
-
-	if (event->type == POS_UPDATE)
+		ds_window_finish_resize(wnd, event);
+	}
+
+	if (event->type == POS_UPDATE) {
 		ds_window_update_move(wnd, event);
+		ds_window_update_resize(wnd, event);
+	}
 
 	/* Transform event coordinates to window-local */
@@ -635,4 +697,67 @@
 }
 
+/** Start moving a window, detected by client.
+ *
+ * @param wnd Window
+ * @param pos Position where the pointer was when the move started
+ *            relative to the window
+ * @param event Button press event
+ */
+void ds_window_move_req(ds_window_t *wnd, gfx_coord2_t *pos)
+{
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "ds_window_move_req (%d, %d)",
+	    (int) pos->x, (int) pos->y);
+
+	if (wnd->state != dsw_idle)
+		return;
+
+	gfx_coord2_add(&wnd->dpos, pos, &wnd->orig_pos);
+	wnd->state = dsw_moving;
+}
+
+/** Start resizing a window, detected by client.
+ *
+ * @param wnd Window
+ * @param rsztype Resize type (which part of window is being dragged)
+ * @param pos Position where the pointer was when the resize started
+ *            relative to the window
+ * @param event Button press event
+ */
+void ds_window_resize_req(ds_window_t *wnd, display_wnd_rsztype_t rsztype,
+    gfx_coord2_t *pos)
+{
+	log_msg(LOG_DEFAULT, LVL_NOTE, "ds_window_resize_req (%d, %d, %d)",
+	    (int) rsztype, (int) pos->x, (int) pos->y);
+
+	if (wnd->state != dsw_idle)
+		return;
+
+	gfx_coord2_add(&wnd->dpos, pos, &wnd->orig_pos);
+	wnd->state = dsw_resizing;
+	wnd->rsztype = rsztype;
+}
+
+/** Compute new window rectangle after resize operation.
+ *
+ * @param wnd Window which is being resized (in dsw_resizing state and thus
+ *            has rsztype set)
+ * @param dresize Amount by which to resize
+ * @param nrect Place to store new rectangle
+ */
+void ds_window_calc_resize(ds_window_t *wnd, gfx_coord2_t *dresize,
+    gfx_rect_t *nrect)
+{
+	*nrect = wnd->rect;
+
+	if ((wnd->rsztype & display_wr_top) != 0)
+		nrect->p0.y += dresize->y;
+	if ((wnd->rsztype & display_wr_left) != 0)
+		nrect->p0.x += dresize->x;
+	if ((wnd->rsztype & display_wr_bottom) != 0)
+		nrect->p1.y += dresize->y;
+	if ((wnd->rsztype & display_wr_right) != 0)
+		nrect->p1.x += dresize->x;
+}
+
 /** @}
  */
Index: uspace/srv/hid/display/window.h
===================================================================
--- uspace/srv/hid/display/window.h	(revision 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
+++ uspace/srv/hid/display/window.h	(revision e0228190e56b2405620ccda32362ae157ee28834)
@@ -37,4 +37,6 @@
 #define WINDOW_H
 
+#include <display/wndparams.h>
+#include <display/wndresize.h>
 #include <errno.h>
 #include <io/pos_event.h>
@@ -44,5 +46,4 @@
 #include "types/display/display.h"
 #include "types/display/window.h"
-#include "types/display/wndparams.h"
 
 extern gfx_context_ops_t window_gc_ops;
@@ -59,4 +60,8 @@
 extern errno_t ds_window_post_unfocus_event(ds_window_t *);
 extern void ds_window_move_req(ds_window_t *wnd, gfx_coord2_t *);
+extern void ds_window_resize_req(ds_window_t *wnd, display_wnd_rsztype_t,
+    gfx_coord2_t *);
+extern void ds_window_calc_resize(ds_window_t *wnd, gfx_coord2_t *,
+    gfx_rect_t *);
 
 #endif
