Index: uspace/app/taskbar/wndlist.c
===================================================================
--- uspace/app/taskbar/wndlist.c	(revision f1f433d10ab8dfdc792a9cdc8807b76dbcfac663)
+++ uspace/app/taskbar/wndlist.c	(revision 3a6d44b7107686f79a1655757bb73fedf182438b)
@@ -50,8 +50,16 @@
 static void wndlist_wm_window_changed(void *, sysarg_t);
 
+/** Window list WM callbacks */
 static wndmgt_cb_t wndlist_wndmgt_cb = {
 	.window_added = wndlist_wm_window_added,
 	.window_removed = wndlist_wm_window_removed,
 	.window_changed = wndlist_wm_window_changed
+};
+
+static void wndlist_button_clicked(ui_pbutton_t *, void *);
+
+/** Window list button callbacks */
+static ui_pbutton_cb_t wndlist_button_cb = {
+	.clicked = wndlist_button_clicked
 };
 
@@ -186,4 +194,7 @@
 	/* Set the button rectangle */
 	wndlist_set_entry_rect(wndlist, entry);
+
+	/* Set button callbacks */
+	ui_pbutton_set_cb(entry->button, &wndlist_button_cb, (void *)entry);
 
 	rc = ui_fixed_add(wndlist->fixed, ui_pbutton_ctl(entry->button));
@@ -340,7 +351,4 @@
 	wndlist_entry_t *entry;
 
-	printf("wm_window_removed: wndlist=%p wnd_id=%zu\n",
-	    (void *)wndlist, wnd_id);
-
 	entry = wndlist_entry_by_id(wndlist, wnd_id);
 	if (entry == NULL)
@@ -361,7 +369,4 @@
 	wndlist_entry_t *entry;
 	errno_t rc;
-
-	printf("wm_window_changed: wndlist=%p wnd_id=%zu\n",
-	    (void *)wndlist, wnd_id);
 
 	entry = wndlist_entry_by_id(wndlist, wnd_id);
@@ -440,4 +445,20 @@
 }
 
+/** Window button was clicked.
+ *
+ * @param pbutton Push button
+ * @param arg Argument (wdnlist_entry_t *)
+ */
+static void wndlist_button_clicked(ui_pbutton_t *pbutton, void *arg)
+{
+	wndlist_entry_t *entry = (wndlist_entry_t *)arg;
+	sysarg_t seat_id;
+
+	seat_id = 0; // TODO Multi-seat
+
+	(void) wndmgt_activate_window(entry->wndlist->wndmgt,
+	    seat_id, entry->wnd_id);
+}
+
 /** @}
  */
Index: uspace/lib/wndmgt/include/wndmgt.h
===================================================================
--- uspace/lib/wndmgt/include/wndmgt.h	(revision f1f433d10ab8dfdc792a9cdc8807b76dbcfac663)
+++ uspace/lib/wndmgt/include/wndmgt.h	(revision 3a6d44b7107686f79a1655757bb73fedf182438b)
@@ -47,5 +47,5 @@
     wndmgt_window_info_t **);
 extern void wndmgt_free_window_info(wndmgt_window_info_t *);
-extern errno_t wndmgt_activate_window(wndmgt_t *, sysarg_t);
+extern errno_t wndmgt_activate_window(wndmgt_t *, sysarg_t, sysarg_t);
 extern errno_t wndmgt_close_window(wndmgt_t *, sysarg_t);
 
Index: uspace/lib/wndmgt/include/wndmgt_srv.h
===================================================================
--- uspace/lib/wndmgt/include/wndmgt_srv.h	(revision f1f433d10ab8dfdc792a9cdc8807b76dbcfac663)
+++ uspace/lib/wndmgt/include/wndmgt_srv.h	(revision 3a6d44b7107686f79a1655757bb73fedf182438b)
@@ -52,5 +52,5 @@
 	errno_t (*get_window_list)(void *, wndmgt_window_list_t **);
 	errno_t (*get_window_info)(void *, sysarg_t, wndmgt_window_info_t **);
-	errno_t (*activate_window)(void *, sysarg_t);
+	errno_t (*activate_window)(void *, sysarg_t, sysarg_t);
 	errno_t (*close_window)(void *, sysarg_t);
 	errno_t (*get_event)(void *, wndmgt_ev_t *);
Index: uspace/lib/wndmgt/src/wndmgt.c
===================================================================
--- uspace/lib/wndmgt/src/wndmgt.c	(revision f1f433d10ab8dfdc792a9cdc8807b76dbcfac663)
+++ uspace/lib/wndmgt/src/wndmgt.c	(revision 3a6d44b7107686f79a1655757bb73fedf182438b)
@@ -287,8 +287,10 @@
  *
  * @param wndmgt Window management session
+ * @param seat_id Seat ID
  * @param wnd_id Window ID
  * @return EOK on success or an error code
  */
-errno_t wndmgt_activate_window(wndmgt_t *wndmgt, sysarg_t wnd_id)
+errno_t wndmgt_activate_window(wndmgt_t *wndmgt, sysarg_t seat_id,
+    sysarg_t wnd_id)
 {
 	async_exch_t *exch;
@@ -296,5 +298,6 @@
 
 	exch = async_exchange_begin(wndmgt->sess);
-	rc = async_req_1_0(exch, WNDMGT_ACTIVATE_WINDOW, wnd_id);
+	rc = async_req_2_0(exch, WNDMGT_ACTIVATE_WINDOW, seat_id,
+	    wnd_id);
 
 	async_exchange_end(exch);
Index: uspace/lib/wndmgt/src/wndmgt_srv.c
===================================================================
--- uspace/lib/wndmgt/src/wndmgt_srv.c	(revision f1f433d10ab8dfdc792a9cdc8807b76dbcfac663)
+++ uspace/lib/wndmgt/src/wndmgt_srv.c	(revision 3a6d44b7107686f79a1655757bb73fedf182438b)
@@ -204,8 +204,10 @@
 static void wndmgt_activate_window_srv(wndmgt_srv_t *srv, ipc_call_t *icall)
 {
+	sysarg_t seat_id;
 	sysarg_t wnd_id;
 	errno_t rc;
 
-	wnd_id = ipc_get_arg1(icall);
+	seat_id = ipc_get_arg1(icall);
+	wnd_id = ipc_get_arg2(icall);
 
 	if (srv->ops->activate_window == NULL) {
@@ -214,5 +216,5 @@
 	}
 
-	rc = srv->ops->activate_window(srv->arg, wnd_id);
+	rc = srv->ops->activate_window(srv->arg, seat_id, wnd_id);
 	async_answer_0(icall, rc);
 }
Index: uspace/lib/wndmgt/test/wndmgt.c
===================================================================
--- uspace/lib/wndmgt/test/wndmgt.c	(revision f1f433d10ab8dfdc792a9cdc8807b76dbcfac663)
+++ uspace/lib/wndmgt/test/wndmgt.c	(revision 3a6d44b7107686f79a1655757bb73fedf182438b)
@@ -48,5 +48,5 @@
 static errno_t test_get_window_list(void *, wndmgt_window_list_t **);
 static errno_t test_get_window_info(void *, sysarg_t, wndmgt_window_info_t **);
-static errno_t test_activate_window(void *, sysarg_t);
+static errno_t test_activate_window(void *, sysarg_t, sysarg_t);
 static errno_t test_close_window(void *, sysarg_t);
 static errno_t test_get_event(void *, wndmgt_ev_t *);
@@ -88,4 +88,5 @@
 
 	bool activate_window_called;
+	sysarg_t activate_window_seat_id;
 	sysarg_t activate_window_wnd_id;
 
@@ -302,4 +303,5 @@
 	service_id_t sid;
 	wndmgt_t *wndmgt = NULL;
+	sysarg_t seat_id;
 	sysarg_t wnd_id;
 	test_response_t resp;
@@ -318,10 +320,12 @@
 	PCUT_ASSERT_NOT_NULL(wndmgt);
 
+	seat_id = 13;
 	wnd_id = 42;
 	resp.rc = ENOMEM;
 	resp.activate_window_called = false;
 
-	rc = wndmgt_activate_window(wndmgt, wnd_id);
+	rc = wndmgt_activate_window(wndmgt, seat_id, wnd_id);
 	PCUT_ASSERT_TRUE(resp.activate_window_called);
+	PCUT_ASSERT_INT_EQUALS(seat_id, resp.activate_window_seat_id);
 	PCUT_ASSERT_INT_EQUALS(wnd_id, resp.activate_window_wnd_id);
 	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
@@ -338,4 +342,5 @@
 	service_id_t sid;
 	wndmgt_t *wndmgt = NULL;
+	sysarg_t seat_id;
 	sysarg_t wnd_id;
 	test_response_t resp;
@@ -354,10 +359,12 @@
 	PCUT_ASSERT_NOT_NULL(wndmgt);
 
+	seat_id = 13;
 	wnd_id = 42;
 	resp.rc = EOK;
 	resp.activate_window_called = false;
 
-	rc = wndmgt_activate_window(wndmgt, wnd_id);
+	rc = wndmgt_activate_window(wndmgt, seat_id, wnd_id);
 	PCUT_ASSERT_TRUE(resp.activate_window_called);
+	PCUT_ASSERT_INT_EQUALS(seat_id, resp.activate_window_seat_id);
 	PCUT_ASSERT_INT_EQUALS(wnd_id, resp.activate_window_wnd_id);
 	PCUT_ASSERT_ERRNO_VAL(resp.rc, rc);
@@ -666,9 +673,11 @@
 }
 
-static errno_t test_activate_window(void *arg, sysarg_t wnd_id)
+static errno_t test_activate_window(void *arg, sysarg_t seat_id,
+    sysarg_t wnd_id)
 {
 	test_response_t *resp = (test_response_t *) arg;
 
 	resp->activate_window_called = true;
+	resp->activate_window_seat_id = seat_id;
 	resp->activate_window_wnd_id = wnd_id;
 	return resp->rc;
Index: uspace/srv/hid/display/wmops.c
===================================================================
--- uspace/srv/hid/display/wmops.c	(revision f1f433d10ab8dfdc792a9cdc8807b76dbcfac663)
+++ uspace/srv/hid/display/wmops.c	(revision 3a6d44b7107686f79a1655757bb73fedf182438b)
@@ -40,9 +40,10 @@
 #include <wndmgt_srv.h>
 #include "display.h"
+#include "seat.h"
 #include "wmclient.h"
 
 static errno_t dispwm_get_window_list(void *, wndmgt_window_list_t **);
 static errno_t dispwm_get_window_info(void *, sysarg_t, wndmgt_window_info_t **);
-static errno_t dispwm_activate_window(void *, sysarg_t);
+static errno_t dispwm_activate_window(void *, sysarg_t, sysarg_t);
 static errno_t dispwm_close_window(void *, sysarg_t);
 static errno_t dispwm_get_event(void *, wndmgt_ev_t *);
@@ -150,12 +151,32 @@
  *
  * @param arg Argument (WM client)
+ * @param seat_id Seat ID
  * @param wnd_id Window ID
  * @return EOK on success or an error code
  */
-static errno_t dispwm_activate_window(void *arg, sysarg_t wnd_id)
-{
+static errno_t dispwm_activate_window(void *arg, sysarg_t seat_id,
+    sysarg_t wnd_id)
+{
+	ds_wmclient_t *wmclient = (ds_wmclient_t *)arg;
+	ds_window_t *wnd;
+	ds_seat_t *seat;
+
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "dispwm_activate_window()");
-	(void)arg;
-	(void)wnd_id;
+
+	ds_display_lock(wmclient->display);
+	wnd = ds_display_find_window(wmclient->display, wnd_id);
+	if (wnd == NULL) {
+		ds_display_unlock(wmclient->display);
+		return ENOENT;
+	}
+
+	// TODO Multi-seat
+	(void) seat_id;
+	seat = ds_display_first_seat(wnd->display);
+
+	/* Switch focus */
+	ds_seat_set_focus(seat, wnd);
+
+	ds_display_unlock(wmclient->display);
 	return EOK;
 }
