Index: uspace/lib/ui/include/ui/menubar.h
===================================================================
--- uspace/lib/ui/include/ui/menubar.h	(revision b987eb42ca08ff4d2e679bf590bdcb10aa41d4e0)
+++ uspace/lib/ui/include/ui/menubar.h	(revision b3b48f4c5a21ad9952bcb7d8d51353f60b59d3c3)
@@ -46,4 +46,5 @@
 #include <types/ui/ui.h>
 #include <types/ui/window.h>
+#include <uchar.h>
 
 extern errno_t ui_menu_bar_create(ui_t *, ui_window_t *,
@@ -55,4 +56,5 @@
 extern ui_evclaim_t ui_menu_bar_kbd_event(ui_menu_bar_t *, kbd_event_t *);
 extern ui_evclaim_t ui_menu_bar_pos_event(ui_menu_bar_t *, pos_event_t *);
+extern void ui_menu_bar_press_accel(ui_menu_bar_t *, char32_t);
 extern void ui_menu_bar_unfocus(ui_menu_bar_t *);
 extern void ui_menu_bar_activate(ui_menu_bar_t *);
Index: uspace/lib/ui/src/menu.c
===================================================================
--- uspace/lib/ui/src/menu.c	(revision b987eb42ca08ff4d2e679bf590bdcb10aa41d4e0)
+++ uspace/lib/ui/src/menu.c	(revision b3b48f4c5a21ad9952bcb7d8d51353f60b59d3c3)
@@ -519,4 +519,8 @@
 		ui_menu_key_press_unmod(menu, event);
 	}
+
+	if (event->type == KEY_PRESS && (event->mods & KM_ALT) != 0 &&
+	    (event->mods & (KM_CTRL | KM_SHIFT)) == 0 && event->c != '\0')
+		ui_menu_bar_press_accel(menu->mbar, event->c);
 
 	return ui_claimed;
Index: uspace/lib/ui/src/menubar.c
===================================================================
--- uspace/lib/ui/src/menubar.c	(revision b987eb42ca08ff4d2e679bf590bdcb10aa41d4e0)
+++ uspace/lib/ui/src/menubar.c	(revision b3b48f4c5a21ad9952bcb7d8d51353f60b59d3c3)
@@ -330,6 +330,4 @@
 {
 	gfx_rect_t rect;
-	ui_menu_t *menu;
-	char32_t maccel;
 
 	if (event->key == KC_F10) {
@@ -364,15 +362,5 @@
 	if (event->c != '\0' && !ui_menu_is_open(mbar->selected)) {
 		/* Check if it is an accelerator. */
-
-		menu = ui_menu_first(mbar);
-		while (menu != NULL) {
-			maccel = ui_menu_get_accel(menu);
-			if (event->c == maccel) {
-				ui_menu_bar_select(mbar, menu, true);
-				return ui_claimed;
-			}
-
-			menu = ui_menu_next(menu);
-		}
+		ui_menu_bar_press_accel(mbar, event->c);
 	}
 
@@ -388,4 +376,10 @@
 ui_evclaim_t ui_menu_bar_kbd_event(ui_menu_bar_t *mbar, kbd_event_t *event)
 {
+	if ((event->mods & KM_ALT) != 0 &&
+	    (event->mods & (KM_CTRL | KM_SHIFT)) == 0 && event->c != '\0') {
+		/* Check if it is an accelerator. */
+		ui_menu_bar_press_accel(mbar, event->c);
+	}
+
 	if (event->type == KEY_PRESS && (event->mods &
 	    (KM_CTRL | KM_ALT | KM_SHIFT)) == 0) {
@@ -397,4 +391,28 @@
 
 	return ui_unclaimed;
+}
+
+/** Accelerator key press.
+ *
+ * If @a c matches an accelerator key, open the respective menu.
+ *
+ * @param mbar Menu bar
+ * @param c Character
+ */
+void ui_menu_bar_press_accel(ui_menu_bar_t *mbar, char32_t c)
+{
+	ui_menu_t *menu;
+	char32_t maccel;
+
+	menu = ui_menu_first(mbar);
+	while (menu != NULL) {
+		maccel = ui_menu_get_accel(menu);
+		if (c == maccel) {
+			ui_menu_bar_select(mbar, menu, true);
+			return;
+		}
+
+		menu = ui_menu_next(menu);
+	}
 }
 
Index: uspace/lib/ui/test/menubar.c
===================================================================
--- uspace/lib/ui/test/menubar.c	(revision b987eb42ca08ff4d2e679bf590bdcb10aa41d4e0)
+++ uspace/lib/ui/test/menubar.c	(revision b3b48f4c5a21ad9952bcb7d8d51353f60b59d3c3)
@@ -198,6 +198,6 @@
 }
 
-/** Press event on menu bar entry selects menu */
-PCUT_TEST(pos_event_select)
+/** ui_menu_bar_press_accel() opens the corresponding menu */
+PCUT_TEST(press_accel)
 {
 	ui_t *ui = NULL;
@@ -206,6 +206,4 @@
 	ui_menu_bar_t *mbar = NULL;
 	ui_menu_t *menu = NULL;
-	ui_evclaim_t claimed;
-	pos_event_t event;
 	gfx_rect_t rect;
 	errno_t rc;
@@ -231,4 +229,52 @@
 	ui_menu_bar_set_rect(mbar, &rect);
 
+	rc = ui_menu_create(mbar, "~T~est", &menu);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(menu);
+
+	PCUT_ASSERT_FALSE(ui_menu_is_open(menu));
+
+	ui_menu_bar_press_accel(mbar, 't');
+
+	PCUT_ASSERT_TRUE(ui_menu_is_open(menu));
+
+	ui_menu_bar_destroy(mbar);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
+/** Press event on menu bar entry selects menu */
+PCUT_TEST(pos_event_select)
+{
+	ui_t *ui = NULL;
+	ui_window_t *window = NULL;
+	ui_wnd_params_t params;
+	ui_menu_bar_t *mbar = NULL;
+	ui_menu_t *menu = NULL;
+	ui_evclaim_t claimed;
+	pos_event_t event;
+	gfx_rect_t rect;
+	errno_t rc;
+
+	rc = ui_create_disp(NULL, &ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_wnd_params_init(&params);
+	params.caption = "Hello";
+
+	rc = ui_window_create(ui, &params, &window);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(window);
+
+	rc = ui_menu_bar_create(ui, window, &mbar);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(mbar);
+
+	rect.p0.x = 0;
+	rect.p0.y = 0;
+	rect.p1.x = 50;
+	rect.p1.y = 25;
+	ui_menu_bar_set_rect(mbar, &rect);
+
 	rc = ui_menu_create(mbar, "Test", &menu);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
