Index: benchmark/io/http/http_ring.cpp
===================================================================
--- benchmark/io/http/http_ring.cpp	(revision c600df18f9fbbecdee5b62a88fa82ac6773b2d67)
+++ benchmark/io/http/http_ring.cpp	(revision 1ed9cb63214b71becd33cbbd4507f40ffe95adc6)
@@ -118,11 +118,11 @@
 // Get a fix reply based on the return code
 const char * http_msgs[] = {
-	"HTTP/1.1 200 OK\r\nServer: HttoForall\r\nContent-Type: text/plain\r\nContent-Length: 15\r\nConnection: keep-alive\r\n\r\nHello, World!\r\n",
-	"HTTP/1.1 400 Bad Request\r\nServer: HttoForall\r\nContent-Type: text/plain\r\nContent-Length: 0 \r\n\r\n",
-	"HTTP/1.1 404 Not Found\r\nServer: HttoForall\r\nContent-Type: text/plain\r\nContent-Length: 0 \r\n\r\n",
-	"HTTP/1.1 405 Method Not \r\nServer: HttoForall\r\nContent-Type: text/plain\r\nContent-Length: 0 \r\n\r\n",
-	"HTTP/1.1 408 Request Timeout\r\nServer: HttoForall\r\nContent-Type: text/plain\r\nContent-Length: 0 \r\n\r\n",
-	"HTTP/1.1 413 Payload Too Large\r\nServer: HttoForall\r\nContent-Type: text/plain\r\nContent-Length: 0 \r\n\r\n",
-	"HTTP/1.1 414 URI Too Long\r\nServer: HttoForall\r\nContent-Type: text/plain\r\nContent-Length: 0 \r\n\r\n",
+	"HTTP/1.1 200 OK\r\nServer: HttpForall\r\nContent-Type: text/plain\r\nContent-Length: 15\r\nConnection: keep-alive\r\n\r\nHello, World!\r\n",
+	"HTTP/1.1 400 Bad Request\r\nServer: HttpForall\r\nContent-Type: text/plain\r\nContent-Length: 0 \r\n\r\n",
+	"HTTP/1.1 404 Not Found\r\nServer: HttpForall\r\nContent-Type: text/plain\r\nContent-Length: 0 \r\n\r\n",
+	"HTTP/1.1 405 Method Not \r\nServer: HttpForall\r\nContent-Type: text/plain\r\nContent-Length: 0 \r\n\r\n",
+	"HTTP/1.1 408 Request Timeout\r\nServer: HttpForall\r\nContent-Type: text/plain\r\nContent-Length: 0 \r\n\r\n",
+	"HTTP/1.1 413 Payload Too Large\r\nServer: HttpForall\r\nContent-Type: text/plain\r\nContent-Length: 0 \r\n\r\n",
+	"HTTP/1.1 414 URI Too Long\r\nServer: HttpForall\r\nContent-Type: text/plain\r\nContent-Length: 0 \r\n\r\n",
 };
 static_assert( KNOWN_CODES == (sizeof(http_msgs) / sizeof(http_msgs[0])) );
Index: benchmark/io/http/options.cfa
===================================================================
--- benchmark/io/http/options.cfa	(revision c600df18f9fbbecdee5b62a88fa82ac6773b2d67)
+++ benchmark/io/http/options.cfa	(revision 1ed9cb63214b71becd33cbbd4507f40ffe95adc6)
@@ -52,5 +52,5 @@
 	// bool sqkpoll = false;
 	// bool iokpoll = false;
-	unsigned nentries = 16;
+	unsigned nentries = 0;
 	bool isolate = false;
 
@@ -79,5 +79,5 @@
 	parse_args( argc, argv, opt, opt_cnt, "[OPTIONS]... [PATH]\ncforall http server", left );
 
-	if( !is_pow2(nentries) ) {
+	if( nentries != 0 && !is_pow2(nentries) ) {
 		unsigned v = nentries;
 		v--;
Index: benchmark/io/http/protocol.cfa
===================================================================
--- benchmark/io/http/protocol.cfa	(revision c600df18f9fbbecdee5b62a88fa82ac6773b2d67)
+++ benchmark/io/http/protocol.cfa	(revision 1ed9cb63214b71becd33cbbd4507f40ffe95adc6)
@@ -214,12 +214,12 @@
 
 const char * original_http_msgs[] = {
-	"HTTP/1.1 200 OK\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: ",
-	"HTTP/1.1 200 OK\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 15\n\nHello, World!\n\n",
-	"HTTP/1.1 400 Bad Request\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n",
-	"HTTP/1.1 404 Not Found\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n",
-	"HTTP/1.1 405 Method Not Allowed\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n",
-	"HTTP/1.1 408 Request Timeout\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n",
-	"HTTP/1.1 413 Payload Too Large\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n",
-	"HTTP/1.1 414 URI Too Long\nServer: HttoForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n",
+	"HTTP/1.1 200 OK\nServer: HttpForall\nDate: %s \nContent-Type: text/plain\nContent-Length: ",
+	"HTTP/1.1 200 OK\nServer: HttpForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 15\n\nHello, World!\n\n",
+	"HTTP/1.1 400 Bad Request\nServer: HttpForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n",
+	"HTTP/1.1 404 Not Found\nServer: HttpForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n",
+	"HTTP/1.1 405 Method Not Allowed\nServer: HttpForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n",
+	"HTTP/1.1 408 Request Timeout\nServer: HttpForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n",
+	"HTTP/1.1 413 Payload Too Large\nServer: HttpForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n",
+	"HTTP/1.1 414 URI Too Long\nServer: HttpForall\nDate: %s \nContent-Type: text/plain\nContent-Length: 0 \n\n",
 };
 
@@ -251,5 +251,5 @@
 		Time now = timeHiRes();
 		strftime( buff, 100, "%a, %d %b %Y %H:%M:%S %Z", now );
-		sout | "Updated date to '" | buff | "'";
+		if( options.log ) sout | "Updated date to '" | buff | "'";
 
 		for(i; KNOWN_CODES) {
@@ -264,5 +264,5 @@
 		this.idx = (this.idx + 1) % 2;
 
-		sout | "Date thread sleeping";
+		if( options.log ) sout | "Date thread sleeping";
 
 		sleep(1`s);
Index: libcfa/src/concurrency/io.cfa
===================================================================
--- libcfa/src/concurrency/io.cfa	(revision c600df18f9fbbecdee5b62a88fa82ac6773b2d67)
+++ libcfa/src/concurrency/io.cfa	(revision 1ed9cb63214b71becd33cbbd4507f40ffe95adc6)
@@ -183,7 +183,5 @@
 		ctx.proc->io.pending = false;
 
-		ready_schedule_lock();
 		__cfa_io_drain( proc );
-		ready_schedule_unlock();
 		// for(i; 2) {
 		// 	unsigned idx = proc->rdq.id + i;
@@ -316,5 +314,7 @@
 		ctx->proc->io.dirty   = true;
 		if(sq.to_submit > 30 || !lazy) {
+			ready_schedule_lock();
 			__cfa_io_flush( ctx->proc );
+			ready_schedule_unlock();
 		}
 	}
Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision c600df18f9fbbecdee5b62a88fa82ac6773b2d67)
+++ libcfa/src/concurrency/kernel.cfa	(revision 1ed9cb63214b71becd33cbbd4507f40ffe95adc6)
@@ -196,5 +196,8 @@
 
 			if( !readyThread ) {
+				ready_schedule_lock();
 				__cfa_io_flush( this );
+				ready_schedule_unlock();
+
 				readyThread = __next_thread_slow( this->cltr );
 			}
@@ -277,5 +280,7 @@
 
 			if(this->io.pending && !this->io.dirty) {
+				ready_schedule_lock();
 				__cfa_io_flush( this );
+				ready_schedule_unlock();
 			}
 
@@ -317,5 +322,8 @@
 
 				// Don't block if we are done
-				if( __atomic_load_n(&this->do_terminate, __ATOMIC_SEQ_CST) ) break MAIN_LOOP;
+				if( __atomic_load_n(&this->do_terminate, __ATOMIC_SEQ_CST) ) {
+					ready_schedule_unlock();
+					break MAIN_LOOP;
+				}
 
 				__STATS( __tls_stats()->ready.sleep.halts++; )
@@ -939,4 +947,5 @@
 			/* paranoid */ verifyf( it, "Unexpected null iterator, at index %u of %u\n", i, count);
 			/* paranoid */ verify( it->local_data->this_stats );
+			// __print_stats( it->local_data->this_stats, cltr->print_stats, "Processor", it->name, (void*)it );
 			__tally_stats( cltr->stats, it->local_data->this_stats );
 			it = &(*it)`next;
@@ -948,4 +957,5 @@
 		// this doesn't solve all problems but does solve many
 		// so it's probably good enough
+		disable_interrupts();
 		uint_fast32_t last_size = ready_mutate_lock();
 
@@ -955,4 +965,5 @@
 		// Unlock the RWlock
 		ready_mutate_unlock( last_size );
+		enable_interrupts();
 	}
 
