diff --git a/applications/reconstruct/src/main.cpp b/applications/reconstruct/src/main.cpp
index 09791e3f16d87222f2b9edb4b3b18d8daeff2076..1f6201403f44ca4922e306e6355ec353c9403d35 100644
--- a/applications/reconstruct/src/main.cpp
+++ b/applications/reconstruct/src/main.cpp
@@ -426,7 +426,7 @@ static void run() {
 
 	ftl::rgbd::Streamer stream(config, &net);
 	stream.add(virt);
-	stream.run();
+	//stream.run();
 
 	unsigned char frameCount = 0;
 	bool paused = false;
@@ -472,7 +472,9 @@ static void run() {
 
 		frameCount++;
 
+		stream.poll();
 		display.update();
+		//sleep_for(milliseconds(10));
 	}
 }
 
diff --git a/components/renderers/cpp/src/rgbd_display.cpp b/components/renderers/cpp/src/rgbd_display.cpp
index 473878548586a5508e97622fe31bbf1b55f7fe55..edc8ada98a93542256f212994df230391427a907 100644
--- a/components/renderers/cpp/src/rgbd_display.cpp
+++ b/components/renderers/cpp/src/rgbd_display.cpp
@@ -123,7 +123,7 @@ void Display::update() {
 	source_->setPose(viewPose);
 
 	Mat rgb, depth;
-	source_->grab();
+	//source_->grab();
 	source_->getRGBD(rgb, depth);
 	if (rgb.rows > 0) cv::imshow(name_, rgb);
 	wait(1);
diff --git a/components/rgbd-sources/include/ftl/rgbd_streamer.hpp b/components/rgbd-sources/include/ftl/rgbd_streamer.hpp
index 8eb7460c77d41415a2a2051a7593597037119c52..8218518edfed0efd68db8c13f8b4ac579d7aff75 100644
--- a/components/rgbd-sources/include/ftl/rgbd_streamer.hpp
+++ b/components/rgbd-sources/include/ftl/rgbd_streamer.hpp
@@ -51,6 +51,7 @@ class Streamer : public ftl::Configurable {
 
 	void run(bool block=false);
 	void stop();
+	void poll();
 
 	RGBDSource *get(const std::string &uri);
 
diff --git a/components/rgbd-sources/src/rgbd_streamer.cpp b/components/rgbd-sources/src/rgbd_streamer.cpp
index b4e256169d598587a637e35624750d8ed3370f90..06d40fd2edcd89bfad54239ff2665d4fb2e1c9da 100644
--- a/components/rgbd-sources/src/rgbd_streamer.cpp
+++ b/components/rgbd-sources/src/rgbd_streamer.cpp
@@ -113,34 +113,30 @@ void Streamer::stop() {
 	active_ = false;
 }
 
+void Streamer::poll() {
+	double wait = 1.0f / 25.0f;
+	auto start = std::chrono::high_resolution_clock::now();
+	// Create frame jobs at correct FPS interval
+	_schedule();
+
+	std::chrono::duration<double> elapsed =
+		std::chrono::high_resolution_clock::now() - start;
+
+	sleep_for(milliseconds((long long)((wait - elapsed.count()) * 1000.0f)));
+}
+
 void Streamer::run(bool block) {
 	active_ = true;
 
 	if (block) {
 		while (active_) {
-			double wait = 1.0f / 25.0f;
-			auto start = std::chrono::high_resolution_clock::now();
-			// Create frame jobs at correct FPS interval
-			_schedule();
-
-			std::chrono::duration<double> elapsed =
-				std::chrono::high_resolution_clock::now() - start;
-
-			sleep_for(milliseconds((long long)((wait - elapsed.count()) * 1000.0f)));
+			poll();
 		}
 	} else {
 		// Create thread job for frame ticking
 		pool_.push([this](int id) {
 			while (active_) {
-				double wait = 1.0f / 25.0f;
-				auto start = std::chrono::high_resolution_clock::now();
-				// Create frame jobs at correct FPS interval
-				_schedule();
-
-				std::chrono::duration<double> elapsed =
-					std::chrono::high_resolution_clock::now() - start;
-
-				sleep_for(milliseconds((long long)((wait - elapsed.count()) * 1000.0f)));
+				poll();
 			}
 		});
 	}