Index: uspace/app/taskbar/taskbar.c
===================================================================
--- uspace/app/taskbar/taskbar.c	(revision 176632602be72a79118566eeda781805d4ce61ab)
+++ uspace/app/taskbar/taskbar.c	(revision 7a05d92432149535737f64b23841348ad9053a0c)
@@ -174,7 +174,7 @@
 	}
 
-	rc = wndlist_append(taskbar->wndlist, "Text Editor");
-	if (rc != EOK) {
-		printf("Error adding window list entry.\n");
+	rc = wndlist_attach_wm(taskbar->wndlist, taskbar->wndmgt);
+	if (rc != EOK) {
+		printf("Error attaching window management service.\n");
 		goto error;
 	}
Index: uspace/app/taskbar/types/wndlist.h
===================================================================
--- uspace/app/taskbar/types/wndlist.h	(revision 176632602be72a79118566eeda781805d4ce61ab)
+++ uspace/app/taskbar/types/wndlist.h	(revision 7a05d92432149535737f64b23841348ad9053a0c)
@@ -42,4 +42,5 @@
 #include <ui/fixed.h>
 #include <ui/resource.h>
+#include <wndmgt.h>
 
 /** Taskbar window list entry */
@@ -69,4 +70,7 @@
 	/** Window list entries (of wndlist_entry_t) */
 	list_t entries;
+
+	/** Window management service */
+	wndmgt_t *wndmgt;
 } wndlist_t;
 
Index: uspace/app/taskbar/wndlist.c
===================================================================
--- uspace/app/taskbar/wndlist.c	(revision 176632602be72a79118566eeda781805d4ce61ab)
+++ uspace/app/taskbar/wndlist.c	(revision 7a05d92432149535737f64b23841348ad9053a0c)
@@ -49,4 +49,5 @@
  * @param res UI resource
  * @param fixed Fixed layout to which buttons will be added
+ * @param wndmgt Window management service
  * @param rwndlist Place to store pointer to new window list
  * @return @c EOK on success or an error code
@@ -71,5 +72,44 @@
 error:
 	return rc;
+}
 
+/** Attach window management service to window list.
+ *
+ * @param wndlist Window list
+ * @param rwndlist Place to store pointer to new window list
+ * @return @c EOK on success or an error code
+ */
+errno_t wndlist_attach_wm(wndlist_t *wndlist, wndmgt_t *wndmgt)
+{
+	errno_t rc;
+	wndmgt_window_list_t *wlist = NULL;
+	wndmgt_window_info_t *winfo = NULL;
+	sysarg_t i;
+
+	rc = wndmgt_get_window_list(wndmgt, &wlist);
+	if (rc != EOK)
+		goto error;
+
+	for (i = 0; i < wlist->nwindows; i++) {
+		rc = wndmgt_get_window_info(wndmgt, wlist->windows[i],
+		    &winfo);
+		if (rc != EOK)
+			goto error;
+
+		rc = wndlist_append(wndlist, winfo->caption);
+		if (rc != EOK) {
+			wndmgt_free_window_info(winfo);
+			goto error;
+		}
+
+		wndmgt_free_window_info(winfo);
+	}
+
+	wndlist->wndmgt = wndmgt;
+	return EOK;
+error:
+	if (wlist != NULL)
+		wndmgt_free_window_list(wlist);
+	return rc;
 }
 
@@ -90,5 +130,9 @@
 	wndlist_entry_t *entry = NULL;
 	gfx_rect_t rect;
+	size_t nentries;
 	errno_t rc;
+
+	/* Number of existing entries */
+	nentries = list_count(&wndlist->entries);
 
 	entry = calloc(1, sizeof(wndlist_entry_t));
@@ -103,12 +147,12 @@
 
 	if (ui_resource_is_textmode(wndlist->res)) {
-		rect.p0.x = 9;
+		rect.p0.x = 17 * nentries + 9;
 		rect.p0.y = 0;
-		rect.p1.x = 25;
+		rect.p1.x = 17 * nentries + 25;
 		rect.p1.y = 1;
 	} else {
-		rect.p0.x = 90;
+		rect.p0.x = 145 * nentries + 90;
 		rect.p0.y = 3;
-		rect.p1.x = 230;
+		rect.p1.x = 145 * nentries + 230;
 		rect.p1.y = 29;
 	}
Index: uspace/app/taskbar/wndlist.h
===================================================================
--- uspace/app/taskbar/wndlist.h	(revision 176632602be72a79118566eeda781805d4ce61ab)
+++ uspace/app/taskbar/wndlist.h	(revision 7a05d92432149535737f64b23841348ad9053a0c)
@@ -40,7 +40,9 @@
 #include <ui/fixed.h>
 #include <ui/resource.h>
+#include <wndmgt.h>
 #include "types/wndlist.h"
 
 extern errno_t wndlist_create(ui_resource_t *, ui_fixed_t *, wndlist_t **);
+extern errno_t wndlist_attach_wm(wndlist_t *, wndmgt_t *);
 extern void wndlist_destroy(wndlist_t *);
 extern errno_t wndlist_append(wndlist_t *, const char *);
Index: uspace/lib/wndmgt/include/types/wndmgt.h
===================================================================
--- uspace/lib/wndmgt/include/types/wndmgt.h	(revision 176632602be72a79118566eeda781805d4ce61ab)
+++ uspace/lib/wndmgt/include/types/wndmgt.h	(revision 7a05d92432149535737f64b23841348ad9053a0c)
@@ -36,8 +36,9 @@
 #define _LIBWNDMGT_TYPES_WNDMGT_H_
 
+#include <ipc/services.h>
 #include <types/common.h>
 
 /** Use the default window management service (argument to wndmgt_open() */
-#define WNDMGT_DEFAULT NULL
+#define WNDMGT_DEFAULT SERVICE_NAME_WNDMGT
 
 struct wndmgt;
Index: uspace/srv/hid/display/main.c
===================================================================
--- uspace/srv/hid/display/main.c	(revision 176632602be72a79118566eeda781805d4ce61ab)
+++ uspace/srv/hid/display/main.c	(revision 7a05d92432149535737f64b23841348ad9053a0c)
@@ -242,4 +242,5 @@
 static void display_wndmgt_conn(ipc_call_t *icall, void *arg)
 {
+	ds_display_t *disp = (ds_display_t *) arg;
 	wndmgt_srv_t srv;
 
@@ -247,5 +248,5 @@
 	wndmgt_srv_initialize(&srv);
 	srv.ops = &wndmgt_srv_ops;
-	srv.arg = NULL; // XXX
+	srv.arg = disp;
 
 	/* Handle connection */
Index: uspace/srv/hid/display/wmops.c
===================================================================
--- uspace/srv/hid/display/wmops.c	(revision 176632602be72a79118566eeda781805d4ce61ab)
+++ uspace/srv/hid/display/wmops.c	(revision 7a05d92432149535737f64b23841348ad9053a0c)
@@ -35,13 +35,9 @@
 
 #include <errno.h>
-//#include <io/log.h>
+#include <io/log.h>
 #include <stdlib.h>
 #include <str.h>
 #include <wndmgt_srv.h>
-//#include "client.h"
-//#include "display.h"
-//#include "dsops.h"
-//#include "seat.h"
-//#include "window.h"
+#include "display.h"
 
 static errno_t dispwm_get_window_list(void *, wndmgt_window_list_t **);
@@ -62,4 +58,9 @@
 {
 	wndmgt_window_list_t *list;
+	ds_display_t *disp = (ds_display_t *)arg;
+	ds_window_t *wnd;
+	unsigned i;
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "dispwm_get_window_list()");
 
 	list = calloc(1, sizeof(wndmgt_window_list_t));
@@ -67,6 +68,14 @@
 		return ENOMEM;
 
-	list->nwindows = 2;
-	list->windows = calloc(2, sizeof(sysarg_t));
+	/* Count the number of windows */
+	list->nwindows = 0;
+	wnd = ds_display_first_window(disp);
+	while (wnd != NULL) {
+		++list->nwindows;
+		wnd = ds_display_next_window(wnd);
+	}
+
+	/* Allocate array for window IDs */
+	list->windows = calloc(list->nwindows, sizeof(sysarg_t));
 	if (list->windows == NULL) {
 		free(list);
@@ -74,6 +83,11 @@
 	}
 
-	list->windows[0] = 1;
-	list->windows[1] = 2;
+	/* Fill in window IDs */
+	i = 0;
+	wnd = ds_display_first_window(disp);
+	while (wnd != NULL) {
+		list->windows[i++] = wnd->id;
+		wnd = ds_display_next_window(wnd);
+	}
 
 	*rlist = list;
@@ -84,4 +98,5 @@
     wndmgt_window_info_t **rinfo)
 {
+
 /*	ds_client_t *client = (ds_client_t *) arg;
 	ds_window_t *wnd;
@@ -101,4 +116,6 @@
 	wndmgt_window_info_t *info;
 
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "dispwm_get_window_info()");
+
 	info = calloc(1, sizeof(wndmgt_window_info_t));
 	if (info == NULL)
@@ -117,4 +134,5 @@
 static errno_t dispwm_activate_window(void *arg, sysarg_t wnd_id)
 {
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "dispwm_activate_window()");
 	(void)arg;
 	(void)wnd_id;
@@ -124,4 +142,5 @@
 static errno_t dispwm_close_window(void *arg, sysarg_t wnd_id)
 {
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "dispwm_close_window()");
 	(void)arg;
 	(void)wnd_id;
