Index: uspace/app/nav/panel.c
===================================================================
--- uspace/app/nav/panel.c	(revision 0e5ed803e1920ae9a9b56104cd8b61a2022abe87)
+++ uspace/app/nav/panel.c	(revision 3b67e955c1e0e8d7f4d0d3ac521a73d5ecc62bfc)
@@ -38,4 +38,5 @@
 #include <gfx/render.h>
 #include <stdlib.h>
+#include <str.h>
 #include <ui/control.h>
 #include <ui/paint.h>
@@ -81,4 +82,5 @@
 
 	panel->window = window;
+	list_initialize(&panel->entries);
 	*rpanel = panel;
 	return EOK;
@@ -95,4 +97,12 @@
 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);
+	}
+
 	ui_control_delete(panel->control);
 	free(panel);
@@ -196,4 +206,74 @@
 }
 
+/** Append new panel entry.
+ *
+ * @param panel Panel
+ * @param name File name
+ * @param size File size;
+ * @return EOK on success or an error code
+ */
+errno_t panel_entry_append(panel_t *panel, const char *name, uint64_t size)
+{
+	panel_entry_t *entry;
+
+	entry = calloc(1, sizeof(panel_entry_t));
+	if (entry == NULL)
+		return ENOMEM;
+
+	entry->panel = panel;
+	entry->name = str_dup(name);
+	if (entry->name == NULL) {
+		free(entry);
+		return ENOMEM;
+	}
+
+	entry->size = size;
+	link_initialize(&entry->lentries);
+	list_append(&entry->lentries, &panel->entries);
+	return EOK;
+}
+
+/** Delete panel entry.
+ *
+ * @param entry Panel entry
+ */
+void panel_entry_delete(panel_entry_t *entry)
+{
+	list_remove(&entry->lentries);
+	free(entry->name);
+	free(entry);
+}
+
+/** Return first panel entry.
+ *
+ * @panel Panel
+ * @return First panel entry or @c NULL if there are no entries
+ */
+panel_entry_t *panel_first(panel_t *panel)
+{
+	link_t *link;
+
+	link = list_first(&panel->entries);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, panel_entry_t, lentries);
+}
+
+/** Return next panel entry.
+ *
+ * @param cur Current entry
+ * @return Next entry or @c NULL if @a cur is the last entry
+ */
+panel_entry_t *panel_next(panel_entry_t *cur)
+{
+	link_t *link;
+
+	link = list_next(&cur->lentries, &cur->panel->entries);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, panel_entry_t, lentries);
+}
 
 /** @}
Index: uspace/app/nav/panel.h
===================================================================
--- uspace/app/nav/panel.h	(revision 0e5ed803e1920ae9a9b56104cd8b61a2022abe87)
+++ uspace/app/nav/panel.h	(revision 3b67e955c1e0e8d7f4d0d3ac521a73d5ecc62bfc)
@@ -37,4 +37,5 @@
 #define PANEL_H
 
+#include <adt/list.h>
 #include <errno.h>
 #include <gfx/color.h>
@@ -43,4 +44,5 @@
 #include <ui/control.h>
 #include <ui/window.h>
+#include <stdint.h>
 #include "nav.h"
 #include "panel.h"
@@ -62,5 +64,20 @@
 	/** Panel color */
 	gfx_color_t *color;
+
+	/** Panel entries (list of panel_entry_t) */
+	list_t entries;
 } 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 **);
@@ -70,4 +87,8 @@
 extern ui_control_t *panel_ctl(panel_t *);
 extern void panel_set_rect(panel_t *, gfx_rect_t *);
+extern errno_t panel_entry_append(panel_t *, const char *, uint64_t);
+extern void panel_entry_delete(panel_entry_t *);
+extern panel_entry_t *panel_first(panel_t *);
+extern panel_entry_t *panel_next(panel_entry_t *);
 
 #endif
Index: uspace/app/nav/test/panel.c
===================================================================
--- uspace/app/nav/test/panel.c	(revision 0e5ed803e1920ae9a9b56104cd8b61a2022abe87)
+++ uspace/app/nav/test/panel.c	(revision 3b67e955c1e0e8d7f4d0d3ac521a73d5ecc62bfc)
@@ -47,5 +47,4 @@
 }
 
-
 /** Test panel_paint() */
 PCUT_TEST(paint)
@@ -142,3 +141,129 @@
 }
 
+/** panel_entry_append() appends new entry */
+PCUT_TEST(entry_append)
+{
+	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);
+
+	PCUT_ASSERT_INT_EQUALS(1, list_count(&panel->entries));
+
+	rc = panel_entry_append(panel, "b", 2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_INT_EQUALS(2, list_count(&panel->entries));
+
+	panel_destroy(panel);
+}
+
+/** panel_entry_delete() deletes entry */
+PCUT_TEST(entry_delete)
+{
+	panel_t *panel;
+	panel_entry_t *entry;
+	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));
+
+	entry = panel_first(panel);
+	panel_entry_delete(entry);
+
+	PCUT_ASSERT_INT_EQUALS(1, list_count(&panel->entries));
+
+	entry = panel_first(panel);
+	panel_entry_delete(entry);
+
+	PCUT_ASSERT_INT_EQUALS(0, list_count(&panel->entries));
+
+	panel_destroy(panel);
+}
+
+/** panel_first() returns valid entry or @c NULL as appropriate */
+PCUT_TEST(first)
+{
+	panel_t *panel;
+	panel_entry_t *entry;
+	errno_t rc;
+
+	rc = panel_create(NULL, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	entry = panel_first(panel);
+	PCUT_ASSERT_NULL(entry);
+
+	/* Add one entry */
+	rc = panel_entry_append(panel, "a", 1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Now try getting it */
+	entry = panel_first(panel);
+	PCUT_ASSERT_NOT_NULL(entry);
+	PCUT_ASSERT_STR_EQUALS("a", entry->name);
+	PCUT_ASSERT_INT_EQUALS(1, entry->size);
+
+	/* Add another entry */
+	rc = panel_entry_append(panel, "b", 2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* We should still get the first entry */
+	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);
+}
+
+/** panel_next() returns the next entry or @c NULL as appropriate */
+PCUT_TEST(next)
+{
+	panel_t *panel;
+	panel_entry_t *entry;
+	errno_t rc;
+
+	rc = panel_create(NULL, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Add one entry */
+	rc = panel_entry_append(panel, "a", 1);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Now try getting its successor */
+	entry = panel_first(panel);
+	PCUT_ASSERT_NOT_NULL(entry);
+
+	entry = panel_next(entry);
+	PCUT_ASSERT_NULL(entry);
+
+	/* Add another entry */
+	rc = panel_entry_append(panel, "b", 2);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* Try getting the successor of first entry again */
+	entry = panel_first(panel);
+	PCUT_ASSERT_NOT_NULL(entry);
+
+	entry = panel_next(entry);
+	PCUT_ASSERT_NOT_NULL(entry);
+	PCUT_ASSERT_STR_EQUALS("b", entry->name);
+	PCUT_ASSERT_INT_EQUALS(2, entry->size);
+
+	panel_destroy(panel);
+}
+
 PCUT_EXPORT(panel);
