diff --git a/applications/gui2/src/modules/camera.cpp b/applications/gui2/src/modules/camera.cpp
index 7ffe5e6eb2db3aa28e5a455e74e97fbe8344a476..9cad119ad9a6bfb07977728ddc0991e8c3facc2f 100644
--- a/applications/gui2/src/modules/camera.cpp
+++ b/applications/gui2/src/modules/camera.cpp
@@ -214,6 +214,11 @@ void Camera::setVolume(float v) {
 	return io->speaker()->setVolume(v);
 }
 
+void Camera::setPaused(bool set) {
+	paused_ = set;
+	io->feed()->muxer()->set("paused", set);
+}
+
 std::unordered_set<Channel> Camera::availableChannels() {
 	if (std::atomic_load(&latest_)) {
 		return latest_->frames[frame_idx].available();
@@ -257,8 +262,6 @@ void Camera::activate(ftl::data::FrameID id) {
 	filter_ = io->feed()->filter(std::unordered_set<unsigned int>{id.frameset()}, {Channel::Left});
 	filter_->on(
 		[this, feed = io->feed(), speaker = io->speaker()](ftl::data::FrameSetPtr fs){
-			if (paused_) return true;
-
 			std::atomic_store(&current_fs_, fs);
 			std::atomic_store(&latest_, fs);
 
diff --git a/applications/gui2/src/modules/camera.hpp b/applications/gui2/src/modules/camera.hpp
index fa0d756ceee92545de014b1be9848b9e29004ae8..e098bdcec465b9092c836f24259e6d9c4a0aa71f 100644
--- a/applications/gui2/src/modules/camera.hpp
+++ b/applications/gui2/src/modules/camera.hpp
@@ -21,8 +21,8 @@ public:
 
 	virtual void activate(ftl::data::FrameID id);
 	void setChannel(ftl::codecs::Channel c);
-	void setPaused(bool set) { paused_ = set; };
-	bool isPaused() { return paused_; }
+	void setPaused(bool set);
+	bool isPaused() const { return paused_; }
 
 	void toggleOverlay();
 
diff --git a/components/streams/include/ftl/streams/feed.hpp b/components/streams/include/ftl/streams/feed.hpp
index 7a5d05794dcc53b7764db81ccbdbfa313a858a1f..4d6a0ebc8a32edbabad3c860f37e433ffa11db80 100644
--- a/components/streams/include/ftl/streams/feed.hpp
+++ b/components/streams/include/ftl/streams/feed.hpp
@@ -177,6 +177,8 @@ public:
 
 	void lowLatencyMode();
 
+	ftl::stream::Muxer *muxer() const { return stream_.get(); }
+
 private:
 	// public methods acquire lock if necessary, private methods assume locking
 	// managed by caller
diff --git a/components/streams/include/ftl/streams/stream.hpp b/components/streams/include/ftl/streams/stream.hpp
index 3ddc80149c64ace933ac30bce0fa8cfbbce45ac4..451acdf354d7dbe77b4ebe2393d0fea6a8f8abc1 100644
--- a/components/streams/include/ftl/streams/stream.hpp
+++ b/components/streams/include/ftl/streams/stream.hpp
@@ -151,6 +151,7 @@ class Muxer : public Stream {
 
 	void _notify(const ftl::codecs::StreamPacket &spkt, const ftl::codecs::Packet &pkt);
 	int _lookup(size_t fsid, StreamEntry *se, int ssid, int count);
+	void _forward(const std::string &name);
 };
 
 /**
diff --git a/components/streams/src/filestream.cpp b/components/streams/src/filestream.cpp
index a49b743e799413123178a71483a6782988b76c63..0044d014233690dc683e6f5ca18ab7def86895b9 100644
--- a/components/streams/src/filestream.cpp
+++ b/components/streams/src/filestream.cpp
@@ -225,6 +225,9 @@ bool File::tick(int64_t ts) {
 		return false;
 	}
 
+	// Skip if paused
+	if (value("paused", false)) return true;
+
 	#ifdef DEBUG_MUTEX
 	UNIQUE_LOCK(mutex_, lk);
 	#else
diff --git a/components/streams/src/stream.cpp b/components/streams/src/stream.cpp
index b68bc01862d7b98bb5c903f7244444d70e035898..a0c61f4e3ae3dc49e2d5d53d60615823e4af0662 100644
--- a/components/streams/src/stream.cpp
+++ b/components/streams/src/stream.cpp
@@ -1,4 +1,5 @@
 #include <ftl/streams/stream.hpp>
+#include <nlohmann/json.hpp>
 
 #define LOGURU_WITH_STREAMS 1
 #include <loguru.hpp>
@@ -75,7 +76,8 @@ void Stream::reset() {
 // ==== Muxer ==================================================================
 
 Muxer::Muxer(nlohmann::json &config) : Stream(config), nid_{0} {
-
+	value("paused", false);
+	_forward("paused");
 }
 
 Muxer::~Muxer() {
@@ -85,6 +87,16 @@ Muxer::~Muxer() {
 	}
 }
 
+void Muxer::_forward(const std::string &name) {
+	on(name, [this,name]() {
+		auto val = getConfig()[name];
+		UNIQUE_LOCK(mutex_,lk);
+		for (auto &se : streams_) {
+			se.stream->set(name, val);
+		}
+	});
+}
+
 
 void Muxer::add(Stream *s, size_t fsid, const std::function<int()> &cb) {
 	UNIQUE_LOCK(mutex_,lk);