diff --git a/applications/gui2/src/views/statistics.cpp b/applications/gui2/src/views/statistics.cpp
index c27a2434433dc79c600ce5beb561f22497de5e14..e72bc160aeff19cea61fb49b606e6a21aef89bb7 100644
--- a/applications/gui2/src/views/statistics.cpp
+++ b/applications/gui2/src/views/statistics.cpp
@@ -84,6 +84,7 @@ void StatisticsWidget::draw(NVGcontext *ctx) {
 					else nvgFontFace(ctx, "sans-bold");
 					nvgFillColor(ctx, nanogui::Color(8, 8, 8, 255)); // shadow
 					tw = nvgTextBounds(ctx, pos[0] + width(), rowh, msg.c_str(), nullptr, nullptr);
+					nvgText(ctx, pos[0] + width(), rowh, msg.c_str(), nullptr);
 					nvgFillColor(ctx, colour);
 					nvgText(ctx, pos[0] + width() - 1, rowh - 1, msg.c_str(), nullptr);
 					tw += 10;
diff --git a/components/streams/src/builder.cpp b/components/streams/src/builder.cpp
index 1eae72dcb730880ceba1e0aaf8d3b34f278bbcd4..f4fc8b6a41c1e67fa47f12d22557b5727091fa5b 100644
--- a/components/streams/src/builder.cpp
+++ b/components/streams/src/builder.cpp
@@ -316,11 +316,13 @@ void ForeignBuilder::_schedule() {
 		jobs_++;
 
 		ftl::pool.push([this,fs](int) {
-			// Calling onFrameset but without all frames so mark as partial
-			if (static_cast<size_t>(fs->count) < fs->frames.size()) fs->set(ftl::data::FSFlag::PARTIAL);
-
 			fs->store();
 
+			if (!fs->isComplete()) {
+				fs->set(ftl::data::FSFlag::PARTIAL);
+				fs->frames[0].message(ftl::data::Message::Warning_INCOMPLETE_FRAME, "Frameset not complete");
+			}
+
 			//UNIQUE_LOCK(fs->mutex(), lk2);
 
 			try {
@@ -373,7 +375,7 @@ std::shared_ptr<ftl::data::FrameSet> ForeignBuilder::_getFrameset() {
 		while (N-- > 0 && i != framesets_.end()) ++i;
 	// Otherwise skip to first fully completed frame
 	} else {
-		while (i != framesets_.end() && static_cast<size_t>((*i)->count) < (*i)->frames.size()) ++i;
+		while (i != framesets_.end() && !(*i)->isComplete()) ++i;
 	}
 
 	if (i != framesets_.end()) {