diff --git a/components/net/cpp/src/peer.cpp b/components/net/cpp/src/peer.cpp
index 52e082373276edc14ea553fb0dc13ee6f8a37e20..549d6478e516c4fe058a3d8253b3b90956c0afbf 100644
--- a/components/net/cpp/src/peer.cpp
+++ b/components/net/cpp/src/peer.cpp
@@ -417,15 +417,6 @@ void Peer::data() {
 bool Peer::_data() {
 	std::unique_lock<std::recursive_mutex> lk(recv_mtx_);
 
-	/*recv_buf_.reserve_buffer(kMaxMessage);
-	int rc = ftl::net::internal::recv(sock_, recv_buf_.buffer(), kMaxMessage, 0);
-
-	if (rc <= 0) {
-		return false;
-	}
-	
-	recv_buf_.buffer_consumed(rc);*/
-
 	if (scheme_ == ftl::URI::SCHEME_WS && !ws_read_header_) {
 		wsheader_type ws;
 		if (ws_parse(recv_buf_, ws) < 0) {
@@ -436,6 +427,8 @@ bool Peer::_data() {
 
 	msgpack::object_handle msg;
 	while (recv_buf_.next(msg)) {
+		// CHECK Safe to unlock here?
+		lk.unlock();
 		ws_read_header_ = false;
 		msgpack::object obj = msg.get();
 		if (status_ != kConnected) {
@@ -457,6 +450,9 @@ bool Peer::_data() {
 		}
 		disp_->dispatch(*this, obj);
 
+		// Relock before next loop of while
+		lk.lock();
+
 		if (scheme_ == ftl::URI::SCHEME_WS && recv_buf_.nonparsed_size() > 0) {
 			wsheader_type ws;
 			if (ws_parse(recv_buf_, ws) < 0) {