Index: uspace/app/getterm/getterm.c
===================================================================
--- uspace/app/getterm/getterm.c	(revision f6ab787eddabe2ded4f3ba4e6efa7457e948e5f2)
+++ uspace/app/getterm/getterm.c	(revision e369d1ce30c6ef54ab92e761fab26143928bb590)
@@ -42,4 +42,5 @@
 #include <str_error.h>
 #include <errno.h>
+#include <loc.h>
 #include "version.h"
 #include "welcome.h"
@@ -49,8 +50,14 @@
 static void usage(void)
 {
-	printf("Usage: %s <terminal> [-w] <command> [<arguments...>]\n", APP_NAME);
+	printf("Usage: %s <terminal> <locfs> [--msg] [--wait] -- "
+	    "<command> [<arguments...>]\n", APP_NAME);
+	printf(" <terminal>    Terminal device\n");
+	printf(" <locfs>       Mount point of locfs\n");
+	printf(" --msg         Print welcome message\n");
+	printf(" --wait        Wait for the terminal to be ready\n");
 }
 
-static void reopen(FILE **stream, int fd, const char *path, int flags, const char *mode)
+static void reopen(FILE **stream, int fd, const char *path, int flags,
+    const char *mode)
 {
 	if (fclose(*stream))
@@ -76,48 +83,74 @@
 int main(int argc, char *argv[])
 {
-	int rc;
-	task_exit_t texit;
-	int retval;
-	task_id_t id;
-	char *fname, *term;
-	char **cmd_args;
-	bool print_wmsg;
-
 	argv++;
 	argc--;
+	if (argc < 4) {
+		usage();
+		return 1;
+	}
+	
+	char *term = *argv;
+	argv++;
+	argc--;
+	
+	char *locfs = *argv;
+	argv++;
+	argc--;
+	
+	bool print_msg = false;
+	bool wait = false;
+	
+	while ((argc > 0) && (str_cmp(*argv, "--") != 0)) {
+		if (str_cmp(*argv, "--msg") == 0) {
+			print_msg = true;
+		} else if (str_cmp(*argv, "--wait") == 0) {
+			wait = true;
+		} else {
+			usage();
+			return 2;
+		}
+		
+		argv++;
+		argc--;
+	}
+	
 	if (argc < 1) {
 		usage();
-		return -1;
+		return 3;
 	}
-
-	if (str_cmp(*argv, "-w") == 0) {
-		print_wmsg = true;
-		argv++;
-		argc--;
-	} else {
-		print_wmsg = false;
+	
+	/* Skip "--" */
+	argv++;
+	argc--;
+	
+	char *cmd = *argv;
+	char **args = argv;
+	
+	if (wait) {
+		/* Wait for the terminal service to be ready */
+		service_id_t service_id;
+		int rc = loc_service_get_id(term, &service_id, IPC_FLAG_BLOCKING);
+		if (rc != EOK) {
+			printf("%s: Error waiting on %s (%s)\n", APP_NAME, term,
+			    str_error(rc));
+			return rc;
+		}
 	}
-
-	if (argc < 2) {
-		usage();
-		return -1;
-	}
-
-	term = *argv++;
-	fname = *argv;
-	cmd_args = argv;
 	
-	reopen(&stdin, 0, term, O_RDONLY, "r");
-	reopen(&stdout, 1, term, O_WRONLY, "w");
-	reopen(&stderr, 2, term, O_WRONLY, "w");
+	char term_node[LOC_NAME_MAXLEN];
+	snprintf(term_node, LOC_NAME_MAXLEN, "%s/%s", locfs, term);
+	
+	reopen(&stdin, 0, term_node, O_RDONLY, "r");
+	reopen(&stdout, 1, term_node, O_WRONLY, "w");
+	reopen(&stderr, 2, term_node, O_WRONLY, "w");
 	
 	if (stdin == NULL)
-		return -2;
+		return 4;
 	
 	if (stdout == NULL)
-		return -3;
+		return 5;
 	
 	if (stderr == NULL)
-		return -4;
+		return 6;
 	
 	/*
@@ -128,21 +161,25 @@
 	
 	version_print(term);
-	if (print_wmsg)
+	if (print_msg)
 		welcome_msg_print();
-
-	rc = task_spawnv(&id, fname, (const char * const *) cmd_args);
+	
+	task_id_t id;
+	
+	int rc = task_spawnv(&id, cmd, (const char * const *) args);
 	if (rc != EOK) {
-		printf("%s: Error spawning %s (%s)\n", APP_NAME, fname,
+		printf("%s: Error spawning %s (%s)\n", APP_NAME, cmd,
 		    str_error(rc));
-		return -5;
+		return rc;
 	}
-
+	
+	task_exit_t texit;
+	int retval;
 	rc = task_wait(id, &texit, &retval);
 	if (rc != EOK) {
-		printf("%s: Error waiting for %s (%s)\n", APP_NAME, fname,
+		printf("%s: Error waiting for %s (%s)\n", APP_NAME, cmd,
 		    str_error(rc));
-		return -6;
+		return rc;
 	}
-
+	
 	return 0;
 }
Index: uspace/app/init/init.c
===================================================================
--- uspace/app/init/init.c	(revision f6ab787eddabe2ded4f3ba4e6efa7457e948e5f2)
+++ uspace/app/init/init.c	(revision e369d1ce30c6ef54ab92e761fab26143928bb590)
@@ -272,34 +272,24 @@
 }
 
-static void getterm(const char *svc, const char *app, bool wmsg)
-{
-	char term[LOC_NAME_MAXLEN];
-	snprintf(term, LOC_NAME_MAXLEN, "%s/%s", LOCFS_MOUNT_POINT, svc);
-	
-	printf("%s: Spawning %s %s %s\n", NAME, APP_GETTERM, term, app);
-	
-	/* Wait for the terminal service to be ready */
-	service_id_t service_id;
-	int rc = loc_service_get_id(svc, &service_id, IPC_FLAG_BLOCKING);
-	if (rc != EOK) {
-		printf("%s: Error waiting on %s (%s)\n", NAME, term,
-		    str_error(rc));
-		return;
-	}
-	
-	if (wmsg) {
-		rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, "-w", term,
-		    app, NULL);
-		if (rc != EOK) {
-			printf("%s: Error spawning %s -w %s %s (%s)\n", NAME,
-			    APP_GETTERM, term, app, str_error(rc));
-		}
+static void getterm(const char *svc, const char *app, bool msg)
+{
+	if (msg) {
+		printf("%s: Spawning %s %s %s --msg --wait -- %s\n", NAME,
+		    APP_GETTERM, svc, LOCFS_MOUNT_POINT, app);
+		
+		int rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, svc,
+		    LOCFS_MOUNT_POINT, "--msg", "--wait", "--", app, NULL);
+		if (rc != EOK)
+			printf("%s: Error spawning %s %s %s --msg --wait -- %s\n",
+			    NAME, APP_GETTERM, svc, LOCFS_MOUNT_POINT, app);
 	} else {
-		rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, term, app,
-		    NULL);
-		if (rc != EOK) {
-			printf("%s: Error spawning %s %s %s (%s)\n", NAME,
-			    APP_GETTERM, term, app, str_error(rc));
-		}
+		printf("%s: Spawning %s %s %s --wait -- %s\n", NAME,
+		    APP_GETTERM, svc, LOCFS_MOUNT_POINT, app);
+		
+		int rc = task_spawnl(NULL, APP_GETTERM, APP_GETTERM, svc,
+		    LOCFS_MOUNT_POINT, "--wait", "--", app, NULL);
+		if (rc != EOK)
+			printf("%s: Error spawning %s %s %s --wait -- %s\n",
+			    NAME, APP_GETTERM, svc, LOCFS_MOUNT_POINT, app);
 	}
 }
@@ -364,15 +354,14 @@
 		gui_start("/app/vlaunch", HID_COMPOSITOR_SERVER);
 		gui_start("/app/vterm", HID_COMPOSITOR_SERVER);
-	} else {
-		rc = console(HID_INPUT, HID_OUTPUT);
-		if (rc == EOK) {
-			getterm("term/vc0", "/app/bdsh", true);
-			getterm("term/vc1", "/app/bdsh", false);
-			getterm("term/vc2", "/app/bdsh", false);
-			getterm("term/vc3", "/app/bdsh", false);
-			getterm("term/vc4", "/app/bdsh", false);
-			getterm("term/vc5", "/app/bdsh", false);
-			getterm("term/vc6", "/app/klog", false);
-		}
+	}
+	
+	rc = console(HID_INPUT, HID_OUTPUT);
+	if (rc == EOK) {
+		getterm("term/vc0", "/app/bdsh", true);
+		getterm("term/vc1", "/app/bdsh", false);
+		getterm("term/vc2", "/app/bdsh", false);
+		getterm("term/vc3", "/app/bdsh", false);
+		getterm("term/vc4", "/app/bdsh", false);
+		getterm("term/vc5", "/app/bdsh", false);
 	}
 	
