diff --git a/components/net/cpp/include/ftl/net/listener.hpp b/components/net/cpp/include/ftl/net/listener.hpp
index 91dc56a260d4810e05382255f8b5119330221fbc..bbf6d0c6aa02623430bc16833a7f0f7cc0bf64da 100644
--- a/components/net/cpp/include/ftl/net/listener.hpp
+++ b/components/net/cpp/include/ftl/net/listener.hpp
@@ -27,10 +27,13 @@ class Listener {
 	
 	void connection(std::shared_ptr<Peer> &s);
 	void onConnection(connecthandler_t h) { handler_connect_.push_back(h); };
+
+	inline int port() const { return port_; }
 	
 	private:
 	SOCKET descriptor_;
 	Protocol *default_proto_;
+	int port_;
 	//sockaddr_in slocalAddr;
 	std::vector<connecthandler_t> handler_connect_;
 };
diff --git a/components/net/cpp/src/listener.cpp b/components/net/cpp/src/listener.cpp
index 14c8f557052da86e9f3afb7a8658f59efa84d590..90ec540f4de09cfb82c763e9b3bf591ad8cf9314 100644
--- a/components/net/cpp/src/listener.cpp
+++ b/components/net/cpp/src/listener.cpp
@@ -102,7 +102,7 @@ Listener::Listener(const char *pUri) : default_proto_(NULL) {
 
 	if (uri.getProtocol() == URI::SCHEME_TCP) {
 		descriptor_ = tcpListen(uri);
-		std::cout << "Listening: " << pUri << " - " << descriptor_ << std::endl;
+		port_ = uri.getPort();
 	} else if (uri.getProtocol() == URI::SCHEME_WS) {
 		descriptor_ = wsListen(uri);
 	} else {
diff --git a/components/net/cpp/src/universe.cpp b/components/net/cpp/src/universe.cpp
index dd56ef9356d86c22ceb65657d44e31d40ede61e6..7a6b3404eebb2db338bd1243ae4c7ceb00a077e3 100644
--- a/components/net/cpp/src/universe.cpp
+++ b/components/net/cpp/src/universe.cpp
@@ -149,14 +149,24 @@ bool Universe::listen(const string &addr) {
 }
 
 Peer *Universe::connect(const string &addr) {
-	// Check if already connected
+	// Check if already connected or if self
 	{
 		UNIQUE_LOCK(net_mutex_,lk);
 		if (peer_by_uri_.find(addr) != peer_by_uri_.end()) {
 			return peer_by_uri_[addr];
 		}
+
+		ftl::URI u(addr);
+		if (u.getHost() == "localhost" || u.getHost() == "127.0.0.1") {
+			for (const auto *l : listeners_) {
+				if (l->port() == u.getPort()) {
+					throw FTL_Error("Cannot connect to self");
+				}
+			}
+		}
 	}
 
+
 	auto p = new Peer(addr.c_str(), this, &disp_);
 	if (!p) return nullptr;
 	
@@ -263,6 +273,29 @@ Peer *Universe::getPeer(const UUID &id) const {
 void Universe::_periodic() {
 	auto i = reconnects_.begin();
 	while (i != reconnects_.end()) {
+
+		std::string addr = i->peer->getURI();
+
+		{
+			UNIQUE_LOCK(net_mutex_,lk);
+			ftl::URI u(addr);
+			bool removed = false;
+
+			if (u.getHost() == "localhost" || u.getHost() == "127.0.0.1") {
+				for (const auto *l : listeners_) {
+					if (l->port() == u.getPort()) {
+						LOG(ERROR) << "Cannot connect to self";
+						garbage_.push_back((*i).peer);
+						i = reconnects_.erase(i);
+						removed = true;
+						break;
+					}
+				}
+			}
+
+			if (removed) continue;
+		}
+
 		if ((*i).peer->reconnect()) {
 			UNIQUE_LOCK(net_mutex_,lk);
 			peers_.push_back((*i).peer);