diff --git a/applications/gui/src/main.cpp b/applications/gui/src/main.cpp
index 974afff1473bd4aad7ecf59575f8735808c35e72..50bc3638c2e26197fbcf5b74dadacd4b6a49d0ad 100644
--- a/applications/gui/src/main.cpp
+++ b/applications/gui/src/main.cpp
@@ -13,7 +13,7 @@ int main(int argc, char **argv) {
 	ftl::net::Universe *net = ftl::create<ftl::net::Universe>(root, "net");
 
 	net->start();
-	//net->waitConnections();
+	net->waitConnections();
 
 	ftl::ctrl::Master *controller = new ftl::ctrl::Master(root, net);
 	controller->onLog([](const ftl::ctrl::LogEvent &e){
diff --git a/applications/gui/src/screen.cpp b/applications/gui/src/screen.cpp
index bb69755fbdcad39fb89da9c3f521c2c42ceb72dd..76d727a996abf445fb09a0d0237d13cce8b974c8 100644
--- a/applications/gui/src/screen.cpp
+++ b/applications/gui/src/screen.cpp
@@ -225,17 +225,23 @@ ftl::gui::Screen::Screen(ftl::Configurable *proot, ftl::net::Universe *pnet, ftl
 	popup->setLayout(new GroupLayout());
 	popup->setTheme(toolbuttheme);
 
-	auto node_details = ctrl_->getSlaves();
-	std::vector<std::string> node_titles;
-
-	for (auto &d : node_details) {
-		auto peer = ftl::UUID(d["id"].get<std::string>());
-		itembutton = new Button(popup, d["title"].get<std::string>());
-		itembutton->setCallback([this,popup,peer]() {
-			auto config_window = new ConfigWindow(this, ctrl_, peer);
-			config_window->setTheme(windowtheme);
-		});
+	//net_->onConnect([this,popup](ftl::net::Peer *p) {
+	{
+		LOG(INFO) << "NET CONNECT";
+		auto node_details = ctrl_->getSlaves();
+		std::vector<std::string> node_titles;
+
+		for (auto &d : node_details) {
+			LOG(INFO) << "ADDING TITLE: " << d.dump();
+			auto peer = ftl::UUID(d["id"].get<std::string>());
+			auto itembutton = new Button(popup, d["title"].get<std::string>());
+			itembutton->setCallback([this,popup,peer]() {
+				auto config_window = new ConfigWindow(this, ctrl_, peer);
+				config_window->setTheme(windowtheme);
+			});
+		}
 	}
+	//});
 
 	itembutton = new Button(popup, "Local");
 	itembutton->setCallback([this,popup]() {
diff --git a/components/control/cpp/src/master.cpp b/components/control/cpp/src/master.cpp
index a1248fac771dcd58a4654244296f4f0c608a5a34..a13a67a90b4bc7ccc1bd2c893580fc286dfb330a 100644
--- a/components/control/cpp/src/master.cpp
+++ b/components/control/cpp/src/master.cpp
@@ -86,6 +86,7 @@ vector<string> Master::getConfigurables() {
 
 vector<string> Master::getConfigurables(const ftl::UUID &peer) {
 	try {
+		LOG(INFO) << "LISTING CONFIGS";
 		return net_->call<vector<string>>(peer, "list_configurables");
 	} catch (...) {
 		return {};
diff --git a/components/renderers/cpp/include/ftl/render/tri_render.hpp b/components/renderers/cpp/include/ftl/render/tri_render.hpp
index e07e9577eb400f1749d70d529a599ac440837e62..6d03fd4a8d39e54202805e4b2b0353ae976e2338 100644
--- a/components/renderers/cpp/include/ftl/render/tri_render.hpp
+++ b/components/renderers/cpp/include/ftl/render/tri_render.hpp
@@ -63,6 +63,7 @@ class Triangular : public ftl::render::Renderer {
 	void __reprojectChannel(ftl::rgbd::Frame &, ftl::codecs::Channel in, ftl::codecs::Channel out, cudaStream_t);
 	void _reprojectChannel(ftl::rgbd::Frame &, ftl::codecs::Channel in, ftl::codecs::Channel out, cudaStream_t);
 	void _dibr(cudaStream_t);
+	void _mesh(cudaStream_t);
 };
 
 }
diff --git a/components/renderers/cpp/src/tri_render.cpp b/components/renderers/cpp/src/tri_render.cpp
index 0e405f9e4677973e95f251039cbac239d03c65e9..58e21c3672343ad3a4a0a73a84ef8833f85da497 100644
--- a/components/renderers/cpp/src/tri_render.cpp
+++ b/components/renderers/cpp/src/tri_render.cpp
@@ -268,12 +268,27 @@ void Triangular::_dibr(cudaStream_t stream) {
 			continue;
 		}
 
-		/*ftl::cuda::dibr_merge(
+		ftl::cuda::dibr_merge(
 			f.createTexture<float4>(Channel::Points),
 			f.createTexture<float4>(Channel::Normals),
 			temp_.createTexture<int>(Channel::Depth2),
 			params_, backcull_, stream
-		);*/
+		);
+	}
+}
+
+void Triangular::_mesh(cudaStream_t stream) {
+	cv::cuda::Stream cvstream = cv::cuda::StreamAccessor::wrapStream(stream);
+	temp_.get<GpuMat>(Channel::Depth2).setTo(cv::Scalar(0x7FFFFFFF), cvstream);
+
+	for (size_t i=0; i < scene_->frames.size(); ++i) {
+		auto &f = scene_->frames[i];
+		auto *s = scene_->sources[i];
+
+		if (f.empty(Channel::Depth + Channel::Colour)) {
+			LOG(ERROR) << "Missing required channel";
+			continue;
+		}
 
 		auto pose = MatrixConversion::toCUDA(s->getPose().cast<float>());
 
@@ -444,7 +459,11 @@ bool Triangular::render(ftl::rgbd::VirtualSource *src, ftl::rgbd::Frame &out) {
 	}
 
 	// Create and render triangles for depth
-	_dibr(stream_);
+	if (splat_) {
+		_mesh(stream_);
+	} else {
+		_dibr(stream_);
+	}
 	
 	// Generate normals
 	ftl::cuda::normals(accum_.createTexture<float4>(Channel::Normals, Format<float4>(camera.width, camera.height)),
diff --git a/components/rgbd-sources/src/sources/net/net.cpp b/components/rgbd-sources/src/sources/net/net.cpp
index 16c5994d491bd1d7794166a26a6174511307cc9b..56b6355eb9696c6684c46a80a6fb3ff1e0584d5a 100644
--- a/components/rgbd-sources/src/sources/net/net.cpp
+++ b/components/rgbd-sources/src/sources/net/net.cpp
@@ -229,7 +229,7 @@ void NetSource::_processConfig(const ftl::codecs::Packet &pkt) {
 	auto unpacked = msgpack::unpack((const char*)pkt.data.data(), pkt.data.size());
 	unpacked.get().convert(cfg);
 
-	LOG(INFO) << "Config Received: " << std::get<1>(cfg);
+	//LOG(INFO) << "Config Received: " << std::get<1>(cfg);
 	// TODO: This needs to be put in safer / better location
 	host_->set(std::get<0>(cfg), nlohmann::json::parse(std::get<1>(cfg)));
 }