Index: uspace/lib/ui/test/accel.c
===================================================================
--- uspace/lib/ui/test/accel.c	(revision 96c6a005543f33cc3c981d5509c272f7fc2978cf)
+++ uspace/lib/ui/test/accel.c	(revision 96c6a005543f33cc3c981d5509c272f7fc2978cf)
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2022 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTvvhhzccgggrERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <pcut/pcut.h>
+#include <stdlib.h>
+#include <str.h>
+#include <uchar.h>
+#include <ui/accel.h>
+
+PCUT_INIT;
+
+PCUT_TEST_SUITE(accel);
+
+/** ui_accel_process() */
+PCUT_TEST(process)
+{
+	errno_t rc;
+	char *buf;
+	char *endptr;
+	char *bp1;
+	char *bp2;
+
+	/* Cases where one string is produced */
+
+	rc = ui_accel_process("", &buf, &endptr);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_STR_EQUALS("", buf);
+	PCUT_ASSERT_EQUALS(buf + 1, endptr);
+	free(buf);
+
+	rc = ui_accel_process("Hello", &buf, &endptr);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_STR_EQUALS("Hello", buf);
+	PCUT_ASSERT_EQUALS(buf + str_size("Hello") + 1, endptr);
+	free(buf);
+
+	rc = ui_accel_process("~~Hello~~", &buf, &endptr);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_STR_EQUALS("~Hello~", buf);
+	PCUT_ASSERT_EQUALS(buf + str_size("~Hello~") + 1, endptr);
+	free(buf);
+
+	/* Three strings are produced (the first is empty) */
+
+	rc = ui_accel_process("~H~ello", &buf, &endptr);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_STR_EQUALS("", buf);
+
+	bp1 = buf + str_size(buf) + 1;
+	PCUT_ASSERT_STR_EQUALS("H", bp1);
+
+	bp2 = bp1 + str_size(bp1) + 1;
+	PCUT_ASSERT_STR_EQUALS("ello", bp2);
+
+	PCUT_ASSERT_EQUALS(bp2 + str_size("ello") + 1, endptr);
+	free(buf);
+}
+
+/** ui_accel_get() */
+PCUT_TEST(get)
+{
+	char32_t a;
+
+	a = ui_accel_get("");
+	PCUT_ASSERT_EQUALS('\0', a);
+
+	a = ui_accel_get("Hello");
+	PCUT_ASSERT_EQUALS('\0', a);
+
+	a = ui_accel_get("~~");
+	PCUT_ASSERT_EQUALS('\0', a);
+
+	a = ui_accel_get("~~Hello~~");
+	PCUT_ASSERT_EQUALS('\0', a);
+
+	a = ui_accel_get("~H~ello");
+	PCUT_ASSERT_EQUALS('h', a);
+
+	a = ui_accel_get("H~e~llo");
+	PCUT_ASSERT_EQUALS('e', a);
+}
+
+PCUT_EXPORT(accel);
Index: uspace/lib/ui/test/main.c
===================================================================
--- uspace/lib/ui/test/main.c	(revision 5de852c29de3e69c0e56c905bb90baf3983deec5)
+++ uspace/lib/ui/test/main.c	(revision 96c6a005543f33cc3c981d5509c272f7fc2978cf)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2021 Jiri Svoboda
+ * Copyright (c) 2022 Jiri Svoboda
  * All rights reserved.
  *
@@ -31,4 +31,5 @@
 PCUT_INIT;
 
+PCUT_IMPORT(accel);
 PCUT_IMPORT(control);
 PCUT_IMPORT(checkbox);
Index: uspace/lib/ui/test/menubar.c
===================================================================
--- uspace/lib/ui/test/menubar.c	(revision 5de852c29de3e69c0e56c905bb90baf3983deec5)
+++ uspace/lib/ui/test/menubar.c	(revision 96c6a005543f33cc3c981d5509c272f7fc2978cf)
@@ -187,5 +187,6 @@
 
 	event.type = KEY_PRESS;
-	event.key = KC_ESCAPE;
+	event.key = KC_F10;
+	event.mods = 0;
 	claimed = ui_menu_bar_kbd_event(mbar, &event);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
@@ -249,44 +250,4 @@
 }
 
-/** Calling ui_menu_bar_select() with the same menu twice deselects it */
-PCUT_TEST(select_same)
-{
-	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;
-	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);
-
-	rc = ui_menu_create(mbar, "Test", &menu);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-	PCUT_ASSERT_NOT_NULL(menu);
-
-	ui_menu_bar_select(mbar, menu, true);
-	PCUT_ASSERT_EQUALS(menu, mbar->selected);
-
-	/* Selecting again should unselect the menu */
-	ui_menu_bar_select(mbar, menu, true);
-	PCUT_ASSERT_NULL(mbar->selected);
-
-	ui_menu_bar_destroy(mbar);
-	ui_window_destroy(window);
-	ui_destroy(ui);
-}
-
 /** Calling ui_menu_bar_select() with another menu selects it */
 PCUT_TEST(select_different)
