diff --git a/SDK/CPP/CMakeLists.txt b/SDK/CPP/CMakeLists.txt
index 472ac9eb1177098e6bb32e92e1c6831e99ebdc0d..123671c2b6581beba4ab4bd5df167ab1e033a531 100644
--- a/SDK/CPP/CMakeLists.txt
+++ b/SDK/CPP/CMakeLists.txt
@@ -43,7 +43,7 @@ ExternalProject_Add(
 	BINARY_DIR ${SDK_BINARY_DIR}
 	INSTALL_COMMAND ""
 	BUILD_ALWAYS true
-	CMAKE_ARGS -DOpenCV_DIR=${OpenCV_DIR}
+	CMAKE_ARGS -DOpenCV_DIR=${OpenCV_DIR} -DWITH_PYTHON=True
 )
 
 if (BUILD_TESTS)
diff --git a/SDK/CPP/private/room_impl.cpp b/SDK/CPP/private/room_impl.cpp
index 76ab1b92bad65d098c8a0f2a34685edc9219e458..65825d5152c5bad4f01340e52896db2808880c2b 100644
--- a/SDK/CPP/private/room_impl.cpp
+++ b/SDK/CPP/private/room_impl.cpp
@@ -16,7 +16,7 @@ RoomImpl::~RoomImpl()
 	if (filter_) filter_->remove();
 }
 
-bool RoomImpl::waitNextFrame(int64_t timeout)
+bool RoomImpl::waitNextFrame(int64_t timeout, bool except)
 {
 	if (!filter_)
 	{
@@ -40,10 +40,15 @@ bool RoomImpl::waitNextFrame(int64_t timeout)
 				return last_read_ < last_seen_;
 			});
 
+			if (except && last_read_ >= last_seen_)
+			{
+				throw voltu::exceptions::Timeout();
+			}
 			return last_read_ < last_seen_;
 		}
 		else if (timeout == 0)
 		{
+			if (except) throw voltu::exceptions::Timeout();
 			return false;
 		}
 		else
diff --git a/SDK/CPP/private/room_impl.hpp b/SDK/CPP/private/room_impl.hpp
index be8516a637b316c9a3964b14952f11fcadd23459..67d44474de421f97ba178ce509d1e72e2b76be46 100644
--- a/SDK/CPP/private/room_impl.hpp
+++ b/SDK/CPP/private/room_impl.hpp
@@ -16,7 +16,7 @@ public:
 	
 	~RoomImpl() override;
 
-	bool waitNextFrame(int64_t) override;
+	bool waitNextFrame(int64_t, bool except) override;
 
 	voltu::FramePtr getFrame() override;
 
diff --git a/SDK/CPP/private/system.cpp b/SDK/CPP/private/system.cpp
index 84bdbcd406793b0a1b51300b2f7ef0e860e67287..f711a3783c3edc0751d90931b2806e3b5f67e10b 100644
--- a/SDK/CPP/private/system.cpp
+++ b/SDK/CPP/private/system.cpp
@@ -87,6 +87,11 @@ std::list<voltu::RoomId> SystemImpl::listRooms()
 
 voltu::RoomPtr SystemImpl::getRoom(voltu::RoomId id)
 {
+	if (feed_->getURI(id).size() == 0)
+	{
+		throw voltu::exceptions::InvalidRoomId();
+	}
+
 	auto s = std::make_shared<voltu::internal::RoomImpl>(feed_);
 	s->addFrameSet(id);
 	return s;
diff --git a/SDK/CPP/public/include/voltu/room.hpp b/SDK/CPP/public/include/voltu/room.hpp
index 87f0f070cc3fae52bd52a6046c6cd4ae299680ea..f2578236c85c42bc64eb4413c8ba6c616be9bfb8 100644
--- a/SDK/CPP/public/include/voltu/room.hpp
+++ b/SDK/CPP/public/include/voltu/room.hpp
@@ -70,7 +70,7 @@ public:
 	 * @param timeout Millisecond timeout, or 0 or -1.
 	 * @return True if a new unseen frame is available.
 	 */
-	PY_API virtual bool waitNextFrame(int64_t timeout) = 0;
+	PY_API virtual bool waitNextFrame(int64_t timeout, bool except=false) = 0;
 
 	/**
 	 * @brief Check if a new frame is available.
diff --git a/SDK/CPP/public/include/voltu/types/errors.hpp b/SDK/CPP/public/include/voltu/types/errors.hpp
index b1e77accc50f9975698db4f61be11a5dd7b1c330..b42964ef8002437e90b2352c9b46d35610faedec 100644
--- a/SDK/CPP/public/include/voltu/types/errors.hpp
+++ b/SDK/CPP/public/include/voltu/types/errors.hpp
@@ -47,6 +47,7 @@ VOLTU_EXCEPTION(NotImplemented, Exception, "Functionality not implemented");
 VOLTU_EXCEPTION(ReadOnly, Exception, "Read only, write not allowed");
 VOLTU_EXCEPTION(WriteOnly, Exception, "Write only, read not allowed");
 VOLTU_EXCEPTION(IncompatibleOperation, Exception, "The input data and operator are incompatible");
+VOLTU_EXCEPTION(Timeout, Exception, "Request timed out");
 
 }
 }
diff --git a/SDK/CPP/public/include/voltu/voltu.hpp b/SDK/CPP/public/include/voltu/voltu.hpp
index a2c4c0a142341a9c145999bc1cadd530271c25b7..d3e1413b4052c065709aaa7591a9c93d37e7550d 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 2    // For binary compatibility and extensions
+#define VOLTU_VERSION_MINOR 3    // 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)