Index: uspace/app/taskbar/taskbar.c
===================================================================
--- uspace/app/taskbar/taskbar.c	(revision 788c76e3d84d36c0843f4bbd27240fa4735c078a)
+++ uspace/app/taskbar/taskbar.c	(revision 5d9403d58e2a81f55461ca1c23cd6a4b52690c6a)
@@ -49,8 +49,10 @@
 
 static void taskbar_wnd_close(ui_window_t *, void *);
+static void taskbar_wnd_kbd(ui_window_t *, void *, kbd_event_t *);
 static void taskbar_wnd_pos(ui_window_t *, void *, pos_event_t *);
 
 static ui_window_cb_t window_cb = {
 	.close = taskbar_wnd_close,
+	.kbd = taskbar_wnd_kbd,
 	.pos = taskbar_wnd_pos
 };
@@ -66,4 +68,31 @@
 
 	ui_quit(taskbar->ui);
+}
+
+/** Window received keyboard event.
+ *
+ * @param window Window
+ * @param arg Argument (taskbar)
+ * @param event Keyboard event
+ */
+static void taskbar_wnd_kbd(ui_window_t *window, void *arg, kbd_event_t *event)
+{
+	taskbar_t *taskbar = (taskbar_t *) arg;
+	ui_evclaim_t claim;
+
+	/* Remember ID of device that sent the last event */
+	taskbar->wndlist->ev_idev_id = event->kbd_id;
+	taskbar->tbsmenu->ev_idev_id = event->kbd_id;
+
+	claim = ui_window_def_kbd(window, event);
+	if (claim == ui_claimed)
+		return;
+
+	if (event->type == KEY_PRESS && (event->mods & KM_CTRL) == 0 &&
+	    (event->mods & KM_ALT) == 0 && (event->mods & KM_SHIFT) == 0 &&
+	    event->key == KC_ENTER) {
+		if (!tbsmenu_is_open(taskbar->tbsmenu))
+			tbsmenu_open(taskbar->tbsmenu);
+	}
 }
 
@@ -79,5 +108,6 @@
 
 	/* Remember ID of device that sent the last event */
-	taskbar->wndlist->ev_pos_id = event->pos_id;
+	taskbar->wndlist->ev_idev_id = event->pos_id;
+	taskbar->tbsmenu->ev_idev_id = event->pos_id;
 
 	ui_window_def_pos(window, event);
Index: uspace/app/taskbar/tbsmenu.c
===================================================================
--- uspace/app/taskbar/tbsmenu.c	(revision 788c76e3d84d36c0843f4bbd27240fa4735c078a)
+++ uspace/app/taskbar/tbsmenu.c	(revision 5d9403d58e2a81f55461ca1c23cd6a4b52690c6a)
@@ -92,4 +92,6 @@
 	    (void *)tbsmenu);
 
+	ui_pbutton_set_default(tbsmenu->sbutton, true);
+
 	rc = ui_fixed_add(fixed, ui_pbutton_ctl(tbsmenu->sbutton));
 	if (rc != EOK)
@@ -166,4 +168,33 @@
 	tbsmenu->rect = *rect;
 	ui_pbutton_set_rect(tbsmenu->sbutton, rect);
+}
+
+/** Open taskbar start menu.
+ *
+ * @param tbsmenu Start menu
+ */
+void tbsmenu_open(tbsmenu_t *tbsmenu)
+{
+	(void) ui_menu_open(tbsmenu->smenu, &tbsmenu->rect,
+	    tbsmenu->ev_idev_id);
+}
+
+/** Close taskbar start menu.
+ *
+ * @param tbsmenu Start menu
+ */
+void tbsmenu_close(tbsmenu_t *tbsmenu)
+{
+	ui_menu_close(tbsmenu->smenu);
+}
+
+/** Determine if taskbar start menu is open.
+ *
+ * @param tbsmenu Start menu
+ * @return @c true iff start menu is open
+ */
+bool tbsmenu_is_open(tbsmenu_t *tbsmenu)
+{
+	return ui_menu_is_open(tbsmenu->smenu);
 }
 
@@ -352,11 +383,9 @@
 	tbsmenu_t *tbsmenu = (tbsmenu_t *)arg;
 
-	if (!ui_menu_is_open(tbsmenu->smenu)) {
-		// XXX ev_pos_id is not set!!!
-		(void) ui_menu_open(tbsmenu->smenu, &tbsmenu->rect,
-		    tbsmenu->ev_pos_id);
+	if (!tbsmenu_is_open(tbsmenu)) {
+		tbsmenu_open(tbsmenu);
 	} else {
 		/* menu is open */
-		ui_menu_close(tbsmenu->smenu);
+		tbsmenu_close(tbsmenu);
 	}
 }
Index: uspace/app/taskbar/tbsmenu.h
===================================================================
--- uspace/app/taskbar/tbsmenu.h	(revision 788c76e3d84d36c0843f4bbd27240fa4735c078a)
+++ uspace/app/taskbar/tbsmenu.h	(revision 5d9403d58e2a81f55461ca1c23cd6a4b52690c6a)
@@ -49,4 +49,7 @@
 extern errno_t tbsmenu_load(tbsmenu_t *, const char *);
 extern void tbsmenu_set_rect(tbsmenu_t *, gfx_rect_t *);
+extern void tbsmenu_open(tbsmenu_t *);
+extern void tbsmenu_close(tbsmenu_t *);
+extern bool tbsmenu_is_open(tbsmenu_t *);
 extern void tbsmenu_destroy(tbsmenu_t *);
 extern errno_t tbsmenu_add(tbsmenu_t *, const char *, const char *,
Index: uspace/app/taskbar/test/tbsmenu.c
===================================================================
--- uspace/app/taskbar/test/tbsmenu.c	(revision 788c76e3d84d36c0843f4bbd27240fa4735c078a)
+++ uspace/app/taskbar/test/tbsmenu.c	(revision 5d9403d58e2a81f55461ca1c23cd6a4b52690c6a)
@@ -69,3 +69,40 @@
 }
 
+/** Test tbsmenu_open/close/is_open() */
+PCUT_TEST(open_close_is_open)
+{
+	errno_t rc;
+	ui_t *ui = NULL;
+	ui_wnd_params_t params;
+	ui_window_t *window = NULL;
+	ui_fixed_t *fixed = NULL;
+	tbsmenu_t *tbsmenu = NULL;
+
+	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_fixed_create(&fixed);
+	ui_window_add(window, ui_fixed_ctl(fixed));
+
+	rc = tbsmenu_create(window, fixed, &tbsmenu);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_FALSE(tbsmenu_is_open(tbsmenu));
+	tbsmenu_open(tbsmenu);
+	PCUT_ASSERT_TRUE(tbsmenu_is_open(tbsmenu));
+	tbsmenu_close(tbsmenu);
+	PCUT_ASSERT_FALSE(tbsmenu_is_open(tbsmenu));
+
+	tbsmenu_destroy(tbsmenu);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
 PCUT_EXPORT(tbsmenu);
Index: uspace/app/taskbar/types/tbsmenu.h
===================================================================
--- uspace/app/taskbar/types/tbsmenu.h	(revision 788c76e3d84d36c0843f4bbd27240fa4735c078a)
+++ uspace/app/taskbar/types/tbsmenu.h	(revision 5d9403d58e2a81f55461ca1c23cd6a4b52690c6a)
@@ -80,8 +80,6 @@
 	list_t entries;
 
-	// TODO libstartmenu instance
-
-	/** Position ID of last position event */
-	sysarg_t ev_pos_id;
+	/** Device ID of last input event */
+	sysarg_t ev_idev_id;
 } tbsmenu_t;
 
Index: uspace/app/taskbar/types/wndlist.h
===================================================================
--- uspace/app/taskbar/types/wndlist.h	(revision 788c76e3d84d36c0843f4bbd27240fa4735c078a)
+++ uspace/app/taskbar/types/wndlist.h	(revision 5d9403d58e2a81f55461ca1c23cd6a4b52690c6a)
@@ -84,6 +84,6 @@
 	wndmgt_t *wndmgt;
 
-	/** Position ID of last position event */
-	sysarg_t ev_pos_id;
+	/** Device ID of last input event */
+	sysarg_t ev_idev_id;
 } wndlist_t;
 
Index: uspace/app/taskbar/wndlist.c
===================================================================
--- uspace/app/taskbar/wndlist.c	(revision 788c76e3d84d36c0843f4bbd27240fa4735c078a)
+++ uspace/app/taskbar/wndlist.c	(revision 5d9403d58e2a81f55461ca1c23cd6a4b52690c6a)
@@ -720,5 +720,5 @@
 
 	/* ID of device that clicked the button */
-	dev_id = entry->wndlist->ev_pos_id;
+	dev_id = entry->wndlist->ev_idev_id;
 
 	(void) wndmgt_activate_window(entry->wndlist->wndmgt,
