Index: uspace/app/nav/nav.c
===================================================================
--- uspace/app/nav/nav.c	(revision 6aa85c1c3876c2d434a6d7a22cc07d02e16bb796)
+++ uspace/app/nav/nav.c	(revision b36ebb423fd5ae79596c69c0741d8f63213a0b48)
@@ -45,4 +45,5 @@
 #include "menu.h"
 #include "nav.h"
+#include "panel.h"
 
 static void wnd_close(ui_window_t *, void *);
@@ -75,4 +76,6 @@
 	navigator_t *navigator;
 	ui_wnd_params_t params;
+	gfx_rect_t rect;
+	unsigned i;
 	errno_t rc;
 
@@ -118,4 +121,23 @@
 	}
 
+	for (i = 0; i < 2; i++) {
+		rc = panel_create(navigator->window, &navigator->panel[i]);
+		if (rc != EOK)
+			goto error;
+
+		rect.p0.x = 40 * i;
+		rect.p0.y = 1;
+		rect.p1.x = 40 * (i + 1);
+		rect.p1.y = 24;
+		panel_set_rect(navigator->panel[i], &rect);
+
+		rc = ui_fixed_add(navigator->fixed,
+		    panel_ctl(navigator->panel[i]));
+		if (rc != EOK) {
+			printf("Error adding control to layout.\n");
+			return rc;
+		}
+	}
+
 	rc = ui_window_paint(navigator->window);
 	if (rc != EOK) {
@@ -133,4 +155,12 @@
 void navigator_destroy(navigator_t *navigator)
 {
+	unsigned i;
+
+	for (i = 0; i < 2; i++) {
+		ui_fixed_remove(navigator->fixed,
+		    panel_ctl(navigator->panel[i]));
+		panel_destroy(navigator->panel[i]);
+	}
+
 	ui_fixed_remove(navigator->fixed, nav_menu_ctl(navigator->menu));
 
Index: uspace/app/nav/nav.h
===================================================================
--- uspace/app/nav/nav.h	(revision 6aa85c1c3876c2d434a6d7a22cc07d02e16bb796)
+++ uspace/app/nav/nav.h	(revision b36ebb423fd5ae79596c69c0741d8f63213a0b48)
@@ -53,4 +53,6 @@
 	/** Menu */
 	struct nav_menu *menu;
+	/** Panels */
+	struct panel *panel[2];
 } navigator_t;
 
@@ -59,5 +61,4 @@
 extern errno_t navigator_run(const char *);
 
-
 #endif
 
Index: uspace/app/nav/panel.c
===================================================================
--- uspace/app/nav/panel.c	(revision 6aa85c1c3876c2d434a6d7a22cc07d02e16bb796)
+++ uspace/app/nav/panel.c	(revision b36ebb423fd5ae79596c69c0741d8f63213a0b48)
@@ -36,16 +36,32 @@
 
 #include <errno.h>
+#include <gfx/render.h>
 #include <stdlib.h>
+#include <ui/control.h>
+#include <ui/paint.h>
 #include "panel.h"
 #include "nav.h"
 
+static void panel_ctl_destroy(void *);
+static errno_t panel_ctl_paint(void *);
+static ui_evclaim_t panel_ctl_pos_event(void *, pos_event_t *);
+
+/** Panel control ops */
+ui_control_ops_t panel_ctl_ops = {
+	.destroy = panel_ctl_destroy,
+	.paint = panel_ctl_paint,
+	.pos_event = panel_ctl_pos_event
+};
+
 /** Create panel.
  *
+ * @param window Containing window
  * @param rpanel Place to store pointer to new panel
  * @return EOK on success or an error code
  */
-errno_t panel_create(panel_t **rpanel)
+errno_t panel_create(ui_window_t *window, panel_t **rpanel)
 {
 	panel_t *panel;
+	errno_t rc;
 
 	panel = calloc(1, sizeof(panel_t));
@@ -53,6 +69,22 @@
 		return ENOMEM;
 
+	rc = ui_control_new(&panel_ctl_ops, (void *)panel,
+	    &panel->control);
+	if (rc != EOK) {
+		free(panel);
+		return rc;
+	}
+
+	rc = gfx_color_new_ega(0x07, &panel->color);
+	if (rc != EOK)
+		goto error;
+
+	panel->window = window;
 	*rpanel = panel;
 	return EOK;
+error:
+	ui_control_delete(panel->control);
+	free(panel);
+	return rc;
 }
 
@@ -63,7 +95,106 @@
 void panel_destroy(panel_t *panel)
 {
+	ui_control_delete(panel->control);
 	free(panel);
 }
 
+/** Paint panel.
+ *
+ * @param panel Panel
+ */
+errno_t panel_paint(panel_t *panel)
+{
+	gfx_context_t *gc = ui_window_get_gc(panel->window);
+	ui_resource_t *res = ui_window_get_res(panel->window);
+	errno_t rc;
+
+	rc = gfx_set_color(gc, panel->color);
+	if (rc != EOK)
+		return rc;
+
+	rc = gfx_fill_rect(gc, &panel->rect);
+	if (rc != EOK)
+		return rc;
+
+	rc = ui_paint_text_box(res, &panel->rect, ui_box_single,
+	    panel->color);
+	if (rc != EOK)
+		return rc;
+
+	rc = gfx_update(gc);
+	if (rc != EOK)
+		return rc;
+
+	return EOK;
+}
+
+/** Handle panel position event.
+ *
+ * @param panel Panel
+ * @param event Position event
+ * @return ui_claimed iff event was claimed
+ */
+ui_evclaim_t panel_pos_event(panel_t *panel, pos_event_t *event)
+{
+	return ui_unclaimed;
+}
+
+/** Get base control for panel.
+ *
+ * @param panel Panel
+ * @return Base UI control
+ */
+ui_control_t *panel_ctl(panel_t *panel)
+{
+	return panel->control;
+}
+
+/** Set panel rectangle.
+ *
+ * @param panel Panel
+ * @param rect Rectangle
+ */
+void panel_set_rect(panel_t *panel, gfx_rect_t *rect)
+{
+	panel->rect = *rect;
+}
+
+/** Destroy panel control.
+ *
+ * @param arg Argument (panel_t *)
+ */
+void panel_ctl_destroy(void *arg)
+{
+	panel_t *panel = (panel_t *) arg;
+
+	panel_destroy(panel);
+}
+
+/** Paint panel control.
+ *
+ * @param arg Argument (panel_t *)
+ * @return EOK on success or an error code
+ */
+errno_t panel_ctl_paint(void *arg)
+{
+	panel_t *panel = (panel_t *) arg;
+
+	return panel_paint(panel);
+}
+
+/** Handle panel control position event.
+ *
+ * @param arg Argument (panel_t *)
+ * @param pos_event Position event
+ * @return @c ui_claimed iff the event is claimed
+ */
+ui_evclaim_t panel_ctl_pos_event(void *arg, pos_event_t *event)
+{
+	panel_t *panel = (panel_t *) arg;
+
+	return panel_pos_event(panel, event);
+}
+
+
 /** @}
  */
Index: uspace/app/nav/panel.h
===================================================================
--- uspace/app/nav/panel.h	(revision 6aa85c1c3876c2d434a6d7a22cc07d02e16bb796)
+++ uspace/app/nav/panel.h	(revision b36ebb423fd5ae79596c69c0741d8f63213a0b48)
@@ -40,5 +40,7 @@
 #include <gfx/color.h>
 #include <gfx/coord.h>
+#include <io/pos_event.h>
 #include <ui/control.h>
+#include <ui/window.h>
 #include "nav.h"
 #include "panel.h"
@@ -48,7 +50,10 @@
  * This is a custom UI control.
  */
-typedef struct {
+typedef struct panel {
 	/** Base control object */
 	struct ui_control *control;
+
+	/** Containing window */
+	ui_window_t *window;
 
 	/** Panel rectangle */
@@ -59,6 +64,10 @@
 } panel_t;
 
-extern errno_t panel_create(panel_t **);
+extern errno_t panel_create(ui_window_t *, panel_t **);
 extern void panel_destroy(panel_t *);
+extern errno_t panel_paint(panel_t *);
+extern ui_evclaim_t panel_pos_event(panel_t *, pos_event_t *);
+extern ui_control_t *panel_ctl(panel_t *);
+extern void panel_set_rect(panel_t *, gfx_rect_t *);
 
 #endif
Index: uspace/app/nav/test/menu.c
===================================================================
--- uspace/app/nav/test/menu.c	(revision 6aa85c1c3876c2d434a6d7a22cc07d02e16bb796)
+++ uspace/app/nav/test/menu.c	(revision b36ebb423fd5ae79596c69c0741d8f63213a0b48)
@@ -57,4 +57,6 @@
 
 	nav_menu_destroy(menu);
+	ui_window_destroy(window);
+	ui_destroy(ui);
 }
 
Index: uspace/app/nav/test/panel.c
===================================================================
--- uspace/app/nav/test/panel.c	(revision 6aa85c1c3876c2d434a6d7a22cc07d02e16bb796)
+++ uspace/app/nav/test/panel.c	(revision b36ebb423fd5ae79596c69c0741d8f63213a0b48)
@@ -41,5 +41,5 @@
 	errno_t rc;
 
-	rc = panel_create(&panel);
+	rc = panel_create(NULL, &panel);
 	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
 
@@ -47,3 +47,98 @@
 }
 
+
+/** Test panel_paint() */
+PCUT_TEST(paint)
+{
+	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, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	rc = panel_paint(panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	panel_destroy(panel);
+	ui_window_destroy(window);
+	ui_destroy(ui);
+}
+
+/** panel_ctl() returns a valid UI control */
+PCUT_TEST(ctl)
+{
+	panel_t *panel;
+	ui_control_t *control;
+	errno_t rc;
+
+	rc = panel_create(NULL, &panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	control = panel_ctl(panel);
+	PCUT_ASSERT_NOT_NULL(control);
+
+	panel_destroy(panel);
+}
+
+/** Test panel_pos_event() */
+PCUT_TEST(pos_event)
+{
+	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);
+
+	claimed = panel_pos_event(panel, &event);
+	PCUT_ASSERT_EQUALS(ui_unclaimed, claimed);
+
+	panel_destroy(panel);
+}
+
+/** panel_set_rect() sets internal field */
+PCUT_TEST(set_rect)
+{
+	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);
+
+	rect.p0.x = 1;
+	rect.p0.y = 2;
+	rect.p1.x = 3;
+	rect.p1.y = 4;
+
+	panel_set_rect(panel, &rect);
+	PCUT_ASSERT_INT_EQUALS(rect.p0.x, panel->rect.p0.x);
+	PCUT_ASSERT_INT_EQUALS(rect.p0.y, panel->rect.p0.y);
+	PCUT_ASSERT_INT_EQUALS(rect.p1.x, panel->rect.p1.x);
+	PCUT_ASSERT_INT_EQUALS(rect.p1.y, panel->rect.p1.y);
+
+	panel_destroy(panel);
+}
+
 PCUT_EXPORT(panel);
