Index: uspace/app/calculator/calculator.c
===================================================================
--- uspace/app/calculator/calculator.c	(revision 59768c77459332a9e19b4be9e1a0aa6659f1b7c9)
+++ uspace/app/calculator/calculator.c	(revision 5de852c29de3e69c0e56c905bb90baf3983deec5)
@@ -186,4 +186,7 @@
 	calc_t *calc = (calc_t *) arg;
 
+	if (ui_window_def_kbd(window, event) == ui_claimed)
+		return;
+
 	if (event->type == KEY_PRESS && (event->mods & KM_CTRL) != 0) {
 		switch (event->key) {
Index: uspace/app/edit/edit.c
===================================================================
--- uspace/app/edit/edit.c	(revision 59768c77459332a9e19b4be9e1a0aa6659f1b7c9)
+++ uspace/app/edit/edit.c	(revision 5de852c29de3e69c0e56c905bb90baf3983deec5)
@@ -2230,4 +2230,7 @@
 	pane.keymod = event->mods;
 
+	if (ui_window_def_kbd(window, event) == ui_claimed)
+		return;
+
 	if (event->type == KEY_PRESS) {
 		key_handle_press(event);
Index: uspace/lib/ui/include/ui/menu.h
===================================================================
--- uspace/lib/ui/include/ui/menu.h	(revision 59768c77459332a9e19b4be9e1a0aa6659f1b7c9)
+++ uspace/lib/ui/include/ui/menu.h	(revision 5de852c29de3e69c0e56c905bb90baf3983deec5)
@@ -39,4 +39,5 @@
 #include <errno.h>
 #include <gfx/coord.h>
+#include <io/kbd_event.h>
 #include <io/pos_event.h>
 #include <stdbool.h>
@@ -57,4 +58,5 @@
 extern bool ui_menu_is_open(ui_menu_t *);
 extern errno_t ui_menu_paint(ui_menu_t *, gfx_coord2_t *);
+extern ui_evclaim_t ui_menu_kbd_event(ui_menu_t *, kbd_event_t *);
 extern ui_evclaim_t ui_menu_pos_event(ui_menu_t *, gfx_coord2_t *,
     pos_event_t *);
Index: uspace/lib/ui/include/ui/window.h
===================================================================
--- uspace/lib/ui/include/ui/window.h	(revision 59768c77459332a9e19b4be9e1a0aa6659f1b7c9)
+++ uspace/lib/ui/include/ui/window.h	(revision 5de852c29de3e69c0e56c905bb90baf3983deec5)
@@ -65,5 +65,5 @@
 extern void ui_window_set_ctl_cursor(ui_window_t *, ui_stock_cursor_t);
 extern errno_t ui_window_paint(ui_window_t *);
-extern void ui_window_def_kbd(ui_window_t *, kbd_event_t *);
+extern ui_evclaim_t ui_window_def_kbd(ui_window_t *, kbd_event_t *);
 extern errno_t ui_window_def_paint(ui_window_t *);
 extern void ui_window_def_pos(ui_window_t *, pos_event_t *);
Index: uspace/lib/ui/src/menu.c
===================================================================
--- uspace/lib/ui/src/menu.c	(revision 59768c77459332a9e19b4be9e1a0aa6659f1b7c9)
+++ uspace/lib/ui/src/menu.c	(revision 5de852c29de3e69c0e56c905bb90baf3983deec5)
@@ -66,4 +66,5 @@
 static void ui_menu_popup_kbd(ui_popup_t *, void *, kbd_event_t *);
 static void ui_menu_popup_pos(ui_popup_t *, void *, pos_event_t *);
+static void ui_menu_key_press_unmod(ui_menu_t *, kbd_event_t *);
 
 static ui_popup_cb_t ui_menu_popup_cb = {
@@ -493,15 +494,18 @@
 }
 
-/** 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;
-
-	/* Deactivate menu bar, close menu */
-	ui_menu_bar_deactivate(menu->mbar);
+/** Handle keyboard event in menu.
+ *
+ * @param menu Menu
+ * @param event Keyboard event
+ * @return ui_claimed iff the event was claimed
+ */
+ui_evclaim_t ui_menu_kbd_event(ui_menu_t *menu, kbd_event_t *event)
+{
+	if (event->type == KEY_PRESS && (event->mods &
+	    (KM_CTRL | KM_ALT | KM_SHIFT)) == 0) {
+		ui_menu_key_press_unmod(menu, event);
+	}
+
+	return ui_claimed;
 }
 
@@ -612,4 +616,17 @@
 }
 
+/** 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;
+
+	/* Deactivate menu bar, close menu */
+	ui_menu_bar_deactivate(menu->mbar);
+}
+
 /** Handle keyboard event in menu popup window.
  *
@@ -622,8 +639,5 @@
 	ui_menu_t *menu = (ui_menu_t *)arg;
 
-	if (event->type == KEY_PRESS && (event->mods &
-	    (KM_CTRL | KM_ALT | KM_SHIFT)) == 0) {
-		ui_menu_key_press_unmod(menu, event);
-	}
+	ui_menu_kbd_event(menu, event);
 }
 
Index: uspace/lib/ui/src/menubar.c
===================================================================
--- uspace/lib/ui/src/menubar.c	(revision 59768c77459332a9e19b4be9e1a0aa6659f1b7c9)
+++ uspace/lib/ui/src/menubar.c	(revision 5de852c29de3e69c0e56c905bb90baf3983deec5)
@@ -371,9 +371,11 @@
 	if (event->type == KEY_PRESS && (event->mods &
 	    (KM_CTRL | KM_ALT | KM_SHIFT)) == 0) {
-		ui_menu_bar_key_press_unmod(mbar, event);
+		return ui_menu_bar_key_press_unmod(mbar, event);
+	}
+
+	if (mbar->active)
 		return ui_claimed;
-	}
-
-	return ui_claimed;
+
+	return ui_unclaimed;
 }
 
Index: uspace/lib/ui/src/window.c
===================================================================
--- uspace/lib/ui/src/window.c	(revision 59768c77459332a9e19b4be9e1a0aa6659f1b7c9)
+++ uspace/lib/ui/src/window.c	(revision 5de852c29de3e69c0e56c905bb90baf3983deec5)
@@ -963,5 +963,5 @@
 		window->cb->kbd(window, window->arg, kbd);
 	else
-		return ui_window_def_kbd(window, kbd);
+		ui_window_def_kbd(window, kbd);
 }
 
@@ -1005,9 +1005,12 @@
  *
  * @param window Window
- */
-void ui_window_def_kbd(ui_window_t *window, kbd_event_t *kbd)
+ * @return ui_claimed iff event was claimed
+ */
+ui_evclaim_t ui_window_def_kbd(ui_window_t *window, kbd_event_t *kbd)
 {
 	if (window->control != NULL)
-		ui_control_kbd_event(window->control, kbd);
+		return ui_control_kbd_event(window->control, kbd);
+
+	return ui_unclaimed;
 }
 
Index: uspace/lib/ui/test/menubar.c
===================================================================
--- uspace/lib/ui/test/menubar.c	(revision 59768c77459332a9e19b4be9e1a0aa6659f1b7c9)
+++ uspace/lib/ui/test/menubar.c	(revision 5de852c29de3e69c0e56c905bb90baf3983deec5)
@@ -188,5 +188,5 @@
 	event.type = KEY_PRESS;
 	event.key = KC_ESCAPE;
-	claimed = ui_menu_kbd_pos_event(mbar, &event);
+	claimed = ui_menu_bar_kbd_event(mbar, &event);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_EQUALS(ui_claimed, claimed);
