Index: uspace/srv/hid/display/display.c
===================================================================
--- uspace/srv/hid/display/display.c	(revision 68704ab6ec14b07b8689674e7dd5563ef8e555e2)
+++ uspace/srv/hid/display/display.c	(revision f2d4a46fb4506a376cf7cd0f623121df842b5348)
@@ -313,4 +313,36 @@
 }
 
+/** Add window to window list.
+ *
+ * Topmost windows are enlisted before any other window. Non-topmost
+ * windows are enlisted before any other non-topmost window.
+ *
+ * @param display Display
+ * @param wnd Window
+ */
+void ds_display_enlist_window(ds_display_t *display, ds_window_t *wnd)
+{
+	ds_window_t *w;
+
+	assert(wnd->display == display);
+	assert(!link_used(&wnd->ldwindows));
+
+	if ((wnd->flags & wndf_topmost) == 0) {
+		/* Find the first non-topmost window */
+		w = ds_display_first_window(display);
+		while (w != NULL && (w->flags & wndf_topmost) != 0)
+			w = ds_display_next_window(w);
+
+		if (w != NULL)
+			list_insert_before(&wnd->ldwindows, &w->ldwindows);
+		else
+			list_append(&wnd->ldwindows, &display->windows);
+	} else {
+		/* Insert at the beginning */
+		list_prepend(&wnd->ldwindows, &display->windows);
+	}
+
+}
+
 /** Add window to display.
  *
@@ -326,5 +358,5 @@
 
 	wnd->display = display;
-	list_prepend(&wnd->ldwindows, &display->windows);
+	ds_display_enlist_window(display, wnd);
 
 	/* Notify window managers about the new window */
@@ -369,5 +401,5 @@
 
 	list_remove(&wnd->ldwindows);
-	list_prepend(&wnd->ldwindows, &wnd->display->windows);
+	ds_display_enlist_window(wnd->display, wnd);
 }
 
Index: uspace/srv/hid/display/display.h
===================================================================
--- uspace/srv/hid/display/display.h	(revision 68704ab6ec14b07b8689674e7dd5563ef8e555e2)
+++ uspace/srv/hid/display/display.h	(revision f2d4a46fb4506a376cf7cd0f623121df842b5348)
@@ -67,4 +67,5 @@
 extern ds_window_t *ds_display_find_window(ds_display_t *, ds_wnd_id_t);
 extern ds_window_t *ds_display_window_by_pos(ds_display_t *, gfx_coord2_t *);
+extern void ds_display_enlist_window(ds_display_t *, ds_window_t *);
 extern void ds_display_add_window(ds_display_t *, ds_window_t *);
 extern void ds_display_remove_window(ds_window_t *);
Index: uspace/srv/hid/display/test/display.c
===================================================================
--- uspace/srv/hid/display/test/display.c	(revision 68704ab6ec14b07b8689674e7dd5563ef8e555e2)
+++ uspace/srv/hid/display/test/display.c	(revision f2d4a46fb4506a376cf7cd0f623121df842b5348)
@@ -195,4 +195,78 @@
 }
 
+/** Test ds_display_enlist_window() */
+PCUT_TEST(display_enlist_window)
+{
+	ds_display_t *disp;
+	ds_client_t *client;
+	ds_seat_t *seat;
+	ds_window_t *w0;
+	ds_window_t *w1;
+	ds_window_t *w2;
+	ds_window_t *w3;
+	ds_window_t *w;
+	display_wnd_params_t params;
+	bool called_cb = false;
+	errno_t rc;
+
+	rc = ds_display_create(NULL, df_none, &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);
+
+	rc = ds_seat_create(disp, &seat);
+	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 = 100;
+
+	/* Regular windows */
+
+	rc = ds_window_create(client, &params, &w0);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ds_window_create(client, &params, &w1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Topmost windows */
+
+	params.flags |= wndf_topmost;
+
+	rc = ds_window_create(client, &params, &w2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ds_window_create(client, &params, &w3);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Delist w1 and w2 */
+	list_remove(&w1->ldwindows);
+	list_remove(&w2->ldwindows);
+
+	/* Enlist the windows back and check their order */
+	ds_display_enlist_window(disp, w1);
+	ds_display_enlist_window(disp, w2);
+
+	w = ds_display_first_window(disp);
+	PCUT_ASSERT_EQUALS(w2, w);
+	w = ds_display_next_window(w);
+	PCUT_ASSERT_EQUALS(w3, w);
+	w = ds_display_next_window(w);
+	PCUT_ASSERT_EQUALS(w1, w);
+	w = ds_display_next_window(w);
+	PCUT_ASSERT_EQUALS(w0, w);
+	w = ds_display_next_window(w);
+	PCUT_ASSERT_EQUALS(NULL, w);
+
+	ds_window_destroy(w0);
+	ds_window_destroy(w1);
+	ds_window_destroy(w2);
+	ds_window_destroy(w3);
+	ds_seat_destroy(seat);
+	ds_client_destroy(client);
+	ds_display_destroy(disp);
+}
+
 /** Test ds_display_window_to_top() */
 PCUT_TEST(display_window_to_top)
