Index: uspace/app/display-cfg/display-cfg.c
===================================================================
--- uspace/app/display-cfg/display-cfg.c	(revision aace43d8c96f05f67da6df75dd07185547da51cb)
+++ uspace/app/display-cfg/display-cfg.c	(revision 14cbf074bd9a512a47130fc27027a861c38bc286)
@@ -65,4 +65,5 @@
  *
  * @param display_spec Display specification
+ * @param dcfg_svc Display configuration service name or DISPCFG_DEFAULT
  * @param rdcfg Place to store pointer to new display configuration
  * @return EOK on success or an error code
@@ -82,10 +83,4 @@
 		printf("Out of memory.\n");
 		return ENOMEM;
-	}
-
-	rc = dispcfg_open(DISPCFG_DEFAULT, NULL, NULL, &dcfg->dispcfg);
-	if (rc != EOK) {
-		printf("Error opening display configuration service.\n");
-		goto error;
 	}
 
@@ -150,10 +145,4 @@
 	ui_window_add(window, ui_fixed_ctl(dcfg->fixed));
 
-	rc = ui_window_paint(window);
-	if (rc != EOK) {
-		printf("Error painting window.\n");
-		return rc;
-	}
-
 	*rdcfg = dcfg;
 	return EOK;
@@ -167,16 +156,59 @@
 	if (dcfg->ui != NULL)
 		ui_destroy(ui);
+	free(dcfg);
+	return rc;
+}
+
+/** Open display configuration service.
+ *
+ * @param dcfg Display configuration dialog
+ * @param dcfg_svc Display configuration service name or DISPCFG_DEFAULT
+ * @return EOK on success or an error code
+ */
+errno_t display_cfg_open(display_cfg_t *dcfg, const char *dcfg_svc)
+{
+	errno_t rc;
+
+	rc = dispcfg_open(dcfg_svc, NULL, NULL, &dcfg->dispcfg);
+	if (rc != EOK) {
+		printf("Error opening display configuration service.\n");
+		goto error;
+	}
+
+	return EOK;
+error:
+	return rc;
+}
+
+/** Populate display configuration from isplay configuration service.
+ *
+ * @param dcfg Display configuration dialog
+ * @return EOK on success or an error code
+ */
+errno_t display_cfg_populate(display_cfg_t *dcfg)
+{
+	errno_t rc;
+
+	rc = dcfg_seats_populate(dcfg->seats);
+	if (rc != EOK)
+		return rc;
+
+	rc = ui_window_paint(dcfg->window);
+	if (rc != EOK) {
+		printf("Error painting window.\n");
+		return rc;
+	}
+
+	return EOK;
+}
+
+/** Destroy display configuration dialog.
+ *
+ * @param dcfg Display configuration dialog
+ */
+void display_cfg_destroy(display_cfg_t *dcfg)
+{
 	if (dcfg->dispcfg != NULL)
 		dispcfg_close(dcfg->dispcfg);
-	free(dcfg);
-	return rc;
-}
-
-/** Destroy display configuration dialog.
- *
- * @param dcfg Display configuration dialog
- */
-void display_cfg_destroy(display_cfg_t *dcfg)
-{
 	ui_window_destroy(dcfg->window);
 	ui_destroy(dcfg->ui);
Index: uspace/app/display-cfg/display-cfg.h
===================================================================
--- uspace/app/display-cfg/display-cfg.h	(revision aace43d8c96f05f67da6df75dd07185547da51cb)
+++ uspace/app/display-cfg/display-cfg.h	(revision 14cbf074bd9a512a47130fc27027a861c38bc286)
@@ -40,4 +40,6 @@
 
 extern errno_t display_cfg_create(const char *, display_cfg_t **);
+extern errno_t display_cfg_open(display_cfg_t *, const char *);
+extern errno_t display_cfg_populate(display_cfg_t *);
 extern void display_cfg_destroy(display_cfg_t *);
 
Index: uspace/app/display-cfg/main.c
===================================================================
--- uspace/app/display-cfg/main.c	(revision aace43d8c96f05f67da6df75dd07185547da51cb)
+++ uspace/app/display-cfg/main.c	(revision 14cbf074bd9a512a47130fc27027a861c38bc286)
@@ -77,4 +77,12 @@
 		return 1;
 
+	rc = display_cfg_open(dcfg, DISPCFG_DEFAULT);
+	if (rc != EOK)
+		return 1;
+
+	rc = display_cfg_populate(dcfg);
+	if (rc != EOK)
+		return 1;
+
 	ui_run(dcfg->ui);
 	display_cfg_destroy(dcfg);
Index: uspace/app/display-cfg/seats.c
===================================================================
--- uspace/app/display-cfg/seats.c	(revision aace43d8c96f05f67da6df75dd07185547da51cb)
+++ uspace/app/display-cfg/seats.c	(revision 14cbf074bd9a512a47130fc27027a861c38bc286)
@@ -50,5 +50,4 @@
 #include "seats.h"
 
-static errno_t dcfg_seats_list_populate(dcfg_seats_t *);
 static errno_t dcfg_seats_asgn_dev_list_populate(dcfg_seats_t *);
 static errno_t dcfg_seats_avail_dev_list_populate(dcfg_seats_t *,
@@ -118,9 +117,6 @@
 	ui_resource_t *ui_res;
 	dcfg_seats_t *seats;
-	dcfg_seats_entry_t *entry;
 	gfx_rect_t rect;
-	char *caption = NULL;
-	errno_t rc;
-	int rv;
+	errno_t rc;
 
 	ui_res = ui_window_get_res(dcfg->window);
@@ -204,8 +200,4 @@
 	ui_list_set_cb(seats->seat_list, &dcfg_seats_list_cb, (void *)seats);
 
-	rc = dcfg_seats_list_populate(seats);
-	if (rc != EOK)
-		goto error;
-
 	/* 'Add...' seat button */
 
@@ -272,19 +264,10 @@
 	/* 'Devices assigned to seat 'xxx':' label */
 
-	entry = dcfg_seats_get_selected(seats);
-	rv = asprintf(&caption, "Devices assigned to seat '%s':", entry->name);
-	if (rv < 0) {
-		rc = ENOMEM;
-		goto error;
-	}
-
-	rc = ui_label_create(ui_res, caption, &seats->devices_label);
+	rc = ui_label_create(ui_res, "Devices assigned to seat 'xxx':",
+	    &seats->devices_label);
 	if (rc != EOK) {
 		printf("Error creating label.\n");
 		goto error;
 	}
-
-	free(caption);
-	caption = NULL;
 
 	if (ui_resource_is_textmode(ui_res)) {
@@ -400,8 +383,4 @@
 	ui_tab_add(seats->tab, ui_fixed_ctl(seats->fixed));
 
-	rc = dcfg_seats_asgn_dev_list_populate(seats);
-	if (rc != EOK)
-		goto error;
-
 	*rseats = seats;
 	return EOK;
@@ -411,6 +390,4 @@
 	if (seats->add_device != NULL)
 		ui_pbutton_destroy(seats->add_device);
-	if (caption != NULL)
-		free(caption);
 	if (seats->devices_label != NULL)
 		ui_label_destroy(seats->devices_label);
@@ -431,4 +408,29 @@
 }
 
+/** Populate seats tab with display configuration service data
+ *
+ * @param dcfg Display configuration dialog
+ * @param rseats Place to store pointer to new seat configuration tab
+ * @return EOK on success or an error code
+ */
+errno_t dcfg_seats_populate(dcfg_seats_t *seats)
+{
+	dcfg_seats_entry_t *entry;
+	errno_t rc;
+
+	printf("seats list populate\n");
+	rc = dcfg_seats_list_populate(seats);
+	if (rc != EOK)
+		return rc;
+
+	/*
+	 * Update "Devices assigned to seat 'xxx'" label and populate
+	 * assigned devices list.
+	 */
+	entry = dcfg_seats_get_selected(seats);
+	dcfg_seats_list_selected(entry->lentry, (void *)entry);
+	return EOK;
+}
+
 /** Destroy display configuration dialog.
  *
@@ -511,5 +513,5 @@
  * @return EOK on success or an error code
  */
-static errno_t dcfg_seats_list_populate(dcfg_seats_t *seats)
+errno_t dcfg_seats_list_populate(dcfg_seats_t *seats)
 {
 	size_t i;
@@ -594,5 +596,5 @@
  * @return EOK on success or an error code
  */
-static errno_t dcfg_avail_devices_insert(dcfg_seats_t *seats,
+errno_t dcfg_avail_devices_insert(dcfg_seats_t *seats,
     ui_select_dialog_t *dialog, const char *name, service_id_t svc_id)
 {
Index: uspace/app/display-cfg/seats.h
===================================================================
--- uspace/app/display-cfg/seats.h	(revision aace43d8c96f05f67da6df75dd07185547da51cb)
+++ uspace/app/display-cfg/seats.h	(revision 14cbf074bd9a512a47130fc27027a861c38bc286)
@@ -41,4 +41,5 @@
 
 extern errno_t dcfg_seats_create(display_cfg_t *, dcfg_seats_t **);
+extern errno_t dcfg_seats_populate(dcfg_seats_t *);
 extern void dcfg_seats_destroy(dcfg_seats_t *);
 extern errno_t dcfg_seats_insert(dcfg_seats_t *, const char *, sysarg_t,
@@ -46,4 +47,7 @@
 extern errno_t dcfg_devices_insert(dcfg_seats_t *, const char *,
     service_id_t);
+extern errno_t dcfg_avail_devices_insert(dcfg_seats_t *seats,
+    ui_select_dialog_t *dialog, const char *name, service_id_t svc_id);
+extern errno_t dcfg_seats_list_populate(dcfg_seats_t *);
 
 #endif
Index: uspace/app/display-cfg/test/seats.c
===================================================================
--- uspace/app/display-cfg/test/seats.c	(revision aace43d8c96f05f67da6df75dd07185547da51cb)
+++ uspace/app/display-cfg/test/seats.c	(revision 14cbf074bd9a512a47130fc27027a861c38bc286)
@@ -32,4 +32,5 @@
 #include <errno.h>
 #include <pcut/pcut.h>
+#include <str.h>
 #include <testdc.h>
 #include "../display-cfg.h"
@@ -85,10 +86,11 @@
 }
 
-//??? Requires us to create a test display config service
+/** dcfg_seats_list_populate() populates seat list */
 PCUT_TEST(seats_list_populate)
 {
+	display_cfg_t *dcfg;
+	dcfg_seats_t *seats;
 	errno_t rc;
 	service_id_t sid;
-	dispcfg_t *dispcfg = NULL;
 	test_response_t resp;
 
@@ -102,11 +104,35 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = dispcfg_open(test_dispcfg_svc, NULL, NULL, &dispcfg);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-	PCUT_ASSERT_NOT_NULL(dispcfg);
-
-	dispcfg_close(dispcfg);
-	rc = loc_service_unregister(sid);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	rc = display_cfg_create(UI_DISPLAY_NULL, &dcfg);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = display_cfg_open(dcfg, test_dispcfg_svc);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = dcfg_seats_create(dcfg, &seats);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/*
+	 * dcfg_seat_list_populate() calls dispcfg_get_seat_list()
+	 * and dispcfg_get_seat_info()
+	 */
+	resp.rc = EOK;
+	resp.get_seat_list_rlist = calloc(1, sizeof(dispcfg_seat_list_t));
+	PCUT_ASSERT_NOT_NULL(resp.get_seat_list_rlist);
+	resp.get_seat_list_rlist->nseats = 1;
+	resp.get_seat_list_rlist->seats = calloc(1, sizeof(sysarg_t));
+	PCUT_ASSERT_NOT_NULL(resp.get_seat_list_rlist->seats);
+	resp.get_seat_list_rlist->seats[0] = 42;
+
+	resp.get_seat_info_rinfo = calloc(1, sizeof(dispcfg_seat_info_t));
+	PCUT_ASSERT_NOT_NULL(resp.get_seat_info_rinfo);
+	resp.get_seat_info_rinfo->name = str_dup("Alice");
+	PCUT_ASSERT_NOT_NULL(resp.get_seat_info_rinfo->name);
+
+	rc = dcfg_seats_list_populate(seats);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	dcfg_seats_destroy(seats);
+	display_cfg_destroy(dcfg);
 }
 
@@ -141,6 +167,42 @@
 }
 
+/** dcfg_avail_devices_insert() inserts entry into available devices list */
 PCUT_TEST(avail_devices_insert)
 {
+	display_cfg_t *dcfg;
+	dcfg_seats_t *seats;
+	ui_list_entry_t *lentry;
+	dcfg_devices_entry_t *entry;
+	ui_select_dialog_t *dialog;
+	ui_select_dialog_params_t sdparams;
+	errno_t rc;
+
+	rc = display_cfg_create(UI_DISPLAY_NULL, &dcfg);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = dcfg_seats_create(dcfg, &seats);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_select_dialog_params_init(&sdparams);
+	sdparams.caption = "Dialog";
+	sdparams.prompt = "Select";
+
+	rc = ui_select_dialog_create(seats->dcfg->ui, &sdparams, &dialog);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = dcfg_avail_devices_insert(seats, dialog, "mydevice", 42);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	lentry = ui_list_first(ui_select_dialog_list(dialog));
+	PCUT_ASSERT_NOT_NULL(lentry);
+	entry = (dcfg_devices_entry_t *)ui_list_entry_get_arg(lentry);
+	PCUT_ASSERT_NOT_NULL(entry);
+
+	PCUT_ASSERT_STR_EQUALS("mydevice", entry->name);
+	PCUT_ASSERT_INT_EQUALS(42, entry->svc_id);
+
+	ui_select_dialog_destroy(dialog);
+	dcfg_seats_destroy(seats);
+	display_cfg_destroy(dcfg);
 }
 
Index: uspace/lib/ui/include/ui/selectdialog.h
===================================================================
--- uspace/lib/ui/include/ui/selectdialog.h	(revision aace43d8c96f05f67da6df75dd07185547da51cb)
+++ uspace/lib/ui/include/ui/selectdialog.h	(revision 14cbf074bd9a512a47130fc27027a861c38bc286)
@@ -51,4 +51,5 @@
     ui_list_entry_attr_t *);
 extern errno_t ui_select_dialog_paint(ui_select_dialog_t *);
+extern ui_list_t *ui_select_dialog_list(ui_select_dialog_t *);
 
 #endif
Index: uspace/lib/ui/src/selectdialog.c
===================================================================
--- uspace/lib/ui/src/selectdialog.c	(revision aace43d8c96f05f67da6df75dd07185547da51cb)
+++ uspace/lib/ui/src/selectdialog.c	(revision 14cbf074bd9a512a47130fc27027a861c38bc286)
@@ -329,4 +329,14 @@
 }
 
+/** Get the entry list from select dialog.
+ *
+ * @param dialog Select dialog
+ * @return UI list
+ */
+ui_list_t *ui_select_dialog_list(ui_select_dialog_t *dialog)
+{
+	return dialog->list;
+}
+
 /** Select dialog window close handler.
  *
Index: uspace/lib/ui/test/selectdialog.c
===================================================================
--- uspace/lib/ui/test/selectdialog.c	(revision aace43d8c96f05f67da6df75dd07185547da51cb)
+++ uspace/lib/ui/test/selectdialog.c	(revision 14cbf074bd9a512a47130fc27027a861c38bc286)
@@ -310,4 +310,42 @@
 }
 
+/** ui_select_dialog_list() returns the UI list */
+PCUT_TEST(list)
+{
+	errno_t rc;
+	ui_t *ui = NULL;
+	ui_select_dialog_params_t params;
+	ui_select_dialog_t *dialog = NULL;
+	ui_list_t *list;
+	ui_list_entry_attr_t attr;
+
+	rc = ui_create_disp(NULL, &ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_select_dialog_params_init(&params);
+	params.caption = "Select one";
+	params.prompt = "Please select";
+
+	rc = ui_select_dialog_create(ui, &params, &dialog);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(dialog);
+
+	list = ui_select_dialog_list(dialog);
+	PCUT_ASSERT_NOT_NULL(list);
+
+	PCUT_ASSERT_INT_EQUALS(0, ui_list_entries_cnt(list));
+
+	/* Add one entry */
+	ui_list_entry_attr_init(&attr);
+	attr.caption = "Entry";
+	rc = ui_select_dialog_append(dialog, &attr);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_INT_EQUALS(1, ui_list_entries_cnt(list));
+
+	ui_select_dialog_destroy(dialog);
+	ui_destroy(ui);
+}
+
 static void test_dialog_bok(ui_select_dialog_t *dialog, void *arg,
     void *earg)
