Index: uspace/app/calculator/calculator.c
===================================================================
--- uspace/app/calculator/calculator.c	(revision d65accb7901a0c96ec4e11bd1f2395b78b22c608)
+++ uspace/app/calculator/calculator.c	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
@@ -899,5 +899,5 @@
 	}
 
-	rc = ui_menu_entry_create(mfile, "Exit", &mexit);
+	rc = ui_menu_entry_create(mfile, "Exit", "Alt-F4", &mexit);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -913,5 +913,5 @@
 	}
 
-	rc = ui_menu_entry_create(medit, "Copy", &mcopy);
+	rc = ui_menu_entry_create(medit, "Copy", "Ctrl-C", &mcopy);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -921,5 +921,5 @@
 	ui_menu_entry_set_cb(mcopy, calc_edit_copy, (void *) &calc);
 
-	rc = ui_menu_entry_create(medit, "Paste", &mpaste);
+	rc = ui_menu_entry_create(medit, "Paste", "Ctrl-V", &mpaste);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
Index: uspace/app/uidemo/uidemo.c
===================================================================
--- uspace/app/uidemo/uidemo.c	(revision d65accb7901a0c96ec4e11bd1f2395b78b22c608)
+++ uspace/app/uidemo/uidemo.c	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
@@ -269,23 +269,23 @@
 	}
 
-	rc = ui_menu_entry_create(demo.mfile, "Foo", &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);
-	if (rc != EOK) {
-		printf("Error creating menu.\n");
-		return rc;
-	}
-
-	rc = ui_menu_entry_create(demo.mfile, "Exit", &mexit);
+	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);
+	if (rc != EOK) {
+		printf("Error creating menu.\n");
+		return rc;
+	}
+
+	rc = ui_menu_entry_create(demo.mfile, "Exit", "Alt-F4", &mexit);
 	if (rc != EOK) {
 		printf("Error creating menu.\n");
@@ -313,5 +313,5 @@
 	}
 
-	rc = ui_menu_entry_create(demo.mhelp, "About", &mabout);
+	rc = ui_menu_entry_create(demo.mhelp, "About", "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 d65accb7901a0c96ec4e11bd1f2395b78b22c608)
+++ uspace/lib/ui/include/ui/menuentry.h	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
@@ -43,5 +43,5 @@
 #include <types/ui/event.h>
 
-extern errno_t ui_menu_entry_create(ui_menu_t *, const char *,
+extern errno_t ui_menu_entry_create(ui_menu_t *, const char *, const char *,
     ui_menu_entry_t **);
 extern void ui_menu_entry_destroy(ui_menu_entry_t *);
@@ -50,5 +50,8 @@
 extern ui_menu_entry_t *ui_menu_entry_first(ui_menu_t *);
 extern ui_menu_entry_t *ui_menu_entry_next(ui_menu_entry_t *);
-extern gfx_coord_t ui_menu_entry_width(ui_menu_entry_t *);
+extern gfx_coord_t ui_menu_entry_calc_width(ui_menu_t *,
+    gfx_coord_t, gfx_coord_t);
+extern void ui_menu_entry_column_widths(ui_menu_entry_t *,
+    gfx_coord_t *, gfx_coord_t *);
 extern gfx_coord_t ui_menu_entry_height(ui_menu_entry_t *);
 extern errno_t ui_menu_entry_paint(ui_menu_entry_t *, gfx_coord2_t *);
Index: uspace/lib/ui/private/menu.h
===================================================================
--- uspace/lib/ui/private/menu.h	(revision d65accb7901a0c96ec4e11bd1f2395b78b22c608)
+++ uspace/lib/ui/private/menu.h	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
@@ -58,6 +58,8 @@
 	/** Selected menu entry or @c NULL */
 	struct ui_menu_entry *selected;
-	/** Maximum entry width */
-	gfx_coord_t max_w;
+	/** Maximum caption width */
+	gfx_coord_t max_caption_w;
+	/** Maximum shortcut width */
+	gfx_coord_t max_shortcut_w;
 	/** Total entry height */
 	gfx_coord_t total_h;
Index: uspace/lib/ui/private/menuentry.h
===================================================================
--- uspace/lib/ui/private/menuentry.h	(revision d65accb7901a0c96ec4e11bd1f2395b78b22c608)
+++ uspace/lib/ui/private/menuentry.h	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
@@ -61,4 +61,6 @@
 	/** Caption */
 	char *caption;
+	/** Shortcut key(s) */
+	char *shortcut;
 };
 
@@ -70,6 +72,8 @@
 	/** Outer rectangle */
 	gfx_rect_t outer_rect;
-	/** Text position */
-	gfx_coord2_t text_pos;
+	/** Caption position */
+	gfx_coord2_t caption_pos;
+	/** Shortcut position */
+	gfx_coord2_t shortcut_pos;
 } ui_menu_entry_geom_t;
 
Index: uspace/lib/ui/src/menu.c
===================================================================
--- uspace/lib/ui/src/menu.c	(revision d65accb7901a0c96ec4e11bd1f2395b78b22c608)
+++ uspace/lib/ui/src/menu.c	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
@@ -175,5 +175,6 @@
 	}
 
-	edim.x = menu->max_w;
+	edim.x = ui_menu_entry_calc_width(menu, menu->max_caption_w,
+	    menu->max_shortcut_w);
 	edim.y = menu->total_h;
 
Index: uspace/lib/ui/src/menuentry.c
===================================================================
--- uspace/lib/ui/src/menuentry.c	(revision d65accb7901a0c96ec4e11bd1f2395b78b22c608)
+++ uspace/lib/ui/src/menuentry.c	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
@@ -54,6 +54,8 @@
 	menu_entry_hpad = 4,
 	menu_entry_vpad = 4,
+	menu_entry_column_pad = 8,
 	menu_entry_hpad_text = 1,
-	menu_entry_vpad_text = 0
+	menu_entry_vpad_text = 0,
+	menu_entry_column_pad_text = 2
 };
 
@@ -62,12 +64,14 @@
  * @param menu Menu
  * @param caption Caption
+ * @param shortcut Shotcut key(s) or empty string
  * @param rmentry Place to store pointer to new menu entry
  * @return EOK on success, ENOMEM if out of memory
  */
 errno_t ui_menu_entry_create(ui_menu_t *menu, const char *caption,
-    ui_menu_entry_t **rmentry)
+    const char *shortcut, ui_menu_entry_t **rmentry)
 {
 	ui_menu_entry_t *mentry;
-	gfx_coord_t width;
+	gfx_coord_t caption_w;
+	gfx_coord_t shortcut_w;
 
 	mentry = calloc(1, sizeof(ui_menu_entry_t));
@@ -81,11 +85,20 @@
 	}
 
+	mentry->shortcut = str_dup(shortcut);
+	if (mentry->caption == NULL) {
+		free(mentry->caption);
+		free(mentry);
+		return ENOMEM;
+	}
+
 	mentry->menu = menu;
 	list_append(&mentry->lentries, &menu->entries);
 
 	/* Update accumulated menu entry dimensions */
-	width = ui_menu_entry_width(mentry);
-	if (width > menu->max_w)
-		menu->max_w = width;
+	ui_menu_entry_column_widths(mentry, &caption_w, &shortcut_w);
+	if (caption_w > menu->max_caption_w)
+		menu->max_caption_w = caption_w;
+	if (shortcut_w > menu->max_shortcut_w)
+		menu->max_shortcut_w = shortcut_w;
 	menu->total_h += ui_menu_entry_height(mentry);
 
@@ -156,20 +169,51 @@
  *
  * @param mentry Menu entry
+ * @param caption_w Place to store caption width
+ * @param shortcut_w Place to store shortcut width
+ */
+void ui_menu_entry_column_widths(ui_menu_entry_t *mentry,
+    gfx_coord_t *caption_w, gfx_coord_t *shortcut_w)
+{
+	ui_resource_t *res;
+
+	res = mentry->menu->mbar->res;
+
+	*caption_w = gfx_text_width(res->font, mentry->caption);
+	*shortcut_w = gfx_text_width(res->font, mentry->shortcut);
+}
+
+/** Compute width of menu entry.
+ *
+ * @param menu Menu
+ * @param caption_w Widht of caption text
+ * @param shortcut_w Width of shortcut text
  * @return Width in pixels
  */
-gfx_coord_t ui_menu_entry_width(ui_menu_entry_t *mentry)
+gfx_coord_t ui_menu_entry_calc_width(ui_menu_t *menu, gfx_coord_t caption_w,
+    gfx_coord_t shortcut_w)
 {
 	ui_resource_t *res;
 	gfx_coord_t hpad;
-
-	res = mentry->menu->mbar->res;
-
-	if (res->textmode) {
+	gfx_coord_t width;
+
+	res = menu->mbar->res;
+
+	if (res->textmode)
 		hpad = menu_entry_hpad_text;
-	} else {
+	else
 		hpad = menu_entry_hpad;
-	}
-
-	return gfx_text_width(res->font, mentry->caption) + 2 * hpad;
+
+	width = caption_w + 2 * hpad;
+
+	if (shortcut_w != 0) {
+		if (res->textmode)
+			width += menu_entry_column_pad_text;
+		else
+			width += menu_entry_column_pad;
+
+		width += shortcut_w;
+	}
+
+	return width;
 }
 
@@ -210,5 +254,4 @@
 	gfx_text_fmt_t fmt;
 	gfx_color_t *bg_color;
-	const char *caption;
 	ui_menu_entry_geom_t geom;
 	errno_t rc;
@@ -221,6 +264,4 @@
 	fmt.halign = gfx_halign_left;
 	fmt.valign = gfx_valign_top;
-
-	caption = mentry->caption;
 
 	if ((mentry->held && mentry->inside) ||
@@ -241,5 +282,11 @@
 		goto error;
 
-	rc = gfx_puttext(res->font, &geom.text_pos, &fmt, caption);
+	rc = gfx_puttext(res->font, &geom.caption_pos, &fmt, mentry->caption);
+	if (rc != EOK)
+		goto error;
+
+	fmt.halign = gfx_halign_right;
+
+	rc = gfx_puttext(res->font, &geom.shortcut_pos, &fmt, mentry->shortcut);
 	if (rc != EOK)
 		goto error;
@@ -400,7 +447,7 @@
 	}
 
-	width = mentry->menu->max_w;
-	geom->text_pos.x = pos->x + hpad;
-	geom->text_pos.y = pos->y + vpad;
+	/* Compute total width of menu entry */
+	width = ui_menu_entry_calc_width(mentry->menu,
+	    mentry->menu->max_caption_w, mentry->menu->max_shortcut_w);
 
 	geom->outer_rect.p0 = *pos;
@@ -408,4 +455,10 @@
 	geom->outer_rect.p1.y = geom->outer_rect.p0.y +
 	    ui_menu_entry_height(mentry);
+
+	geom->caption_pos.x = pos->x + hpad;
+	geom->caption_pos.y = pos->y + vpad;
+
+	geom->shortcut_pos.x = geom->outer_rect.p1.x - hpad;
+	geom->shortcut_pos.y = pos->y + vpad;
 }
 
Index: uspace/lib/ui/test/menu.c
===================================================================
--- uspace/lib/ui/test/menu.c	(revision d65accb7901a0c96ec4e11bd1f2395b78b22c608)
+++ uspace/lib/ui/test/menu.c	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
@@ -205,5 +205,5 @@
 	PCUT_ASSERT_INT_EQUALS(0, rect.p0.x);
 	PCUT_ASSERT_INT_EQUALS(0, rect.p0.y);
-	PCUT_ASSERT_INT_EQUALS(8, rect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(16, rect.p1.x);
 	PCUT_ASSERT_INT_EQUALS(8, rect.p1.y);
 
@@ -420,9 +420,9 @@
 	PCUT_ASSERT_INT_EQUALS(0, geom.outer_rect.p0.x);
 	PCUT_ASSERT_INT_EQUALS(0, geom.outer_rect.p0.y);
-	PCUT_ASSERT_INT_EQUALS(8, geom.outer_rect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(16, geom.outer_rect.p1.x);
 	PCUT_ASSERT_INT_EQUALS(8, geom.outer_rect.p1.y);
 	PCUT_ASSERT_INT_EQUALS(4, geom.entries_rect.p0.x);
 	PCUT_ASSERT_INT_EQUALS(4, geom.entries_rect.p0.y);
-	PCUT_ASSERT_INT_EQUALS(4, geom.entries_rect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(12, geom.entries_rect.p1.x);
 	PCUT_ASSERT_INT_EQUALS(4, geom.entries_rect.p1.y);
 
Index: uspace/lib/ui/test/menuentry.c
===================================================================
--- uspace/lib/ui/test/menuentry.c	(revision d65accb7901a0c96ec4e11bd1f2395b78b22c608)
+++ uspace/lib/ui/test/menuentry.c	(revision b8b64a813a029c8f1d40c1b17e79513d0a6aed8d)
@@ -99,5 +99,5 @@
 	PCUT_ASSERT_NOT_NULL(menu);
 
-	rc = ui_menu_entry_create(menu, "Foo", &mentry);
+	rc = ui_menu_entry_create(menu, "Foo", "F1", &mentry);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(mentry);
@@ -144,9 +144,9 @@
 	PCUT_ASSERT_NOT_NULL(menu);
 
-	rc = ui_menu_entry_create(menu, "Foo", &entry1);
+	rc = ui_menu_entry_create(menu, "Foo", "F1", &entry1);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(entry1);
 
-	rc = ui_menu_entry_create(menu, "Bar", &entry2);
+	rc = ui_menu_entry_create(menu, "Bar", "F2", &entry2);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(entry2);
@@ -166,13 +166,15 @@
 }
 
-/** ui_menu_entry_width() / ui_menu_entry_height() */
-PCUT_TEST(width_height)
-{
-	dummy_gc_t *dgc;
-	gfx_context_t *gc;
-	ui_resource_t *resource = NULL;
-	ui_menu_bar_t *mbar = NULL;
-	ui_menu_t *menu = NULL;
-	ui_menu_entry_t *mentry = NULL;
+/** ui_menu_entry_widths() / ui_menu_entry_height() */
+PCUT_TEST(widths_height)
+{
+	dummy_gc_t *dgc;
+	gfx_context_t *gc;
+	ui_resource_t *resource = NULL;
+	ui_menu_bar_t *mbar = NULL;
+	ui_menu_t *menu = NULL;
+	ui_menu_entry_t *mentry = NULL;
+	gfx_coord_t caption_w;
+	gfx_coord_t shortcut_w;
 	gfx_coord_t width;
 	gfx_coord_t height;
@@ -196,10 +198,14 @@
 	PCUT_ASSERT_NOT_NULL(menu);
 
-	rc = ui_menu_entry_create(menu, "X", &mentry);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-	PCUT_ASSERT_NOT_NULL(mentry);
-
-	width = ui_menu_entry_width(mentry);
-	PCUT_ASSERT_INT_EQUALS(11 + 8, width);
+	rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_NOT_NULL(mentry);
+
+	ui_menu_entry_column_widths(mentry, &caption_w, &shortcut_w);
+	PCUT_ASSERT_INT_EQUALS(11, caption_w);
+	PCUT_ASSERT_INT_EQUALS(10, shortcut_w);
+
+	width = ui_menu_entry_calc_width(menu, caption_w, shortcut_w);
+	PCUT_ASSERT_INT_EQUALS(4 + 11 + 8 + 10 + 4, width);
 
 	height = ui_menu_entry_height(mentry);
@@ -240,5 +246,5 @@
 	PCUT_ASSERT_NOT_NULL(menu);
 
-	rc = ui_menu_entry_create(menu, "Foo", &mentry);
+	rc = ui_menu_entry_create(menu, "Foo", "F1", &mentry);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(mentry);
@@ -284,5 +290,5 @@
 	PCUT_ASSERT_NOT_NULL(menu);
 
-	rc = ui_menu_entry_create(menu, "X", &mentry);
+	rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(mentry);
@@ -337,5 +343,5 @@
 	PCUT_ASSERT_NOT_NULL(menu);
 
-	rc = ui_menu_entry_create(menu, "X", &mentry);
+	rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(mentry);
@@ -395,5 +401,5 @@
 	PCUT_ASSERT_NOT_NULL(menu);
 
-	rc = ui_menu_entry_create(menu, "X", &mentry);
+	rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(mentry);
@@ -458,5 +464,5 @@
 	PCUT_ASSERT_NOT_NULL(menu);
 
-	rc = ui_menu_entry_create(menu, "X", &mentry);
+	rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(mentry);
@@ -508,5 +514,5 @@
 	PCUT_ASSERT_NOT_NULL(menu);
 
-	rc = ui_menu_entry_create(menu, "X", &mentry);
+	rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(mentry);
@@ -516,5 +522,5 @@
 
 	event.type = POS_PRESS;
-	event.hpos = 20;
+	event.hpos = 40;
 	event.vpos = 20;
 
@@ -558,5 +564,5 @@
 	PCUT_ASSERT_NOT_NULL(menu);
 
-	rc = ui_menu_entry_create(menu, "X", &mentry);
+	rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(mentry);
@@ -569,5 +575,5 @@
 
 	event.type = POS_UPDATE;
-	event.hpos = 20;
+	event.hpos = 40;
 	event.vpos = 20;
 
@@ -611,5 +617,5 @@
 	PCUT_ASSERT_NOT_NULL(menu);
 
-	rc = ui_menu_entry_create(menu, "X", &mentry);
+	rc = ui_menu_entry_create(menu, "X", "Y", &mentry);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 	PCUT_ASSERT_NOT_NULL(mentry);
