Index: uspace/lib/c/arch/ia64/src/ddi.c
===================================================================
--- uspace/lib/c/arch/ia64/src/ddi.c	(revision e1da7ec0aef03e61c7634e6b41960aa3385d4e82)
+++ uspace/lib/c/arch/ia64/src/ddi.c	(revision b658c5dcfbdf75d4121c595dd0f965265d2b16cd)
@@ -2,12 +2,13 @@
 #include <sysinfo.h>
 
-uint64_t ia64_iospace_address=0;
-
+uint64_t ia64_iospace_address = 0;
 
 uint64_t get_ia64_iospace_address(void)
 {
-
-	return sysinfo_value("ia64_iospace.address.virtual");
-
+	sysarg_t addr;
+	if (sysinfo_get_value("ia64_iospace.address.virtual", &addr) != 0)
+		addr = 0;
+	
+	return addr;
 }
 
Index: uspace/lib/c/generic/sysinfo.c
===================================================================
--- uspace/lib/c/generic/sysinfo.c	(revision e1da7ec0aef03e61c7634e6b41960aa3385d4e82)
+++ uspace/lib/c/generic/sysinfo.c	(revision b658c5dcfbdf75d4121c595dd0f965265d2b16cd)
@@ -31,14 +31,52 @@
  */
 /** @file
- */ 
+ */
 
 #include <libc.h>
 #include <sysinfo.h>
 #include <str.h>
+#include <errno.h>
+#include <malloc.h>
+#include <bool.h>
 
-sysarg_t sysinfo_value(const char *name)
+sysinfo_item_tag_t sysinfo_get_tag(const char *path)
 {
-	return __SYSCALL2(SYS_SYSINFO_VALUE, (sysarg_t) name,
-	    (sysarg_t) str_size(name));
+	return (sysinfo_item_tag_t) __SYSCALL2(SYS_SYSINFO_GET_TAG,
+	    (sysarg_t) path, (sysarg_t) str_size(path));
+}
+
+int sysinfo_get_value(const char *path, sysarg_t *value)
+{
+	return (int) __SYSCALL3(SYS_SYSINFO_GET_VALUE, (sysarg_t) path,
+	    (sysarg_t) str_size(path), (sysarg_t) value);
+}
+
+static int sysinfo_get_data_size(const char *path, size_t *size)
+{
+	return (int) __SYSCALL3(SYS_SYSINFO_GET_DATA_SIZE, (sysarg_t) path,
+	    (sysarg_t) str_size(path), (sysarg_t) size);
+}
+
+extern void *sysinfo_get_data(const char *path, size_t *size)
+{
+	while (true) {
+		int ret = sysinfo_get_data_size(path, size);
+		if (ret != EOK)
+			return NULL;
+		
+		void *data = malloc(*size);
+		if (data == NULL)
+			return NULL;
+		
+		ret = __SYSCALL4(SYS_SYSINFO_GET_DATA, (sysarg_t) path,
+		    (sysarg_t) str_size(path), (sysarg_t) data, (sysarg_t) *size);
+		if (ret == EOK)
+			return data;
+		
+		if (ret != ENOMEM)
+			return NULL;
+		
+		free(data);
+	}
 }
 
Index: uspace/lib/c/generic/task.c
===================================================================
--- uspace/lib/c/generic/task.c	(revision e1da7ec0aef03e61c7634e6b41960aa3385d4e82)
+++ uspace/lib/c/generic/task.c	(revision b658c5dcfbdf75d4121c595dd0f965265d2b16cd)
@@ -70,16 +70,21 @@
  * loader API.
  *
- * @param path pathname of the binary to execute
- * @param argv command-line arguments
+ * @param path Pathname of the binary to execute.
+ * @param argv Command-line arguments.
+ * @param err  If not NULL, the error value is stored here.
  *
  * @return ID of the newly created task or zero on error.
  *
  */
-task_id_t task_spawn(const char *path, const char *const args[])
+task_id_t task_spawn(const char *path, const char *const args[], int *err)
 {
 	/* Connect to a program loader. */
 	loader_t *ldr = loader_connect();
-	if (ldr == NULL)
+	if (ldr == NULL) {
+		if (err != NULL)
+			*err = EREFUSED;
+		
 		return 0;
+	}
 	
 	/* Get task ID. */
@@ -143,4 +148,8 @@
 	/* Success */
 	free(ldr);
+	
+	if (err != NULL)
+		*err = EOK;
+	
 	return task_id;
 	
@@ -149,4 +158,7 @@
 	loader_abort(ldr);
 	free(ldr);
+	
+	if (err != NULL)
+		*err = rc;
 	
 	return 0;
Index: uspace/lib/c/include/sysinfo.h
===================================================================
--- uspace/lib/c/include/sysinfo.h	(revision e1da7ec0aef03e61c7634e6b41960aa3385d4e82)
+++ uspace/lib/c/include/sysinfo.h	(revision b658c5dcfbdf75d4121c595dd0f965265d2b16cd)
@@ -31,5 +31,5 @@
  */
 /** @file
- */ 
+ */
 
 #ifndef LIBC_SYSINFO_H_
@@ -37,8 +37,14 @@
 
 #include <libc.h>
-#include <sysinfo.h>
-#include <str.h>
 
-sysarg_t sysinfo_value(const char *name);
+typedef enum {
+	SYSINFO_VAL_UNDEFINED = 0,
+	SYSINFO_VAL_VAL = 1,
+	SYSINFO_VAL_DATA = 2
+} sysinfo_item_tag_t;
+
+extern sysinfo_item_tag_t sysinfo_get_tag(const char *);
+extern int sysinfo_get_value(const char *, sysarg_t *);
+extern void *sysinfo_get_data(const char *, size_t *);
 
 #endif
Index: uspace/lib/c/include/task.h
===================================================================
--- uspace/lib/c/include/task.h	(revision e1da7ec0aef03e61c7634e6b41960aa3385d4e82)
+++ uspace/lib/c/include/task.h	(revision b658c5dcfbdf75d4121c595dd0f965265d2b16cd)
@@ -46,9 +46,8 @@
 
 extern task_id_t task_get_id(void);
-extern int task_set_name(const char *name);
-extern task_id_t task_spawn(const char *path, const char *const argv[]);
-extern int task_wait(task_id_t id, task_exit_t *texit, int *retval);
-extern int task_retval(int val);
-
+extern int task_set_name(const char *);
+extern task_id_t task_spawn(const char *, const char *const[], int *);
+extern int task_wait(task_id_t id, task_exit_t *, int *);
+extern int task_retval(int);
 
 #endif
Index: uspace/lib/net/adt/module_map.c
===================================================================
--- uspace/lib/net/adt/module_map.c	(revision e1da7ec0aef03e61c7634e6b41960aa3385d4e82)
+++ uspace/lib/net/adt/module_map.c	(revision b658c5dcfbdf75d4121c595dd0f965265d2b16cd)
@@ -94,12 +94,13 @@
 }
 
-task_id_t spawn(const char * fname){
-	const char * argv[2];
+task_id_t spawn(const char *fname)
+{
+	const char *argv[2];
 	task_id_t res;
-
+	
 	argv[0] = fname;
 	argv[1] = NULL;
-	res = task_spawn(fname, argv);
-
+	res = task_spawn(fname, argv, NULL);
+	
 	return res;
 }
