Index: uspace/lib/display/src/disp_srv.c
===================================================================
--- uspace/lib/display/src/disp_srv.c	(revision a2e104e0deacc5a9fdacf4d8e3824726c77c47a5)
+++ uspace/lib/display/src/disp_srv.c	(revision 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
@@ -37,4 +37,5 @@
 #include <disp_srv.h>
 #include <display/event.h>
+#include <display/wndresize.h>
 #include <errno.h>
 #include <io/log.h>
@@ -147,4 +148,44 @@
 }
 
+static void display_window_resize_req_srv(display_srv_t *srv, ipc_call_t *icall)
+{
+	sysarg_t wnd_id;
+	ipc_call_t call;
+	display_wnd_rsztype_t rsztype;
+	gfx_coord2_t pos;
+	size_t size;
+	errno_t rc;
+
+	wnd_id = ipc_get_arg1(icall);
+	rsztype = (display_wnd_rsztype_t) ipc_get_arg2(icall);
+
+	if (!async_data_write_receive(&call, &size)) {
+		async_answer_0(&call, EREFUSED);
+		async_answer_0(icall, EREFUSED);
+		return;
+	}
+
+	if (size != sizeof(gfx_coord2_t)) {
+		async_answer_0(&call, EINVAL);
+		async_answer_0(icall, EINVAL);
+		return;
+	}
+
+	rc = async_data_write_finalize(&call, &pos, size);
+	if (rc != EOK) {
+		async_answer_0(&call, rc);
+		async_answer_0(icall, rc);
+		return;
+	}
+
+	if (srv->ops->window_resize_req == NULL) {
+		async_answer_0(icall, ENOTSUP);
+		return;
+	}
+
+	rc = srv->ops->window_resize_req(srv->arg, wnd_id, rsztype, &pos);
+	async_answer_0(icall, rc);
+}
+
 static void display_window_resize_srv(display_srv_t *srv, ipc_call_t *icall)
 {
@@ -256,4 +297,7 @@
 		case DISPLAY_WINDOW_MOVE_REQ:
 			display_window_move_req_srv(srv, &call);
+			break;
+		case DISPLAY_WINDOW_RESIZE_REQ:
+			display_window_resize_req_srv(srv, &call);
 			break;
 		case DISPLAY_WINDOW_RESIZE:
Index: uspace/lib/display/src/display.c
===================================================================
--- uspace/lib/display/src/display.c	(revision a2e104e0deacc5a9fdacf4d8e3824726c77c47a5)
+++ uspace/lib/display/src/display.c	(revision 1e4a937d249f5477ae9be53bbb34c94e8942f19d)
@@ -251,4 +251,5 @@
  *
  * @param window Window
+ * @param pos Position in the window where the button was pressed
  * @return EOK on success or an error code
  */
@@ -262,4 +263,40 @@
 	exch = async_exchange_begin(window->display->sess);
 	req = async_send_1(exch, DISPLAY_WINDOW_MOVE_REQ, window->id, &answer);
+	rc = async_data_write_start(exch, (void *)pos, sizeof (gfx_coord2_t));
+	async_exchange_end(exch);
+	if (rc != EOK) {
+		async_forget(req);
+		return rc;
+	}
+
+	async_wait_for(req, &rc);
+	if (rc != EOK)
+		return rc;
+
+	return EOK;
+}
+
+/** Request a window resize.
+ *
+ * Request the display service to initiate a user window resize operation
+ * (i.e. let the user resize the window). Used when the client detects
+ * mouse press on the window frame or such.
+ *
+ * @param window Window
+ * @param rsztype Resize type (which part of window frame is being dragged)
+ * @param pos Position in the window where the button was pressed
+ * @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);
 	rc = async_data_write_start(exch, (void *)pos, sizeof (gfx_coord2_t));
 	async_exchange_end(exch);
