diff --git a/src/peer.cpp b/src/peer.cpp
index dab342bcf2f0af47131ed869bd0a9ec3100e00fd..83d722a4eb2084edb86f9ff617686193ca8efe8c 100644
--- a/src/peer.cpp
+++ b/src/peer.cpp
@@ -215,13 +215,7 @@ void Peer::close(bool retry) {
 
 void Peer::_close(bool retry) {
 	if (status_ != NodeStatus::kConnected && status_ != NodeStatus::kConnecting) return;
-	status_ = NodeStatus::kDisconnected;
 	
-	if (sock_->is_valid()) {
-		net_->_notifyDisconnect(this);
-		sock_->close();
-	}
-
 	// Attempt auto reconnect?
 	if (retry && can_reconnect_) {
 		status_ = NodeStatus::kReconnecting;
@@ -229,6 +223,11 @@ void Peer::_close(bool retry) {
 	} else {
 		status_ = NodeStatus::kDisconnected;
 	}
+
+	if (sock_->is_valid()) {
+		net_->_notifyDisconnect(this);
+		sock_->close();
+	}
 }
 
 bool Peer::socketError() {
@@ -238,8 +237,8 @@ bool Peer::socketError() {
 	// Must close before log since log may try to send over net causing
 	// more socket errors...
 	
-	_close(reconnect_on_socket_error_);
-	net_->_notifyError(this, ftl::protocol::Error::kSocketError, uri_.to_string()); 
+	net_->_notifyError(this, ftl::protocol::Error::kSocketError, uri_.to_string());
+	_close(reconnect_on_socket_error_); 
 	return true;
 }