Index: benchmark/io/http/main.cfa
===================================================================
--- benchmark/io/http/main.cfa	(revision c2351798a8039f2b6372f1d5e3447b051e1b4906)
+++ benchmark/io/http/main.cfa	(revision d60d30ef3cbda3a4010ce92c21dcd3ce89fb6684)
@@ -47,4 +47,13 @@
 		}
 	#endif
+}
+
+struct ServerIoContext {
+	io_context self;
+};
+
+void ?{}( ServerIoContext & this ) {
+	/* paranoid */ assert( options.clopts.instance != 0p );
+	(this.self){ *options.clopts.instance };
 }
 
@@ -153,11 +162,12 @@
 		}
 
-		if(options.file_cache.path && options.file_cache.fixed_fds) {
-			register_fixed_files(cl, fds, pipe_off);
-		}
+		// if(options.file_cache.path && options.file_cache.fixed_fds) {
+		// 	register_fixed_files(cl, fds, pipe_off);
+		// }
 
 		{
 			ServerProc procs[options.clopts.nprocs];
-			StatsPrinter printer;
+			ServerIoContext ioctxs[options.clopts.nprocs];
+			// StatsPrinter printer;
 
 			init_protocol();
@@ -183,5 +193,5 @@
 				{
 					char buffer[128];
-					while(int ret = cfa_read(0, buffer, 128, 0, -1`s, 0p, 0p); ret != 0) {
+					while(int ret = cfa_read(0, buffer, 128, 0); ret != 0) {
 						if(ret < 0) abort( "main read error: (%d) %s\n", (int)errno, strerror(errno) );
 					}
@@ -193,5 +203,4 @@
 				for(i; options.clopts.nworkers) {
 					workers[i].done = true;
-					cancel(workers[i].cancel);
 				}
 				sout | "done";
Index: benchmark/io/http/options.cfa
===================================================================
--- benchmark/io/http/options.cfa	(revision c2351798a8039f2b6372f1d5e3447b051e1b4906)
+++ benchmark/io/http/options.cfa	(revision d60d30ef3cbda3a4010ce92c21dcd3ce89fb6684)
@@ -46,10 +46,7 @@
 
 void parse_options( int argc, char * argv[] ) {
-	bool subthrd = false;
-	bool eagrsub = false;
-	bool fixedfd = false;
-	bool sqkpoll = false;
-	bool iokpoll = false;
-	unsigned sublen = 16;
+	// bool fixedfd = false;
+	// bool sqkpoll = false;
+	// bool iokpoll = false;
 	unsigned nentries = 16;
 
@@ -65,10 +62,7 @@
 		{'\0', "cache-size",     "Size of the cache to use, if set to small, will uses closes power of 2", options.file_cache.size },
 		{'\0', "list-files",     "List the files in the specified path and exit", options.file_cache.list, parse_settrue },
-		{ 's', "submitthread",   "If set, cluster uses polling thread to submit I/O", subthrd, parse_settrue },
-		{ 'e', "eagersubmit",    "If set, cluster submits I/O eagerly but still aggregates submits", eagrsub, parse_settrue},
-		{ 'f', "fixed-fds",      "If set, files are open eagerly and pre-registered with the cluster", fixedfd, parse_settrue},
-		{ 'k', "kpollsubmit",    "If set, cluster uses IORING_SETUP_SQPOLL, implies -f", sqkpoll, parse_settrue },
-		{ 'i', "kpollcomplete",  "If set, cluster uses IORING_SETUP_IOPOLL", iokpoll, parse_settrue },
-		{'\0', "submitlength",   "Max number of submitions that can be submitted together", sublen },
+		// { 'f', "fixed-fds",      "If set, files are open eagerly and pre-registered with the cluster", fixedfd, parse_settrue},
+		// { 'k', "kpollsubmit",    "If set, cluster uses IORING_SETUP_SQPOLL, implies -f", sqkpoll, parse_settrue },
+		// { 'i', "kpollcomplete",  "If set, cluster uses IORING_SETUP_IOPOLL", iokpoll, parse_settrue },
 		{'\0', "numentries",     "Number of I/O entries", nentries },
 
@@ -93,22 +87,15 @@
 	options.clopts.params.num_entries = nentries;
 
-	options.clopts.params.poller_submits = subthrd;
-	options.clopts.params.eager_submits  = eagrsub;
+	// if( fixedfd ) {
+	// 	options.file_cache.fixed_fds = true;
+	// }
 
-	if( fixedfd ) {
-		options.file_cache.fixed_fds = true;
-	}
+	// if( sqkpoll ) {
+	// 	options.file_cache.fixed_fds = true;
+	// }
 
-	if( sqkpoll ) {
-		options.clopts.params.poll_submit = true;
-		options.file_cache.fixed_fds = true;
-	}
-
-	if( iokpoll ) {
-		options.clopts.params.poll_complete = true;
-		options.file_cache.open_flags |= O_DIRECT;
-	}
-
-	options.clopts.params.num_ready = sublen;
+	// if( iokpoll ) {
+	// 	options.file_cache.open_flags |= O_DIRECT;
+	// }
 
 	if( left[0] == 0p ) { return; }
Index: benchmark/io/http/protocol.cfa
===================================================================
--- benchmark/io/http/protocol.cfa	(revision c2351798a8039f2b6372f1d5e3447b051e1b4906)
+++ benchmark/io/http/protocol.cfa	(revision d60d30ef3cbda3a4010ce92c21dcd3ce89fb6684)
@@ -53,6 +53,5 @@
 	while(len > 0) {
 		// Call write
-		int ret = cfa_write(fd, it, len, 0, -1`s, 0p, 0p);
-		// int ret = write(fd, it, len);
+		int ret = cfa_send(fd, it, len, 0, 0);
 		if( ret < 0 ) {
 			if( errno == ECONNRESET || errno == EPIPE ) return -ECONNRESET;
@@ -94,5 +93,5 @@
 
 
-[HttpCode code, bool closed, * const char file, size_t len] http_read(int fd, []char buffer, size_t len, io_cancellation * cancel) {
+[HttpCode code, bool closed, * const char file, size_t len] http_read(int fd, []char buffer, size_t len) {
 	char * it = buffer;
 	size_t count = len - 1;
@@ -100,5 +99,5 @@
 	READ:
 	for() {
-		int ret = cfa_read(fd, (void*)it, count, 0, -1`s, cancel, 0p);
+		int ret = cfa_recv(fd, (void*)it, count, 0, 0);
 		// int ret = read(fd, (void*)it, count);
 		if(ret == 0 ) return [OK200, true, 0, 0];
@@ -139,5 +138,5 @@
 	ssize_t ret;
 	SPLICE1: while(count > 0) {
-		ret = cfa_splice(ans_fd, &offset, pipe[1], 0p, count, sflags, 0, -1`s, 0p, 0p);
+		ret = cfa_splice(ans_fd, &offset, pipe[1], 0p, count, sflags, 0);
 		// ret = splice(ans_fd, &offset, pipe[1], 0p, count, sflags);
 		if( ret < 0 ) {
@@ -152,5 +151,5 @@
 		size_t in_pipe = ret;
 		SPLICE2: while(in_pipe > 0) {
-			ret = cfa_splice(pipe[0], 0p, fd, 0p, in_pipe, sflags, 0, -1`s, 0p, 0p);
+			ret = cfa_splice(pipe[0], 0p, fd, 0p, in_pipe, sflags, 0);
 			// ret = splice(pipe[0], 0p, fd, 0p, in_pipe, sflags);
 			if( ret < 0 ) {
Index: benchmark/io/http/protocol.hfa
===================================================================
--- benchmark/io/http/protocol.hfa	(revision c2351798a8039f2b6372f1d5e3447b051e1b4906)
+++ benchmark/io/http/protocol.hfa	(revision d60d30ef3cbda3a4010ce92c21dcd3ce89fb6684)
@@ -1,5 +1,3 @@
 #pragma once
-
-struct io_cancellation;
 
 enum HttpCode {
@@ -21,5 +19,5 @@
 int answer_empty( int fd );
 
-[HttpCode code, bool closed, * const char file, size_t len] http_read(int fd, []char buffer, size_t len, io_cancellation *);
+[HttpCode code, bool closed, * const char file, size_t len] http_read(int fd, []char buffer, size_t len);
 
 int sendfile( int pipe[2], int fd, int ans_fd, size_t count );
Index: benchmark/io/http/worker.cfa
===================================================================
--- benchmark/io/http/worker.cfa	(revision c2351798a8039f2b6372f1d5e3447b051e1b4906)
+++ benchmark/io/http/worker.cfa	(revision d60d30ef3cbda3a4010ce92c21dcd3ce89fb6684)
@@ -35,6 +35,5 @@
 	for() {
 		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] );
+		int fd = cfa_accept4( this.[sockfd, addr, addrlen, flags], 0 );
 		if(fd < 0) {
 			if( errno == ECONNABORTED ) break;
@@ -42,4 +41,5 @@
 			abort( "accept error: (%d) %s\n", (int)errno, strerror(errno) );
 		}
+		if(this.done) break;
 
 		if( options.log ) sout | "=== New connection" | fd | "" | ", waiting for requests ===";
@@ -55,5 +55,5 @@
 			char buffer[len];
 			if( options.log ) sout | "=== Reading request ===";
-			[code, closed, file, name_size] = http_read(fd, buffer, len, &this.cancel);
+			[code, closed, file, name_size] = http_read(fd, buffer, len);
 
 			// if we are done, break out of the loop
Index: benchmark/io/http/worker.hfa
===================================================================
--- benchmark/io/http/worker.hfa	(revision c2351798a8039f2b6372f1d5e3447b051e1b4906)
+++ benchmark/io/http/worker.hfa	(revision d60d30ef3cbda3a4010ce92c21dcd3ce89fb6684)
@@ -17,5 +17,4 @@
 	socklen_t * addrlen;
 	int flags;
-	io_cancellation cancel;
 	volatile bool done;
 };
