Index: uspace/app/calculator/calculator.c
===================================================================
--- uspace/app/calculator/calculator.c	(revision 96c6a005543f33cc3c981d5509c272f7fc2978cf)
+++ uspace/app/calculator/calculator.c	(revision c88d7f99a03ed5648769517d28db22e858d28931)
@@ -902,5 +902,5 @@
 	}
 
-	rc = ui_menu_entry_create(mfile, "Exit", "Alt-F4", &mexit);
+	rc = ui_menu_entry_create(mfile, "E~x~it", "Alt-F4", &mexit);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -916,5 +916,5 @@
 	}
 
-	rc = ui_menu_entry_create(medit, "Copy", "Ctrl-C", &mcopy);
+	rc = ui_menu_entry_create(medit, "~C~opy", "Ctrl-C", &mcopy);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -924,5 +924,5 @@
 	ui_menu_entry_set_cb(mcopy, calc_edit_copy, (void *) &calc);
 
-	rc = ui_menu_entry_create(medit, "Paste", "Ctrl-V", &mpaste);
+	rc = ui_menu_entry_create(medit, "~P~aste", "Ctrl-V", &mpaste);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
Index: uspace/app/edit/edit.c
===================================================================
--- uspace/app/edit/edit.c	(revision 96c6a005543f33cc3c981d5509c272f7fc2978cf)
+++ uspace/app/edit/edit.c	(revision c88d7f99a03ed5648769517d28db22e858d28931)
@@ -436,5 +436,5 @@
 	}
 
-	rc = ui_menu_entry_create(mfile, "Save", "Ctrl-S", &msave);
+	rc = ui_menu_entry_create(mfile, "~S~ave", "Ctrl-S", &msave);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -444,5 +444,5 @@
 	ui_menu_entry_set_cb(msave, edit_file_save, (void *) edit);
 
-	rc = ui_menu_entry_create(mfile, "Save As", "Ctrl-E", &msaveas);
+	rc = ui_menu_entry_create(mfile, "Save ~A~s", "Ctrl-E", &msaveas);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -458,5 +458,5 @@
 	}
 
-	rc = ui_menu_entry_create(mfile, "Exit", "Ctrl-Q", &mexit);
+	rc = ui_menu_entry_create(mfile, "E~x~it", "Ctrl-Q", &mexit);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -472,5 +472,5 @@
 	}
 
-	rc = ui_menu_entry_create(medit, "Cut", "Ctrl-X", &mcut);
+	rc = ui_menu_entry_create(medit, "Cu~t~", "Ctrl-X", &mcut);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -480,5 +480,5 @@
 	ui_menu_entry_set_cb(mcut, edit_edit_cut, (void *) edit);
 
-	rc = ui_menu_entry_create(medit, "Copy", "Ctrl-C", &mcopy);
+	rc = ui_menu_entry_create(medit, "~C~opy", "Ctrl-C", &mcopy);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -488,5 +488,5 @@
 	ui_menu_entry_set_cb(mcopy, edit_edit_copy, (void *) edit);
 
-	rc = ui_menu_entry_create(medit, "Paste", "Ctrl-V", &mpaste);
+	rc = ui_menu_entry_create(medit, "~P~aste", "Ctrl-V", &mpaste);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -496,5 +496,5 @@
 	ui_menu_entry_set_cb(mpaste, edit_edit_paste, (void *) edit);
 
-	rc = ui_menu_entry_create(medit, "Delete", "Del", &mdelete);
+	rc = ui_menu_entry_create(medit, "~D~elete", "Del", &mdelete);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -510,5 +510,5 @@
 	}
 
-	rc = ui_menu_entry_create(medit, "Select All", "Ctrl-A", &mselall);
+	rc = ui_menu_entry_create(medit, "Select ~A~ll", "Ctrl-A", &mselall);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -524,5 +524,5 @@
 	}
 
-	rc = ui_menu_entry_create(msearch, "Find", "Ctrl-F", &mfind);
+	rc = ui_menu_entry_create(msearch, "~F~ind", "Ctrl-F", &mfind);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -532,5 +532,5 @@
 	ui_menu_entry_set_cb(mfind, edit_search_find, (void *) edit);
 
-	rc = ui_menu_entry_create(msearch, "Reverse Find", "Ctrl-Shift-F", &mfindr);
+	rc = ui_menu_entry_create(msearch, "~R~everse Find", "Ctrl-Shift-F", &mfindr);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -540,5 +540,5 @@
 	ui_menu_entry_set_cb(mfindr, edit_search_reverse_find, (void *) edit);
 
-	rc = ui_menu_entry_create(msearch, "Find Next", "Ctrl-N", &mfindn);
+	rc = ui_menu_entry_create(msearch, "Find ~N~ext", "Ctrl-N", &mfindn);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -554,5 +554,5 @@
 	}
 
-	rc = ui_menu_entry_create(msearch, "Go To Line", "Ctrl-L", &mgoto);
+	rc = ui_menu_entry_create(msearch, "Go To ~L~ine", "Ctrl-L", &mgoto);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
Index: uspace/app/uidemo/uidemo.c
===================================================================
--- uspace/app/uidemo/uidemo.c	(revision 96c6a005543f33cc3c981d5509c272f7fc2978cf)
+++ uspace/app/uidemo/uidemo.c	(revision c88d7f99a03ed5648769517d28db22e858d28931)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2022 Jiri Svoboda
  * All rights reserved.
  *
@@ -545,5 +545,5 @@
 	}
 
-	rc = ui_menu_entry_create(demo.mfile, "Message", "", &mmsg);
+	rc = ui_menu_entry_create(demo.mfile, "~M~essage", "", &mmsg);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -553,5 +553,5 @@
 	ui_menu_entry_set_cb(mmsg, uidemo_file_message, (void *) &demo);
 
-	rc = ui_menu_entry_create(demo.mfile, "Load", "", &mload);
+	rc = ui_menu_entry_create(demo.mfile, "~L~oad", "", &mload);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -561,17 +561,17 @@
 	ui_menu_entry_set_cb(mload, uidemo_file_load, (void *) &demo);
 
-	rc = ui_menu_entry_create(demo.mfile, "Foo", "Ctrl-Alt-Del", &mfoo);
-	if (rc != EOK) {
-		printf("Error creating menu.\n");
-		return rc;
-	}
-
-	rc = ui_menu_entry_create(demo.mfile, "Bar", "", &mbar);
-	if (rc != EOK) {
-		printf("Error creating menu.\n");
-		return rc;
-	}
-
-	rc = ui_menu_entry_create(demo.mfile, "Foobar", "", &mfoobar);
+	rc = ui_menu_entry_create(demo.mfile, "~F~oo", "Ctrl-Alt-Del", &mfoo);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	rc = ui_menu_entry_create(demo.mfile, "~B~ar", "", &mbar);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	rc = ui_menu_entry_create(demo.mfile, "F~o~obar", "", &mfoobar);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -585,5 +585,5 @@
 	}
 
-	rc = ui_menu_entry_create(demo.mfile, "Exit", "Alt-F4", &mexit);
+	rc = ui_menu_entry_create(demo.mfile, "E~x~it", "Alt-F4", &mexit);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -599,5 +599,5 @@
 	}
 
-	rc = ui_menu_entry_create(demo.medit, "Modify", "", &mmodify);
+	rc = ui_menu_entry_create(demo.medit, "~M~odify", "", &mmodify);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -619,5 +619,5 @@
 	}
 
-	rc = ui_menu_entry_create(demo.mhelp, "About", "Ctrl-H, F1", &mabout);
+	rc = ui_menu_entry_create(demo.mhelp, "~A~bout", "Ctrl-H, F1", &mabout);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
Index: uspace/lib/ui/include/ui/menuentry.h
===================================================================
--- uspace/lib/ui/include/ui/menuentry.h	(revision 96c6a005543f33cc3c981d5509c272f7fc2978cf)
+++ uspace/lib/ui/include/ui/menuentry.h	(revision c88d7f99a03ed5648769517d28db22e858d28931)
@@ -60,4 +60,5 @@
     gfx_coord_t *, gfx_coord_t *);
 extern gfx_coord_t ui_menu_entry_height(ui_menu_entry_t *);
+extern char32_t ui_menu_entry_get_accel(ui_menu_entry_t *);
 extern errno_t ui_menu_entry_paint(ui_menu_entry_t *, gfx_coord2_t *);
 extern bool ui_menu_entry_selectable(ui_menu_entry_t *);
Index: uspace/lib/ui/src/menu.c
===================================================================
--- uspace/lib/ui/src/menu.c	(revision 96c6a005543f33cc3c981d5509c272f7fc2978cf)
+++ uspace/lib/ui/src/menu.c	(revision c88d7f99a03ed5648769517d28db22e858d28931)
@@ -604,4 +604,7 @@
 static void ui_menu_key_press_unmod(ui_menu_t *menu, kbd_event_t *event)
 {
+	ui_menu_entry_t *mentry;
+	char32_t c;
+
 	switch (event->key) {
 	case KC_ESCAPE:
@@ -625,4 +628,15 @@
 		break;
 	default:
+		if (event->c != '\0') {
+			mentry = ui_menu_entry_first(menu);
+			while (mentry != NULL) {
+				c = ui_menu_entry_get_accel(mentry);
+				if (c == event->c && menu->selected != NULL) {
+					ui_menu_entry_activate(mentry);
+					break;
+				}
+				mentry = ui_menu_entry_next(mentry);
+			}
+		}
 		break;
 	}
Index: uspace/lib/ui/src/menuentry.c
===================================================================
--- uspace/lib/ui/src/menuentry.c	(revision 96c6a005543f33cc3c981d5509c272f7fc2978cf)
+++ uspace/lib/ui/src/menuentry.c	(revision c88d7f99a03ed5648769517d28db22e858d28931)
@@ -43,4 +43,5 @@
 #include <stdlib.h>
 #include <str.h>
+#include <ui/accel.h>
 #include <ui/control.h>
 #include <ui/paint.h>
@@ -245,6 +246,6 @@
 	res = ui_window_get_res(mentry->menu->mbar->window);
 
-	*caption_w = gfx_text_width(res->font, mentry->caption);
-	*shortcut_w = gfx_text_width(res->font, mentry->shortcut);
+	*caption_w = ui_text_width(res->font, mentry->caption);
+	*shortcut_w = ui_text_width(res->font, mentry->shortcut);
 }
 
@@ -331,4 +332,15 @@
 }
 
+/** Get menu entry accelerator character.
+ *
+ * @param mentry Menu entry
+ * @return Accelerator character (lowercase) or the null character if
+ *         the menu entry has no accelerator.
+ */
+char32_t ui_menu_entry_get_accel(ui_menu_entry_t *mentry)
+{
+	return ui_accel_get(mentry->caption);
+}
+
 /** Paint menu entry.
  *
@@ -340,5 +352,5 @@
 {
 	ui_resource_t *res;
-	gfx_text_fmt_t fmt;
+	ui_text_fmt_t fmt;
 	gfx_color_t *bg_color;
 	ui_menu_entry_geom_t geom;
@@ -350,5 +362,5 @@
 	ui_menu_entry_get_geom(mentry, pos, &geom);
 
-	gfx_text_fmt_init(&fmt);
+	ui_text_fmt_init(&fmt);
 	fmt.font = res->font;
 	fmt.halign = gfx_halign_left;
@@ -358,7 +370,9 @@
 	    mentry == mentry->menu->selected) {
 		fmt.color = res->wnd_sel_text_color;
+		fmt.hgl_color = res->wnd_sel_text_hgl_color;
 		bg_color = res->wnd_sel_text_bg_color;
 	} else {
 		fmt.color = res->wnd_text_color;
+		fmt.hgl_color = res->wnd_text_hgl_color;
 		bg_color = res->wnd_face_color;
 	}
@@ -372,5 +386,5 @@
 		goto error;
 
-	rc = gfx_puttext(&geom.caption_pos, &fmt, mentry->caption);
+	rc = ui_paint_text(&geom.caption_pos, &fmt, mentry->caption);
 	if (rc != EOK)
 		goto error;
@@ -378,5 +392,5 @@
 	fmt.halign = gfx_halign_right;
 
-	rc = gfx_puttext(&geom.shortcut_pos, &fmt, mentry->shortcut);
+	rc = ui_paint_text(&geom.shortcut_pos, &fmt, mentry->shortcut);
 	if (rc != EOK)
 		goto error;
