Index: benchmark/io/http/main.cfa
===================================================================
--- benchmark/io/http/main.cfa	(revision ce988165d61a7f4aa494bc6a361d74571259bbbf)
+++ benchmark/io/http/main.cfa	(revision 6e2b04e05bb3d9f5059628fbcd9d7304e2577458)
@@ -234,5 +234,8 @@
 	int addrlen = prepaddr(address);
 
-	int server_fd = listener(address, addrlen);
+	int server_fd;
+	if(!options.socket.manyreuse) {
+		server_fd = listener(address, addrlen);
+	}
 
 	//===================
@@ -271,5 +274,5 @@
 						workers[i].pipe[0] = fds[pipe_off + (i * 2) + 0];
 						workers[i].pipe[1] = fds[pipe_off + (i * 2) + 1];
-						workers[i].sockfd  = server_fd;
+						workers[i].sockfd  = options.socket.manyreuse ?  listener(address, addrlen) : server_fd;
 						workers[i].addr    = (struct sockaddr *)&address;
 						workers[i].addrlen = (socklen_t*)&addrlen;
@@ -311,7 +314,15 @@
 
 				sout | "Shutting down socket..." | nonl; flush( sout );
-				int ret = shutdown( server_fd, SHUT_RD );
-				if( ret < 0 ) {
-					abort( "shutdown error: (%d) %s\n", (int)errno, strerror(errno) );
+				if(options.socket.manyreuse) {
+					for(i; options.clopts.nworkers) {
+						ret = shutdown( workers[i].sockfd, SHUT_RD );
+						if(ret < 0) abort( "close socket %d error: (%d) %s\n", i, (int)errno, strerror(errno) );
+					}
+				}
+				else {
+					ret = shutdown( server_fd, SHUT_RD );
+					if( ret < 0 ) {
+						abort( "shutdown error: (%d) %s\n", (int)errno, strerror(errno) );
+					}
 				}
 				sout | "done";
@@ -320,7 +331,15 @@
 				// Close Socket
 				sout | "Closing Socket..." | nonl; flush( sout );
-				ret = close( server_fd );
-				if(ret < 0) {
-					abort( "close socket error: (%d) %s\n", (int)errno, strerror(errno) );
+				if(options.socket.manyreuse) {
+					for(i; options.clopts.nworkers) {
+						ret = close(workers[i].sockfd);
+						if(ret < 0) abort( "close socket %d error: (%d) %s\n", i, (int)errno, strerror(errno) );
+					}
+				}
+				else {
+					ret = close( server_fd );
+					if(ret < 0) {
+						abort( "close socket error: (%d) %s\n", (int)errno, strerror(errno) );
+					}
 				}
 				sout | "done";
Index: benchmark/io/http/options.cfa
===================================================================
--- benchmark/io/http/options.cfa	(revision ce988165d61a7f4aa494bc6a361d74571259bbbf)
+++ benchmark/io/http/options.cfa	(revision 6e2b04e05bb3d9f5059628fbcd9d7304e2577458)
@@ -35,7 +35,9 @@
 
 	{ // socket
-		8080, // port
-		10,   // backlog
-		1024  // buflen
+		8080,  // port
+		10,    // backlog
+		1024,  // buflen
+		false, // onereuse
+		false  // manyreuse
 	},
 
@@ -70,4 +72,6 @@
 		{'\0', "shell",          "Disable interactive mode", options.interactive, parse_setfalse},
 		{'\0', "accept-backlog", "Maximum number of pending accepts", options.socket.backlog},
+		{'\0', "reuseport-one",  "Create a single listen socket with SO_REUSEPORT", options.socket.onereuse, parse_settrue},
+		{'\0', "reuseport",      "Use many listen sockets with SO_REUSEPORT", options.socket.manyreuse, parse_settrue},
 		{'\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},
 		{'\0', "seed",           "seed to use for hashing", options.file_cache.hash_seed },
Index: benchmark/io/http/options.hfa
===================================================================
--- benchmark/io/http/options.hfa	(revision ce988165d61a7f4aa494bc6a361d74571259bbbf)
+++ benchmark/io/http/options.hfa	(revision 6e2b04e05bb3d9f5059628fbcd9d7304e2577458)
@@ -27,4 +27,6 @@
 		int backlog;
 		int buflen;
+		bool onereuse;
+		bool manyreuse;
 	} socket;
 
Index: benchmark/io/http/socket.cfa
===================================================================
--- benchmark/io/http/socket.cfa	(revision ce988165d61a7f4aa494bc6a361d74571259bbbf)
+++ benchmark/io/http/socket.cfa	(revision 6e2b04e05bb3d9f5059628fbcd9d7304e2577458)
@@ -31,7 +31,11 @@
 	}
 
-	int value = 1;
-	if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &value, sizeof(int)) < 0)
-		abort( "setsockopt error: (%d) %s\n", (int)errno, strerror(errno) );
+	if(options.socket.onereuse || options.socket.manyreuse) {
+		int value = 1;
+		// if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void*)&on, sizeof(on)))
+		// 	abort( "setsockopt SO_REUSEADDR error: (%d) %s\n", (int)errno, strerror(errno) );
+		if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &value, sizeof(int)) < 0)
+			abort( "setsockopt SO_REUSEPORT error: (%d) %s\n", (int)errno, strerror(errno) );
+	}
 
 	int ret = 0;
Index: benchmark/io/http/worker.cfa
===================================================================
--- benchmark/io/http/worker.cfa	(revision ce988165d61a7f4aa494bc6a361d74571259bbbf)
+++ benchmark/io/http/worker.cfa	(revision 6e2b04e05bb3d9f5059628fbcd9d7304e2577458)
@@ -43,4 +43,6 @@
 	/* paranoid */ assert( this.pipe[0] != -1 );
 	/* paranoid */ assert( this.pipe[1] != -1 );
+
+	const bool reuse = options.socket.manyreuse;
 
 	CONNECTION:
