Index: uspace/srv/hid/display/main.c
===================================================================
--- uspace/srv/hid/display/main.c	(revision 7a05d92432149535737f64b23841348ad9053a0c)
+++ uspace/srv/hid/display/main.c	(revision 1b92d4b53fe9235e85d98684285dfaa75b944c07)
@@ -56,8 +56,10 @@
 #include "seat.h"
 #include "window.h"
+#include "wmclient.h"
 #include "wmops.h"
 
 static void display_client_conn(ipc_call_t *, void *);
 static void display_client_ev_pending(void *);
+static void display_wmclient_ev_pending(void *);
 static void display_gc_conn(ipc_call_t *, void *);
 static void display_wndmgt_conn(ipc_call_t *, void *);
@@ -80,4 +82,8 @@
 };
 
+static ds_wmclient_cb_t display_wmclient_cb = {
+	.ev_pending = display_wmclient_ev_pending
+};
+
 static void display_client_ev_pending(void *arg)
 {
@@ -85,4 +91,11 @@
 
 	display_srv_ev_pending(srv);
+}
+
+static void display_wmclient_ev_pending(void *arg)
+{
+	wndmgt_srv_t *srv = (wndmgt_srv_t *) arg;
+
+	wndmgt_srv_ev_pending(srv);
 }
 
@@ -189,5 +202,7 @@
 	if (svc_id != 0) {
 		/* Create client object */
+		ds_display_lock(disp);
 		rc = ds_client_create(disp, &display_client_cb, &srv, &client);
+		ds_display_unlock(disp);
 		if (rc != EOK) {
 			async_answer_0(icall, ENOMEM);
@@ -243,13 +258,28 @@
 {
 	ds_display_t *disp = (ds_display_t *) arg;
+	errno_t rc;
 	wndmgt_srv_t srv;
+	ds_wmclient_t *wmclient = NULL;
+
+	/* Create WM client object */
+	ds_display_lock(disp);
+	rc = ds_wmclient_create(disp, &display_wmclient_cb, &srv, &wmclient);
+	ds_display_unlock(disp);
+	if (rc != EOK) {
+		async_answer_0(icall, ENOMEM);
+		return;
+	}
 
 	/* Set up protocol structure */
 	wndmgt_srv_initialize(&srv);
 	srv.ops = &wndmgt_srv_ops;
-	srv.arg = disp;
+	srv.arg = wmclient;
 
 	/* Handle connection */
 	wndmgt_conn(icall, &srv);
+
+	ds_display_lock(disp);
+	ds_wmclient_destroy(wmclient);
+	ds_display_unlock(disp);
 }
 
