Index: uspace/app/nav/panel.c
===================================================================
--- uspace/app/nav/panel.c	(revision 7aeb52cbe11c394f85042884e7d7d4f35fd6bc3d)
+++ uspace/app/nav/panel.c	(revision 01e9991a00c21784a68aecc730376c43f47c81fb)
@@ -41,4 +41,5 @@
 #include <stdlib.h>
 #include <str.h>
+#include <task.h>
 #include <ui/control.h>
 #include <ui/paint.h>
@@ -953,30 +954,75 @@
 errno_t panel_open(panel_t *panel, panel_entry_t *entry)
 {
+	if (entry->isdir)
+		return panel_open_dir(panel, entry);
+	else if (entry->svc == 0)
+		return panel_open_file(panel, entry);
+	else
+		return EOK;
+}
+
+/** Open panel directory entry.
+ *
+ * Perform Open action on a directory entry (i.e. switch to the directory).
+ *
+ * @param panel Panel
+ * @param entry Panel entry (which is a directory)
+ *
+ * @return EOK on success or an error code
+ */
+errno_t panel_open_dir(panel_t *panel, panel_entry_t *entry)
+{
 	gfx_context_t *gc = ui_window_get_gc(panel->window);
-	char *dirname;
 	errno_t rc;
 
-	if (!entry->isdir)
-		return EOK;
-
-	dirname = str_dup(entry->name);
+	assert(entry->isdir);
+
 	panel_clear_entries(panel);
 
-	rc = panel_read_dir(panel, dirname);
-	if (rc != EOK) {
-		free(dirname);
-		return rc;
-	}
+	rc = panel_read_dir(panel, entry->name);
+	if (rc != EOK)
+		return rc;
 
 	rc = panel_paint(panel);
-	if (rc != EOK) {
-		free(dirname);
-		return rc;
-	}
-
-	free(dirname);
+	if (rc != EOK)
+		return rc;
+
 	return gfx_update(gc);
 }
 
+/** Open panel file entry.
+ *
+ * Perform Open action on a file entry (i.e. try running it).
+ *
+ * @param panel Panel
+ * @param entry Panel entry (which is a file)
+ *
+ * @return EOK on success or an error code
+ */
+errno_t panel_open_file(panel_t *panel, panel_entry_t *entry)
+{
+	task_id_t id;
+	task_wait_t wait;
+	task_exit_t texit;
+	int retval;
+	errno_t rc;
+
+	/* It's not a directory */
+	assert(!entry->isdir);
+	/* It's not a service-special file */
+	assert(entry->svc == 0);
+
+	rc = task_spawnl(&id, &wait, entry->name, entry->name, NULL);
+	if (rc != EOK)
+		return rc;
+
+	rc = task_wait(&wait, &texit, &retval);
+	if ((rc != EOK) || (texit != TASK_EXIT_NORMAL))
+		return rc;
+
+	(void) ui_paint(ui_window_get_ui(panel->window));
+	return EOK;
+}
+
 /** @}
  */
Index: uspace/app/nav/panel.h
===================================================================
--- uspace/app/nav/panel.h	(revision 7aeb52cbe11c394f85042884e7d7d4f35fd6bc3d)
+++ uspace/app/nav/panel.h	(revision 01e9991a00c21784a68aecc730376c43f47c81fb)
@@ -77,4 +77,6 @@
 extern void panel_page_down(panel_t *);
 extern errno_t panel_open(panel_t *, panel_entry_t *);
+extern errno_t panel_open_dir(panel_t *, panel_entry_t *);
+extern errno_t panel_open_file(panel_t *, panel_entry_t *);
 
 #endif
