Index: benchmark/io/http/main.cfa
===================================================================
--- benchmark/io/http/main.cfa	(revision dddb3dd01058a6f0eb621887f1bc9675d616a840)
+++ benchmark/io/http/main.cfa	(revision 2cd784ad04295254eec8cf73fb1020ac5739a985)
@@ -38,4 +38,6 @@
 }
 
+void ^?{}( StatsPrinter & mutex this ) {}
+
 void main(StatsPrinter & this) {
 	LOOP: for() {
@@ -54,35 +56,8 @@
 // Globals
 //=============================================================================================
-// struct ServerProc {
-// 	processor self;
-// };
-
-// void ?{}( ServerProc & this ) {
-// 	/* paranoid */ assert( options.clopts.instance != 0p );
-// 	(this.self){ "Benchmark Processor", *options.clopts.instance };
-
-// 	#if !defined(__CFA_NO_STATISTICS__)
-// 		if( options.clopts.procstats ) {
-// 			print_stats_at_exit( this.self, options.clopts.instance->print_stats );
-// 		}
-// 		if( options.clopts.viewhalts ) {
-// 			print_halts( this.self );
-// 		}
-// 	#endif
-// }
-
-// struct ServerIoContext {
-// 	io_context self;
-// };
-
-// void ?{}( ServerIoContext & this ) {
-// 	/* paranoid */ assert( options.clopts.instance != 0p );
-// 	(this.self){ *options.clopts.instance };
-// }
-
 struct ServerCluster {
 	cluster self;
 	processor    * procs;
-	io_context   * ctxs;
+	// io_context   * ctxs;
 	StatsPrinter * prnt;
 
@@ -106,12 +81,9 @@
 	}
 
-	this.ctxs = alloc(options.clopts.nprocs);
-	for(i; options.clopts.nprocs) {
-		(this.ctxs[i]){ this.self };
-	}
-
-	this.prnt = alloc(options.clopts.nprocs);
-	for(i; options.clopts.nprocs) {
-		(this.prnt[i]){ this.self };
+	if(options.stats) {
+		this.prnt = alloc();
+		(*this.prnt){ this.self };
+	} else {
+		this.prnt = 0p;
 	}
 
@@ -125,13 +97,5 @@
 
 void ^?{}( ServerCluster & this ) {
-	for(i; options.clopts.nprocs) {
-		^(this.prnt[i]){};
-	}
-	free(this.prnt);
-
-	for(i; options.clopts.nprocs) {
-		^(this.ctxs[i]){};
-	}
-	free(this.ctxs);
+	delete(this.prnt);
 
 	for(i; options.clopts.nprocs) {
@@ -250,6 +214,11 @@
 				{
 					char buffer[128];
-					while(int ret = cfa_read(0, buffer, 128, 0); ret != 0) {
+					for() {
+						int ret = cfa_read(0, buffer, 128, 0);
+						if(ret == 0) break;
 						if(ret < 0) abort( "main read error: (%d) %s\n", (int)errno, strerror(errno) );
+						sout | "User wrote '" | "" | nonl;
+						write(sout, buffer, ret - 1);
+						sout | "'";
 					}
 
Index: benchmark/io/http/options.cfa
===================================================================
--- benchmark/io/http/options.cfa	(revision dddb3dd01058a6f0eb621887f1bc9675d616a840)
+++ benchmark/io/http/options.cfa	(revision 2cd784ad04295254eec8cf73fb1020ac5739a985)
@@ -20,4 +20,5 @@
 Options options @= {
 	false, // log
+	false, // stats
 
 	{ // file_cache
@@ -61,4 +62,5 @@
 		{'\0', "isolate",        "Create one cluster per processor", isolate, parse_settrue},
 		{'\0', "log",            "Enable logs", options.log, parse_settrue},
+		{'\0', "stats",          "Enable statistics", options.stats, parse_settrue},
 		{'\0', "accept-backlog", "Maximum number of pending accepts", options.socket.backlog},
 		{'\0', "request_len",    "Maximum number of bytes in the http request, requests with more data will be answered with Http Code 414", options.socket.buflen},
Index: benchmark/io/http/options.hfa
===================================================================
--- benchmark/io/http/options.hfa	(revision dddb3dd01058a6f0eb621887f1bc9675d616a840)
+++ benchmark/io/http/options.hfa	(revision 2cd784ad04295254eec8cf73fb1020ac5739a985)
@@ -9,4 +9,5 @@
 struct Options {
 	bool log;
+	bool stats;
 
 	struct {
Index: benchmark/io/http/protocol.cfa
===================================================================
--- benchmark/io/http/protocol.cfa	(revision dddb3dd01058a6f0eb621887f1bc9675d616a840)
+++ benchmark/io/http/protocol.cfa	(revision 2cd784ad04295254eec8cf73fb1020ac5739a985)
@@ -52,5 +52,5 @@
 	while(len > 0) {
 		// Call write
-		int ret = cfa_send(fd, it, len, 0, 0);
+		int ret = cfa_send(fd, it, len, 0, CFA_IO_LAZY);
 		if( ret < 0 ) {
 			if( errno == ECONNRESET || errno == EPIPE ) return -ECONNRESET;
@@ -121,5 +121,5 @@
 	READ:
 	for() {
-		int ret = cfa_recv(fd, (void*)it, count, 0, 0);
+		int ret = cfa_recv(fd, (void*)it, count, 0, CFA_IO_LAZY);
 		// int ret = read(fd, (void*)it, count);
 		if(ret == 0 ) return [OK200, true, 0, 0];
@@ -160,6 +160,5 @@
 	ssize_t ret;
 	SPLICE1: while(count > 0) {
-		ret = cfa_splice(ans_fd, &offset, pipe[1], 0p, count, sflags, 0);
-		// ret = splice(ans_fd, &offset, pipe[1], 0p, count, sflags);
+		ret = cfa_splice(ans_fd, &offset, pipe[1], 0p, count, sflags, CFA_IO_LAZY);
 		if( ret < 0 ) {
 			if( errno != EAGAIN && errno != EWOULDBLOCK) continue SPLICE1;
@@ -173,6 +172,5 @@
 		size_t in_pipe = ret;
 		SPLICE2: while(in_pipe > 0) {
-			ret = cfa_splice(pipe[0], 0p, fd, 0p, in_pipe, sflags, 0);
-			// ret = splice(pipe[0], 0p, fd, 0p, in_pipe, sflags);
+			ret = cfa_splice(pipe[0], 0p, fd, 0p, in_pipe, sflags, CFA_IO_LAZY);
 			if( ret < 0 ) {
 				if( errno != EAGAIN && errno != EWOULDBLOCK) continue SPLICE2;
@@ -232,4 +230,5 @@
 		Time now = getTimeNsec();
 		strftime( buff, 100, "%a, %d %b %Y %H:%M:%S %Z", now );
+		sout | "Updated date to '" | buff | "'";
 
 		for(i; KNOWN_CODES) {
@@ -244,4 +243,6 @@
 		this.idx = (this.idx + 1) % 2;
 
+		sout | "Date thread sleeping";
+
 		sleep(1`s);
 	}
Index: benchmark/io/http/worker.cfa
===================================================================
--- benchmark/io/http/worker.cfa	(revision dddb3dd01058a6f0eb621887f1bc9675d616a840)
+++ benchmark/io/http/worker.cfa	(revision 2cd784ad04295254eec8cf73fb1020ac5739a985)
@@ -37,5 +37,5 @@
 	for() {
 		if( options.log ) sout | "=== Accepting connection ===";
-		int fd = cfa_accept4( this.[sockfd, addr, addrlen, flags], 0 );
+		int fd = cfa_accept4( this.[sockfd, addr, addrlen, flags], CFA_IO_LAZY );
 		if(fd < 0) {
 			if( errno == ECONNABORTED ) break;
