diff --git a/components/net/cpp/include/ftl/net/universe.hpp b/components/net/cpp/include/ftl/net/universe.hpp
index 8cf1c462f7a52e225170fbf8a6c59f854688bc77..b45163006d9755c3c3a713a23b1b9ccdf704cb8c 100644
--- a/components/net/cpp/include/ftl/net/universe.hpp
+++ b/components/net/cpp/include/ftl/net/universe.hpp
@@ -217,6 +217,7 @@ class Universe : public ftl::Configurable {
 	std::thread thread_;
 	std::list<ReconnectInfo> reconnects_;
 	size_t phase_;
+	std::list<ftl::net::Peer*> garbage_;
 
 	struct ConnHandler {
 		callback_t id;
diff --git a/components/net/cpp/src/universe.cpp b/components/net/cpp/src/universe.cpp
index 541131085a7215a021d30ccc28b1dd9072426bb9..8c50709e2d6253f73849f5560c72eee9a6ff5b83 100644
--- a/components/net/cpp/src/universe.cpp
+++ b/components/net/cpp/src/universe.cpp
@@ -170,6 +170,14 @@ void Universe::_installBindings() {
 // Note: should be called inside a net lock
 void Universe::_cleanupPeers() {
 
+	if (ftl::pool.n_idle() == ftl::pool.size()) {
+		if (garbage_.size() > 0) LOG(INFO) << "Garbage collection";
+		while (garbage_.size() > 0) {
+			delete garbage_.front();
+			garbage_.pop_front();
+		}
+	}
+
 	auto i = peers_.begin();
 	while (i != peers_.end()) {
 		if (!(*i)->isValid()) {
@@ -185,7 +193,8 @@ void Universe::_cleanupPeers() {
 			if (p->status() == ftl::net::Peer::kReconnecting) {
 				reconnects_.push_back({50, 1.0f, p});
 			} else {
-				delete p;
+				//delete p;
+				garbage_.push_back(p);
 			}
 		} else {
 			i++;
@@ -210,7 +219,8 @@ void Universe::_periodic() {
 			(*i).tries--;
 			i++;
 		} else {
-			delete (*i).peer;
+			//delete (*i).peer;
+			garbage_.push_back((*i).peer);
 			i = reconnects_.erase(i);
 			LOG(WARNING) << "Reconnection to peer failed";
 		}