diff --git a/net/CMakeLists.txt b/net/CMakeLists.txt
index 5af66370e1e966adee4cad7b533d347a1197f7c0..85d31c34d48dcb4e3e54a6fb5657f3f264688a87 100644
--- a/net/CMakeLists.txt
+++ b/net/CMakeLists.txt
@@ -29,6 +29,7 @@ set(FTLSOURCE
 	src/listener.cpp
 	src/socket.cpp
 	src/dispatcher.cpp
+	src/protocol.cpp
 )
 
 check_include_file("uriparser/Uri.h" HAVE_URI_H)
diff --git a/net/include/ftl/net.hpp b/net/include/ftl/net.hpp
index 0647fb3f68ef1b7466cd9ca1edb6712f55d6c03c..c0915ed7559c3a68660aa1d46055f830c31a14e0 100644
--- a/net/include/ftl/net.hpp
+++ b/net/include/ftl/net.hpp
@@ -40,7 +40,7 @@ bool run(bool async=false);
  */
 bool wait();
 
-void wait(std::function<bool(void)>);
+void wait(std::function<bool(void)>, float t=3.0f);
 
 /**
  * Check and process any waiting messages, but do not block if there are none.
diff --git a/net/src/net.cpp b/net/src/net.cpp
index d6c120a1b772e758e9b219f1ae87060fd9278ccb..0d2943f917a34e6c77a16fab0f00ef23ebf75a6a 100644
--- a/net/src/net.cpp
+++ b/net/src/net.cpp
@@ -191,9 +191,9 @@ bool ftl::net::wait() {
 	return _run(false,false);
 }
 
-void ftl::net::wait(std::function<bool(void)> f) {
+void ftl::net::wait(std::function<bool(void)> f, float to) {
 	auto start = steady_clock::now();
-	while (!f() && duration<float>(steady_clock::now() - start).count() < 3.0)
+	while (!f() && duration<float>(steady_clock::now() - start).count() < to)
 		_run(false,false);
 }
 
diff --git a/net/test/net_integration.cpp b/net/test/net_integration.cpp
index 0989f67726b1233e82fe8a657ecf9ddafa54a3e9..20b2c676028789402b2412c41f9143a2915ba416 100644
--- a/net/test/net_integration.cpp
+++ b/net/test/net_integration.cpp
@@ -178,7 +178,7 @@ TEST_CASE("net::listen()", "[net]") {
 		bool connected = false;
 		
 		l->onConnection([&](shared_ptr<Socket> s) {
-			ftl::net::wait(); // Wait for handshake
+			ftl::net::wait([&s]() { return s->isConnected(); });
 			REQUIRE( s->isConnected() );
 			connected = true;
 		});
@@ -212,11 +212,10 @@ TEST_CASE("Net Integration", "[integrate]") {
 	
 	shared_ptr<Socket> s2 = ftl::net::connect("tcp://localhost:9000");
 	
-	ftl::net::wait(); // TODO, make setProtocol block until handshake complete
-	ftl::net::wait();
-	REQUIRE( s1 != nullptr );
 	REQUIRE( s2 != nullptr );
-	
+	ftl::net::wait([&s2]() { return s2->isConnected(); });
+	REQUIRE( s1 != nullptr );	
+
 	REQUIRE( s1->isConnected() );
 	REQUIRE( s2->isConnected() );