Index: uspace/app/nav/nav.c
===================================================================
--- uspace/app/nav/nav.c	(revision 2fb495228984165d057f71bfa95d721845722687)
+++ uspace/app/nav/nav.c	(revision 692c7f40369e2c44dc1847d6acc7f45ea36d1934)
@@ -81,6 +81,22 @@
 	    ((event->mods & KM_SHIFT) == 0) &&
 	    (event->mods & KM_CTRL) != 0) {
-		if (event->key == KC_Q)
+		switch (event->key) {
+		case KC_Q:
 			ui_quit(navigator->ui);
+			break;
+		default:
+			break;
+		}
+	}
+
+	if (event->type == KEY_PRESS &&
+	    ((event->mods & (KM_CTRL | KM_ALT | KM_SHIFT)) == 0)) {
+		switch (event->key) {
+		case KC_TAB:
+			navigator_switch_panel(navigator);
+			break;
+		default:
+			break;
+		}
 	}
 
@@ -145,5 +161,6 @@
 
 	for (i = 0; i < 2; i++) {
-		rc = panel_create(navigator->window, &navigator->panel[i]);
+		rc = panel_create(navigator->window, i == 0,
+		    &navigator->panel[i]);
 		if (rc != EOK)
 			goto error;
@@ -219,4 +236,40 @@
 }
 
+/** Get the currently active navigator panel.
+ *
+ * @param navigator Navigator
+ * @return Currently active panel
+ */
+panel_t *navigator_get_active_panel(navigator_t *navigator)
+{
+	int i;
+
+	for (i = 0; i < navigator_panels; i++) {
+		if (panel_is_active(navigator->panel[i]))
+			return navigator->panel[i];
+	}
+
+	/* This should not happen */
+	assert(false);
+	return NULL;
+}
+
+/** Switch to another navigator panel.
+ *
+ * Changes the currently active navigator panel to the next panel.
+ *
+ * @param navigator Navigator
+ */
+void navigator_switch_panel(navigator_t *navigator)
+{
+	if (panel_is_active(navigator->panel[0])) {
+		panel_deactivate(navigator->panel[0]);
+		panel_activate(navigator->panel[1]);
+	} else {
+		panel_deactivate(navigator->panel[1]);
+		panel_activate(navigator->panel[0]);
+	}
+}
+
 /** @}
  */
Index: uspace/app/nav/nav.h
===================================================================
--- uspace/app/nav/nav.h	(revision 2fb495228984165d057f71bfa95d721845722687)
+++ uspace/app/nav/nav.h	(revision 692c7f40369e2c44dc1847d6acc7f45ea36d1934)
@@ -39,8 +39,11 @@
 #include <errno.h>
 #include "types/nav.h"
+#include "types/panel.h"
 
 extern errno_t navigator_create(const char *, navigator_t **);
 extern void navigator_destroy(navigator_t *);
 extern errno_t navigator_run(const char *);
+extern panel_t *navigator_get_active_panel(navigator_t *);
+extern void navigator_switch_panel(navigator_t *);
 
 #endif
Index: uspace/app/nav/panel.c
===================================================================
--- uspace/app/nav/panel.c	(revision 2fb495228984165d057f71bfa95d721845722687)
+++ uspace/app/nav/panel.c	(revision 692c7f40369e2c44dc1847d6acc7f45ea36d1934)
@@ -63,8 +63,9 @@
  *
  * @param window Containing window
+ * @param active @c true iff panel should be active
  * @param rpanel Place to store pointer to new panel
  * @return EOK on success or an error code
  */
-errno_t panel_create(ui_window_t *window, panel_t **rpanel)
+errno_t panel_create(ui_window_t *window, bool active, panel_t **rpanel)
 {
 	panel_t *panel;
@@ -90,7 +91,12 @@
 		goto error;
 
+	rc = gfx_color_new_ega(0x0f, &panel->act_border_color);
+	if (rc != EOK)
+		goto error;
+
 	panel->window = window;
 	list_initialize(&panel->entries);
 	panel->entries_cnt = 0;
+	panel->active = active;
 	*rpanel = panel;
 	return EOK;
@@ -113,4 +119,5 @@
 	gfx_color_delete(panel->color);
 	gfx_color_delete(panel->curs_color);
+	gfx_color_delete(panel->act_border_color);
 	panel_clear_entries(panel);
 	ui_control_delete(panel->control);
@@ -147,5 +154,5 @@
 	pos.y = panel->rect.p0.y + 1 + entry_idx - panel->page_idx;
 
-	if (entry == panel->cursor)
+	if (entry == panel->cursor && panel->active)
 		fmt.color = panel->curs_color;
 	else
@@ -182,4 +189,6 @@
 	gfx_text_fmt_t fmt;
 	panel_entry_t *entry;
+	ui_box_style_t bstyle;
+	gfx_color_t *bcolor;
 	int i, lines;
 	errno_t rc;
@@ -195,6 +204,13 @@
 		return rc;
 
-	rc = ui_paint_text_box(res, &panel->rect, ui_box_single,
-	    panel->color);
+	if (panel->active) {
+		bstyle = ui_box_double;
+		bcolor = panel->act_border_color;
+	} else {
+		bstyle = ui_box_single;
+		bcolor = panel->color;
+	}
+
+	rc = ui_paint_text_box(res, &panel->rect, bstyle, bcolor);
 	if (rc != EOK)
 		return rc;
@@ -228,4 +244,7 @@
 ui_evclaim_t panel_kbd_event(panel_t *panel, kbd_event_t *event)
 {
+	if (!panel->active)
+		return ui_unclaimed;
+
 	if (event->type == KEY_PRESS) {
 		if ((event->mods & (KM_CTRL | KM_ALT | KM_SHIFT)) == 0) {
@@ -255,5 +274,5 @@
 	}
 
-	return ui_unclaimed;
+	return ui_claimed;
 }
 
@@ -297,4 +316,34 @@
 {
 	return panel->rect.p1.y - panel->rect.p0.y - 2;
+}
+
+/** Determine if panel is active.
+ *
+ * @param panel Panel
+ * @return @c true iff panel is active
+ */
+bool panel_is_active(panel_t *panel)
+{
+	return panel->active;
+}
+
+/** Activate panel.
+ *
+ * @param panel Panel
+ */
+void panel_activate(panel_t *panel)
+{
+	panel->active = true;
+	(void) panel_paint(panel);
+}
+
+/** Deactivate panel.
+ *
+ * @param panel Panel
+ */
+void panel_deactivate(panel_t *panel)
+{
+	panel->active = false;
+	(void) panel_paint(panel);
 }
 
Index: uspace/app/nav/panel.h
===================================================================
--- uspace/app/nav/panel.h	(revision 2fb495228984165d057f71bfa95d721845722687)
+++ uspace/app/nav/panel.h	(revision 692c7f40369e2c44dc1847d6acc7f45ea36d1934)
@@ -43,7 +43,8 @@
 #include <ui/control.h>
 #include <ui/window.h>
+#include <stdbool.h>
 #include "types/panel.h"
 
-extern errno_t panel_create(ui_window_t *, panel_t **);
+extern errno_t panel_create(ui_window_t *, bool, panel_t **);
 extern void panel_destroy(panel_t *);
 extern errno_t panel_entry_paint(panel_entry_t *, size_t);
@@ -54,4 +55,7 @@
 extern void panel_set_rect(panel_t *, gfx_rect_t *);
 extern unsigned panel_page_size(panel_t *);
+extern bool panel_is_active(panel_t *);
+extern void panel_activate(panel_t *);
+extern void panel_deactivate(panel_t *);
 extern errno_t panel_entry_append(panel_t *, const char *, uint64_t);
 extern void panel_entry_delete(panel_entry_t *);
Index: uspace/app/nav/test/nav.c
===================================================================
--- uspace/app/nav/test/nav.c	(revision 2fb495228984165d057f71bfa95d721845722687)
+++ uspace/app/nav/test/nav.c	(revision 692c7f40369e2c44dc1847d6acc7f45ea36d1934)
@@ -47,3 +47,49 @@
 }
 
+/** navigator_get_active_panel() returns the active panel */
+PCUT_TEST(get_active_panel)
+{
+	navigator_t *nav;
+	panel_t *panel;
+	errno_t rc;
+
+	rc = navigator_create(UI_DISPLAY_NULL, &nav);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* First panel should be active at the beginning */
+	panel = navigator_get_active_panel(nav);
+	PCUT_ASSERT_EQUALS(nav->panel[0], panel);
+
+	navigator_destroy(nav);
+}
+
+/** navigator_switch_panel() switches to a different panel */
+PCUT_TEST(switch_panel)
+{
+	navigator_t *nav;
+	panel_t *panel;
+	errno_t rc;
+
+	rc = navigator_create(UI_DISPLAY_NULL, &nav);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	/* First panel should be active at the beginning */
+	panel = navigator_get_active_panel(nav);
+	PCUT_ASSERT_EQUALS(nav->panel[0], panel);
+
+	navigator_switch_panel(nav);
+
+	/* Second panel should be active now */
+	panel = navigator_get_active_panel(nav);
+	PCUT_ASSERT_EQUALS(nav->panel[1], panel);
+
+	navigator_switch_panel(nav);
+
+	/* First panel should be active again */
+	panel = navigator_get_active_panel(nav);
+	PCUT_ASSERT_EQUALS(nav->panel[0], panel);
+
+	navigator_destroy(nav);
+}
+
 PCUT_EXPORT(nav);
Index: uspace/app/nav/test/panel.c
===================================================================
--- uspace/app/nav/test/panel.c	(revision 2fb495228984165d057f71bfa95d721845722687)
+++ uspace/app/nav/test/panel.c	(revision 692c7f40369e2c44dc1847d6acc7f45ea36d1934)
@@ -46,5 +46,5 @@
 	errno_t rc;
 
-	rc = panel_create(NULL, &panel);
+	rc = panel_create(NULL, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -70,5 +70,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = panel_create(window, &panel);
+	rc = panel_create(window, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -102,5 +102,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = panel_create(window, &panel);
+	rc = panel_create(window, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -120,5 +120,5 @@
 	errno_t rc;
 
-	rc = panel_create(NULL, &panel);
+	rc = panel_create(NULL, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -133,14 +133,12 @@
 {
 	panel_t *panel;
-	ui_control_t *control;
 	ui_evclaim_t claimed;
 	kbd_event_t event;
 	errno_t rc;
 
-	rc = panel_create(NULL, &panel);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	control = panel_ctl(panel);
-	PCUT_ASSERT_NOT_NULL(control);
+	/* Active panel should claim events */
+
+	rc = panel_create(NULL, true, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
 	event.type = KEY_PRESS;
@@ -150,4 +148,19 @@
 
 	claimed = panel_kbd_event(panel, &event);
+	PCUT_ASSERT_EQUALS(ui_claimed, claimed);
+
+	panel_destroy(panel);
+
+	/* Inactive panel should not claim events */
+
+	rc = panel_create(NULL, false, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	event.type = KEY_PRESS;
+	event.key = KC_ENTER;
+	event.mods = 0;
+	event.c = '\0';
+
+	claimed = panel_kbd_event(panel, &event);
 	PCUT_ASSERT_EQUALS(ui_unclaimed, claimed);
 
@@ -159,14 +172,10 @@
 {
 	panel_t *panel;
-	ui_control_t *control;
 	ui_evclaim_t claimed;
 	pos_event_t event;
 	errno_t rc;
 
-	rc = panel_create(NULL, &panel);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	control = panel_ctl(panel);
-	PCUT_ASSERT_NOT_NULL(control);
+	rc = panel_create(NULL, true, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
 	event.pos_id = 0;
@@ -186,13 +195,9 @@
 {
 	panel_t *panel;
-	ui_control_t *control;
 	gfx_rect_t rect;
 	errno_t rc;
 
-	rc = panel_create(NULL, &panel);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	control = panel_ctl(panel);
-	PCUT_ASSERT_NOT_NULL(control);
+	rc = panel_create(NULL, true, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
 	rect.p0.x = 1;
@@ -214,13 +219,9 @@
 {
 	panel_t *panel;
-	ui_control_t *control;
 	gfx_rect_t rect;
 	errno_t rc;
 
-	rc = panel_create(NULL, &panel);
-	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
-
-	control = panel_ctl(panel);
-	PCUT_ASSERT_NOT_NULL(control);
+	rc = panel_create(NULL, true, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
 	rect.p0.x = 10;
@@ -237,4 +238,81 @@
 }
 
+/** panel_is_active() returns panel activity state */
+PCUT_TEST(is_active)
+{
+	panel_t *panel;
+	errno_t rc;
+
+	rc = panel_create(NULL, true, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_TRUE(panel_is_active(panel));
+	panel_destroy(panel);
+
+	rc = panel_create(NULL, false, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+	PCUT_ASSERT_FALSE(panel_is_active(panel));
+	panel_destroy(panel);
+}
+
+/** panel_activate() activates panel */
+PCUT_TEST(activate)
+{
+	ui_t *ui;
+	ui_window_t *window;
+	ui_wnd_params_t params;
+	panel_t *panel;
+	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, false, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	PCUT_ASSERT_FALSE(panel_is_active(panel));
+	panel_activate(panel);
+	PCUT_ASSERT_TRUE(panel_is_active(panel));
+
+	panel_destroy(panel);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
+/** panel_deactivate() deactivates panel */
+PCUT_TEST(deactivate)
+{
+	ui_t *ui;
+	ui_window_t *window;
+	ui_wnd_params_t params;
+	panel_t *panel;
+	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);
+
+	PCUT_ASSERT_TRUE(panel_is_active(panel));
+	panel_deactivate(panel);
+	PCUT_ASSERT_FALSE(panel_is_active(panel));
+
+	panel_destroy(panel);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
 /** panel_entry_append() appends new entry */
 PCUT_TEST(entry_append)
@@ -243,5 +321,5 @@
 	errno_t rc;
 
-	rc = panel_create(NULL, &panel);
+	rc = panel_create(NULL, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -266,5 +344,5 @@
 	errno_t rc;
 
-	rc = panel_create(NULL, &panel);
+	rc = panel_create(NULL, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -296,5 +374,5 @@
 	errno_t rc;
 
-	rc = panel_create(NULL, &panel);
+	rc = panel_create(NULL, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -345,5 +423,5 @@
 	PCUT_ASSERT_INT_EQUALS(0, rv);
 
-	rc = panel_create(NULL, &panel);
+	rc = panel_create(NULL, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -375,5 +453,5 @@
 	errno_t rc;
 
-	rc = panel_create(NULL, &panel);
+	rc = panel_create(NULL, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -411,5 +489,5 @@
 	errno_t rc;
 
-	rc = panel_create(NULL, &panel);
+	rc = panel_create(NULL, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -447,5 +525,5 @@
 	errno_t rc;
 
-	rc = panel_create(NULL, &panel);
+	rc = panel_create(NULL, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -484,5 +562,5 @@
 	errno_t rc;
 
-	rc = panel_create(NULL, &panel);
+	rc = panel_create(NULL, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -538,5 +616,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = panel_create(window, &panel);
+	rc = panel_create(window, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -619,5 +697,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = panel_create(window, &panel);
+	rc = panel_create(window, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -702,5 +780,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = panel_create(window, &panel);
+	rc = panel_create(window, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -763,5 +841,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = panel_create(window, &panel);
+	rc = panel_create(window, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -825,5 +903,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = panel_create(window, &panel);
+	rc = panel_create(window, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -913,5 +991,5 @@
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
-	rc = panel_create(window, &panel);
+	rc = panel_create(window, true, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
Index: uspace/app/nav/types/nav.h
===================================================================
--- uspace/app/nav/types/nav.h	(revision 2fb495228984165d057f71bfa95d721845722687)
+++ uspace/app/nav/types/nav.h	(revision 692c7f40369e2c44dc1847d6acc7f45ea36d1934)
@@ -41,4 +41,8 @@
 #include <ui/window.h>
 
+enum {
+	navigator_panels = 2
+};
+
 /** Navigator */
 typedef struct navigator {
@@ -52,5 +56,5 @@
 	struct nav_menu *menu;
 	/** Panels */
-	struct panel *panel[2];
+	struct panel *panel[navigator_panels];
 } navigator_t;
 
Index: uspace/app/nav/types/panel.h
===================================================================
--- uspace/app/nav/types/panel.h	(revision 2fb495228984165d057f71bfa95d721845722687)
+++ uspace/app/nav/types/panel.h	(revision 692c7f40369e2c44dc1847d6acc7f45ea36d1934)
@@ -75,4 +75,7 @@
 	gfx_color_t *curs_color;
 
+	/** Active border color */
+	gfx_color_t *act_border_color;
+
 	/** Panel entries (list of panel_entry_t) */
 	list_t entries;
@@ -92,4 +95,7 @@
 	/** Index of entry under cursor */
 	size_t cursor_idx;
+
+	/** @c true iff the panel is active */
+	bool active;
 } panel_t;
 
