diff --git a/SDK/CPP/private/pipeline_impl.cpp b/SDK/CPP/private/pipeline_impl.cpp
index cdc52fce3eb188cabf35a2e2e80353398e4a23ef..7fbbc5131cc0f3d6edc67a5f413bac31ca2a9ba7 100644
--- a/SDK/CPP/private/pipeline_impl.cpp
+++ b/SDK/CPP/private/pipeline_impl.cpp
@@ -42,10 +42,12 @@ void PipelineImpl::submit(const voltu::FramePtr &frame)
 	}
 }
 
-bool PipelineImpl::waitCompletion(int timeout)
+bool PipelineImpl::waitCompletion(int timeout, bool except)
 {
 	int count = timeout / 5;
 	while (!ready_ && --count >= 0) std::this_thread::sleep_for(std::chrono::milliseconds(5));
+
+	if (!ready_) throw voltu::exceptions::Timeout();
 	return ready_;
 }
 
diff --git a/SDK/CPP/private/pipeline_impl.hpp b/SDK/CPP/private/pipeline_impl.hpp
index 98fe41c9018fe328c1cb296e3819d052a8808a73..3413f067a20bfe06bd55c9373b9bc8eb4ac73026 100644
--- a/SDK/CPP/private/pipeline_impl.hpp
+++ b/SDK/CPP/private/pipeline_impl.hpp
@@ -16,7 +16,7 @@ public:
 
 	void submit(const voltu::FramePtr &frame) override;
 
-	bool waitCompletion(int timeout) override;
+	bool waitCompletion(int timeout, bool except) override;
 
 	voltu::OperatorPtr appendOperator(voltu::OperatorId id) override;
 
diff --git a/SDK/CPP/public/include/voltu/pipeline.hpp b/SDK/CPP/public/include/voltu/pipeline.hpp
index f8a201bac088192866886505050b2bce07b51acd..4e2c4ee89d512d22f7e7e675323d09ec3598d9c4 100644
--- a/SDK/CPP/public/include/voltu/pipeline.hpp
+++ b/SDK/CPP/public/include/voltu/pipeline.hpp
@@ -64,7 +64,7 @@ public:
 	 * @param timeout Millisecond timeout, or 0 for non-blocking check.
 	 * @return True if completed
 	 */
-	PY_API virtual bool waitCompletion(int timeout) = 0;
+	PY_API virtual bool waitCompletion(int timeout, bool except=false) = 0;
 
 	/**
 	 * @brief Add an operator to this pipeline.
diff --git a/SDK/CPP/public/include/voltu/voltu.hpp b/SDK/CPP/public/include/voltu/voltu.hpp
index d3e1413b4052c065709aaa7591a9c93d37e7550d..c59518dcf75541a5dca78b6bc6e94dbd83c92047 100644
--- a/SDK/CPP/public/include/voltu/voltu.hpp
+++ b/SDK/CPP/public/include/voltu/voltu.hpp
@@ -8,7 +8,7 @@
 
 // Bump these for each release
 #define VOLTU_VERSION_MAJOR 0    // For API incompatible changes
-#define VOLTU_VERSION_MINOR 3    // For binary compatibility and extensions
+#define VOLTU_VERSION_MINOR 4    // For binary compatibility and extensions
 #define VOLTU_VERSION_PATCH 0    // Binary compatible internal fixes
 
 #define VOLTU_VERSION ((VOLTU_VERSION_MAJOR*10000) + (VOLTU_VERSION_MINOR*100) + VOLTU_VERSION_PATCH)
diff --git a/SDK/CPP/public/samples/fusion_evaluator/main.cpp b/SDK/CPP/public/samples/fusion_evaluator/main.cpp
index 85abd616a41613eb1f77073e8692a918e02641c5..b56ab129b6af9a40468e33bf795e4bf99a2af0ff 100644
--- a/SDK/CPP/public/samples/fusion_evaluator/main.cpp
+++ b/SDK/CPP/public/samples/fusion_evaluator/main.cpp
@@ -91,7 +91,7 @@ int main(int argc, char **argv)
 
 	for (int i=0; i<frameno; ++i)
 	{
-		room->waitNextFrame(5000);
+		room->waitNextFrame(5000, true);
 		room->getFrame();
 	}
 	auto frame = room->getFrame();
@@ -108,7 +108,7 @@ int main(int argc, char **argv)
 	op1->property("mls_iterations")->setInt(iters);
 
 	pipe->submit(frame);
-	pipe->waitCompletion(3000);
+	pipe->waitCompletion(3000, true);
 
 	auto imgset = frame->getImageSet(display_channel);