Index: uspace/app/nav/main.c
===================================================================
--- uspace/app/nav/main.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
+++ uspace/app/nav/main.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2021 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup nav
+ * @{
+ */
+/** @file Navigator main.
+ *
+ * HelenOS file manager.
+ */
+
+#include <stdio.h>
+#include <str.h>
+#include <ui/ui.h>
+#include "nav.h"
+
+static void print_syntax(void)
+{
+	printf("Syntax: nav [-d <display-spec>]\n");
+}
+
+int main(int argc, char *argv[])
+{
+	const char *display_spec = UI_CONSOLE_DEFAULT;
+	errno_t rc;
+	int i;
+
+	i = 1;
+	while (i < argc && argv[i][0] == '-') {
+		if (str_cmp(argv[i], "-d") == 0) {
+			++i;
+			if (i >= argc) {
+				printf("Argument missing.\n");
+				print_syntax();
+				return 1;
+			}
+
+			display_spec = argv[i++];
+		} else {
+			printf("Invalid option '%s'.\n", argv[i]);
+			print_syntax();
+			return 1;
+		}
+	}
+
+	if (i < argc) {
+		print_syntax();
+		return 1;
+	}
+
+	rc = navigator_run(display_spec);
+	if (rc != EOK)
+		return 1;
+
+	return 0;
+}
+
+/** @}
+ */
Index: uspace/app/nav/menu.c
===================================================================
--- uspace/app/nav/menu.c	(revision d097daca0b4477f4950c6da8f56adc0b0d6990d3)
+++ uspace/app/nav/menu.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
@@ -47,9 +47,9 @@
 /** Create navigator menu.
  *
- * @param navigator Navigator
+ * @param window Navigator window
  * @param rmenu Place to store pointer to new menu
  * @return EOK on success or an error code
  */
-errno_t nav_menu_create(navigator_t *navigator, nav_menu_t **rmenu)
+errno_t nav_menu_create(ui_window_t *window, nav_menu_t **rmenu)
 {
 	nav_menu_t *menu;
@@ -64,5 +64,8 @@
 		return ENOMEM;
 
-	rc = ui_menu_bar_create(navigator->ui, navigator->window,
+	menu->window = window;
+	menu->ui = ui_window_get_ui(window);
+
+	rc = ui_menu_bar_create(menu->ui, menu->window,
 	    &menu->menubar);
 	if (rc != EOK)
@@ -77,7 +80,7 @@
 		goto error;
 
-	ui_menu_entry_set_cb(mexit, nav_file_exit, (void *) navigator);
+	ui_menu_entry_set_cb(mexit, nav_file_exit, (void *) menu);
 
-	ui_window_get_app_rect(navigator->window, &arect);
+	ui_window_get_app_rect(menu->window, &arect);
 
 	rect.p0 = arect.p0;
@@ -86,9 +89,4 @@
 	ui_menu_bar_set_rect(menu->menubar, &rect);
 
-	rc = ui_fixed_add(navigator->fixed, ui_menu_bar_ctl(menu->menubar));
-	if (rc != EOK)
-		goto error;
-
-	menu->navigator = navigator;
 	*rmenu = menu;
 	return EOK;
@@ -104,11 +102,18 @@
 void nav_menu_destroy(nav_menu_t *menu)
 {
-	if (menu->menubar != NULL) {
-		ui_fixed_remove(menu->navigator->fixed,
-		    ui_menu_bar_ctl(menu->menubar));
+	if (menu->menubar != NULL)
 		ui_menu_bar_destroy(menu->menubar);
-	}
 
 	free(menu);
+}
+
+/** Return base UI control for the menu bar.
+ *
+ * @param menu Navigator menu
+ * @return UI control
+ */
+ui_control_t *nav_menu_ctl(nav_menu_t *menu)
+{
+	return ui_menu_bar_ctl(menu->menubar);
 }
 
Index: uspace/app/nav/menu.h
===================================================================
--- uspace/app/nav/menu.h	(revision d097daca0b4477f4950c6da8f56adc0b0d6990d3)
+++ uspace/app/nav/menu.h	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
@@ -38,17 +38,22 @@
 
 #include <errno.h>
+#include <ui/control.h>
 #include <ui/menu.h>
 #include <ui/menubar.h>
 #include <ui/menuentry.h>
+#include <ui/ui.h>
+#include <ui/window.h>
 #include "nav.h"
 
 /** Navigator menu */
 typedef struct nav_menu {
-	navigator_t *navigator;
+	ui_t *ui;
+	ui_window_t *window;
 	ui_menu_bar_t *menubar;
 } nav_menu_t;
 
-extern errno_t nav_menu_create(navigator_t *, nav_menu_t **);
+extern errno_t nav_menu_create(ui_window_t *, nav_menu_t **);
 extern void nav_menu_destroy(nav_menu_t *);
+extern ui_control_t *nav_menu_ctl(nav_menu_t *);
 
 #endif
Index: uspace/app/nav/meson.build
===================================================================
--- uspace/app/nav/meson.build	(revision d097daca0b4477f4950c6da8f56adc0b0d6990d3)
+++ uspace/app/nav/meson.build	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
@@ -29,5 +29,17 @@
 deps = [ 'ui' ]
 src = files(
+	'main.c',
 	'menu.c',
 	'nav.c',
+	'panel.c',
 )
+
+test_src = files(
+	'menu.c',
+	'nav.c',
+	'panel.c',
+	'test/main.c',
+	'test/menu.c',
+	'test/nav.c',
+	'test/panel.c',
+)
Index: uspace/app/nav/nav.c
===================================================================
--- uspace/app/nav/nav.c	(revision d097daca0b4477f4950c6da8f56adc0b0d6990d3)
+++ uspace/app/nav/nav.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
@@ -46,7 +46,4 @@
 #include "nav.h"
 
-static errno_t navigator_create(const char *, navigator_t **);
-static void navigator_destroy(navigator_t *);
-
 static void wnd_close(ui_window_t *, void *);
 
@@ -73,5 +70,5 @@
  * @return EOK on success or ane error code
  */
-static errno_t navigator_create(const char *display_spec,
+errno_t navigator_create(const char *display_spec,
     navigator_t **rnavigator)
 {
@@ -111,7 +108,13 @@
 	ui_window_add(navigator->window, ui_fixed_ctl(navigator->fixed));
 
-	rc = nav_menu_create(navigator, &navigator->menu);
+	rc = nav_menu_create(navigator->window, &navigator->menu);
 	if (rc != EOK)
 		goto error;
+
+	rc = ui_fixed_add(navigator->fixed, nav_menu_ctl(navigator->menu));
+	if (rc != EOK) {
+		printf("Error adding control to layout.\n");
+		return rc;
+	}
 
 	rc = ui_window_paint(navigator->window);
@@ -128,6 +131,8 @@
 }
 
-static void navigator_destroy(navigator_t *navigator)
+void navigator_destroy(navigator_t *navigator)
 {
+	ui_fixed_remove(navigator->fixed, nav_menu_ctl(navigator->menu));
+
 	if (navigator->menu != NULL)
 		nav_menu_destroy(navigator->menu);
@@ -140,5 +145,5 @@
 
 /** Run navigator on the specified display. */
-static errno_t navigator_run(const char *display_spec)
+errno_t navigator_run(const char *display_spec)
 {
 	navigator_t *navigator;
@@ -155,45 +160,4 @@
 }
 
-static void print_syntax(void)
-{
-	printf("Syntax: nav [-d <display-spec>]\n");
-}
-
-int main(int argc, char *argv[])
-{
-	const char *display_spec = UI_CONSOLE_DEFAULT;
-	errno_t rc;
-	int i;
-
-	i = 1;
-	while (i < argc && argv[i][0] == '-') {
-		if (str_cmp(argv[i], "-d") == 0) {
-			++i;
-			if (i >= argc) {
-				printf("Argument missing.\n");
-				print_syntax();
-				return 1;
-			}
-
-			display_spec = argv[i++];
-		} else {
-			printf("Invalid option '%s'.\n", argv[i]);
-			print_syntax();
-			return 1;
-		}
-	}
-
-	if (i < argc) {
-		print_syntax();
-		return 1;
-	}
-
-	rc = navigator_run(display_spec);
-	if (rc != EOK)
-		return 1;
-
-	return 0;
-}
-
 /** @}
  */
Index: uspace/app/nav/nav.h
===================================================================
--- uspace/app/nav/nav.h	(revision d097daca0b4477f4950c6da8f56adc0b0d6990d3)
+++ uspace/app/nav/nav.h	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
@@ -37,4 +37,5 @@
 #define NAV_H
 
+#include <errno.h>
 #include <display.h>
 #include <ui/fixed.h>
@@ -54,4 +55,9 @@
 } navigator_t;
 
+extern errno_t navigator_create(const char *, navigator_t **);
+extern void navigator_destroy(navigator_t *);
+extern errno_t navigator_run(const char *);
+
+
 #endif
 
Index: uspace/app/nav/panel.c
===================================================================
--- uspace/app/nav/panel.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
+++ uspace/app/nav/panel.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2021 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup nav
+ * @{
+ */
+/** @file Navigator panel.
+ *
+ * Displays a file listing.
+ */
+
+#include <errno.h>
+#include <stdlib.h>
+#include "panel.h"
+#include "nav.h"
+
+/** Create panel.
+ *
+ * @param rpanel Place to store pointer to new panel
+ * @return EOK on success or an error code
+ */
+errno_t panel_create(panel_t **rpanel)
+{
+	panel_t *panel;
+
+	panel = calloc(1, sizeof(panel_t));
+	if (panel == NULL)
+		return ENOMEM;
+
+	*rpanel = panel;
+	return EOK;
+}
+
+/** Destroy panel.
+ *
+ * @param panel Panel
+ */
+void panel_destroy(panel_t *panel)
+{
+	free(panel);
+}
+
+/** @}
+ */
Index: uspace/app/nav/panel.h
===================================================================
--- uspace/app/nav/panel.h	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
+++ uspace/app/nav/panel.h	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2021 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup nav
+ * @{
+ */
+/**
+ * @file Navigator panel
+ */
+
+#ifndef PANEL_H
+#define PANEL_H
+
+#include <errno.h>
+#include <gfx/color.h>
+#include <gfx/coord.h>
+#include <ui/control.h>
+#include "nav.h"
+#include "panel.h"
+
+/** Navigator panel
+ *
+ * This is a custom UI control.
+ */
+typedef struct {
+	/** Base control object */
+	struct ui_control *control;
+
+	/** Panel rectangle */
+	gfx_rect_t rect;
+
+	/** Panel color */
+	gfx_color_t *color;
+} panel_t;
+
+extern errno_t panel_create(panel_t **);
+extern void panel_destroy(panel_t *);
+
+#endif
+
+/** @}
+ */
Index: uspace/app/nav/test/main.c
===================================================================
--- uspace/app/nav/test/main.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
+++ uspace/app/nav/test/main.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2021 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <pcut/pcut.h>
+
+PCUT_INIT;
+
+PCUT_IMPORT(menu);
+PCUT_IMPORT(nav);
+PCUT_IMPORT(panel);
+
+PCUT_MAIN();
Index: uspace/app/nav/test/menu.c
===================================================================
--- uspace/app/nav/test/menu.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
+++ uspace/app/nav/test/menu.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2021 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <pcut/pcut.h>
+#include "../menu.h"
+
+PCUT_INIT;
+
+PCUT_TEST_SUITE(menu);
+
+/** Create and destroy menu. */
+PCUT_TEST(create_destroy)
+{
+	ui_t *ui;
+	ui_window_t *window;
+	ui_wnd_params_t params;
+	nav_menu_t *menu;
+	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 = nav_menu_create(window, &menu);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	nav_menu_destroy(menu);
+}
+
+PCUT_EXPORT(menu);
Index: uspace/app/nav/test/nav.c
===================================================================
--- uspace/app/nav/test/nav.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
+++ uspace/app/nav/test/nav.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2021 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <pcut/pcut.h>
+#include "../nav.h"
+
+PCUT_INIT;
+
+PCUT_TEST_SUITE(nav);
+
+/** Create and destroy navigator. */
+PCUT_TEST(create_destroy)
+{
+	navigator_t *nav;
+	errno_t rc;
+
+	rc = navigator_create(UI_DISPLAY_NULL, &nav);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	navigator_destroy(nav);
+}
+
+PCUT_EXPORT(nav);
Index: uspace/app/nav/test/panel.c
===================================================================
--- uspace/app/nav/test/panel.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
+++ uspace/app/nav/test/panel.c	(revision 68b9e540bff9326adf47a100b2c1f52f7102f9f2)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2021 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <errno.h>
+#include <pcut/pcut.h>
+#include "../panel.h"
+
+PCUT_INIT;
+
+PCUT_TEST_SUITE(panel);
+
+/** Create and destroy panel. */
+PCUT_TEST(create_destroy)
+{
+	panel_t *panel;
+	errno_t rc;
+
+	rc = panel_create(&panel);
+	PCUT_ASSERT_ERRNO_VAL(EOK, rc);
+
+	panel_destroy(panel);
+}
+
+PCUT_EXPORT(panel);
