Index: uspace/app/nav/nav.c
===================================================================
--- uspace/app/nav/nav.c	(revision 61784ed78adb5941f6507892f4875e013e77473e)
+++ uspace/app/nav/nav.c	(revision 0e80e40d465209db1058a14f81079dee22378462)
@@ -136,5 +136,11 @@
 		if (rc != EOK) {
 			printf("Error adding control to layout.\n");
-			return rc;
+			goto error;
+		}
+
+		rc = panel_read_dir(navigator->panel[i], ".");
+		if (rc != EOK) {
+			printf("Error reading directory.\n");
+			goto error;
 		}
 	}
Index: uspace/app/nav/panel.c
===================================================================
--- uspace/app/nav/panel.c	(revision 61784ed78adb5941f6507892f4875e013e77473e)
+++ uspace/app/nav/panel.c	(revision 0e80e40d465209db1058a14f81079dee22378462)
@@ -35,10 +35,13 @@
  */
 
+#include <dirent.h>
 #include <errno.h>
 #include <gfx/render.h>
+#include <gfx/text.h>
 #include <stdlib.h>
 #include <str.h>
 #include <ui/control.h>
 #include <ui/paint.h>
+#include <ui/resource.h>
 #include "panel.h"
 #include "nav.h"
@@ -81,4 +84,8 @@
 		goto error;
 
+	rc = gfx_color_new_ega(0x30, &panel->curs_color);
+	if (rc != EOK)
+		goto error;
+
 	panel->window = window;
 	list_initialize(&panel->entries);
@@ -86,4 +93,8 @@
 	return EOK;
 error:
+	if (panel->color != NULL)
+		gfx_color_delete(panel->color);
+	if (panel->curs_color != NULL)
+		gfx_color_delete(panel->curs_color);
 	ui_control_delete(panel->control);
 	free(panel);
@@ -97,12 +108,7 @@
 void panel_destroy(panel_t *panel)
 {
-	panel_entry_t *entry;
-
-	entry = panel_first(panel);
-	while (entry != NULL) {
-		panel_entry_delete(entry);
-		entry = panel_first(panel);
-	}
-
+	gfx_color_delete(panel->color);
+	gfx_color_delete(panel->curs_color);
+	panel_clear_entries(panel);
 	ui_control_delete(panel->control);
 	free(panel);
@@ -117,5 +123,12 @@
 	gfx_context_t *gc = ui_window_get_gc(panel->window);
 	ui_resource_t *res = ui_window_get_res(panel->window);
+	gfx_font_t *font = ui_resource_get_font(res);
+	gfx_text_fmt_t fmt;
+	panel_entry_t *entry;
+	gfx_coord2_t pos;
+	gfx_rect_t rect;
 	errno_t rc;
+
+	gfx_text_fmt_init(&fmt);
 
 	rc = gfx_set_color(gc, panel->color);
@@ -131,4 +144,36 @@
 	if (rc != EOK)
 		return rc;
+
+	pos.x = panel->rect.p0.x + 1;
+	pos.y = panel->rect.p0.y + 1;
+
+	entry = panel->page;
+	while (entry != NULL && pos.y < panel->rect.p1.y - 1) {
+		if (entry == panel->cursor) {
+			/* Draw cursor background */
+			rect.p0 = pos;
+			rect.p1.x = panel->rect.p1.x - 1;
+			rect.p1.y = rect.p0.y + 1;
+
+			rc = gfx_set_color(gc, panel->curs_color);
+			if (rc != EOK)
+				return rc;
+
+			rc = gfx_fill_rect(gc, &rect);
+			if (rc != EOK)
+				return rc;
+
+			fmt.color = panel->curs_color;
+		} else {
+			fmt.color = panel->color;
+		}
+
+		rc = gfx_puttext(font, &pos, &fmt, entry->name);
+		if (rc != EOK)
+			return rc;
+
+		pos.y++;
+		entry = panel_next(entry);
+	}
 
 	rc = gfx_update(gc);
@@ -240,4 +285,9 @@
 void panel_entry_delete(panel_entry_t *entry)
 {
+	if (entry->panel->cursor == entry)
+		entry->panel->cursor = NULL;
+	if (entry->panel->page == entry)
+		entry->panel->page = NULL;
+
 	list_remove(&entry->lentries);
 	free(entry->name);
@@ -245,4 +295,53 @@
 }
 
+/** Clear panel entry list.
+ *
+ * @param panel Panel
+ */
+void panel_clear_entries(panel_t *panel)
+{
+	panel_entry_t *entry;
+
+	entry = panel_first(panel);
+	while (entry != NULL) {
+		panel_entry_delete(entry);
+		entry = panel_first(panel);
+	}
+}
+
+/** Read directory into panel entry list.
+ *
+ * @param panel Panel
+ * @param dirname Directory path
+ * @return EOK on success or an error code
+ */
+errno_t panel_read_dir(panel_t *panel, const char *dirname)
+{
+	DIR *dir;
+	struct dirent *dirent;
+	errno_t rc;
+
+	dir = opendir(dirname);
+	if (dir == NULL)
+		return errno;
+
+	dirent = readdir(dir);
+	while (dirent != NULL) {
+		rc = panel_entry_append(panel, dirent->d_name, 1);
+		if (rc != EOK)
+			goto error;
+		dirent = readdir(dir);
+	}
+
+	closedir(dir);
+
+	panel->cursor = panel_first(panel);
+	panel->page = panel_first(panel);
+	return EOK;
+error:
+	closedir(dir);
+	return rc;
+}
+
 /** Return first panel entry.
  *
Index: uspace/app/nav/panel.h
===================================================================
--- uspace/app/nav/panel.h	(revision 61784ed78adb5941f6507892f4875e013e77473e)
+++ uspace/app/nav/panel.h	(revision 0e80e40d465209db1058a14f81079dee22378462)
@@ -48,4 +48,16 @@
 #include "panel.h"
 
+/** Panel entry */
+typedef struct {
+	/** Containing panel */
+	struct panel *panel;
+	/** Link to @c panel->entries */
+	link_t lentries;
+	/** File name */
+	char *name;
+	/** File size */
+	uint64_t size;
+} panel_entry_t;
+
 /** Navigator panel
  *
@@ -65,19 +77,16 @@
 	gfx_color_t *color;
 
+	/** Panel cursor color */
+	gfx_color_t *curs_color;
+
 	/** Panel entries (list of panel_entry_t) */
 	list_t entries;
+
+	/** First entry of current page */
+	panel_entry_t *page;
+
+	/** Cursor position */
+	panel_entry_t *cursor;
 } panel_t;
-
-/** Panel entry */
-typedef struct {
-	/** Containing panel */
-	panel_t *panel;
-	/** Link to @c panel->entries */
-	link_t lentries;
-	/** File name */
-	char *name;
-	/** File size */
-	uint64_t size;
-} panel_entry_t;
 
 extern errno_t panel_create(ui_window_t *, panel_t **);
@@ -89,4 +98,6 @@
 extern errno_t panel_entry_append(panel_t *, const char *, uint64_t);
 extern void panel_entry_delete(panel_entry_t *);
+extern void panel_clear_entries(panel_t *);
+extern errno_t panel_read_dir(panel_t *, const char *);
 extern panel_entry_t *panel_first(panel_t *);
 extern panel_entry_t *panel_next(panel_entry_t *);
Index: uspace/app/nav/test/panel.c
===================================================================
--- uspace/app/nav/test/panel.c	(revision 61784ed78adb5941f6507892f4875e013e77473e)
+++ uspace/app/nav/test/panel.c	(revision 0e80e40d465209db1058a14f81079dee22378462)
@@ -29,4 +29,6 @@
 #include <errno.h>
 #include <pcut/pcut.h>
+#include <stdio.h>
+#include <vfs/vfs.h>
 #include "../panel.h"
 
@@ -194,4 +196,82 @@
 }
 
+/** panel_clear_entries() removes all entries from panel */
+PCUT_TEST(clear_entries)
+{
+	panel_t *panel;
+	errno_t rc;
+
+	rc = panel_create(NULL, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = panel_entry_append(panel, "a", 1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = panel_entry_append(panel, "b", 2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_INT_EQUALS(2, list_count(&panel->entries));
+
+	panel_clear_entries(panel);
+	PCUT_ASSERT_INT_EQUALS(0, list_count(&panel->entries));
+
+	panel_destroy(panel);
+}
+
+/** panel_read_dir() reads the contents of a directory */
+PCUT_TEST(read_dir)
+{
+	panel_t *panel;
+	panel_entry_t *entry;
+	char buf[L_tmpnam];
+	char *fname;
+	char *p;
+	errno_t rc;
+	FILE *f;
+	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);
+
+	rv = asprintf(&fname, "%s/%s", p, "a");
+	PCUT_ASSERT_TRUE(rv >= 0);
+
+	f = fopen(fname, "wb");
+	PCUT_ASSERT_NOT_NULL(f);
+
+	rv = fprintf(f, "X");
+	PCUT_ASSERT_TRUE(rv >= 0);
+
+	rv = fclose(f);
+	PCUT_ASSERT_INT_EQUALS(0, rv);
+
+	rc = panel_create(NULL, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = panel_read_dir(panel, p);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_INT_EQUALS(1, list_count(&panel->entries));
+
+	entry = panel_first(panel);
+	PCUT_ASSERT_NOT_NULL(entry);
+	PCUT_ASSERT_STR_EQUALS("a", entry->name);
+	// PCUT_ASSERT_INT_EQUALS(1, entry->size);
+
+	panel_destroy(panel);
+
+	rv = remove(fname);
+	PCUT_ASSERT_INT_EQUALS(0, rv);
+
+	rv = remove(p);
+	PCUT_ASSERT_INT_EQUALS(0, rv);
+	free(fname);
+}
+
 /** panel_first() returns valid entry or @c NULL as appropriate */
 PCUT_TEST(first)
Index: uspace/lib/gfxfont/include/gfx/text.h
===================================================================
--- uspace/lib/gfxfont/include/gfx/text.h	(revision 61784ed78adb5941f6507892f4875e013e77473e)
+++ uspace/lib/gfxfont/include/gfx/text.h	(revision 0e80e40d465209db1058a14f81079dee22378462)
@@ -38,4 +38,5 @@
 
 #include <errno.h>
+#include <stddef.h>
 #include <types/gfx/coord.h>
 #include <types/gfx/font.h>
