Index: uspace/lib/ui/src/menu.c
===================================================================
--- uspace/lib/ui/src/menu.c	(revision 2e6394e9b57983df5807f35868516f9bf997dc35)
+++ uspace/lib/ui/src/menu.c	(revision 4055fe6398e8d99d55d7ffceea4e0262d7f27b22)
@@ -61,7 +61,9 @@
 };
 
+static void ui_menu_popup_close(ui_popup_t *, void *);
 static void ui_menu_popup_pos(ui_popup_t *, void *, pos_event_t *);
 
 static ui_popup_cb_t ui_menu_popup_cb = {
+	.close = ui_menu_popup_close,
 	.pos = ui_menu_popup_pos
 };
@@ -366,9 +368,22 @@
 	} else {
 		/* Press outside menu - close it */
-//		if (event->type == POS_PRESS)
-//			ui_menu_bar_select(menu->mbar, NULL, NULL);
+		if (event->type == POS_PRESS)
+			ui_menu_bar_select(menu->mbar, NULL, NULL);
 	}
 
 	return ui_unclaimed;
+}
+
+/** Handle close event in menu popup window.
+ *
+ * @param popup Menu popup window
+ * @param arg Argument (ui_menu_t *)
+ */
+static void ui_menu_popup_close(ui_popup_t *popup, void *arg)
+{
+	ui_menu_t *menu = (ui_menu_t *)arg;
+
+	/* Close the menu */
+	ui_menu_bar_select(menu->mbar, NULL, NULL);
 }
 
Index: uspace/lib/ui/src/menubar.c
===================================================================
--- uspace/lib/ui/src/menubar.c	(revision 2e6394e9b57983df5807f35868516f9bf997dc35)
+++ uspace/lib/ui/src/menubar.c	(revision 4055fe6398e8d99d55d7ffceea4e0262d7f27b22)
@@ -61,5 +61,4 @@
 static errno_t ui_menu_bar_ctl_paint(void *);
 static ui_evclaim_t ui_menu_bar_ctl_pos_event(void *, pos_event_t *);
-static void ui_menu_bar_ctl_unfocus(void *);
 
 /** Menu bar control ops */
@@ -68,5 +67,4 @@
 	.paint = ui_menu_bar_ctl_paint,
 	.pos_event = ui_menu_bar_ctl_pos_event,
-	.unfocus = ui_menu_bar_ctl_unfocus
 };
 
@@ -317,13 +315,4 @@
 }
 
-/** Handle menu bar window unfocus notification.
- *
- * @param mbar Menu bar
- */
-void ui_menu_bar_unfocus(ui_menu_bar_t *mbar)
-{
-//	ui_menu_bar_select(mbar, NULL, NULL);
-}
-
 /** Destroy menu bar control.
  *
@@ -362,15 +351,4 @@
 }
 
-/** Handle menu bar control window unfocus notification.
- *
- * @param arg Argument (ui_menu_bar_t *)
- */
-void ui_menu_bar_ctl_unfocus(void *arg)
-{
-	ui_menu_bar_t *mbar = (ui_menu_bar_t *) arg;
-
-	ui_menu_bar_unfocus(mbar);
-}
-
 /** @}
  */
Index: uspace/lib/ui/src/popup.c
===================================================================
--- uspace/lib/ui/src/popup.c	(revision 2e6394e9b57983df5807f35868516f9bf997dc35)
+++ uspace/lib/ui/src/popup.c	(revision 4055fe6398e8d99d55d7ffceea4e0262d7f27b22)
@@ -46,7 +46,9 @@
 #include "../private/popup.h"
 
+static void ui_popup_window_close(ui_window_t *, void *);
 static void ui_popup_window_pos(ui_window_t *, void *, pos_event_t *);
 
 static ui_window_cb_t ui_popup_window_cb = {
+	.close = ui_popup_window_close,
 	.pos = ui_popup_window_pos
 };
@@ -185,4 +187,17 @@
 }
 
+/** Handle close event in popup window.
+ *
+ * @param window Window
+ * @param arg Argument (ui_popup_t *)
+ */
+static void ui_popup_window_close(ui_window_t *window, void *arg)
+{
+	ui_popup_t *popup = (ui_popup_t *)arg;
+
+	if (popup->cb != NULL && popup->cb->close != NULL)
+		popup->cb->close(popup, popup->arg);
+}
+
 /** Handle position event in popup window.
  *
Index: uspace/srv/hid/display/seat.c
===================================================================
--- uspace/srv/hid/display/seat.c	(revision 2e6394e9b57983df5807f35868516f9bf997dc35)
+++ uspace/srv/hid/display/seat.c	(revision 4055fe6398e8d99d55d7ffceea4e0262d7f27b22)
@@ -104,4 +104,7 @@
 		ds_window_bring_to_top(wnd);
 	}
+
+	/* When focus changes, popup window should be closed */
+	ds_seat_set_popup(seat, NULL);
 }
 
@@ -113,4 +116,13 @@
 void ds_seat_set_popup(ds_seat_t *seat, ds_window_t *wnd)
 {
+	if (wnd == seat->popup)
+		return;
+
+	if (seat->popup != NULL) {
+		/* Window is no longer the popup window, send close request */
+		ds_client_post_close_event(seat->popup->client,
+		    seat->popup);
+	}
+
 	seat->popup = wnd;
 }
@@ -139,5 +151,5 @@
 
 	if (seat->popup == wnd)
-		seat->popup = NULL;
+		ds_seat_set_popup(seat, NULL);
 }
 
@@ -427,9 +439,12 @@
 
 	wnd = ds_display_window_by_pos(seat->display, &seat->pntpos);
-	/*
-	 * Deliver event to popup window, unless the pointer is over
-	 * it (in which case it will be delivered to that window
-	 * below, anyway.
-	 */
+
+	/* Click outside popup window */
+	if (event->type == POS_PRESS && wnd != seat->popup) {
+		/* Close popup window */
+		ds_seat_set_popup(seat, NULL);
+	}
+
+	/* Deliver event to popup window. */
 	if (seat->popup != NULL) {
 		rc = ds_window_post_pos_event(seat->popup, event);
