diff --git a/components/codecs/include/ftl/codecs/nvidia_encoder.hpp b/components/codecs/include/ftl/codecs/nvidia_encoder.hpp
index db3f3d4dfa3855efd72cbd0b129d27728db33c5b..5bff3adfdcc145d958c76ca941d76e426f3ee6b5 100644
--- a/components/codecs/include/ftl/codecs/nvidia_encoder.hpp
+++ b/components/codecs/include/ftl/codecs/nvidia_encoder.hpp
@@ -43,6 +43,7 @@ class NvidiaEncoder : public ftl::codecs::Encoder {
 	Parameters params_;
 
 	bool was_reset_;
+	int64_t frame_count_ = 0;
 
 	bool _createEncoder(const cv::cuda::GpuMat &in, const ftl::codecs::Packet &pkt);
 	ftl::codecs::definition_t _verifiedDefinition(ftl::codecs::definition_t def, const cv::cuda::GpuMat &in);
diff --git a/components/codecs/src/nvidia_encoder.cpp b/components/codecs/src/nvidia_encoder.cpp
index 10e3d2e0b5938a276a36202223963d97b07c3a07..65b9ec32013b58fe9267aaf00151e6f3e0dc5082 100644
--- a/components/codecs/src/nvidia_encoder.cpp
+++ b/components/codecs/src/nvidia_encoder.cpp
@@ -198,6 +198,11 @@ bool NvidiaEncoder::encode(const cv::cuda::GpuMat &in, ftl::codecs::Packet &pkt)
 	// Make sure conversions complete...
 	stream_.waitForCompletion();
 
+	// Insert periodic i-frames here.
+	if (((++frame_count_) % 128) == 0) {
+		was_reset_ = true;
+	}
+
 	uint64_t cs = _encode(pkt.data.data(), pkt.data.size(), was_reset_);
 	pkt.data.resize(cs);
 	was_reset_ = false;
@@ -218,6 +223,8 @@ bool NvidiaEncoder::_createEncoder(const cv::cuda::GpuMat &in, const ftl::codecs
 	LOG(INFO) << "Calculated bitrate " << (float(bitrate) / 1024.0f / 1024.0f) << "Mbps (" << int(pkt.bitrate) << ")";
 	
 	params_ = params;
+	frame_count_ = 0;
+	was_reset_ = true;
 
 	const int fps = 1000/ftl::timer::getInterval();
 	
diff --git a/components/streams/src/netstream.cpp b/components/streams/src/netstream.cpp
index 19ca6f08328153f2dd430ef362fc3fa9b9884560..62864077276916106d17c53bb3bfc5ce051b03b2 100644
--- a/components/streams/src/netstream.cpp
+++ b/components/streams/src/netstream.cpp
@@ -324,7 +324,7 @@ bool Net::begin() {
 	active_ = true;
 	
 	// Initially send a colour request just to create the connection
-	_sendRequest(Channel::Colour, kAllFramesets, kAllFrames, 30, 255);
+	_sendRequest(Channel::Colour, kAllFramesets, kAllFrames, 30, 255, true);
 
 	return true;
 }
diff --git a/components/streams/src/sender.cpp b/components/streams/src/sender.cpp
index ebd778a3298b212dc5845553ea8473d1ccfb8712..a47e9854a38784802e0b26ee344a20c790b77ac9 100644
--- a/components/streams/src/sender.cpp
+++ b/components/streams/src/sender.cpp
@@ -134,7 +134,10 @@ void Sender::fakePost(ftl::data::FrameSet &fs, ftl::codecs::Channel c) {
 bool Sender::_checkNeedsIFrame(int64_t ts, bool injecting) {
 	int mspf = ftl::timer::getInterval();
 
-	if (injecting) injection_timestamp_ = ts+2*mspf;
+	if (injecting) {
+		LOG(INFO) << "Inject persistent state: " << ts;
+		injection_timestamp_ = ts+2*mspf;
+	}
 
 	// Add an iframe at the requested frequency.
 	//if (add_iframes_ > 0 && ts != timestamp_) iframe_ = (iframe_+1) % add_iframes_;