diff --git a/applications/gui/src/ctrl_window.cpp b/applications/gui/src/ctrl_window.cpp
index 3ab9285ed0e26e5cbdc2f1d03406a5c7858734d6..7b4308e584c88227f98f17064e5094c50a65a36a 100644
--- a/applications/gui/src/ctrl_window.cpp
+++ b/applications/gui/src/ctrl_window.cpp
@@ -1,13 +1,39 @@
 #include "ctrl_window.hpp"
 
 #include <nanogui/layout.h>
+#include <nanogui/label.h>
+#include <nanogui/combobox.h>
+
+#include <vector>
+#include <string>
 
 using ftl::gui::ControlWindow;
+using std::string;
+using std::vector;
 
 
 ControlWindow::ControlWindow(nanogui::Widget *parent, ftl::ctrl::Master *ctrl)
 		: nanogui::Window(parent, "Control"), ctrl_(ctrl) {
 	setLayout(new nanogui::GroupLayout());
+
+	using namespace nanogui;
+
+	new Label(this, "Select Node","sans-bold");
+	vector<string> details = ctrl->getSlaves();
+	LOG(INFO) << "Details count = " << details.size();
+
+	vector<string> available;
+	for (auto &d : details) {
+		auto detail = ftl::config::json_t::parse(d);
+		LOG(INFO) << "DETAIL RECEIVED " << detail;
+		available.push_back(detail["title"].get<string>());
+	}
+
+	auto select = new ComboBox(this, available);
+	select->setCallback([this,available](int ix) {
+		LOG(INFO) << "Change node: " << ix;
+		
+	});
 }
 
 ControlWindow::~ControlWindow() {
diff --git a/applications/gui/src/main.cpp b/applications/gui/src/main.cpp
index a62a091dbeb80700062f4fe772ad4c1f409f2161..5ada2cba5d4eece9bb89c2eb022bdead3a545a55 100644
--- a/applications/gui/src/main.cpp
+++ b/applications/gui/src/main.cpp
@@ -168,6 +168,14 @@ class FTLApplication : public nanogui::Screen {
 				imageWindow->setLayout(new GroupLayout());
 				imageWindow->setSize(Vector2i(400,400));
 
+				new Label(imageWindow, "Select source","sans-bold");
+				auto available = net->findAll<string>("list_streams");
+				auto select = new ComboBox(imageWindow, available);
+				select->setCallback([this,available](int ix) {
+					LOG(INFO) << "Change source: " << ix;
+					
+				});
+
 				auto imageView = new VirtualCameraView(imageWindow);
 				//cam.view = imageView;
 				imageView->setGridThreshold(20);
@@ -179,18 +187,7 @@ class FTLApplication : public nanogui::Screen {
 			}
 		}
 
-		auto window = new Window(this, "Sources");
-		window->setLayout(new GroupLayout());
-
-		new Label(window, "Select source","sans-bold");
-		auto available = net->findAll<string>("list_streams");
-		auto select = new ComboBox(window, available);
-		select->setCallback([this,available](int ix) {
-			LOG(INFO) << "Change source: " << ix;
-			
-		});
-
-		window = new ftl::gui::ControlWindow(this, controller);
+		auto window = new ftl::gui::ControlWindow(this, controller);
 
 		setVisible(true);
 		performLayout();
diff --git a/components/common/cpp/include/loguru.hpp b/components/common/cpp/include/loguru.hpp
index e43dc742e83d21405dacdafafa830a3251703998..a65ab2be28f1eeff9f918f075a0e7c78f9a04ba3 100644
--- a/components/common/cpp/include/loguru.hpp
+++ b/components/common/cpp/include/loguru.hpp
@@ -98,6 +98,7 @@ Website: www.ilikebigbits.com
 #define LOGURU_VERSION_PATCH 0
 
 #define LOGURU_REPLACE_GLOG 1
+#define LOGURU_CATCH_SIGABRT 0
 
 #if defined(_MSC_VER)
 #include <sal.h>	// Needed for _In_z_ etc annotations
diff --git a/components/control/cpp/include/ftl/master.hpp b/components/control/cpp/include/ftl/master.hpp
index e069f12fcdfc813c27db76dbb75795b23f2570b0..17ca49c2c2fc9f08ebf5f7183f7c7cbbe10baf32 100644
--- a/components/control/cpp/include/ftl/master.hpp
+++ b/components/control/cpp/include/ftl/master.hpp
@@ -37,6 +37,8 @@ class Master {
 
 	std::vector<std::string> getConfigurables(const ftl::UUID &peer);
 
+	std::vector<std::string> getSlaves();
+
 	std::vector<ftl::config::json_t> get(const std::string &uri);
 
 	ftl::config::json_t getOne(const std::string &uri);
diff --git a/components/control/cpp/src/master.cpp b/components/control/cpp/src/master.cpp
index 1724f1dd58f84610ba0bb576cb241bf2958137b8..5072c41553524bfae22f86702383f3f364a3a433 100644
--- a/components/control/cpp/src/master.cpp
+++ b/components/control/cpp/src/master.cpp
@@ -47,6 +47,10 @@ void Master::set(const ftl::UUID &peer, const string &uri, json_t &value) {
 	net_->send(peer, "update_cfg", uri, (string)value);
 }
 
+vector<string> Master::getSlaves() {
+	return net_->findAll<string>("slave_details");
+}
+
 vector<string> Master::getConfigurables() {
 	return {};
 }
diff --git a/components/control/cpp/src/slave.cpp b/components/control/cpp/src/slave.cpp
index 8a6253195f5a38c69389868569d6eb9ba98fe990..fd348c18124e04117c70d85479180286f152d69b 100644
--- a/components/control/cpp/src/slave.cpp
+++ b/components/control/cpp/src/slave.cpp
@@ -4,6 +4,7 @@
 using ftl::Configurable;
 using ftl::net::Universe;
 using ftl::ctrl::Slave;
+using std::string;
 
 static void netLog(void* user_data, const loguru::Message& message) {
 	Universe *net = (Universe*)user_data;
@@ -30,6 +31,14 @@ Slave::Slave(Universe *net, ftl::Configurable *root) {
 		return ftl::config::resolve(uri);
 	});
 
+	net->bind("slave_details", [net,root]() -> std::vector<std::string> {
+		ftl::config::json_t json {
+			{"id", net->id().to_string()},
+			{"title", root->value("title", *root->get<string>("$id"))}
+		};
+		return {json.dump()};
+	});
+
 	loguru::add_callback("net_log", netLog, net, loguru::Verbosity_INFO);
 }
 
diff --git a/components/net/cpp/include/ftl/net/universe.hpp b/components/net/cpp/include/ftl/net/universe.hpp
index 169eff58923b115287539c50358fe1840e91ce57..5ce99f3a5f781991f44ed1d33c24e0f717371e53 100644
--- a/components/net/cpp/include/ftl/net/universe.hpp
+++ b/components/net/cpp/include/ftl/net/universe.hpp
@@ -278,7 +278,7 @@ template <typename R, typename... ARGS>
 R Universe::call(const ftl::UUID &pid, const std::string &name, ARGS... args) {
 	Peer *p = getPeer(pid);
 	if (p == nullptr) {
-		LOG(ERROR) << "Attempting to call an unknown peer : " << pid.to_string();
+		DLOG(WARNING) << "Attempting to call an unknown peer : " << pid.to_string();
 		throw -1;
 	}
 	return p->call<R>(name, args...);
@@ -288,7 +288,7 @@ template <typename... ARGS>
 void Universe::send(const ftl::UUID &pid, const std::string &name, ARGS... args) {
 	Peer *p = getPeer(pid);
 	if (p == nullptr) {
-		LOG(ERROR) << "Attempting to call an unknown peer : " << pid.to_string();
+		DLOG(WARNING) << "Attempting to call an unknown peer : " << pid.to_string();
 		throw -1;
 	}
 	p->send(name, args...);
diff --git a/components/rgbd-sources/include/ftl/rgbd_streamer.hpp b/components/rgbd-sources/include/ftl/rgbd_streamer.hpp
index 3d62721896c563711af7e1c2531900de246a504e..51c7a2e58bd2805968fdabedef32d3995c2726a3 100644
--- a/components/rgbd-sources/include/ftl/rgbd_streamer.hpp
+++ b/components/rgbd-sources/include/ftl/rgbd_streamer.hpp
@@ -61,6 +61,7 @@ class Streamer : public ftl::Configurable {
 	std::shared_mutex mutex_;
 	bool active_;
 	ftl::net::Universe *net_;
+	bool late_;
 
 	void _schedule();
 	void _swap(detail::StreamSource &);
diff --git a/components/rgbd-sources/src/rgbd_streamer.cpp b/components/rgbd-sources/src/rgbd_streamer.cpp
index 472f05cf2a24cf93b8af8e0da5c57a29ecedb01e..6d6157936637c88e1f66d2ccf36b6136676688f0 100644
--- a/components/rgbd-sources/src/rgbd_streamer.cpp
+++ b/components/rgbd-sources/src/rgbd_streamer.cpp
@@ -24,7 +24,7 @@ using std::chrono::milliseconds;
 #define THREAD_POOL_SIZE 6
 
 Streamer::Streamer(nlohmann::json &config, Universe *net)
-		: ftl::Configurable(config), pool_(THREAD_POOL_SIZE) {
+		: ftl::Configurable(config), pool_(THREAD_POOL_SIZE), late_(false) {
 
 	active_ = false;
 	net_ = net;
@@ -169,11 +169,15 @@ void Streamer::_schedule() {
 
 		shared_lock<shared_mutex> slk(s.second->mutex);
 		if (s.second->state != 0) {
-			LOG(WARNING) << "Stream not ready to schedule on time: " << uri;
+			if (!late_) LOG(WARNING) << "Stream not ready to schedule on time: " << uri;
+			late_ = true;
 			continue;
+		} else {
+			late_ = false;
 		}
+
 		if (s.second->clients[0].size() == 0) {
-			LOG(ERROR) << "Stream has no clients: " << uri;
+			//LOG(ERROR) << "Stream has no clients: " << uri;
 			continue;
 		}
 		slk.unlock();
@@ -184,7 +188,7 @@ void Streamer::_schedule() {
 			src->src->grab();
 
 			unique_lock<shared_mutex> lk(src->mutex);
-			LOG(INFO) << "Grab frame";
+			//LOG(INFO) << "Grab frame";
 			src->state |= ftl::rgbd::detail::kGrabbed;
 			_swap(*src);
 		});
@@ -225,7 +229,7 @@ void Streamer::_schedule() {
 			}
 
 			unique_lock<shared_mutex> lk(src->mutex);
-			LOG(INFO) << "Tx Frame: " << uri;
+			DLOG(2) << "Tx Frame: " << uri;
 			src->state |= ftl::rgbd::detail::kTransmitted;
 			_swap(*src);
 		});