Index: benchmark/io/http/main.cfa
===================================================================
--- benchmark/io/http/main.cfa	(revision c3ee5f3bd19fb4c7ae641b1685022970419e5909)
+++ benchmark/io/http/main.cfa	(revision ece0e80868c1aeb44b18903340b03bf43399c6d0)
@@ -114,5 +114,4 @@
 		options.clopts.instance = &cl;
 
-		init_protocol();
 
 		int pipe_cnt = options.clopts.nworkers * 2;
@@ -131,4 +130,6 @@
 		{
 			ServerProc procs[options.clopts.nprocs];
+
+			init_protocol();
 			{
 				Worker workers[options.clopts.nworkers];
@@ -158,6 +159,25 @@
 					printf("Shutting Down\n");
 				}
+
+				for(i; options.clopts.nworkers) {
+					printf("Cancelling %p\n", (void*)workers[i].cancel.target);
+					cancel(workers[i].cancel);
+				}
+
+				printf("Shutting down socket\n");
+				int ret = shutdown( server_fd, SHUT_RD );
+				if( ret < 0 ) { abort( "shutdown error: (%d) %s\n", (int)errno, strerror(errno) ); }
+
+				//===================
+				// Close Socket
+				printf("Closing Socket\n");
+				ret = close( server_fd );
+				if(ret < 0) {
+					abort( "close socket error: (%d) %s\n", (int)errno, strerror(errno) );
+				}
 			}
 			printf("Workers Closed\n");
+
+			deinit_protocol();
 		}
 
@@ -170,13 +190,4 @@
 		free(fds);
 
-		deinit_protocol();
-	}
-
-	//===================
-	// Close Socket
-	printf("Closing Socket\n");
-	ret = close( server_fd );
-	if(ret < 0) {
-		abort( "close socket error: (%d) %s\n", (int)errno, strerror(errno) );
 	}
 
Index: benchmark/io/http/protocol.cfa
===================================================================
--- benchmark/io/http/protocol.cfa	(revision c3ee5f3bd19fb4c7ae641b1685022970419e5909)
+++ benchmark/io/http/protocol.cfa	(revision ece0e80868c1aeb44b18903340b03bf43399c6d0)
@@ -71,5 +71,5 @@
 }
 
-[HttpCode code, bool closed, * const char file, size_t len] http_read(int fd, []char buffer, size_t len) {
+[HttpCode code, bool closed, * const char file, size_t len] http_read(int fd, []char buffer, size_t len, io_cancellation * cancel) {
 	char * it = buffer;
 	size_t count = len - 1;
@@ -77,5 +77,5 @@
 	READ:
 	for() {
-		int ret = cfa_read(fd, (void*)it, count, 0, -1`s, 0p, 0p);
+		int ret = cfa_read(fd, (void*)it, count, 0, -1`s, cancel, 0p);
 		// int ret = read(fd, (void*)it, count);
 		if(ret == 0 ) return [OK200, true, 0, 0];
@@ -148,5 +148,5 @@
 
 void ?{}( DateFormater & this ) {
-	((thread&)this){ *options.clopts.instance };
+	((thread&)this){ "Server Date Thread", *options.clopts.instance };
 	this.idx = 0;
 	memset( this.buffers[0].buff, 0, sizeof(this.buffers[0]) );
@@ -162,7 +162,6 @@
 
 		Time now = getTimeNsec();
-		// Date: Wed, 17 Apr 2013 12:00:00 GMT
+
 		strftime( this.buffers[this.idx].buff, 100, "%a, %d %b %Y %H:%M:%S %Z", now );
-		printf("Changing date to %s\n", this.buffers[this.idx].buff);
 
 		char * next = this.buffers[this.idx].buff;
Index: benchmark/io/http/protocol.hfa
===================================================================
--- benchmark/io/http/protocol.hfa	(revision c3ee5f3bd19fb4c7ae641b1685022970419e5909)
+++ benchmark/io/http/protocol.hfa	(revision ece0e80868c1aeb44b18903340b03bf43399c6d0)
@@ -1,3 +1,5 @@
 #pragma once
+
+struct io_cancellation;
 
 enum HttpCode {
@@ -15,5 +17,5 @@
 int answer_header( int fd, size_t size );
 
-[HttpCode code, bool closed, * const char file, size_t len] http_read(int fd, []char buffer, size_t len);
+[HttpCode code, bool closed, * const char file, size_t len] http_read(int fd, []char buffer, size_t len, io_cancellation *);
 
 void sendfile( int pipe[2], int fd, int ans_fd, size_t count );
Index: benchmark/io/http/worker.cfa
===================================================================
--- benchmark/io/http/worker.cfa	(revision c3ee5f3bd19fb4c7ae641b1685022970419e5909)
+++ benchmark/io/http/worker.cfa	(revision ece0e80868c1aeb44b18903340b03bf43399c6d0)
@@ -28,11 +28,13 @@
 	CONNECTION:
 	for() {
-		int fd = cfa_accept4( this.[sockfd, addr, addrlen, flags], 0, -1`s, 0p, 0p );
+		printf("=== Accepting connection ===\n");
+		int fd = cfa_accept4( this.[sockfd, addr, addrlen, flags], 0, -1`s, &this.cancel, 0p );
 		if(fd < 0) {
 			if( errno == ECONNABORTED ) break;
+			if( errno == EINVAL ) break;
 			abort( "accept error: (%d) %s\n", (int)errno, strerror(errno) );
 		}
 
-		printf("New connection %d, waiting for requests\n", fd);
+		printf("=== New connection %d, waiting for requests ===\n", fd);
 		REQUEST:
 		for() {
@@ -45,10 +47,10 @@
 			size_t len = options.socket.buflen;
 			char buffer[len];
-			printf("Reading request\n");
-			[code, closed, file, name_size] = http_read(fd, buffer, len);
+			printf("=== Reading request ===\n");
+			[code, closed, file, name_size] = http_read(fd, buffer, len, &this.cancel);
 
 			// if we are done, break out of the loop
 			if( closed ) {
-				printf("Connection closed\n");
+				printf("=== Connection closed ===\n");
 				continue CONNECTION;
 			}
@@ -56,10 +58,10 @@
 			// If this wasn't a request retrun 400
 			if( code != OK200 ) {
-				printf("Invalid Request : %d\n", code_val(code));
+				printf("=== Invalid Request : %d ===\n", code_val(code));
 				answer_error(fd, code);
 				continue REQUEST;
 			}
 
-			printf("Request for file %.*s\n", (int)name_size, file);
+			printf("=== Request for file %.*s ===\n", (int)name_size, file);
 
 			// Get the fd from the file cache
@@ -70,5 +72,5 @@
 			// If we can't find the file, return 404
 			if( ans_fd < 0 ) {
-				printf("File Not Found\n");
+				printf("=== File Not Found ===\n");
 				answer_error(fd, E404);
 				continue REQUEST;
@@ -81,5 +83,5 @@
 			sendfile( this.pipe, fd, ans_fd, count);
 
-			printf("File sent\n");
+			printf("=== File sent ===\n");
 		}
 	}
Index: benchmark/io/http/worker.hfa
===================================================================
--- benchmark/io/http/worker.hfa	(revision c3ee5f3bd19fb4c7ae641b1685022970419e5909)
+++ benchmark/io/http/worker.hfa	(revision ece0e80868c1aeb44b18903340b03bf43399c6d0)
@@ -17,4 +17,5 @@
 	socklen_t * addrlen;
 	int flags;
+	io_cancellation cancel;
 };
 void ?{}( Worker & this);
