Index: benchmark/io/http/filecache.cfa
===================================================================
--- benchmark/io/http/filecache.cfa	(revision bdbc24dd17836e04d081cb6b954955b5913013d8)
+++ benchmark/io/http/filecache.cfa	(revision 0cc43e1fadb39979645cb0d70447d7e7db2ee4c5)
@@ -4,4 +4,5 @@
 #include <string.h>
 
+#include <fstream.hfa>
 #include <stdlib.hfa>
 
@@ -182,7 +183,7 @@
 		conflicts += put_file( raw[i], fd );
 	}
-	printf("Filled cache from path \"%s\" with %zu files\n", path, fcount);
+	sout | "Filled cache from path \"" | path | "\" with" | fcount | "files";
 	if( conflicts > 0 ) {
-		printf("Found %d conflicts (seed: %u)\n", conflicts, options.file_cache.hash_seed);
+		sout | "Found" | conflicts | "conflicts (seed: " | options.file_cache.hash_seed | ")";
 		#if defined(REJECT_CONFLICTS)
 			abort("Conflicts found in the cache");
@@ -191,9 +192,9 @@
 
 	if(options.file_cache.list) {
-		printf("Listing files and exiting\n");
+		sout | "Listing files and exiting";
 		for(i; fcount) {
 			int s; char u;
 			[s, u] = human_size(raw[i].size);
-			printf("%4d%c - %s\n", s, u, raw[i].file);
+			sout | s | u | "-" | raw[i].file;
 			free(raw[i].file);
 		}
Index: benchmark/io/http/main.cfa
===================================================================
--- benchmark/io/http/main.cfa	(revision bdbc24dd17836e04d081cb6b954955b5913013d8)
+++ benchmark/io/http/main.cfa	(revision 0cc43e1fadb39979645cb0d70447d7e7db2ee4c5)
@@ -10,4 +10,5 @@
 }
 
+#include <fstream.hfa>
 #include <kernel.hfa>
 #include <iofwd.hfa>
@@ -83,10 +84,10 @@
 	//===================
 	// Open Files
-	printf("Filling cache from %s\n", path);
+	sout | "Filling cache from" | path;
 	fill_cache( path );
 
 	//===================
 	// Open Socket
-	printf("%ld : Listening on port %d\n", getpid(), options.socket.port);
+	sout | getpid() | ": Listening on port" | options.socket.port;
 	int server_fd = socket(AF_INET, SOCK_STREAM, 0);
 	if(server_fd < 0) {
@@ -108,8 +109,8 @@
 			if(errno == EADDRINUSE) {
 				if(waited == 0) {
-					printf("Waiting for port\n");
+					sout | "Waiting for port";
 				} else {
-					printf("\r%d", waited);
-					fflush(stdout);
+					sout | "\r" | waited | nonl;
+					flush( sout );
 				}
 				waited ++;
@@ -173,5 +174,5 @@
 					unpark( workers[i] );
 				}
-				printf("%d workers started on %d processors\n", options.clopts.nworkers, options.clopts.nprocs);
+				sout | options.clopts.nworkers | "workers started on" | options.clopts.nprocs | "processors";
 				{
 					char buffer[128];
@@ -180,7 +181,8 @@
 					}
 
-					printf("Shutting Down\n");
-				}
-
+					sout | "Shutdown received";
+				}
+
+				sout | "Notifying connections";
 				for(i; options.clopts.nworkers) {
 					workers[i].done = true;
@@ -188,5 +190,5 @@
 				}
 
-				printf("Shutting down socket\n");
+				sout | "Shutting down socket";
 				int ret = shutdown( server_fd, SHUT_RD );
 				if( ret < 0 ) { abort( "shutdown error: (%d) %s\n", (int)errno, strerror(errno) ); }
@@ -194,15 +196,22 @@
 				//===================
 				// Close Socket
-				printf("Closing Socket\n");
+				sout | "Closing Socket";
 				ret = close( server_fd );
 				if(ret < 0) {
 					abort( "close socket error: (%d) %s\n", (int)errno, strerror(errno) );
 				}
+				sout | "Stopping connection threads..." | nonl;
 			}
-			printf("Workers Closed\n");
-
+			sout | "done";
+
+			sout | "Stopping protocol threads..." | nonl;
 			deinit_protocol();
-		}
-
+			sout | "done";
+
+			sout | "Stopping processors..." | nonl;
+		}
+		sout | "done";
+
+		sout | "Closing splice fds..." | nonl;
 		for(i; pipe_cnt) {
 			ret = close( fds[pipe_off + i] );
@@ -212,10 +221,14 @@
 		}
 		free(fds);
-
-	}
+		sout | "done";
+
+		sout | "Stopping processors..." | nonl;
+	}
+	sout | "done";
 
 	//===================
 	// Close Files
-	printf("Closing Files\n");
+	sout | "Closing open files..." | nonl;
 	close_cache();
-}
+	sout | "done";
+}
Index: benchmark/io/http/protocol.cfa
===================================================================
--- benchmark/io/http/protocol.cfa	(revision bdbc24dd17836e04d081cb6b954955b5913013d8)
+++ benchmark/io/http/protocol.cfa	(revision 0cc43e1fadb39979645cb0d70447d7e7db2ee4c5)
@@ -5,4 +5,6 @@
 	#include <fcntl.h>
 }
+
+#include <fstream.hfa>
 #include <iofwd.hfa>
 
@@ -11,5 +13,5 @@
 extern "C" {
       int snprintf ( char * s, size_t n, const char * format, ... );
-	#include <linux/io_uring.h>
+	// #include <linux/io_uring.h>
 }
 #include <string.h>
@@ -115,5 +117,8 @@
 	}
 
-	if( options.log ) printf("%.*s\n", rlen, buffer);
+	if( options.log ) {
+		write(sout, buffer, rlen);
+		sout | nl;
+	}
 
 	it = buffer;
Index: benchmark/io/http/worker.cfa
===================================================================
--- benchmark/io/http/worker.cfa	(revision bdbc24dd17836e04d081cb6b954955b5913013d8)
+++ benchmark/io/http/worker.cfa	(revision 0cc43e1fadb39979645cb0d70447d7e7db2ee4c5)
@@ -6,4 +6,5 @@
 #include <unistd.h>
 
+#include <fstream.hfa>
 #include <iofwd.hfa>
 
@@ -33,5 +34,5 @@
 	CONNECTION:
 	for() {
-		if( options.log ) printf("=== Accepting connection ===\n");
+		if( options.log ) sout | "=== Accepting connection ===";
 		int fd = cfa_accept4( this.[sockfd, addr, addrlen, flags], 0, -1`s, &this.cancel, 0p );
 		// int fd = accept4( this.[sockfd, addr, addrlen, flags] );
@@ -42,5 +43,5 @@
 		}
 
-		if( options.log ) printf("=== New connection %d, waiting for requests ===\n", fd);
+		if( options.log ) sout | "=== New connection" | fd | "" | ", waiting for requests ===";
 		REQUEST:
 		for() {
@@ -53,5 +54,5 @@
 			size_t len = options.socket.buflen;
 			char buffer[len];
-			if( options.log ) printf("=== Reading request ===\n");
+			if( options.log ) sout | "=== Reading request ===";
 			[code, closed, file, name_size] = http_read(fd, buffer, len, &this.cancel);
 
@@ -61,5 +62,5 @@
 			// If this wasn't a request retrun 400
 			if( code != OK200 ) {
-				printf("=== Invalid Request : %d ===\n", code_val(code));
+				sout | "=== Invalid Request :" | code_val(code) | "===";
 				answer_error(fd, code);
 				continue REQUEST;
@@ -67,5 +68,5 @@
 
 			if(0 == strncmp(file, "plaintext", min(name_size, sizeof("plaintext") ))) {
-				if( options.log ) printf("=== Request for /plaintext ===\n");
+				if( options.log ) sout | "=== Request for /plaintext ===";
 
 				char text[] = "Hello, World!\n";
@@ -75,10 +76,10 @@
 				if( ret == -ECONNRESET ) break REQUEST;
 
-				if( options.log ) printf("=== Answer sent ===\n");
+				if( options.log ) sout | "=== Answer sent ===";
 				continue REQUEST;
 			}
 
 			if(0 == strncmp(file, "ping", min(name_size, sizeof("ping") ))) {
-				if( options.log ) printf("=== Request for /ping ===\n");
+				if( options.log ) sout | "=== Request for /ping ===";
 
 				// Send the header
@@ -86,9 +87,13 @@
 				if( ret == -ECONNRESET ) break REQUEST;
 
-				if( options.log ) printf("=== Answer sent ===\n");
+				if( options.log ) sout | "=== Answer sent ===";
 				continue REQUEST;
 			}
 
-			if( options.log ) printf("=== Request for file %.*s ===\n", (int)name_size, file);
+			if( options.log ) {
+				sout | "=== Request for file " | nonl;
+				write(sout, file, name_size);
+				sout | " ===";
+			}
 
 			// Get the fd from the file cache
@@ -99,5 +104,7 @@
 			// If we can't find the file, return 404
 			if( ans_fd < 0 ) {
-				printf("=== File Not Found ===\n");
+				sout | "=== File Not Found (" | nonl;
+				write(sout, file, name_size);
+				sout | ") ===";
 				answer_error(fd, E404);
 				continue REQUEST;
@@ -112,8 +119,8 @@
 			if( ret == -ECONNRESET ) break REQUEST;
 
-			if( options.log ) printf("=== Answer sent ===\n");
+			if( options.log ) sout | "=== Answer sent ===";
 		}
 
-		if( options.log ) printf("=== Connection closed ===\n");
+		if( options.log ) sout | "=== Connection closed ===";
 		close(fd);
 		continue CONNECTION;
