Index: uspace/app/launcher/launcher.c
===================================================================
--- uspace/app/launcher/launcher.c	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
+++ uspace/app/launcher/launcher.c	(revision 24c452b35ddd0c461fd764673507864e5fc2fbcd)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2020 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * Copyright (c) 2012 Petr Koupy
  * All rights reserved.
@@ -70,5 +70,5 @@
 };
 
-static int app_launch(const char *, const char *);
+static int app_launchl(const char *, ...);
 
 /** Window close button was clicked.
@@ -94,38 +94,71 @@
 
 	if (pbutton == launcher->pb1) {
-		app_launch("/app/terminal", NULL);
+		app_launchl("/app/terminal", "-c", "/app/nav", NULL);
 	} else if (pbutton == launcher->pb2) {
-		app_launch("/app/calculator", NULL);
+		app_launchl("/app/terminal", NULL);
 	} else if (pbutton == launcher->pb3) {
-		app_launch("/app/uidemo", NULL);
+		app_launchl("/app/calculator", NULL);
 	} else if (pbutton == launcher->pb4) {
-		app_launch("/app/gfxdemo", "ui");
+		app_launchl("/app/uidemo", NULL);
+	} else if (pbutton == launcher->pb5) {
+		app_launchl("/app/gfxdemo", "ui", NULL);
 	}
 }
 
-static int app_launch(const char *app, const char *arg)
+static int app_launchl(const char *app, ...)
 {
 	errno_t rc;
 	task_id_t id;
 	task_wait_t wait;
-
-	if (display_spec != UI_DISPLAY_DEFAULT) {
-		printf("%s: Spawning %s -d %s\n", NAME, app, display_spec);
-		rc = task_spawnl(&id, &wait, app, app, "-d", display_spec,
-		    arg, NULL);
-	} else {
-		printf("%s: Spawning %s\n", NAME, app);
-		rc = task_spawnl(&id, &wait, app, app, arg, NULL);
-	}
-
-	if (rc != EOK) {
-		printf("%s: Error spawning %s %s (%s)\n", NAME, app,
-		    display_spec != DISPLAY_DEFAULT ? display_spec :
-		    "<default>", str_error(rc));
+	va_list ap;
+	const char *arg;
+	const char **argv;
+	const char **argp;
+	int cnt = 0;
+	int i;
+
+	va_start(ap, app);
+	do {
+		arg = va_arg(ap, const char *);
+		cnt++;
+	} while (arg != NULL);
+	va_end(ap);
+
+	argv = calloc(cnt + 4, sizeof(const char *));
+	if (argv == NULL)
 		return -1;
-	}
 
 	task_exit_t texit;
 	int retval;
+
+	argp = argv;
+	*argp++ = app;
+
+	if (display_spec != UI_DISPLAY_DEFAULT) {
+		*argp++ = "-d";
+		*argp++ = display_spec;
+	}
+
+	va_start(ap, app);
+	do {
+		arg = va_arg(ap, const char *);
+		*argp++ = arg;
+	} while (arg != NULL);
+	va_end(ap);
+
+	*argp++ = NULL;
+
+	printf("%s: Spawning %s", NAME, app);
+	for (i = 0; argv[i] != NULL; i++) {
+		printf(" %s", argv[i]);
+	}
+	printf("\n");
+
+	rc = task_spawnv(&id, &wait, app, argv);
+	if (rc != EOK) {
+		printf("%s: Error spawning %s (%s)\n", NAME, app, str_error(rc));
+		return -1;
+	}
+
 	rc = task_wait(&wait, &texit, &retval);
 	if ((rc != EOK) || (texit != TASK_EXIT_NORMAL)) {
@@ -189,5 +222,5 @@
 	params.rect.p0.y = 0;
 	params.rect.p1.x = 210;
-	params.rect.p1.y = 300;
+	params.rect.p1.y = 310;
 
 	memset((void *) &launcher, 0, sizeof(launcher));
@@ -263,5 +296,7 @@
 	}
 
-	rc = ui_pbutton_create(ui_res, "Terminal", &launcher.pb1);
+	/* Navigator */
+
+	rc = ui_pbutton_create(ui_res, "Navigator", &launcher.pb1);
 	if (rc != EOK) {
 		printf("Error creating button.\n");
@@ -274,5 +309,5 @@
 	rect.p0.y = 130;
 	rect.p1.x = 190;
-	rect.p1.y = 158;
+	rect.p1.y = rect.p0.y + 28;
 	ui_pbutton_set_rect(launcher.pb1, &rect);
 
@@ -283,5 +318,7 @@
 	}
 
-	rc = ui_pbutton_create(ui_res, "Calculator", &launcher.pb2);
+	/* Terminal */
+
+	rc = ui_pbutton_create(ui_res, "Terminal", &launcher.pb2);
 	if (rc != EOK) {
 		printf("Error creating button.\n");
@@ -292,7 +329,7 @@
 
 	rect.p0.x = 15;
-	rect.p0.y = 170;
+	rect.p0.y = 130 + 35;
 	rect.p1.x = 190;
-	rect.p1.y = 198;
+	rect.p1.y = rect.p0.y + 28;
 	ui_pbutton_set_rect(launcher.pb2, &rect);
 
@@ -303,5 +340,7 @@
 	}
 
-	rc = ui_pbutton_create(ui_res, "UI Demo", &launcher.pb3);
+	/* Calculator */
+
+	rc = ui_pbutton_create(ui_res, "Calculator", &launcher.pb3);
 	if (rc != EOK) {
 		printf("Error creating button.\n");
@@ -312,7 +351,7 @@
 
 	rect.p0.x = 15;
-	rect.p0.y = 210;
+	rect.p0.y = 130 + 2 * 35;
 	rect.p1.x = 190;
-	rect.p1.y = 238;
+	rect.p1.y = rect.p0.y + 28;
 	ui_pbutton_set_rect(launcher.pb3, &rect);
 
@@ -323,5 +362,7 @@
 	}
 
-	rc = ui_pbutton_create(ui_res, "GFX Demo", &launcher.pb4);
+	/* UI Demo */
+
+	rc = ui_pbutton_create(ui_res, "UI Demo", &launcher.pb4);
 	if (rc != EOK) {
 		printf("Error creating button.\n");
@@ -332,7 +373,7 @@
 
 	rect.p0.x = 15;
-	rect.p0.y = 250;
+	rect.p0.y = 130 + 3 * 35;
 	rect.p1.x = 190;
-	rect.p1.y = 278;
+	rect.p1.y = rect.p0.y + 28;
 	ui_pbutton_set_rect(launcher.pb4, &rect);
 
@@ -343,8 +384,27 @@
 	}
 
+	/* GFX Demo */
+
+	rc = ui_pbutton_create(ui_res, "GFX Demo", &launcher.pb5);
+	if (rc != EOK) {
+		printf("Error creating button.\n");
+		return rc;
+	}
+
+	ui_pbutton_set_cb(launcher.pb5, &pbutton_cb, (void *) &launcher);
+
+	rect.p0.x = 15;
+	rect.p0.y = 130 + 4 * 35;
+	rect.p1.x = 190;
+	rect.p1.y = rect.p0.y + 28;
+	ui_pbutton_set_rect(launcher.pb5, &rect);
+
+	rc = ui_fixed_add(launcher.fixed, ui_pbutton_ctl(launcher.pb5));
+	if (rc != EOK) {
+		printf("Error adding control to layout.\n");
+		return rc;
+	}
+
 	ui_window_add(window, ui_fixed_ctl(launcher.fixed));
-
-	(void) ui_res;
-	(void) app_launch;
 
 	rc = ui_window_paint(window);
Index: uspace/app/launcher/launcher.h
===================================================================
--- uspace/app/launcher/launcher.h	(revision d8ddf7a17eaf0cf4fee87a5efb1faca4bb6562b2)
+++ uspace/app/launcher/launcher.h	(revision 24c452b35ddd0c461fd764673507864e5fc2fbcd)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2020 Jiri Svoboda
+ * Copyright (c) 2021 Jiri Svoboda
  * All rights reserved.
  *
@@ -56,4 +56,5 @@
 	ui_pbutton_t *pb3;
 	ui_pbutton_t *pb4;
+	ui_pbutton_t *pb5;
 } launcher_t;
 
