Index: uspace/lib/libc/generic/libc.c
===================================================================
--- uspace/lib/libc/generic/libc.c	(revision d68e4d573ccb8f5b2c980725f2f3c84831e0c8b5)
+++ uspace/lib/libc/generic/libc.c	(revision 7114d836ff84c10f98376e50246b4d5e34146131)
@@ -62,4 +62,6 @@
 void __main(void *pcb_ptr)
 {
+	int retval;
+
 	__heap_init();
 	__async_init();
@@ -83,6 +85,8 @@
 	}
 	
-	main(argc, argv);
+	retval = main(argc, argv);
+
 	__stdio_done();
+	(void) task_retval(retval);
 }
 
Index: uspace/lib/libc/generic/task.c
===================================================================
--- uspace/lib/libc/generic/task.c	(revision d68e4d573ccb8f5b2c980725f2f3c84831e0c8b5)
+++ uspace/lib/libc/generic/task.c	(revision 7114d836ff84c10f98376e50246b4d5e34146131)
@@ -149,7 +149,23 @@
 }
 
-int task_wait(task_id_t id)
+int task_wait(task_id_t id, int *retval)
 {
-	return (int) async_req_2_0(PHONE_NS, NS_TASK_WAIT, LOWER32(id), UPPER32(id));
+	ipcarg_t rv;
+	int rc;
+
+	rc = (int) async_req_2_1(PHONE_NS, NS_TASK_WAIT, LOWER32(id),
+	    UPPER32(id), &rv);
+	*retval = rv;
+
+	return rc;
+}
+
+int task_retval(int val)
+{
+	task_id_t id;
+
+	id = task_get_id();
+	return (int) async_req_3_0(PHONE_NS, NS_RETVAL, LOWER32(id),
+	    UPPER32(id), val);
 }
 
Index: uspace/lib/libc/include/ipc/ns.h
===================================================================
--- uspace/lib/libc/include/ipc/ns.h	(revision d68e4d573ccb8f5b2c980725f2f3c84831e0c8b5)
+++ uspace/lib/libc/include/ipc/ns.h	(revision 7114d836ff84c10f98376e50246b4d5e34146131)
@@ -40,5 +40,6 @@
 typedef enum {
 	NS_PING = IPC_FIRST_USER_METHOD,
-	NS_TASK_WAIT
+	NS_TASK_WAIT,
+	NS_RETVAL
 } ns_request_t;
 
Index: uspace/lib/libc/include/task.h
===================================================================
--- uspace/lib/libc/include/task.h	(revision d68e4d573ccb8f5b2c980725f2f3c84831e0c8b5)
+++ uspace/lib/libc/include/task.h	(revision 7114d836ff84c10f98376e50246b4d5e34146131)
@@ -43,5 +43,7 @@
 extern int task_set_name(const char *name);
 extern task_id_t task_spawn(const char *path, char *const argv[]);
-extern int task_wait(task_id_t id);
+extern int task_wait(task_id_t id, int *retval);
+extern int task_retval(int val);
+
 
 #endif
