Index: uspace/app/taskbar/taskbar.c
===================================================================
--- uspace/app/taskbar/taskbar.c	(revision a5c7b86505bfd86d4bd76518afece6eff13cf0c3)
+++ uspace/app/taskbar/taskbar.c	(revision 5d6213034774b404c59bb28fa4d9b10fcabfca81)
@@ -134,4 +134,7 @@
 	params.style &= ~ui_wds_titlebar;
 
+	/* Window is not obscured by other windows */
+	params.flags |= ui_wndf_topmost;
+
 	/* Prevent taskbar window from being listed in taskbar */
 	params.flags |= ui_wndf_system;
Index: uspace/lib/display/include/types/display/wndparams.h
===================================================================
--- uspace/lib/display/include/types/display/wndparams.h	(revision a5c7b86505bfd86d4bd76518afece6eff13cf0c3)
+++ uspace/lib/display/include/types/display/wndparams.h	(revision 5d6213034774b404c59bb28fa4d9b10fcabfca81)
@@ -42,10 +42,12 @@
 	/** Popup window (capture events, no focus) */
 	wndf_popup = 0x1,
+	/** Topmost window */
+	wndf_topmost = 0x2,
 	/** Set specific initial window position */
-	wndf_setpos = 0x2,
+	wndf_setpos = 0x4,
 	/** Window is maximized */
-	wndf_maximized = 0x4,
+	wndf_maximized = 0x8,
 	/** Special system window */
-	wndf_system = 0x8
+	wndf_system = 0x10
 } display_wnd_flags_t;
 
Index: uspace/lib/ui/include/types/ui/window.h
===================================================================
--- uspace/lib/ui/include/types/ui/window.h	(revision a5c7b86505bfd86d4bd76518afece6eff13cf0c3)
+++ uspace/lib/ui/include/types/ui/window.h	(revision 5d6213034774b404c59bb28fa4d9b10fcabfca81)
@@ -67,6 +67,8 @@
 	/** Popup window */
 	ui_wndf_popup = 0x1,
+	/** Topmost window */
+	ui_wndf_topmost = 0x2,
 	/** Special system window */
-	ui_wndf_system = 0x2
+	ui_wndf_system = 0x4
 } ui_wnd_flags_t;
 
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision a5c7b86505bfd86d4bd76518afece6eff13cf0c3)
+++ uspace/lib/ui/src/window.c	(revision 5d6213034774b404c59bb28fa4d9b10fcabfca81)
@@ -228,4 +228,6 @@
 	if ((params->flags & ui_wndf_popup) != 0)
 		dparams.flags |= wndf_popup;
+	if ((params->flags & ui_wndf_topmost) != 0)
+		dparams.flags |= wndf_topmost;
 	if ((params->flags & ui_wndf_system) != 0)
 		dparams.flags |= wndf_system;
Index: uspace/srv/hid/display/display.c
===================================================================
--- uspace/srv/hid/display/display.c	(revision a5c7b86505bfd86d4bd76518afece6eff13cf0c3)
+++ uspace/srv/hid/display/display.c	(revision 5d6213034774b404c59bb28fa4d9b10fcabfca81)
@@ -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 a5c7b86505bfd86d4bd76518afece6eff13cf0c3)
+++ uspace/srv/hid/display/display.h	(revision 5d6213034774b404c59bb28fa4d9b10fcabfca81)
@@ -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 a5c7b86505bfd86d4bd76518afece6eff13cf0c3)
+++ uspace/srv/hid/display/test/display.c	(revision 5d6213034774b404c59bb28fa4d9b10fcabfca81)
@@ -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)
