Index: uspace/app/nav/panel.c
===================================================================
--- uspace/app/nav/panel.c	(revision 516c1607373b6e00243bf3289a3a2c1b9b65804f)
+++ uspace/app/nav/panel.c	(revision 9468680f918aea064bdf015898d6c1f8eb63d31b)
@@ -519,4 +519,9 @@
 	char *ndir = NULL;
 	panel_entry_attr_t attr;
+	panel_entry_t *next;
+	panel_entry_t *prev;
+	char *olddn;
+	size_t pg_size;
+	size_t i;
 	errno_t rc;
 
@@ -582,6 +587,40 @@
 	panel->page = panel_first(panel);
 	panel->page_idx = 0;
+
+	/* Moving up? */
+	if (str_cmp(dirname, "..") == 0) {
+		/* Get the last component of old path */
+		olddn = str_rchr(panel->dir, '/');
+		if (olddn != NULL && *olddn != '\0') {
+			/* Find corresponding entry */
+			++olddn;
+			next = panel_next(panel->cursor);
+			while (next != NULL && str_cmp(next->name, olddn) <= 0 &&
+			    next->isdir) {
+				panel->cursor = next;
+				++panel->cursor_idx;
+				next = panel_next(panel->cursor);
+			}
+
+			/* Move page so that cursor is in the center */
+			panel->page = panel->cursor;
+			panel->page_idx = panel->cursor_idx;
+
+			pg_size = panel_page_size(panel);
+
+			for (i = 0; i < pg_size / 2; i++) {
+				prev = panel_prev(panel->page);
+				if (prev == NULL)
+					break;
+
+				panel->page = prev;
+				--panel->page_idx;
+			}
+		}
+	}
+
 	free(panel->dir);
 	panel->dir = ndir;
+
 	return EOK;
 error:
@@ -974,13 +1013,26 @@
 {
 	gfx_context_t *gc = ui_window_get_gc(panel->window);
+	char *dirname;
 	errno_t rc;
 
 	assert(entry->isdir);
 
+	/*
+	 * Need to copy out name before we free the entry below
+	 * via panel_clear_entries().
+	 */
+	dirname = str_dup(entry->name);
+	if (dirname == NULL)
+		return ENOMEM;
+
 	panel_clear_entries(panel);
 
-	rc = panel_read_dir(panel, entry->name);
-	if (rc != EOK)
-		return rc;
+	rc = panel_read_dir(panel, dirname);
+	if (rc != EOK) {
+		free(dirname);
+		return rc;
+	}
+
+	free(dirname);
 
 	rc = panel_paint(panel);
Index: uspace/app/nav/test/panel.c
===================================================================
--- uspace/app/nav/test/panel.c	(revision 516c1607373b6e00243bf3289a3a2c1b9b65804f)
+++ uspace/app/nav/test/panel.c	(revision 9468680f918aea064bdf015898d6c1f8eb63d31b)
@@ -471,5 +471,79 @@
 	rv = remove(p);
 	PCUT_ASSERT_INT_EQUALS(0, rv);
+
 	free(fname);
+}
+
+/** When moving to parent directory from a subdir, we seek to the
+ * coresponding entry
+ */
+PCUT_TEST(read_dir_up)
+{
+	panel_t *panel;
+	char buf[L_tmpnam];
+	char *subdir_a;
+	char *subdir_b;
+	char *subdir_c;
+	char *p;
+	errno_t rc;
+	int rv;
+
+	/* Create name for temporary directory */
+	p = tmpnam(buf);
+	PCUT_ASSERT_NOT_NULL(p);
+
+	/* Create temporary directory */
+	rc = vfs_link_path(p, KIND_DIRECTORY, NULL);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Create some subdirectories */
+
+	rv = asprintf(&subdir_a, "%s/%s", p, "a");
+	PCUT_ASSERT_TRUE(rv >= 0);
+	rc = vfs_link_path(subdir_a, KIND_DIRECTORY, NULL);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rv = asprintf(&subdir_b, "%s/%s", p, "b");
+	PCUT_ASSERT_TRUE(rv >= 0);
+	rc = vfs_link_path(subdir_b, KIND_DIRECTORY, NULL);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rv = asprintf(&subdir_c, "%s/%s", p, "c");
+	PCUT_ASSERT_TRUE(rv >= 0);
+	rc = vfs_link_path(subdir_c, KIND_DIRECTORY, NULL);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = panel_create(NULL, true, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Start in subdirectory "b" */
+	rc = panel_read_dir(panel, subdir_b);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Now go up (into p) */
+
+	rc = panel_read_dir(panel, "..");
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_NOT_NULL(panel->cursor);
+	PCUT_ASSERT_STR_EQUALS("b", panel->cursor->name);
+
+	panel_destroy(panel);
+
+	rv = remove(subdir_a);
+	PCUT_ASSERT_INT_EQUALS(0, rv);
+
+	rv = remove(subdir_b);
+	PCUT_ASSERT_INT_EQUALS(0, rv);
+
+	rv = remove(subdir_c);
+	PCUT_ASSERT_INT_EQUALS(0, rv);
+
+	rv = remove(p);
+	PCUT_ASSERT_INT_EQUALS(0, rv);
+
+	free(subdir_a);
+	free(subdir_b);
+	free(subdir_c);
 }
 
@@ -594,5 +668,5 @@
 	/* Add another entry */
 	attr.name = "b";
-	attr.size= 2;
+	attr.size = 2;
 	rc = panel_entry_append(panel, &attr);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
