Index: uspace/app/bdsh/exec.c
===================================================================
--- uspace/app/bdsh/exec.c	(revision 7ae3d6f9d860f518c19f0060df70099eddaf81a0)
+++ uspace/app/bdsh/exec.c	(revision 0b81cad0360a509d54d5a8a7f64c14e5fb6f91e6)
@@ -41,4 +41,5 @@
 #include <fcntl.h>
 #include <str_error.h>
+#include <errno.h>
 
 #include "config.h"
@@ -116,24 +117,26 @@
 	task_exit_t texit;
 	char *tmp;
-	int retval;
+	int rc, retval;
 
 	tmp = str_dup(find_command(cmd));
 	free(found);
 
-	tid = task_spawn(tmp, (const char **) argv, &retval);
+	rc = task_spawnv(&tid, tmp, (const char **) argv);
 	free(tmp);
 
-	if (tid == 0) {
+	if (rc != 0) {
 		cli_error(CL_EEXEC, "%s: Cannot spawn `%s' (%s)", progname, cmd,
-		    str_error(retval));
+		    str_error(rc));
 		return 1;
 	}
 	
-	task_wait(tid, &texit, &retval);
-	if (texit != TASK_EXIT_NORMAL) {
+	rc = task_wait(tid, &texit, &retval);
+	if (rc != EOK) {
+		printf("%s: Failed waiting for command (%s)\n", str_error(rc));
+	} else if (texit != TASK_EXIT_NORMAL) {
 		printf("%s: Command failed (unexpectedly terminated)\n", progname);
 	} else if (retval != 0) {
-		printf("%s: Command failed (%s)\n",
-		    progname, str_error(retval));
+		printf("%s: Command failed (exit code %d)\n",
+		    progname, retval);
 	}
 
Index: uspace/app/getterm/getterm.c
===================================================================
--- uspace/app/getterm/getterm.c	(revision 7ae3d6f9d860f518c19f0060df70099eddaf81a0)
+++ uspace/app/getterm/getterm.c	(revision 0b81cad0360a509d54d5a8a7f64c14e5fb6f91e6)
@@ -41,4 +41,5 @@
 #include <task.h>
 #include <str_error.h>
+#include <errno.h>
 #include "version.h"
 
@@ -74,15 +75,13 @@
 static task_id_t spawn(const char *fname)
 {
-	const char *args[2];
+	task_id_t id;
+	int rc;
 	
-	args[0] = fname;
-	args[1] = NULL;
-	
-	int err;
-	task_id_t id = task_spawn(fname, args, &err);
-	
-	if (id == 0)
+	rc = task_spawnl(&id, fname, fname, NULL);
+	if (rc != EOK) {
 		printf("%s: Error spawning %s (%s)\n", APP_NAME, fname,
-		    str_error(err));
+		    str_error(rc));
+		return 0;
+	}
 	
 	return id;
Index: uspace/app/init/init.c
===================================================================
--- uspace/app/init/init.c	(revision 7ae3d6f9d860f518c19f0060df70099eddaf81a0)
+++ uspace/app/init/init.c	(revision 0b81cad0360a509d54d5a8a7f64c14e5fb6f91e6)
@@ -124,5 +124,5 @@
 static void spawn(const char *fname)
 {
-	const char *argv[2];
+	int rc;
 	struct stat s;
 	
@@ -131,17 +131,13 @@
 	
 	printf("%s: Spawning %s\n", NAME, fname);
-	
-	argv[0] = fname;
-	argv[1] = NULL;
-	
-	int err;
-	if (!task_spawn(fname, argv, &err))
+	rc = task_spawnl(NULL, fname, fname, NULL);
+	if (rc != EOK) {
 		printf("%s: Error spawning %s (%s)\n", NAME, fname,
-		    str_error(err));
+		    str_error(rc));
+	}
 }
 
 static void srv_start(const char *fname)
 {
-	const char *argv[2];
 	task_id_t id;
 	task_exit_t texit;
@@ -153,12 +149,8 @@
 	
 	printf("%s: Starting %s\n", NAME, fname);
-	
-	argv[0] = fname;
-	argv[1] = NULL;
-	
-	id = task_spawn(fname, argv, &retval);
+	rc = task_spawnl(&id, fname, fname, NULL);
 	if (!id) {
 		printf("%s: Error spawning %s (%s)\n", NAME, fname,
-		    str_error(retval));
+		    str_error(rc));
 		return;
 	}
@@ -167,11 +159,17 @@
 	if (rc != EOK) {
 		printf("%s: Error waiting for %s (%s(\n", NAME, fname,
-		    str_error(retval));
-		return;
-	}
-	
-	if ((texit != TASK_EXIT_NORMAL) || (retval != 0)) {
-		printf("%s: Server %s failed to start (%s)\n", NAME,
-			fname, str_error(retval));
+		    str_error(rc));
+		return;
+	}
+	
+	if (texit != TASK_EXIT_NORMAL) {
+		printf("%s: Server %s failed to start (unexpectedly "
+		    "terminated)\n", NAME, fname);
+		return;
+	}
+
+	if (retval != 0) {
+		printf("%s: Server %s failed to start (exit code %d)\n", NAME,
+			fname, retval);
 	}
 }
@@ -179,5 +177,4 @@
 static void console(const char *dev)
 {
-	const char *argv[3];
 	char hid_in[DEVMAP_NAME_MAXLEN];
 	int rc;
@@ -190,21 +187,19 @@
 	dev_handle_t handle;
 	rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING);
-	
-	if (rc == EOK) {
-		argv[0] = SRV_CONSOLE;
-		argv[1] = hid_in;
-		argv[2] = NULL;
-		
-		if (!task_spawn(SRV_CONSOLE, argv, &rc))
-			printf("%s: Error spawning %s %s (%s)\n", NAME, SRV_CONSOLE,
-			    hid_in, str_error(rc));
-	} else
+	if (rc != EOK) {
 		printf("%s: Error waiting on %s (%s)\n", NAME, hid_in,
 		    str_error(rc));
+		return;
+	}
+	
+	rc = task_spawnl(NULL, SRV_CONSOLE, SRV_CONSOLE, hid_in, NULL);
+	if (rc != EOK) {
+		printf("%s: Error spawning %s %s (%s)\n", NAME, SRV_CONSOLE,
+		    hid_in, str_error(rc));
+	}
 }
 
 static void getterm(const char *dev, const char *app)
 {
-	const char *argv[4];
 	char term[DEVMAP_NAME_MAXLEN];
 	int rc;
@@ -217,17 +212,15 @@
 	dev_handle_t handle;
 	rc = devmap_device_get_handle(dev, &handle, IPC_FLAG_BLOCKING);
-	
-	if (rc == EOK) {
-		argv[0] = APP_GETTERM;
-		argv[1] = term;
-		argv[2] = app;
-		argv[3] = NULL;
-		
-		if (!task_spawn(APP_GETTERM, argv, &rc))
-			printf("%s: Error spawning %s %s %s (%s)\n", NAME, APP_GETTERM,
-			    term, app, str_error(rc));
-	} else
+	if (rc != EOK) {
 		printf("%s: Error waiting on %s (%s)\n", NAME, term,
 		    str_error(rc));
+		return;
+	}
+	
+	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));
+	}
 }
 
Index: uspace/app/netstart/netstart.c
===================================================================
--- uspace/app/netstart/netstart.c	(revision 7ae3d6f9d860f518c19f0060df70099eddaf81a0)
+++ uspace/app/netstart/netstart.c	(revision 0b81cad0360a509d54d5a8a7f64c14e5fb6f91e6)
@@ -57,15 +57,11 @@
 static bool spawn(const char *desc, const char *path)
 {
+	int rc;
+
 	printf("%s: Spawning %s (%s)\n", NAME, desc, path);
-	
-	const char *argv[2];
-	
-	argv[0] = path;
-	argv[1] = NULL;
-	
-	int err;
-	if (task_spawn(path, argv, &err) == 0) {
+	rc = task_spawnl(NULL, path, path, NULL);
+	if (rc != EOK) {
 		fprintf(stderr, "%s: Error spawning %s (%s)\n", NAME, path,
-		    str_error(err));
+		    str_error(rc));
 		return false;
 	}
Index: uspace/app/redir/redir.c
===================================================================
--- uspace/app/redir/redir.c	(revision 7ae3d6f9d860f518c19f0060df70099eddaf81a0)
+++ uspace/app/redir/redir.c	(revision 0b81cad0360a509d54d5a8a7f64c14e5fb6f91e6)
@@ -43,4 +43,5 @@
 #include <task.h>
 #include <str_error.h>
+#include <errno.h>
 
 #define NAME  "redir"
@@ -76,5 +77,9 @@
 static task_id_t spawn(int argc, char *argv[])
 {
-	const char **args = (const char **) calloc(argc + 1, sizeof(char *));
+	const char **args;
+	task_id_t id;
+	int rc;
+
+	args = (const char **) calloc(argc + 1, sizeof(char *));
 	if (!args) {
 		printf("No memory available\n");
@@ -88,12 +93,12 @@
 	args[argc] = NULL;
 	
-	int err;
-	task_id_t id = task_spawn(argv[0], args, &err);
+	rc = task_spawnv(&id, argv[0], args);
 	
 	free(args);
 	
-	if (id == 0)
+	if (rc != EOK) {
 		printf("%s: Error spawning %s (%s)\n", NAME, argv[0],
-		    str_error(err));
+		    str_error(rc));
+	}
 	
 	return id;
Index: uspace/app/sbi/src/os/helenos.c
===================================================================
--- uspace/app/sbi/src/os/helenos.c	(revision 7ae3d6f9d860f518c19f0060df70099eddaf81a0)
+++ uspace/app/sbi/src/os/helenos.c	(revision 0b81cad0360a509d54d5a8a7f64c14e5fb6f91e6)
@@ -249,15 +249,16 @@
 	task_id_t tid;
 	task_exit_t texit;
-	int retval;
-
-	tid = task_spawn(cmd[0], (char const * const *) cmd, &retval);
-	if (tid == 0) {
+	int rc, retval;
+
+	rc = task_spawnv(&tid, cmd[0], (char const * const *) cmd);
+	if (rc != EOK) {
 		printf("Error: Failed spawning '%s' (%s).\n", cmd[0],
-		    str_error(retval));
+		    str_error(rc));
 		exit(1);
 	}
 
 	/* XXX Handle exit status and return value. */
-	task_wait(tid, &texit, &retval);
+	rc = task_wait(tid, &texit, &retval);
+	(void) rc;
 
 	return EOK;
