Index: uspace/app/nav/menu.c
===================================================================
--- uspace/app/nav/menu.c	(revision bdb2a72f86802fff119615849dfc676b05454dbf)
+++ uspace/app/nav/menu.c	(revision 08d5f8bd15845866be03c68818016899e8d0226b)
@@ -43,6 +43,4 @@
 #include "nav.h"
 
-static void nav_file_exit(ui_menu_entry_t *, void *);
-
 /** Create navigator menu.
  *
@@ -55,4 +53,6 @@
 	nav_menu_t *menu;
 	ui_menu_t *mfile;
+	ui_menu_entry_t *mopen;
+	ui_menu_entry_t *mfsep;
 	ui_menu_entry_t *mexit;
 	gfx_rect_t arect;
@@ -76,9 +76,19 @@
 		goto error;
 
+	rc = ui_menu_entry_create(mfile, "Open", "Enter", &mopen);
+	if (rc != EOK)
+		goto error;
+
+	ui_menu_entry_set_cb(mopen, nav_menu_file_open, (void *) menu);
+
+	rc = ui_menu_entry_sep_create(mfile, &mfsep);
+	if (rc != EOK)
+		goto error;
+
 	rc = ui_menu_entry_create(mfile, "Exit", "Ctrl-Q", &mexit);
 	if (rc != EOK)
 		goto error;
 
-	ui_menu_entry_set_cb(mexit, nav_file_exit, (void *) menu);
+	ui_menu_entry_set_cb(mexit, nav_menu_file_exit, (void *) menu);
 
 	ui_window_get_app_rect(menu->window, &arect);
@@ -94,4 +104,16 @@
 	nav_menu_destroy(menu);
 	return rc;
+}
+
+/** Set navigator menu callbacks.
+ *
+ * @param menu Menu
+ * @param cb Callbacks
+ * @param arg Argument to callback functions
+ */
+void nav_menu_set_cb(nav_menu_t *menu, nav_menu_cb_t *cb, void *arg)
+{
+	menu->cb = cb;
+	menu->cb_arg = arg;
 }
 
@@ -118,4 +140,17 @@
 }
 
+/** File / Open menu entry selected.
+ *
+ * @param mentry Menu entry
+ * @param arg Argument (navigator_t *)
+ */
+void nav_menu_file_open(ui_menu_entry_t *mentry, void *arg)
+{
+	nav_menu_t *menu = (nav_menu_t *)arg;
+
+	if (menu->cb != NULL && menu->cb->file_open != NULL)
+		menu->cb->file_open(menu->cb_arg);
+}
+
 /** File / Exit menu entry selected.
  *
@@ -123,9 +158,10 @@
  * @param arg Argument (navigator_t *)
  */
-static void nav_file_exit(ui_menu_entry_t *mentry, void *arg)
+void nav_menu_file_exit(ui_menu_entry_t *mentry, void *arg)
 {
-	navigator_t *navigator = (navigator_t *) arg;
+	nav_menu_t *menu = (nav_menu_t *)arg;
 
-	ui_quit(navigator->ui);
+	if (menu->cb != NULL && menu->cb->file_exit != NULL)
+		menu->cb->file_exit(menu->cb_arg);
 }
 
Index: uspace/app/nav/menu.h
===================================================================
--- uspace/app/nav/menu.h	(revision bdb2a72f86802fff119615849dfc676b05454dbf)
+++ uspace/app/nav/menu.h	(revision 08d5f8bd15845866be03c68818016899e8d0226b)
@@ -38,10 +38,14 @@
 
 #include <errno.h>
+#include <ui/menuentry.h>
 #include <ui/window.h>
 #include "types/menu.h"
 
 extern errno_t nav_menu_create(ui_window_t *, nav_menu_t **);
+extern void nav_menu_set_cb(nav_menu_t *, nav_menu_cb_t *, void *);
 extern void nav_menu_destroy(nav_menu_t *);
 extern ui_control_t *nav_menu_ctl(nav_menu_t *);
+extern void nav_menu_file_open(ui_menu_entry_t *, void *);
+extern void nav_menu_file_exit(ui_menu_entry_t *, void *);
 
 #endif
Index: uspace/app/nav/nav.c
===================================================================
--- uspace/app/nav/nav.c	(revision bdb2a72f86802fff119615849dfc676b05454dbf)
+++ uspace/app/nav/nav.c	(revision 08d5f8bd15845866be03c68818016899e8d0226b)
@@ -55,4 +55,12 @@
 };
 
+static void navigator_file_open(void *);
+static void navigator_file_exit(void *);
+
+static nav_menu_cb_t navigator_menu_cb = {
+	.file_open = navigator_file_open,
+	.file_exit = navigator_file_exit
+};
+
 /** Window close button was clicked.
  *
@@ -154,4 +162,7 @@
 		goto error;
 
+	nav_menu_set_cb(navigator->menu, &navigator_menu_cb,
+	    (void *)navigator);
+
 	rc = ui_fixed_add(navigator->fixed, nav_menu_ctl(navigator->menu));
 	if (rc != EOK) {
@@ -278,4 +289,22 @@
 }
 
+/** File / Open menu entry selected */
+static void navigator_file_open(void *arg)
+{
+	navigator_t *navigator = (navigator_t *)arg;
+	panel_t *panel;
+
+	panel = navigator_get_active_panel(navigator);
+	panel_open(panel, panel->cursor);
+}
+
+/** File / Exit menu entry selected */
+static void navigator_file_exit(void *arg)
+{
+	navigator_t *navigator = (navigator_t *)arg;
+
+	ui_quit(navigator->ui);
+}
+
 /** @}
  */
Index: uspace/app/nav/test/menu.c
===================================================================
--- uspace/app/nav/test/menu.c	(revision bdb2a72f86802fff119615849dfc676b05454dbf)
+++ uspace/app/nav/test/menu.c	(revision 08d5f8bd15845866be03c68818016899e8d0226b)
@@ -29,4 +29,5 @@
 #include <errno.h>
 #include <pcut/pcut.h>
+#include <stdbool.h>
 #include "../menu.h"
 
@@ -34,4 +35,19 @@
 
 PCUT_TEST_SUITE(menu);
+
+static void test_menu_file_open(void *);
+static void test_menu_file_exit(void *);
+
+static nav_menu_cb_t dummy_cb;
+static nav_menu_cb_t test_cb = {
+	.file_open = test_menu_file_open,
+	.file_exit = test_menu_file_exit
+};
+
+/** Test response */
+typedef struct {
+	bool file_open;
+	bool file_exit;
+} test_resp_t;
 
 /** Create and destroy menu. */
@@ -61,3 +77,90 @@
 }
 
+/** nav_menu_set_cb() */
+PCUT_TEST(set_cb)
+{
+	ui_t *ui;
+	ui_window_t *window;
+	ui_wnd_params_t params;
+	nav_menu_t *menu;
+	int foo;
+	errno_t rc;
+
+	rc = ui_create_disp(NULL, &ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_wnd_params_init(&params);
+	params.caption = "Test";
+
+	rc = ui_window_create(ui, &params, &window);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = nav_menu_create(window, &menu);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	nav_menu_set_cb(menu, &test_cb, &foo);
+	PCUT_ASSERT_EQUALS(&test_cb, menu->cb);
+	PCUT_ASSERT_EQUALS(&foo, menu->cb_arg);
+
+	nav_menu_destroy(menu);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
+/** File / Open callback */
+PCUT_TEST(file_open)
+{
+	ui_t *ui;
+	ui_window_t *window;
+	ui_wnd_params_t params;
+	nav_menu_t *menu;
+	test_resp_t resp;
+	errno_t rc;
+
+	rc = ui_create_disp(NULL, &ui);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	ui_wnd_params_init(&params);
+	params.caption = "Test";
+
+	rc = ui_window_create(ui, &params, &window);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = nav_menu_create(window, &menu);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Call back with no callbacks set */
+	nav_menu_file_open(NULL, menu);
+
+	/* Call back with dummy callbacks set */
+	nav_menu_set_cb(menu, &dummy_cb, &resp);
+	nav_menu_file_open(NULL, menu);
+
+	/* Call back with test callbacks set */
+	resp.file_open = false;
+	nav_menu_set_cb(menu, &test_cb, &resp);
+	nav_menu_file_open(NULL, menu);
+	PCUT_ASSERT_TRUE(resp.file_open);
+
+	nav_menu_destroy(menu);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
+/** Testing File / Open callback */
+static void test_menu_file_open(void *arg)
+{
+	test_resp_t *resp = (test_resp_t *)arg;
+
+	resp->file_open = true;
+}
+
+/** Testing File / Exit callback */
+static void test_menu_file_exit(void *arg)
+{
+	test_resp_t *resp = (test_resp_t *)arg;
+
+	resp->file_exit = true;
+}
+
 PCUT_EXPORT(menu);
Index: uspace/app/nav/types/menu.h
===================================================================
--- uspace/app/nav/types/menu.h	(revision bdb2a72f86802fff119615849dfc676b05454dbf)
+++ uspace/app/nav/types/menu.h	(revision 08d5f8bd15845866be03c68818016899e8d0226b)
@@ -41,9 +41,24 @@
 #include <ui/window.h>
 
+/** Navigator menu callbacks */
+typedef struct nav_menu_cb {
+	/** File / Open */
+	void (*file_open)(void *);
+	/** File / Exit */
+	void (*file_exit)(void *);
+} nav_menu_cb_t;
+
 /** Navigator menu */
 typedef struct nav_menu {
+	/** UI */
 	ui_t *ui;
+	/** Containing window */
 	ui_window_t *window;
+	/** Menu bar */
 	ui_menu_bar_t *menubar;
+	/** Callbacks */
+	nav_menu_cb_t *cb;
+	/** Callback argument */
+	void *cb_arg;
 } nav_menu_t;
 
Index: uspace/lib/ui/include/ui/menuentry.h
===================================================================
--- uspace/lib/ui/include/ui/menuentry.h	(revision bdb2a72f86802fff119615849dfc676b05454dbf)
+++ uspace/lib/ui/include/ui/menuentry.h	(revision 08d5f8bd15845866be03c68818016899e8d0226b)
@@ -39,4 +39,5 @@
 #include <errno.h>
 #include <gfx/coord.h>
+#include <io/pos_event.h>
 #include <types/ui/menu.h>
 #include <types/ui/menuentry.h>
