Index: uspace/app/bdsh/cmds/modules/mkfile/mkfile.c
===================================================================
--- uspace/app/bdsh/cmds/modules/mkfile/mkfile.c	(revision 82d515e917f3eeeff253e4aa30e493f5f632c950)
+++ uspace/app/bdsh/cmds/modules/mkfile/mkfile.c	(revision 9af1c61b92a35908b9af07874373f345e922fede)
@@ -31,4 +31,5 @@
 #include <stdlib.h>
 #include <stdint.h>
+#include <str_error.h>
 #include <dirent.h>
 #include <macros.h>
@@ -191,5 +192,5 @@
 		rc = vfs_write(fd, &pos, buffer, to_write, &nwritten);
 		if (rc != EOK) {
-			printf("%s: Error writing file (%d).\n", cmdname, errno);
+			printf("%s: Error writing file (%s).\n", cmdname, str_error(errno));
 			vfs_put(fd);
 			free(buffer);
@@ -206,5 +207,5 @@
 	return CMD_SUCCESS;
 error:
-	printf("%s: Error writing file (%d).\n", cmdname, errno);
+	printf("%s: Error writing file (%s).\n", cmdname, str_error(errno));
 	return CMD_FAILURE;
 }
Index: uspace/app/df/df.c
===================================================================
--- uspace/app/df/df.c	(revision 82d515e917f3eeeff253e4aa30e493f5f632c950)
+++ uspace/app/df/df.c	(revision 9af1c61b92a35908b9af07874373f345e922fede)
@@ -40,4 +40,5 @@
 #include <stdlib.h>
 #include <stdint.h>
+#include <str_error.h>
 #include <getopt.h>
 #include <errno.h>
@@ -118,6 +119,6 @@
 				return 1;
 		} else {
-			fprintf(stderr, "Cannot get information for '%s' (%d).\n",
-			    mtab_ent->mp, errno);
+			fprintf(stderr, "Cannot get information for '%s' (%s).\n",
+			    mtab_ent->mp, str_error(errno));
 		}
 	}
Index: uspace/app/taskdump/taskdump.c
===================================================================
--- uspace/app/taskdump/taskdump.c	(revision 82d515e917f3eeeff253e4aa30e493f5f632c950)
+++ uspace/app/taskdump/taskdump.c	(revision 9af1c61b92a35908b9af07874373f345e922fede)
@@ -40,4 +40,5 @@
 #include <stddef.h>
 #include <stdbool.h>
+#include <str_error.h>
 #include <errno.h>
 #include <udebug.h>
@@ -135,5 +136,5 @@
 		
 		printf("Error connecting\n");
-		printf("async_connect_kbox(%" PRIu64 ") -> %d ", task_id, errno);
+		printf("async_connect_kbox(%" PRIu64 ") -> %s", task_id, str_error_name(errno));
 		return errno;
 	}
Index: uspace/app/tester/stdio/stdio1.c
===================================================================
--- uspace/app/tester/stdio/stdio1.c	(revision 82d515e917f3eeeff253e4aa30e493f5f632c950)
+++ uspace/app/tester/stdio/stdio1.c	(revision 9af1c61b92a35908b9af07874373f345e922fede)
@@ -30,4 +30,5 @@
 #include <stdlib.h>
 #include <stddef.h>
+#include <str_error.h>
 #include <errno.h>
 #include "../tester.h"
@@ -46,5 +47,5 @@
 	file = fopen(file_name, "rt");
 	if (file == NULL) {
-		TPRINTF("errno = %d\n", errno);
+		TPRINTF("errno = %s\n", str_error_name(errno));
 		return "Failed opening file";
 	} else
@@ -54,5 +55,5 @@
 	size_t cnt = fread(buf, 1, BUF_SIZE, file);
 	if (ferror(file)) {
-		TPRINTF("errno = %d\n", errno);
+		TPRINTF("errno = %s\n", str_error_name(errno));
 		fclose(file);
 		return "Failed reading file";
@@ -65,5 +66,5 @@
 	TPRINTF("Seek to beginning...");
 	if (fseek(file, 0, SEEK_SET) != 0) {
-		TPRINTF("errno = %d\n", errno);
+		TPRINTF("errno = %s\n", str_error_name(errno));
 		fclose(file);
 		return "Failed seeking in file";
@@ -83,5 +84,5 @@
 	TPRINTF("Close...");
 	if (fclose(file) != 0) {
-		TPRINTF("errno = %d\n", errno);
+		TPRINTF("errno = %s\n", str_error_name(errno));
 		return "Failed closing file";
 	} else
Index: uspace/app/tester/stdio/stdio2.c
===================================================================
--- uspace/app/tester/stdio/stdio2.c	(revision 82d515e917f3eeeff253e4aa30e493f5f632c950)
+++ uspace/app/tester/stdio/stdio2.c	(revision 9af1c61b92a35908b9af07874373f345e922fede)
@@ -30,4 +30,5 @@
 #include <stdlib.h>
 #include <stddef.h>
+#include <str_error.h>
 #include <errno.h>
 #include "../tester.h"
@@ -42,5 +43,5 @@
 	file = fopen(file_name, "wt");
 	if (file == NULL) {
-		TPRINTF("errno = %d\n", errno);
+		TPRINTF("errno = %s\n", str_error_name(errno));
 		return "Failed opening file";
 	} else
@@ -53,5 +54,5 @@
 	TPRINTF("Close...");
 	if (fclose(file) != 0) {
-		TPRINTF("errno = %d\n", errno);
+		TPRINTF("errno = %s\n", str_error_name(errno));
 		return "Failed closing file";
 	} else
@@ -61,5 +62,5 @@
 	file = fopen(file_name, "rt");
 	if (file == NULL) {
-		TPRINTF("errno = %d\n", errno);
+		TPRINTF("errno = %s\n", str_error_name(errno));
 		return "Failed opening file";
 	} else
@@ -76,5 +77,5 @@
 	TPRINTF("\nClose...");
 	if (fclose(file) != 0) {
-		TPRINTF("errno = %d\n", errno);
+		TPRINTF("errno = %s\n", str_error_name(errno));
 		return "Failed closing file";
 	} else
Index: uspace/app/trace/trace.c
===================================================================
--- uspace/app/trace/trace.c	(revision 82d515e917f3eeeff253e4aa30e493f5f632c950)
+++ uspace/app/trace/trace.c	(revision 9af1c61b92a35908b9af07874373f345e922fede)
@@ -38,4 +38,5 @@
 #include <stdint.h>
 #include <stddef.h>
+#include <str_error.h>
 #include <inttypes.h>
 #include <fibril.h>
@@ -157,5 +158,5 @@
 		
 		printf("Error connecting\n");
-		printf("ipc_connect_task(%" PRIu64 ") -> %d ", task_id, errno);
+		printf("ipc_connect_task(%" PRIu64 ") -> %s ", task_id, str_error_name(errno));
 		return errno;
 	}
Index: uspace/lib/c/generic/errno.c
===================================================================
--- uspace/lib/c/generic/errno.c	(revision 82d515e917f3eeeff253e4aa30e493f5f632c950)
+++ uspace/lib/c/generic/errno.c	(revision 9af1c61b92a35908b9af07874373f345e922fede)
@@ -36,7 +36,7 @@
 #include <fibril.h>
 
-static fibril_local int fibril_errno;
+static fibril_local errno_t fibril_errno;
 
-int *__errno(void)
+errno_t *__errno(void)
 {
 	return &fibril_errno;
Index: uspace/lib/c/generic/str_error.c
===================================================================
--- uspace/lib/c/generic/str_error.c	(revision 82d515e917f3eeeff253e4aa30e493f5f632c950)
+++ uspace/lib/c/generic/str_error.c	(revision 9af1c61b92a35908b9af07874373f345e922fede)
@@ -41,9 +41,32 @@
 #define NOERR_LEN  64
 
+// TODO: this file should be generated from errno declarations
+
+static const char* err_name[] = {
+	"EOK",
+	"ENOENT",
+	"ENOMEM",
+	"ELIMIT",
+	"EREFUSED",
+	"EFORWARD",
+	"EPERM",
+	"EHANGUP",
+	"EPARTY",
+	"EEXIST",
+	"EBADMEM",
+	"ENOTSUP",
+	"EADDRNOTAVAIL",
+	"ETIMEOUT",
+	"EINVAL",
+	"EBUSY",
+	"EOVERFLOW",
+	"EINTR"
+};
+
 static const char* err_desc[] = {
 	"No error",
 	"No such entry",
 	"Not enough memory",
-	"Limit exceeded", 
+	"Limit exceeded",
 	"Connection refused",
 	"Forwarding error",
@@ -64,5 +87,31 @@
 static fibril_local char noerr[NOERR_LEN];
 
-const char *str_error(const int e)
+const char *str_error_name(errno_t e)
+{
+	if ((e <= 0) && (e >= MIN_ERRNO))
+		return err_name[-e];
+
+	/* Ad hoc descriptions of error codes interesting for USB. */
+	// FIXME: integrate these as first-class error values
+	switch (e) {
+		case ENOFS:
+			return "ENOFS";
+		case EBADCHECKSUM:
+			return "EBADCHECKSUM";
+		case ESTALL:
+			return "ESTALL";
+		case EAGAIN:
+			return "EAGAIN";
+		case EEMPTY:
+			return "EEMPTY";
+		default:
+			break;
+	}
+
+	snprintf(noerr, NOERR_LEN, "(%d)", (int)e);
+	return noerr;
+}
+
+const char *str_error(errno_t e)
 {
 	if ((e <= 0) && (e >= MIN_ERRNO))
@@ -86,5 +135,5 @@
 	}
 
-	snprintf(noerr, NOERR_LEN, "Unkown error code %d", e);
+	snprintf(noerr, NOERR_LEN, "Unknown error code (%d)", (int)e);
 	return noerr;
 }
Index: uspace/lib/c/include/str_error.h
===================================================================
--- uspace/lib/c/include/str_error.h	(revision 82d515e917f3eeeff253e4aa30e493f5f632c950)
+++ uspace/lib/c/include/str_error.h	(revision 9af1c61b92a35908b9af07874373f345e922fede)
@@ -36,5 +36,8 @@
 #define LIBC_STRERROR_H_
 
-const char *str_error(const int);
+#include <errno.h>
+
+const char *str_error(errno_t);
+const char *str_error_name(errno_t);
 
 #endif
Index: uspace/srv/devman/match.c
===================================================================
--- uspace/srv/devman/match.c	(revision 82d515e917f3eeeff253e4aa30e493f5f632c950)
+++ uspace/srv/devman/match.c	(revision 9af1c61b92a35908b9af07874373f345e922fede)
@@ -232,6 +232,6 @@
 	int rc = vfs_read(fd, (aoff64_t []) {0}, buf, len, &read_bytes);
 	if (rc != EOK) {
-		log_msg(LOG_DEFAULT, LVL_ERROR, "Unable to read file '%s' (%d).", conf_path,
-		    errno);
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Unable to read file '%s': %s.", conf_path,
+		    str_error(errno));
 		goto cleanup;
 	}
