Index: uspace/srv/hid/display/seat.c
===================================================================
--- uspace/srv/hid/display/seat.c	(revision 08f345fc2f36ccc5165433e7fd95204075a9d44f)
+++ uspace/srv/hid/display/seat.c	(revision 1483981d7b7ed0a76568358cb7506faba072c4e6)
@@ -128,4 +128,25 @@
 }
 
+/** Switch focus to another window.
+ *
+ * @param seat Seat
+ * @param wnd Window to evacuate focus from
+ */
+void ds_seat_switch_focus(ds_seat_t *seat)
+{
+	ds_window_t *nwnd;
+
+	if (seat->focus != NULL)
+		nwnd = ds_display_prev_window(seat->focus);
+	else
+		nwnd = NULL;
+
+	if (nwnd == NULL)
+		nwnd = ds_display_last_window(seat->display);
+
+	if (nwnd != NULL)
+		ds_seat_set_focus(seat, nwnd);
+}
+
 /** Post keyboard event to the seat's focused window.
  *
@@ -143,5 +164,5 @@
 	if (event->type == KEY_PRESS && alt_or_shift && event->key == KC_TAB) {
 		/* On Alt-Tab or Shift-Tab, switch focus to next window */
-		ds_seat_evac_focus(seat, seat->focus);
+		ds_seat_switch_focus(seat);
 		return EOK;
 	}
@@ -389,6 +410,5 @@
 
 	wnd = ds_display_window_by_pos(seat->display, &seat->pntpos);
-
-	if (seat->focus != wnd) {
+	if (seat->focus != wnd && seat->focus != NULL) {
 		rc = ds_window_post_pos_event(seat->focus, event);
 		if (rc != EOK)
Index: uspace/srv/hid/display/seat.h
===================================================================
--- uspace/srv/hid/display/seat.h	(revision 08f345fc2f36ccc5165433e7fd95204075a9d44f)
+++ uspace/srv/hid/display/seat.h	(revision 1483981d7b7ed0a76568358cb7506faba072c4e6)
@@ -50,4 +50,5 @@
 extern void ds_seat_set_focus(ds_seat_t *, ds_window_t *);
 extern void ds_seat_evac_focus(ds_seat_t *, ds_window_t *);
+extern void ds_seat_switch_focus(ds_seat_t *);
 extern errno_t ds_seat_post_kbd_event(ds_seat_t *, kbd_event_t *);
 extern errno_t ds_seat_post_ptd_event(ds_seat_t *, ptd_event_t *);
Index: uspace/srv/hid/display/test/seat.c
===================================================================
--- uspace/srv/hid/display/test/seat.c	(revision 08f345fc2f36ccc5165433e7fd95204075a9d44f)
+++ uspace/srv/hid/display/test/seat.c	(revision 1483981d7b7ed0a76568358cb7506faba072c4e6)
@@ -90,6 +90,6 @@
 }
 
-/** Evacuate focus. */
-PCUT_TEST(evac_focus)
+/** Evacuate focus when another window is available. */
+PCUT_TEST(evac_focus_two_windows)
 {
 	ds_display_t *disp;
@@ -132,4 +132,141 @@
 	ds_window_destroy(w0);
 	ds_window_destroy(w1);
+	ds_seat_destroy(seat);
+	ds_client_destroy(client);
+	ds_display_destroy(disp);
+}
+
+/** Evacuate focus from the only existing window.
+ *
+ * After evacuating no window should be focused
+ */
+PCUT_TEST(evac_focus_one_window)
+{
+	ds_display_t *disp;
+	ds_client_t *client;
+	ds_seat_t *seat;
+	ds_window_t *wnd;
+	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 = 1;
+
+	rc = ds_window_create(client, &params, &wnd);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ds_seat_set_focus(seat, wnd);
+	PCUT_ASSERT_EQUALS(wnd, seat->focus);
+	PCUT_ASSERT_TRUE(called_cb);
+	called_cb = false;
+
+	ds_seat_evac_focus(seat, wnd);
+	PCUT_ASSERT_NULL(seat->focus);
+	PCUT_ASSERT_TRUE(called_cb);
+
+	ds_window_destroy(wnd);
+	ds_seat_destroy(seat);
+	ds_client_destroy(client);
+	ds_display_destroy(disp);
+}
+
+/** Switch focus when another window is available. */
+PCUT_TEST(switch_focus_two_windows)
+{
+	ds_display_t *disp;
+	ds_client_t *client;
+	ds_seat_t *seat;
+	ds_window_t *w0;
+	ds_window_t *w1;
+	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 = 1;
+
+	rc = ds_window_create(client, &params, &w1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = ds_window_create(client, &params, &w0);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ds_seat_set_focus(seat, w1);
+	PCUT_ASSERT_EQUALS(w1, seat->focus);
+	PCUT_ASSERT_TRUE(called_cb);
+	called_cb = false;
+
+	ds_seat_switch_focus(seat);
+	PCUT_ASSERT_EQUALS(w0, seat->focus);
+	PCUT_ASSERT_TRUE(called_cb);
+
+	ds_window_destroy(w0);
+	ds_window_destroy(w1);
+	ds_seat_destroy(seat);
+	ds_client_destroy(client);
+	ds_display_destroy(disp);
+}
+
+/** Switch focus with just one existing window.
+ *
+ * After switching the focus should remain with the same window.
+ */
+PCUT_TEST(switch_focus_one_window)
+{
+	ds_display_t *disp;
+	ds_client_t *client;
+	ds_seat_t *seat;
+	ds_window_t *wnd;
+	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 = 1;
+
+	rc = ds_window_create(client, &params, &wnd);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ds_seat_set_focus(seat, wnd);
+	PCUT_ASSERT_EQUALS(wnd, seat->focus);
+	PCUT_ASSERT_TRUE(called_cb);
+	called_cb = false;
+
+	ds_seat_switch_focus(seat);
+	PCUT_ASSERT_EQUALS(wnd, seat->focus);
+	PCUT_ASSERT_FALSE(called_cb);
+
+	ds_window_destroy(wnd);
 	ds_seat_destroy(seat);
 	ds_client_destroy(client);
