Index: uspace/app/nav/panel.c
===================================================================
--- uspace/app/nav/panel.c	(revision 966a27d3b51421d64b6686d7dd7bbdccbc125b97)
+++ uspace/app/nav/panel.c	(revision 8922b76487a1f5b22f3782452b3fe1c9905bce2e)
@@ -324,4 +324,8 @@
 {
 	gfx_coord2_t pos;
+	gfx_rect_t irect;
+	panel_entry_t *entry;
+	size_t entry_idx;
+	int n;
 
 	pos.x = event->hpos;
@@ -330,6 +334,24 @@
 		return ui_unclaimed;
 
-	if (!panel->active) {
+	if (!panel->active && event->type == POS_PRESS)
 		panel_activate_req(panel);
+
+	if (event->type == POS_PRESS) {
+		irect.p0.x = panel->rect.p0.x + 1;
+		irect.p0.y = panel->rect.p0.y + 1;
+		irect.p1.x = panel->rect.p1.x - 1;
+		irect.p1.y = panel->rect.p1.y - 1;
+
+		/* Did we click on one of the entries? */
+		if (gfx_pix_inside_rect(&pos, &irect)) {
+			/* Index within page */
+			n = pos.y - irect.p0.y;
+
+			/* Entry and its index within entire listing */
+			entry = panel_page_nth_entry(panel, n, &entry_idx);
+
+			/* Move to the entry found */
+			panel_cursor_move(panel, entry, entry_idx);
+		}
 	}
 
@@ -800,4 +822,37 @@
 }
 
+/** Find the n-th entry of the current panel page.
+ *
+ * If the page is short and has less than n+1 entries, return the last entry.
+ *
+ * @param panel Panel
+ * @param n Which entry to get (starting from 0)
+ * @param ridx Place to store index (within listing) of the entry
+ * @return n-th entry of the page
+ */
+panel_entry_t *panel_page_nth_entry(panel_t *panel, size_t n, size_t *ridx)
+{
+	panel_entry_t *entry;
+	panel_entry_t *next;
+	size_t i;
+	size_t idx;
+
+	assert(n < panel_page_size(panel));
+
+	entry = panel->page;
+	idx = panel->page_idx;
+	for (i = 0; i < n; i++) {
+		next = panel_next(entry);
+		if (next == NULL)
+			break;
+
+		entry = next;
+		++idx;
+	}
+
+	*ridx = idx;
+	return entry;
+}
+
 /** Move cursor to a new position, possibly scrolling.
  *
Index: uspace/app/nav/panel.h
===================================================================
--- uspace/app/nav/panel.h	(revision 966a27d3b51421d64b6686d7dd7bbdccbc125b97)
+++ uspace/app/nav/panel.h	(revision 8922b76487a1f5b22f3782452b3fe1c9905bce2e)
@@ -70,4 +70,5 @@
 extern panel_entry_t *panel_next(panel_entry_t *);
 extern panel_entry_t *panel_prev(panel_entry_t *);
+extern panel_entry_t *panel_page_nth_entry(panel_t *, size_t, size_t *);
 extern void panel_cursor_move(panel_t *, panel_entry_t *, size_t);
 extern void panel_cursor_up(panel_t *);
Index: uspace/app/nav/test/panel.c
===================================================================
--- uspace/app/nav/test/panel.c	(revision 966a27d3b51421d64b6686d7dd7bbdccbc125b97)
+++ uspace/app/nav/test/panel.c	(revision 8922b76487a1f5b22f3782452b3fe1c9905bce2e)
@@ -205,22 +205,81 @@
 PCUT_TEST(pos_event)
 {
+	ui_t *ui;
+	ui_window_t *window;
+	ui_wnd_params_t params;
 	panel_t *panel;
 	ui_evclaim_t claimed;
 	pos_event_t event;
-	errno_t rc;
-
-	rc = panel_create(NULL, true, &panel);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	gfx_rect_t rect;
+	panel_entry_attr_t attr;
+	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 = panel_create(window, true, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rect.p0.x = 0;
+	rect.p0.y = 0;
+	rect.p1.x = 10;
+	rect.p1.y = 10;
+	panel_set_rect(panel, &rect);
+
+	panel_entry_attr_init(&attr);
+	attr.name = "a";
+	attr.size = 1;
+	rc = panel_entry_append(panel, &attr);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	attr.name = "b";
+	attr.size = 2;
+	rc = panel_entry_append(panel, &attr);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	attr.name = "c";
+	attr.size = 3;
+	rc = panel_entry_append(panel, &attr);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	panel->cursor = panel_first(panel);
+	panel->cursor_idx = 0;
+	panel->page = panel_first(panel);
+	panel->page_idx = 0;
 
 	event.pos_id = 0;
 	event.type = POS_PRESS;
 	event.btn_num = 1;
-	event.hpos = 0;
-	event.vpos = 0;
+
+	/* Clicking on the middle entry should select it */
+	event.hpos = 1;
+	event.vpos = 2;
 
 	claimed = panel_pos_event(panel, &event);
-	PCUT_ASSERT_EQUALS(ui_unclaimed, claimed);
-
-	panel_destroy(panel);
+	PCUT_ASSERT_EQUALS(ui_claimed, claimed);
+
+	PCUT_ASSERT_NOT_NULL(panel->cursor);
+	PCUT_ASSERT_STR_EQUALS("b", panel->cursor->name);
+	PCUT_ASSERT_INT_EQUALS(2, panel->cursor->size);
+
+	/* Clicking below the last entry should select it */
+	event.hpos = 1;
+	event.vpos = 4;
+	claimed = panel_pos_event(panel, &event);
+	PCUT_ASSERT_EQUALS(ui_claimed, claimed);
+
+	PCUT_ASSERT_NOT_NULL(panel->cursor);
+	PCUT_ASSERT_STR_EQUALS("c", panel->cursor->name);
+	PCUT_ASSERT_INT_EQUALS(3, panel->cursor->size);
+
+	panel_destroy(panel);
+	ui_window_destroy(window);
+	ui_destroy(ui);
 }
 
@@ -839,4 +898,56 @@
 	PCUT_ASSERT_STR_EQUALS("a", entry->name);
 	PCUT_ASSERT_INT_EQUALS(1, entry->size);
+
+	panel_destroy(panel);
+}
+
+/** panel_page_nth_entry() .. */
+PCUT_TEST(page_nth_entry)
+{
+	panel_t *panel;
+	panel_entry_t *entry;
+	panel_entry_attr_t attr;
+	size_t idx;
+	errno_t rc;
+
+	rc = panel_create(NULL, true, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	panel_entry_attr_init(&attr);
+
+	/* Add some entries */
+	attr.name = "a";
+	attr.size = 1;
+	rc = panel_entry_append(panel, &attr);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	attr.name = "b";
+	attr.size = 2;
+	rc = panel_entry_append(panel, &attr);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	attr.name = "c";
+	attr.size = 3;
+	rc = panel_entry_append(panel, &attr);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	panel->page = panel_next(panel_first(panel));
+	panel->page_idx = 1;
+
+	entry = panel_page_nth_entry(panel, 0, &idx);
+	PCUT_ASSERT_STR_EQUALS("b", entry->name);
+	PCUT_ASSERT_INT_EQUALS(1, idx);
+
+	entry = panel_page_nth_entry(panel, 1, &idx);
+	PCUT_ASSERT_STR_EQUALS("c", entry->name);
+	PCUT_ASSERT_INT_EQUALS(2, idx);
+
+	entry = panel_page_nth_entry(panel, 2, &idx);
+	PCUT_ASSERT_STR_EQUALS("c", entry->name);
+	PCUT_ASSERT_INT_EQUALS(2, idx);
+
+	entry = panel_page_nth_entry(panel, 3, &idx);
+	PCUT_ASSERT_STR_EQUALS("c", entry->name);
+	PCUT_ASSERT_INT_EQUALS(2, idx);
 
 	panel_destroy(panel);
