Index: uspace/lib/display/src/disp_srv.c
===================================================================
--- uspace/lib/display/src/disp_srv.c	(revision 973efd3684d83cf125f752dd057beb73441fa8f2)
+++ uspace/lib/display/src/disp_srv.c	(revision fb420e48d741bf6fe291bdb165ec1a5626f87fa1)
@@ -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 973efd3684d83cf125f752dd057beb73441fa8f2)
+++ uspace/lib/display/src/display.c	(revision fb420e48d741bf6fe291bdb165ec1a5626f87fa1)
@@ -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;
