Index: uspace/lib/ui/private/menubar.h
===================================================================
--- uspace/lib/ui/private/menubar.h	(revision 5afc1aab1cfdfe1ff186c56e8dd269294e23fdb6)
+++ uspace/lib/ui/private/menubar.h	(revision 4034954cea3faa7e7a1a926e6bd2cfc10d48f1f3)
@@ -67,5 +67,5 @@
 
 extern void ui_menu_bar_select(ui_menu_bar_t *, ui_menu_dd_t *, bool, sysarg_t);
-extern void ui_menu_bar_select_sysmenu(ui_menu_bar_t *, sysarg_t);
+extern void ui_menu_bar_select_sysmenu(ui_menu_bar_t *, bool, sysarg_t);
 extern void ui_menu_bar_left(ui_menu_bar_t *, sysarg_t);
 extern void ui_menu_bar_right(ui_menu_bar_t *, sysarg_t);
Index: uspace/lib/ui/src/menubar.c
===================================================================
--- uspace/lib/ui/src/menubar.c	(revision 5afc1aab1cfdfe1ff186c56e8dd269294e23fdb6)
+++ uspace/lib/ui/src/menubar.c	(revision 4034954cea3faa7e7a1a926e6bd2cfc10d48f1f3)
@@ -294,4 +294,10 @@
 }
 
+/** Select first drop-down.
+ *
+ * @param mbar Menu bar
+ * @param openup @c true to open drop-down if it was not open
+ * @param idev_id Input device ID
+ */
 void ui_menu_bar_select_first(ui_menu_bar_t *mbar, bool openup,
     sysarg_t idev_id)
@@ -303,4 +309,10 @@
 }
 
+/** Select last drop-down.
+ *
+ * @param mbar Menu bar
+ * @param openup @c true to open drop-down if it was not open
+ * @param idev_id Input device ID
+ */
 void ui_menu_bar_select_last(ui_menu_bar_t *mbar, bool openup,
     sysarg_t idev_id)
@@ -312,13 +324,16 @@
 }
 
-void ui_menu_bar_select_sysmenu(ui_menu_bar_t *mbar, sysarg_t idev_id)
-{
-	bool was_open;
-
+/** Select system menu.
+ *
+ * @param mbar Menu bar
+ * @param openup @c true to open drop-down if it was not open
+ * @param idev_id Input device ID
+ */
+void ui_menu_bar_select_sysmenu(ui_menu_bar_t *mbar, bool openup,
+    sysarg_t idev_id)
+{
 	ui_wdecor_sysmenu_hdl_set_active(mbar->window->wdecor, true);
-	was_open = mbar->selected != NULL &&
-	    ui_menu_dd_is_open(mbar->selected);
-
-	if (was_open)
+
+	if (openup)
 		ui_window_send_sysmenu(mbar->window, idev_id);
 }
@@ -335,4 +350,6 @@
 {
 	ui_menu_dd_t *nmdd;
+	bool sel_sysmenu = false;
+	bool was_open;
 
 	if (mbar->selected == NULL)
@@ -342,5 +359,5 @@
 	if (nmdd == NULL) {
 		if ((mbar->window->wdecor->style & ui_wds_sysmenu_hdl) != 0) {
-			ui_menu_bar_select_sysmenu(mbar, idev_id);
+			sel_sysmenu = true;
 		} else {
 			nmdd = ui_menu_dd_last(mbar);
@@ -348,6 +365,16 @@
 	}
 
+	was_open = mbar->selected != NULL &&
+	    ui_menu_dd_is_open(mbar->selected);
+
 	if (nmdd != mbar->selected)
 		ui_menu_bar_select(mbar, nmdd, false, idev_id);
+
+	/*
+	 * Only open sysmenu *after* closing the previous menu, avoid
+	 * having multiple popup windows at the same time.
+	 */
+	if (sel_sysmenu)
+		ui_menu_bar_select_sysmenu(mbar, was_open, idev_id);
 }
 
@@ -363,4 +390,6 @@
 {
 	ui_menu_dd_t *nmdd;
+	bool sel_sysmenu = false;
+	bool was_open;
 
 	if (mbar->selected == NULL)
@@ -370,5 +399,5 @@
 	if (nmdd == NULL) {
 		if ((mbar->window->wdecor->style & ui_wds_sysmenu_hdl) != 0) {
-			ui_menu_bar_select_sysmenu(mbar, idev_id);
+			sel_sysmenu = true;
 		} else {
 			nmdd = ui_menu_dd_first(mbar);
@@ -376,6 +405,16 @@
 	}
 
+	was_open = mbar->selected != NULL &&
+	    ui_menu_dd_is_open(mbar->selected);
+
 	if (nmdd != mbar->selected)
 		ui_menu_bar_select(mbar, nmdd, false, idev_id);
+
+	/*
+	 * Only open sysmenu *after* closing the previous menu, avoid
+	 * having multiple popup windows at the same time.
+	 */
+	if (sel_sysmenu)
+		ui_menu_bar_select_sysmenu(mbar, was_open, idev_id);
 }
 
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision 5afc1aab1cfdfe1ff186c56e8dd269294e23fdb6)
+++ uspace/lib/ui/src/window.c	(revision 4034954cea3faa7e7a1a926e6bd2cfc10d48f1f3)
@@ -1061,6 +1061,7 @@
 
 	if (window->mbar != NULL) {
+		ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
+		ui_menu_close(window->sysmenu);
 		ui_menu_bar_select_last(window->mbar, false, idev_id);
-		ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
 	}
 }
@@ -1077,6 +1078,7 @@
 
 	if (window->mbar != NULL) {
+		ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
+		ui_menu_close(window->sysmenu);
 		ui_menu_bar_select_first(window->mbar, false, idev_id);
-		ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
 	}
 }
@@ -1095,6 +1097,7 @@
 
 	if (window->mbar != NULL) {
+		ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
+		ui_menu_close(window->sysmenu);
 		ui_menu_bar_press_accel(window->mbar, c, idev_id);
-		ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
 	}
 }
@@ -1550,8 +1553,9 @@
 	ui_window_t *window = (ui_window_t *)arg;
 
-	(void)sysmenu;
-
-	if (window->mbar != NULL)
+	if (window->mbar != NULL) {
+		ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
+		ui_menu_close(sysmenu);
 		ui_menu_bar_select_last(window->mbar, true, idev_id);
+	}
 }
 
@@ -1566,8 +1570,9 @@
 	ui_window_t *window = (ui_window_t *)arg;
 
-	(void)sysmenu;
-
-	if (window->mbar != NULL)
+	if (window->mbar != NULL) {
+		ui_wdecor_sysmenu_hdl_set_active(window->wdecor, false);
+		ui_menu_close(sysmenu);
 		ui_menu_bar_select_first(window->mbar, true, idev_id);
+	}
 }
 
Index: uspace/lib/ui/test/menubar.c
===================================================================
--- uspace/lib/ui/test/menubar.c	(revision 5afc1aab1cfdfe1ff186c56e8dd269294e23fdb6)
+++ uspace/lib/ui/test/menubar.c	(revision 4034954cea3faa7e7a1a926e6bd2cfc10d48f1f3)
@@ -453,5 +453,5 @@
 	PCUT_ASSERT_NOT_NULL(mdd2);
 
-	ui_menu_bar_select_sysmenu(mbar, 0);
+	ui_menu_bar_select_sysmenu(mbar, false, 0);
 	PCUT_ASSERT_TRUE(window->wdecor->sysmenu_hdl_active);
 
