diff --git a/applications/tools/simple_viewer/main.cpp b/applications/tools/simple_viewer/main.cpp
index ae7fd54cc253796a60d6a3a73b8a6b24085ae5f1..ba8f1435cbeb09d5cdb4ace3764d22da69a3da87 100644
--- a/applications/tools/simple_viewer/main.cpp
+++ b/applications/tools/simple_viewer/main.cpp
@@ -88,6 +88,8 @@ static void run(ftl::Configurable *root) {
 	std::list<ftl::Handle> handles;
 	ftl::data::Pool pool(2,10);
 
+	std::list<ftl::data::Generator*> generators;
+
 	// Check paths for FTL files to load.
 	auto paths = (*root->get<nlohmann::json>("paths"));
 	int i = 0; //groups.size();
@@ -99,25 +101,57 @@ static void run(ftl::Configurable *root) {
 		// Command line path is ftl file
 		if (ext == "ftl") {
 			auto *gen = createFileGenerator(root, &pool, path);
+			generators.push_back(gen);
+			++i;
+		} else {
+			ftl::URI uri(path);
+			if (uri.getScheme() == ftl::URI::SCHEME_TCP || uri.getScheme() == ftl::URI::SCHEME_WS) {
+				net->connect(path)->waitConnection();
+			}
+		}
+	}
 
-			handles.push_back(std::move(gen->onFrameSet([&](std::shared_ptr<ftl::data::FrameSet> fs) {
-				
-				LOG(INFO) << "Got frameset: " << fs->timestamp();
-				for (auto &f : fs->frames) {
-					if (f.has(Channel::Colour)) {
-						cv::Mat tmp;
-						f.get<cv::cuda::GpuMat>(Channel::Colour).download(tmp);
-						cv::imshow(std::string("Frame")+std::to_string(f.id().id), tmp);
-					}
-				}
+	auto stream_uris = net->findAll<std::string>("list_streams");
+
+	if (stream_uris.size() > 0) {
+		ftl::stream::Muxer *stream = ftl::create<ftl::stream::Muxer>(root, "muxstream");
+		ftl::stream::Receiver *gen = ftl::create<ftl::stream::Receiver>(root, "receiver", &pool);
+		gen->setStream(stream);
+
+		//sender->onRequest([stream](const ftl::codecs::StreamPacket &spkt, const ftl::codecs::Packet &pkt) {
+		//	if (spkt.channel == Channel::Colour) {
+		//		stream->reset();
+		//	}
+		//});
+
+		int count = 0;
+		for (auto &s : stream_uris) {
+			LOG(INFO) << " --- found stream: " << s;
+			auto *nstream = ftl::create<ftl::stream::Net>(stream, std::string("netstream")+std::to_string(count), net);
+			nstream->set("uri", s);
+			stream->add(nstream);
+			++count;
+		}
 
-				cv::waitKey(1);
+		generators.push_back(gen);
+		stream->begin();
+	}
 
-				return true;
-			})));
+	for (auto *g : generators) {
+		handles.push_back(std::move(g->onFrameSet([&](std::shared_ptr<ftl::data::FrameSet> fs) {	
+			LOG(INFO) << "Got frameset: " << fs->timestamp();
+			for (auto &f : fs->frames) {
+				if (f.has(Channel::Colour)) {
+					cv::Mat tmp;
+					f.get<cv::cuda::GpuMat>(Channel::Colour).download(tmp);
+					cv::imshow(std::string("Frame")+std::to_string(f.id().id), tmp);
+				}
+			}
 
-			++i;
-		}
+			cv::waitKey(1);
+
+			return true;
+		})));
 	}
 
 	LOG(INFO) << "Start timer";