diff --git a/components/net/cpp/include/ftl/net/universe.hpp b/components/net/cpp/include/ftl/net/universe.hpp
index 6cc631a06ac509b96f615aa046c51bf5b55ded81..193d29ace1148489d34dd24aa3b325b38508766c 100644
--- a/components/net/cpp/include/ftl/net/universe.hpp
+++ b/components/net/cpp/include/ftl/net/universe.hpp
@@ -85,6 +85,9 @@ class Universe : public ftl::Configurable {
 	 * @param addr URI giving protocol, interface and port
 	 */
 	Peer *connect(const std::string &addr);
+
+	bool isConnected(const ftl::URI &uri);
+	bool isConnected(const std::string &s);
 	
 	size_t numberOfPeers() const { return peers_.size(); }
 
diff --git a/components/net/cpp/src/universe.cpp b/components/net/cpp/src/universe.cpp
index 7a6b3404eebb2db338bd1243ae4c7ceb00a077e3..4fdba608f62ea64ef4cd16c547ecaa018034c8f6 100644
--- a/components/net/cpp/src/universe.cpp
+++ b/components/net/cpp/src/universe.cpp
@@ -148,15 +148,26 @@ bool Universe::listen(const string &addr) {
 	return l->isListening();
 }
 
+bool Universe::isConnected(const ftl::URI &uri) {
+	UNIQUE_LOCK(net_mutex_,lk);
+	return (peer_by_uri_.find(uri.getBaseURI()) != peer_by_uri_.end());
+}
+
+bool Universe::isConnected(const std::string &s) {
+	ftl::URI uri(s);
+	return isConnected(uri);
+}
+
 Peer *Universe::connect(const string &addr) {
+	ftl::URI u(addr);
+
 	// 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];
+		if (peer_by_uri_.find(u.getBaseURI()) != peer_by_uri_.end()) {
+			return peer_by_uri_.at(u.getBaseURI());
 		}
 
-		ftl::URI u(addr);
 		if (u.getHost() == "localhost" || u.getHost() == "127.0.0.1") {
 			for (const auto *l : listeners_) {
 				if (l->port() == u.getPort()) {
@@ -173,7 +184,7 @@ Peer *Universe::connect(const string &addr) {
 	if (p->status() != Peer::kInvalid) {
 		UNIQUE_LOCK(net_mutex_,lk);
 		peers_.push_back(p);
-		peer_by_uri_[addr] = p;
+		peer_by_uri_[u.getBaseURI()] = p;
 	}
 	
 	_installBindings(p);
diff --git a/components/streams/src/feed.cpp b/components/streams/src/feed.cpp
index 47c388ca3d64ad4e14e620da7ef4fa3a6eb5c745..a06e43b04663f072e3bee641a162af0704360e85 100644
--- a/components/streams/src/feed.cpp
+++ b/components/streams/src/feed.cpp
@@ -600,8 +600,13 @@ bool Feed::sourceAvailable(const std::string &uri) {
 
 bool Feed::sourceActive(const std::string &suri) {
 	ftl::URI uri(suri);
-	SHARED_LOCK(mtx_, lk);
-	return fsid_lookup_.count(uri.getBaseURI()) > 0;
+
+	if (uri.getScheme() == ftl::URI::SCHEME_TCP || uri.getScheme() == ftl::URI::SCHEME_WS) {
+		return net_->isConnected(uri);
+	} else {
+		SHARED_LOCK(mtx_, lk);
+		return fsid_lookup_.count(uri.getBaseURI()) > 0;
+	}
 }
 
 std::string Feed::getName(const std::string &puri) {