Index: uspace/srv/hid/display/client.c
===================================================================
--- uspace/srv/hid/display/client.c	(revision f5191b449e0b356b9d44b1a2339ee32df02f1200)
+++ uspace/srv/hid/display/client.c	(revision b252e878bcde3d889907ddd89352eb92e233aa16)
@@ -221,5 +221,6 @@
 
 	wevent->window = ewindow;
-	wevent->event.kbd_event = *event;
+	wevent->event.etype = wev_kbd;
+	wevent->event.ev.kbd = *event;
 	list_append(&wevent->levents, &client->events);
 
@@ -231,4 +232,34 @@
 }
 
+/** Post position event to the client's message queue.
+ *
+ * @param client Client
+ * @param ewindow Window that the message is targetted to
+ * @param event Event
+ *
+ * @return EOK on success or an error code
+ */
+errno_t ds_client_post_pos_event(ds_client_t *client, ds_window_t *ewindow,
+    pos_event_t *event)
+{
+	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_pos;
+	wevent->event.ev.pos = *event;
+	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;
+}
+
 /** @}
  */
Index: uspace/srv/hid/display/client.h
===================================================================
--- uspace/srv/hid/display/client.h	(revision f5191b449e0b356b9d44b1a2339ee32df02f1200)
+++ uspace/srv/hid/display/client.h	(revision b252e878bcde3d889907ddd89352eb92e233aa16)
@@ -39,4 +39,5 @@
 #include <errno.h>
 #include <io/kbd_event.h>
+#include <io/pos_event.h>
 #include "types/display/client.h"
 #include "types/display/display.h"
@@ -54,4 +55,6 @@
 extern errno_t ds_client_post_kbd_event(ds_client_t *, ds_window_t *,
     kbd_event_t *);
+extern errno_t ds_client_post_pos_event(ds_client_t *, ds_window_t *,
+    pos_event_t *);
 
 #endif
Index: uspace/srv/hid/display/test/client.c
===================================================================
--- uspace/srv/hid/display/test/client.c	(revision f5191b449e0b356b9d44b1a2339ee32df02f1200)
+++ uspace/srv/hid/display/test/client.c	(revision b252e878bcde3d889907ddd89352eb92e233aa16)
@@ -206,8 +206,64 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_EQUALS(wnd, rwindow);
-	PCUT_ASSERT_EQUALS(event.type, revent.kbd_event.type);
-	PCUT_ASSERT_EQUALS(event.key, revent.kbd_event.key);
-	PCUT_ASSERT_EQUALS(event.mods, revent.kbd_event.mods);
-	PCUT_ASSERT_EQUALS(event.c, revent.kbd_event.c);
+	PCUT_ASSERT_EQUALS(wev_kbd, revent.etype);
+	PCUT_ASSERT_EQUALS(event.type, revent.ev.kbd.type);
+	PCUT_ASSERT_EQUALS(event.key, revent.ev.kbd.key);
+	PCUT_ASSERT_EQUALS(event.mods, revent.ev.kbd.mods);
+	PCUT_ASSERT_EQUALS(event.c, revent.ev.kbd.c);
+
+	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_pos_event(). */
+PCUT_TEST(client_get_post_pos_event)
+{
+	ds_display_t *disp;
+	ds_client_t *client;
+	ds_window_t *wnd;
+	display_wnd_params_t params;
+	pos_event_t event;
+	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);
+
+	event.type = POS_PRESS;
+	event.hpos = 1;
+	event.vpos = 2;
+
+	PCUT_ASSERT_FALSE(called_cb);
+
+	rc = ds_client_get_event(client, &rwindow, &revent);
+	PCUT_ASSERT_ERRNO_VAL(ENOENT, rc);
+
+	rc = ds_client_post_pos_event(client, wnd, &event);
+	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_pos, revent.etype);
+	PCUT_ASSERT_EQUALS(event.type, revent.ev.pos.type);
+	PCUT_ASSERT_EQUALS(event.hpos, revent.ev.pos.hpos);
+	PCUT_ASSERT_EQUALS(event.vpos, revent.ev.pos.vpos);
 
 	rc = ds_client_get_event(client, &rwindow, &revent);
Index: uspace/srv/hid/display/test/display.c
===================================================================
--- uspace/srv/hid/display/test/display.c	(revision f5191b449e0b356b9d44b1a2339ee32df02f1200)
+++ uspace/srv/hid/display/test/display.c	(revision b252e878bcde3d889907ddd89352eb92e233aa16)
@@ -377,6 +377,4 @@
 	w1->dpos.y = 400;
 
-	PCUT_ASSERT_FALSE(called_cb);
-
 	ds_seat_set_focus(seat, w0);
 
@@ -386,5 +384,4 @@
 	rc = ds_display_post_ptd_event(disp, &event);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-	PCUT_ASSERT_FALSE(called_cb);
 
 	event.type = PTD_PRESS;
@@ -392,5 +389,4 @@
 	rc = ds_display_post_ptd_event(disp, &event);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-	PCUT_ASSERT_FALSE(called_cb);
 
 	PCUT_ASSERT_EQUALS(w1, seat->focus);
@@ -400,5 +396,4 @@
 	rc = ds_display_post_ptd_event(disp, &event);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-	PCUT_ASSERT_FALSE(called_cb);
 
 	event.type = PTD_MOVE;
@@ -407,5 +402,4 @@
 	rc = ds_display_post_ptd_event(disp, &event);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-	PCUT_ASSERT_FALSE(called_cb);
 
 	event.type = PTD_PRESS;
@@ -413,5 +407,4 @@
 	rc = ds_display_post_ptd_event(disp, &event);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-	PCUT_ASSERT_FALSE(called_cb);
 
 	PCUT_ASSERT_EQUALS(w0, seat->focus);
Index: uspace/srv/hid/display/test/seat.c
===================================================================
--- uspace/srv/hid/display/test/seat.c	(revision f5191b449e0b356b9d44b1a2339ee32df02f1200)
+++ uspace/srv/hid/display/test/seat.c	(revision b252e878bcde3d889907ddd89352eb92e233aa16)
@@ -232,8 +232,9 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_EQUALS(wnd, rwindow);
-	PCUT_ASSERT_EQUALS(event.type, revent.kbd_event.type);
-	PCUT_ASSERT_EQUALS(event.key, revent.kbd_event.key);
-	PCUT_ASSERT_EQUALS(event.mods, revent.kbd_event.mods);
-	PCUT_ASSERT_EQUALS(event.c, revent.kbd_event.c);
+	PCUT_ASSERT_EQUALS(wev_kbd, revent.etype);
+	PCUT_ASSERT_EQUALS(event.type, revent.ev.kbd.type);
+	PCUT_ASSERT_EQUALS(event.key, revent.ev.kbd.key);
+	PCUT_ASSERT_EQUALS(event.mods, revent.ev.kbd.mods);
+	PCUT_ASSERT_EQUALS(event.c, revent.ev.kbd.c);
 
 	rc = ds_client_get_event(client, &rwindow, &revent);
Index: uspace/srv/hid/display/window.c
===================================================================
--- uspace/srv/hid/display/window.c	(revision f5191b449e0b356b9d44b1a2339ee32df02f1200)
+++ uspace/srv/hid/display/window.c	(revision b252e878bcde3d889907ddd89352eb92e233aa16)
@@ -489,4 +489,6 @@
 errno_t ds_window_post_pos_event(ds_window_t *wnd, pos_event_t *event)
 {
+	pos_event_t tevent;
+
 	log_msg(LOG_DEFAULT, LVL_DEBUG,
 	    "ds_window_post_pos_event type=%d pos=%d,%d\n", event->type,
@@ -508,5 +510,10 @@
 	}
 
-	return EOK;
+	/* Transform event coordinates to window-local */
+	tevent = *event;
+	tevent.hpos -= wnd->dpos.x;
+	tevent.vpos -= wnd->dpos.y;
+
+	return ds_client_post_pos_event(wnd->client, wnd, &tevent);
 }
 
