Index: uspace/app/bdsh/cmds/modules/cat/cat.c
===================================================================
--- uspace/app/bdsh/cmds/modules/cat/cat.c	(revision 9fa14d8ddc43d5a2acc6637cb66265ecd07540e8)
+++ uspace/app/bdsh/cmds/modules/cat/cat.c	(revision 1abcf1db7c2a8071caaf9983f1571b2ef88e1be6)
@@ -353,5 +353,5 @@
 		case 'H':
 			if (!optarg || str_uint64_t(optarg, NULL, 10, false, &head) != EOK) {
-				puts("Invalid head size\n");
+				puts("Invalid head size");
 				return CMD_FAILURE;
 			}
@@ -359,5 +359,5 @@
 		case 't':
 			if (!optarg || str_uint64_t(optarg, NULL, 10, false, &tail) != EOK) {
-				puts("Invalid tail size\n");
+				puts("Invalid tail size");
 				return CMD_FAILURE;
 			}
@@ -367,5 +367,5 @@
 		case 'b':
 			if (!optarg || str_size_t(optarg, NULL, 10, false, &buffer) != EOK) {
-				puts("Invalid buffer size\n");
+				puts("Invalid buffer size");
 				return CMD_FAILURE;
 			}
Index: uspace/app/tetris/scores.c
===================================================================
--- uspace/app/tetris/scores.c	(revision 9fa14d8ddc43d5a2acc6637cb66265ecd07540e8)
+++ uspace/app/tetris/scores.c	(revision 1abcf1db7c2a8071caaf9983f1571b2ef88e1be6)
@@ -128,5 +128,5 @@
 	clear_screen();
 	moveto(10, 10);
-	puts("Insert your name: ");
+	fputs("Insert your name: ", stdout);
 	str_cpy(scores[NUMSPOTS - 1].hs_name, STR_BOUNDS(MAXLOGNAME) + 1,
 	    "Player");
Index: uspace/app/tetris/tetris.c
===================================================================
--- uspace/app/tetris/tetris.c	(revision 9fa14d8ddc43d5a2acc6637cb66265ecd07540e8)
+++ uspace/app/tetris/tetris.c	(revision 1abcf1db7c2a8071caaf9983f1571b2ef88e1be6)
@@ -179,5 +179,5 @@
 	clear_screen();
 	moveto(5, 10);
-	puts("Tetris\n\n");
+	puts("Tetris\n");
 
 	moveto(8, 10);
@@ -194,5 +194,5 @@
 	printf("In game controls:");
 	moveto(21, 0);
-	puts(key_msg);
+	printf("%s", key_msg);
 }
 
Index: uspace/app/tmon/main.c
===================================================================
--- uspace/app/tmon/main.c	(revision 9fa14d8ddc43d5a2acc6637cb66265ecd07540e8)
+++ uspace/app/tmon/main.c	(revision 1abcf1db7c2a8071caaf9983f1571b2ef88e1be6)
@@ -127,5 +127,5 @@
 static void print_usage(char *app_name)
 {
-	puts(NAME ": benchmark USB diagnostic device\n\n");
+	puts(NAME ": benchmark USB diagnostic device\n");
 	printf("Usage: %s command [device] [options]\n\n", app_name);
 
@@ -134,10 +134,10 @@
 	}
 
-	puts("\n");
+	puts("");
 	for (unsigned i = 0; i < ARRAY_SIZE(options); ++i) {
 		printf(INDENT "-%c --%s\n" INDENT INDENT "%s\n", options[i].short_name, options[i].long_name, options[i].description);
 	}
 
-	puts("\nIf no device is specified, the first device is used provided that it is the only one connected. Otherwise, the command fails.\n\n");
+	puts("\nIf no device is specified, the first device is used provided that it is the only one connected. Otherwise, the command fails.\n");
 }
 
Index: uspace/app/tmon/tests.c
===================================================================
--- uspace/app/tmon/tests.c	(revision 9fa14d8ddc43d5a2acc6637cb66265ecd07540e8)
+++ uspace/app/tmon/tests.c	(revision 1abcf1db7c2a8071caaf9983f1571b2ef88e1be6)
@@ -94,5 +94,5 @@
 		case 't':
 			if (!optarg || str_uint32_t(optarg, NULL, 10, false, &duration_uint) != EOK) {
-				puts(NAME ": Invalid duration.\n");
+				puts(NAME ": Invalid duration.");
 				rc = EINVAL;
 				goto err_malloc;
@@ -102,5 +102,5 @@
 		case 's':
 			if (!optarg || str_size_t(optarg, NULL, 10, false, &p->transfer_size) != EOK) {
-				puts(NAME ": Invalid data size.\n");
+				puts(NAME ": Invalid data size.");
 				rc = EINVAL;
 				goto err_malloc;
@@ -182,15 +182,15 @@
 	const usbdiag_test_params_t *params = (usbdiag_test_params_t *) generic_params;
 	print_params(params);
-	puts("\nTesting... ");
+	fputs("\nTesting... ", stdout);
 
 	usbdiag_test_results_t results;
 	errno_t rc = usbdiag_test_in(exch, params, &results);
 	if (rc != EOK) {
-		puts("failed\n");
+		puts("failed");
 		printf(NAME ": %s\n", str_error(rc));
 		return 1;
 	}
 
-	puts("succeeded\n\n");
+	puts("succeeded\n");
 	print_results(params, &results);
 	return 0;
@@ -207,15 +207,15 @@
 	const usbdiag_test_params_t *params = (usbdiag_test_params_t *) generic_params;
 	print_params(params);
-	puts("\nTesting... ");
+	fputs("\nTesting... ", stdout);
 
 	usbdiag_test_results_t results;
 	errno_t rc = usbdiag_test_out(exch, params, &results);
 	if (rc) {
-		puts("failed\n");
+		puts("failed");
 		printf(NAME ": %s\n", str_error(rc));
 		return 1;
 	}
 
-	puts("succeeded\n\n");
+	puts("succeeded\n");
 	print_results(params, &results);
 	return 0;
Index: uspace/app/top/screen.c
===================================================================
--- uspace/app/top/screen.c	(revision 9fa14d8ddc43d5a2acc6637cb66265ecd07540e8)
+++ uspace/app/top/screen.c	(revision 1abcf1db7c2a8071caaf9983f1571b2ef88e1be6)
@@ -120,8 +120,8 @@
 	sysarg_t i;
 	for (i = c + 1; i < cols; i++)
-		puts(" ");
+		fputs(" ", stdout);
 
 	if (r + 1 < rows)
-		puts("\n");
+		puts("");
 }
 
@@ -187,5 +187,5 @@
 	size_t i;
 	for (i = 0; i < data->load_count; i++) {
-		puts(" ");
+		fputs(" ", stdout);
 		stats_print_load_fragment(data->load[i], 2);
 	}
@@ -259,7 +259,7 @@
 			    data->cpus[i].id, data->cpus[i].frequency_mhz,
 			    busy, busy_suffix, idle, idle_suffix);
-			puts(", idle: ");
+			fputs(", idle: ", stdout);
 			print_percent(data->cpus_perc[i].idle, 2);
-			puts(", busy: ");
+			fputs(", busy: ", stdout);
 			print_percent(data->cpus_perc[i].busy, 2);
 		} else
@@ -361,5 +361,5 @@
 		int width = table->columns[i].width;
 		if (i != 0) {
-			puts(" ");
+			fputs(" ", stdout);
 		}
 		if (width == 0) {
@@ -395,5 +395,5 @@
 
 		if (column_index != 0) {
-			puts(" ");
+			fputs(" ", stdout);
 		}
 
Index: uspace/dist/src/c/demos/tetris/scores.c
===================================================================
--- uspace/dist/src/c/demos/tetris/scores.c	(revision 9fa14d8ddc43d5a2acc6637cb66265ecd07540e8)
+++ uspace/dist/src/c/demos/tetris/scores.c	(revision 1abcf1db7c2a8071caaf9983f1571b2ef88e1be6)
@@ -129,5 +129,5 @@
 	clear_screen();
 	moveto(10, 10);
-	puts("Insert your name: ");
+	fputs("Insert your name: ", stdout);
 	str_cpy(scores[NUMSPOTS - 1].hs_name, STR_BOUNDS(MAXLOGNAME) + 1,
 	    "Player");
Index: uspace/dist/src/c/demos/tetris/tetris.c
===================================================================
--- uspace/dist/src/c/demos/tetris/tetris.c	(revision 9fa14d8ddc43d5a2acc6637cb66265ecd07540e8)
+++ uspace/dist/src/c/demos/tetris/tetris.c	(revision 1abcf1db7c2a8071caaf9983f1571b2ef88e1be6)
@@ -180,5 +180,5 @@
 	clear_screen();
 	moveto(5, 10);
-	puts("Tetris\n\n");
+	puts("Tetris\n");
 
 	moveto(8, 10);
Index: uspace/dist/src/c/demos/top/screen.c
===================================================================
--- uspace/dist/src/c/demos/top/screen.c	(revision 9fa14d8ddc43d5a2acc6637cb66265ecd07540e8)
+++ uspace/dist/src/c/demos/top/screen.c	(revision 1abcf1db7c2a8071caaf9983f1571b2ef88e1be6)
@@ -120,8 +120,8 @@
 	sysarg_t i;
 	for (i = c + 1; i < cols; i++)
-		puts(" ");
+		fputs(" ", stdout);
 
 	if (r + 1 < rows)
-		puts("\n");
+		puts("");
 }
 
@@ -187,5 +187,5 @@
 	size_t i;
 	for (i = 0; i < data->load_count; i++) {
-		puts(" ");
+		fputs(" ", stdout);
 		stats_print_load_fragment(data->load[i], 2);
 	}
@@ -259,7 +259,7 @@
 			    data->cpus[i].id, data->cpus[i].frequency_mhz,
 			    busy, busy_suffix, idle, idle_suffix);
-			puts(", idle: ");
+			fputs(", idle: ", stdout);
 			print_percent(data->cpus_perc[i].idle, 2);
-			puts(", busy: ");
+			fputs(", busy: ", stdout);
 			print_percent(data->cpus_perc[i].busy, 2);
 		} else
@@ -361,5 +361,5 @@
 		int width = table->columns[i].width;
 		if (i != 0) {
-			puts(" ");
+			fputs(" ", stdout);
 		}
 		if (width == 0) {
@@ -395,5 +395,5 @@
 
 		if (column_index != 0) {
-			puts(" ");
+			fputs(" ", stdout);
 		}
 
Index: uspace/lib/c/generic/io/io.c
===================================================================
--- uspace/lib/c/generic/io/io.c	(revision 9fa14d8ddc43d5a2acc6637cb66265ecd07540e8)
+++ uspace/lib/c/generic/io/io.c	(revision 1abcf1db7c2a8071caaf9983f1571b2ef88e1be6)
@@ -733,5 +733,7 @@
 int puts(const char *str)
 {
-	return fputs(str, stdout);
+	if (fputs(str, stdout) < 0)
+		return EOF;
+	return putchar('\n');
 }
 
Index: uspace/lib/c/include/stdio.h
===================================================================
--- uspace/lib/c/include/stdio.h	(revision 9fa14d8ddc43d5a2acc6637cb66265ecd07540e8)
+++ uspace/lib/c/include/stdio.h	(revision 1abcf1db7c2a8071caaf9983f1571b2ef88e1be6)
@@ -76,4 +76,6 @@
 extern int fputs(const char *, FILE *);
 
+// FIXME: putchar and fputc are byte-oriented.
+// They shouldn't accept wide characters.
 extern int putchar(wchar_t);
 extern int puts(const char *);
