Index: uspace/app/gfxdemo/gfxdemo.c
===================================================================
--- uspace/app/gfxdemo/gfxdemo.c	(revision 4fbdc3d4f4d1d992db668ffd58dad07f9d4a07db)
+++ uspace/app/gfxdemo/gfxdemo.c	(revision 4d9c8071cfd4fd433a31ad7f0edce89077cb3892)
@@ -456,4 +456,5 @@
 	display_t *display = NULL;
 	gfx_context_t *gc;
+	display_wnd_params_t params;
 	display_window_t *window = NULL;
 	errno_t rc;
@@ -467,5 +468,11 @@
 	}
 
-	rc = display_window_create(display, &wnd_cb, NULL, &window);
+	display_wnd_params_init(&params);
+	params.rect.p0.x = 0;
+	params.rect.p0.y = 0;
+	params.rect.p1.x = 400;
+	params.rect.p1.y = 300;
+
+	rc = display_window_create(display, &params, &wnd_cb, NULL, &window);
 	if (rc != EOK) {
 		printf("Error creating window.\n");
Index: uspace/app/terminal/terminal.c
===================================================================
--- uspace/app/terminal/terminal.c	(revision 4fbdc3d4f4d1d992db668ffd58dad07f9d4a07db)
+++ uspace/app/terminal/terminal.c	(revision 4d9c8071cfd4fd433a31ad7f0edce89077cb3892)
@@ -715,4 +715,5 @@
 	terminal_t *term;
 	gfx_bitmap_params_t params;
+	display_wnd_params_t wparams;
 	errno_t rc;
 
@@ -755,6 +756,12 @@
 	}
 
-	rc = display_window_create(display, &terminal_wnd_cb, (void *) term,
-	    &term->window);
+	display_wnd_params_init(&wparams);
+	wparams.rect.p0.x = 0;
+	wparams.rect.p0.y = 0;
+	wparams.rect.p1.x = width;
+	wparams.rect.p1.y = height;
+
+	rc = display_window_create(display, &wparams, &terminal_wnd_cb,
+	    (void *) term, &term->window);
 	if (rc != EOK) {
 		printf("Error creating window.\n");
Index: uspace/lib/display/include/disp_srv.h
===================================================================
--- uspace/lib/display/include/disp_srv.h	(revision 4fbdc3d4f4d1d992db668ffd58dad07f9d4a07db)
+++ uspace/lib/display/include/disp_srv.h	(revision 4d9c8071cfd4fd433a31ad7f0edce89077cb3892)
@@ -39,4 +39,5 @@
 #include <errno.h>
 #include <types/display/event.h>
+#include <types/display/wndparams.h>
 
 typedef struct display_ops display_ops_t;
@@ -50,5 +51,5 @@
 
 struct display_ops {
-	errno_t (*window_create)(void *, sysarg_t *);
+	errno_t (*window_create)(void *, display_wnd_params_t *, sysarg_t *);
 	errno_t (*window_destroy)(void *, sysarg_t);
 	errno_t (*get_event)(void *, sysarg_t *, display_wnd_ev_t *);
Index: uspace/lib/display/include/display.h
===================================================================
--- uspace/lib/display/include/display.h	(revision 4fbdc3d4f4d1d992db668ffd58dad07f9d4a07db)
+++ uspace/lib/display/include/display.h	(revision 4d9c8071cfd4fd433a31ad7f0edce89077cb3892)
@@ -39,10 +39,12 @@
 #include <gfx/context.h>
 #include <stdbool.h>
+#include "types/display/wndparams.h"
 #include "types/display.h"
 
 extern errno_t display_open(const char *, display_t **);
 extern void display_close(display_t *);
-extern errno_t display_window_create(display_t *, display_wnd_cb_t *,
-    void *, display_window_t **);
+extern void display_wnd_params_init(display_wnd_params_t *);
+extern errno_t display_window_create(display_t *, display_wnd_params_t *,
+    display_wnd_cb_t *, void *, display_window_t **);
 extern errno_t display_window_destroy(display_window_t *);
 extern errno_t display_window_get_gc(display_window_t *, gfx_context_t **);
Index: uspace/lib/display/include/types/display/wndparams.h
===================================================================
--- uspace/lib/display/include/types/display/wndparams.h	(revision 4d9c8071cfd4fd433a31ad7f0edce89077cb3892)
+++ uspace/lib/display/include/types/display/wndparams.h	(revision 4d9c8071cfd4fd433a31ad7f0edce89077cb3892)
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2019 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup libdisplay
+ * @{
+ */
+/** @file
+ */
+
+#ifndef _LIBDISPLAY_TYPES_DISPLAY_WNDPARAMS_H_
+#define _LIBDISPLAY_TYPES_DISPLAY_WNDPARAMS_H_
+
+#include <gfx/coord.h>
+
+/** Parameters for a new window.
+ *
+ * The window's dimensions are determined by the bounding rectangle,
+ * the position of which does not relate to its positon on the display,
+ * it just determines which range of logical coordinates is used
+ * by the window.
+ */
+typedef struct {
+	/** Bounding rectangle */
+	gfx_rect_t rect;
+} display_wnd_params_t;
+
+#endif
+
+/** @}
+ */
Index: uspace/lib/display/src/disp_srv.c
===================================================================
--- uspace/lib/display/src/disp_srv.c	(revision 4fbdc3d4f4d1d992db668ffd58dad07f9d4a07db)
+++ uspace/lib/display/src/disp_srv.c	(revision 4d9c8071cfd4fd433a31ad7f0edce89077cb3892)
@@ -62,7 +62,29 @@
 {
 	sysarg_t wnd_id;
+	ipc_call_t call;
+	display_wnd_params_t params;
+	size_t size;
 	errno_t rc;
 
 	printf("display_window_create_srv\n");
+
+	if (!async_data_write_receive(&call, &size)) {
+		async_answer_0(&call, EREFUSED);
+		async_answer_0(icall, EREFUSED);
+		return;
+	}
+
+	if (size != sizeof(display_wnd_params_t)) {
+		async_answer_0(&call, EINVAL);
+		async_answer_0(icall, EINVAL);
+		return;
+	}
+
+	rc = async_data_write_finalize(&call, &params, size);
+	if (rc != EOK) {
+		async_answer_0(&call, rc);
+		async_answer_0(icall, rc);
+		return;
+	}
 
 	if (srv->ops->window_create == NULL) {
@@ -71,5 +93,5 @@
 	}
 
-	rc = srv->ops->window_create(srv->arg, &wnd_id);
+	rc = srv->ops->window_create(srv->arg, &params, &wnd_id);
 	async_answer_1(icall, rc, wnd_id);
 }
Index: uspace/lib/display/src/display.c
===================================================================
--- uspace/lib/display/src/display.c	(revision 4fbdc3d4f4d1d992db668ffd58dad07f9d4a07db)
+++ uspace/lib/display/src/display.c	(revision 4d9c8071cfd4fd433a31ad7f0edce89077cb3892)
@@ -36,4 +36,5 @@
 #include <ipcgfx/client.h>
 #include <loc.h>
+#include <mem.h>
 #include <stdlib.h>
 
@@ -133,7 +134,17 @@
 }
 
+/** Initialize window parameters structure.
+ *
+ * @param params Window parameters structure
+ */
+void display_wnd_params_init(display_wnd_params_t *params)
+{
+	memset(params, 0, sizeof(*params));
+}
+
 /** Create a display window.
  *
  * @param display Display
+ * @param params Window parameters
  * @param cb Callback functions
  * @param cb_arg Argument to callback functions
@@ -141,10 +152,11 @@
  * @return EOK on success or an error code
  */
-errno_t display_window_create(display_t *display, display_wnd_cb_t *cb,
-    void *cb_arg, display_window_t **rwindow)
+errno_t display_window_create(display_t *display, display_wnd_params_t *params,
+    display_wnd_cb_t *cb, void *cb_arg, display_window_t **rwindow)
 {
 	display_window_t *window;
 	async_exch_t *exch;
-	sysarg_t wnd_id;
+	aid_t req;
+	ipc_call_t answer;
 	errno_t rc;
 
@@ -154,15 +166,18 @@
 
 	exch = async_exchange_begin(display->sess);
-	rc = async_req_0_1(exch, DISPLAY_WINDOW_CREATE, &wnd_id);
-
-	async_exchange_end(exch);
-
-	if (rc != EOK) {
-		free(window);
-		return rc;
-	}
+	req = async_send_0(exch, DISPLAY_WINDOW_CREATE, &answer);
+	rc = async_data_write_start(exch, params, sizeof (display_wnd_params_t));
+	async_exchange_end(exch);
+	if (rc != EOK) {
+		async_forget(req);
+		return rc;
+	}
+
+	async_wait_for(req, &rc);
+	if (rc != EOK)
+		return rc;
 
 	window->display = display;
-	window->id = wnd_id;
+	window->id = ipc_get_arg1(&answer);
 	window->cb = cb;
 	window->cb_arg = cb_arg;
Index: uspace/lib/display/test/display.c
===================================================================
--- uspace/lib/display/test/display.c	(revision 4fbdc3d4f4d1d992db668ffd58dad07f9d4a07db)
+++ uspace/lib/display/test/display.c	(revision 4d9c8071cfd4fd433a31ad7f0edce89077cb3892)
@@ -49,5 +49,5 @@
 static void test_kbd_event(void *, kbd_event_t *);
 
-static errno_t test_window_create(void *, sysarg_t *);
+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_get_event(void *, sysarg_t *, display_wnd_ev_t *);
@@ -79,4 +79,5 @@
 	int event_cnt;
 	bool window_create_called;
+	gfx_rect_t create_rect;
 	bool window_destroy_called;
 	bool get_event_called;
@@ -120,4 +121,5 @@
 	service_id_t sid;
 	display_t *disp = NULL;
+	display_wnd_params_t params;
 	display_window_t *wnd;
 	test_response_t resp;
@@ -139,6 +141,17 @@
 	resp.rc = ENOMEM;
 	resp.window_create_called = false;
-	rc = display_window_create(disp, &test_display_wnd_cb, NULL, &wnd);
+	display_wnd_params_init(&params);
+	params.rect.p0.x = 0;
+	params.rect.p0.y = 0;
+	params.rect.p0.x = 100;
+	params.rect.p0.y = 100;
+
+	rc = display_window_create(disp, &params, &test_display_wnd_cb,
+	    (void *) &resp, &wnd);
 	PCUT_ASSERT_TRUE(resp.window_create_called);
+	PCUT_ASSERT_EQUALS(params.rect.p0.x, resp.create_rect.p0.x);
+	PCUT_ASSERT_EQUALS(params.rect.p0.y, resp.create_rect.p0.y);
+	PCUT_ASSERT_EQUALS(params.rect.p1.x, resp.create_rect.p1.x);
+	PCUT_ASSERT_EQUALS(params.rect.p1.y, resp.create_rect.p1.y);
 	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
 	PCUT_ASSERT_NULL(wnd);
@@ -158,4 +171,5 @@
 	service_id_t sid;
 	display_t *disp = NULL;
+	display_wnd_params_t params;
 	display_window_t *wnd;
 	test_response_t resp;
@@ -177,6 +191,17 @@
 	resp.rc = EOK;
 	resp.window_create_called = false;
-	rc = display_window_create(disp, &test_display_wnd_cb, NULL, &wnd);
+	display_wnd_params_init(&params);
+	params.rect.p0.x = 0;
+	params.rect.p0.y = 0;
+	params.rect.p0.x = 100;
+	params.rect.p0.y = 100;
+
+	rc = display_window_create(disp, &params, &test_display_wnd_cb,
+	    (void *) &resp, &wnd);
 	PCUT_ASSERT_TRUE(resp.window_create_called);
+	PCUT_ASSERT_EQUALS(params.rect.p0.x, resp.create_rect.p0.x);
+	PCUT_ASSERT_EQUALS(params.rect.p0.y, resp.create_rect.p0.y);
+	PCUT_ASSERT_EQUALS(params.rect.p1.x, resp.create_rect.p1.x);
+	PCUT_ASSERT_EQUALS(params.rect.p1.y, resp.create_rect.p1.y);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(wnd);
@@ -198,4 +223,5 @@
 	service_id_t sid;
 	display_t *disp = NULL;
+	display_wnd_params_t params;
 	display_window_t *wnd;
 	test_response_t resp;
@@ -216,6 +242,17 @@
 	resp.rc = EOK;
 	resp.window_create_called = false;
-	rc = display_window_create(disp, &test_display_wnd_cb, NULL, &wnd);
+	display_wnd_params_init(&params);
+	params.rect.p0.x = 0;
+	params.rect.p0.y = 0;
+	params.rect.p0.x = 100;
+	params.rect.p0.y = 100;
+
+	rc = display_window_create(disp, &params, &test_display_wnd_cb,
+	    (void *) &resp, &wnd);
 	PCUT_ASSERT_TRUE(resp.window_create_called);
+	PCUT_ASSERT_EQUALS(params.rect.p0.x, resp.create_rect.p0.x);
+	PCUT_ASSERT_EQUALS(params.rect.p0.y, resp.create_rect.p0.y);
+	PCUT_ASSERT_EQUALS(params.rect.p1.x, resp.create_rect.p1.x);
+	PCUT_ASSERT_EQUALS(params.rect.p1.y, resp.create_rect.p1.y);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(wnd);
@@ -238,4 +275,5 @@
 	service_id_t sid;
 	display_t *disp = NULL;
+	display_wnd_params_t params;
 	display_window_t *wnd;
 	test_response_t resp;
@@ -257,5 +295,12 @@
 	wnd = NULL;
 	resp.rc = EOK;
-	rc = display_window_create(disp, &test_display_wnd_cb, NULL, &wnd);
+	display_wnd_params_init(&params);
+	params.rect.p0.x = 0;
+	params.rect.p0.y = 0;
+	params.rect.p0.x = 100;
+	params.rect.p0.y = 100;
+
+	rc = display_window_create(disp, &params, &test_display_wnd_cb,
+	    (void *) &resp, &wnd);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(wnd);
@@ -283,4 +328,5 @@
 	service_id_t sid;
 	display_t *disp = NULL;
+	display_wnd_params_t params;
 	display_window_t *wnd;
 	test_response_t resp;
@@ -303,5 +349,12 @@
 	wnd = NULL;
 	resp.rc = EOK;
-	rc = display_window_create(disp, &test_display_wnd_cb, NULL, &wnd);
+	display_wnd_params_init(&params);
+	params.rect.p0.x = 0;
+	params.rect.p0.y = 0;
+	params.rect.p0.x = 100;
+	params.rect.p0.y = 100;
+
+	rc = display_window_create(disp, &params, &test_display_wnd_cb,
+	    (void *) &resp, &wnd);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(wnd);
@@ -336,4 +389,5 @@
 	service_id_t sid;
 	display_t *disp = NULL;
+	display_wnd_params_t params;
 	display_window_t *wnd;
 	test_response_t resp;
@@ -356,6 +410,12 @@
 	wnd = NULL;
 	resp.rc = EOK;
-	rc = display_window_create(disp, &test_display_wnd_cb, (void *) &resp,
-	    &wnd);
+	display_wnd_params_init(&params);
+	params.rect.p0.x = 0;
+	params.rect.p0.y = 0;
+	params.rect.p0.x = 100;
+	params.rect.p0.y = 100;
+
+	rc = display_window_create(disp, &params, &test_display_wnd_cb,
+	    (void *) &resp, &wnd);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(wnd);
@@ -462,9 +522,11 @@
 }
 
-static errno_t test_window_create(void *arg, sysarg_t *rwnd_id)
+static errno_t test_window_create(void *arg, display_wnd_params_t *params,
+    sysarg_t *rwnd_id)
 {
 	test_response_t *resp = (test_response_t *) arg;
 
 	resp->window_create_called = true;
+	resp->create_rect = params->rect;
 	if (resp->rc == EOK)
 		*rwnd_id = resp->wnd_id;
Index: uspace/srv/hid/display/dsops.c
===================================================================
--- uspace/srv/hid/display/dsops.c	(revision 4fbdc3d4f4d1d992db668ffd58dad07f9d4a07db)
+++ uspace/srv/hid/display/dsops.c	(revision 4d9c8071cfd4fd433a31ad7f0edce89077cb3892)
@@ -43,5 +43,5 @@
 #include "window.h"
 
-static errno_t disp_window_create(void *, sysarg_t *);
+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_get_event(void *, sysarg_t *, display_wnd_ev_t *);
@@ -53,5 +53,6 @@
 };
 
-static errno_t disp_window_create(void *arg, sysarg_t *rwnd_id)
+static errno_t disp_window_create(void *arg, display_wnd_params_t *params,
+    sysarg_t *rwnd_id)
 {
 	errno_t rc;
