Index: benchmark/io/http/main.cfa
===================================================================
--- benchmark/io/http/main.cfa	(revision 390fb02b2df905afef08792dee99f77218c37c0c)
+++ benchmark/io/http/main.cfa	(revision c3ee5f3bd19fb4c7ae641b1685022970419e5909)
@@ -46,4 +46,7 @@
 }
 
+extern void init_protocol(void);
+extern void deinit_protocol(void);
+
 //=============================================================================================
 // Main
@@ -56,6 +59,8 @@
 	//===================
 	// Open Files
-	printf("Filling cache from %s\n", path);
-	fill_cache( path );
+	if (FileExperiment == options.experiment.type) {
+		printf("Filling cache from %s\n", path);
+		fill_cache( path );
+	}
 
 	//===================
@@ -79,5 +84,5 @@
 		ret = bind( server_fd, (struct sockaddr *)&address, sizeof(address) );
 		if(ret < 0) {
-			if(errno == 98) {
+			if(errno == EADDRINUSE) {
 				if(waited == 0) {
 					printf("Waiting for port\n");
@@ -108,4 +113,6 @@
 		#endif
 		options.clopts.instance = &cl;
+
+		init_protocol();
 
 		int pipe_cnt = options.clopts.nworkers * 2;
@@ -162,4 +169,6 @@
 		}
 		free(fds);
+
+		deinit_protocol();
 	}
 
Index: benchmark/io/http/protocol.cfa
===================================================================
--- benchmark/io/http/protocol.cfa	(revision 390fb02b2df905afef08792dee99f77218c37c0c)
+++ benchmark/io/http/protocol.cfa	(revision c3ee5f3bd19fb4c7ae641b1685022970419e5909)
@@ -18,5 +18,5 @@
 #include "options.hfa"
 
-const char * volatile date = "Wed, 17 Apr 2013 12:00:00 GMT";
+const char * volatile date = 0p;
 
 const char * http_msgs[] = {
@@ -78,7 +78,9 @@
 	for() {
 		int ret = cfa_read(fd, (void*)it, count, 0, -1`s, 0p, 0p);
+		// int ret = read(fd, (void*)it, count);
 		if(ret == 0 ) return [OK200, true, 0, 0];
 		if(ret < 0 ) {
 			if( errno == EAGAIN || errno == EWOULDBLOCK) continue READ;
+			// if( errno == EINVAL ) return [E400, true, 0, 0];
 			abort( "read error: (%d) %s\n", (int)errno, strerror(errno) );
 		}
@@ -129,2 +131,57 @@
 	}
 }
+
+//=============================================================================================
+
+#include <clock.hfa>
+#include <time.hfa>
+#include <thread.hfa>
+
+struct date_buffer {
+	char buff[100];
+};
+
+thread DateFormater {
+	int idx;
+	date_buffer buffers[2];
+};
+
+void ?{}( DateFormater & this ) {
+	((thread&)this){ *options.clopts.instance };
+	this.idx = 0;
+	memset( this.buffers[0].buff, 0, sizeof(this.buffers[0]) );
+	memset( this.buffers[1].buff, 0, sizeof(this.buffers[1]) );
+}
+
+void main(DateFormater & this) {
+	LOOP: for() {
+		waitfor( ^?{} : this) {
+			break LOOP;
+		}
+		or else {}
+
+		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;
+		__atomic_exchange_n((char * volatile *)&date, next, __ATOMIC_SEQ_CST);
+		this.idx = (this.idx + 1) % 2;
+
+		sleep(1`s);
+	}
+}
+
+//=============================================================================================
+DateFormater * the_date_formatter;
+
+void init_protocol(void) {
+	the_date_formatter = alloc();
+	(*the_date_formatter){};
+}
+
+void deinit_protocol(void) {
+	^(*the_date_formatter){};
+	free( the_date_formatter );
+}
