diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp
index 81b1defb95b74ae57b86cc5e581087a3407e6f5a..01e59191af54d0562a9b834d52f96050d0499136 100644
--- a/include/vkcv/Core.hpp
+++ b/include/vkcv/Core.hpp
@@ -218,7 +218,7 @@ namespace vkcv
 		/**
 		 * @brief start recording command buffers and increment frame index
 		*/
-		void beginFrame(uint32_t& width, uint32_t& height);
+		bool beginFrame(uint32_t& width, uint32_t& height);
 
 		void recordDrawcallsToCmdStream(
             const CommandStreamHandle       cmdStreamHandle,
diff --git a/projects/cmd_sync_test/src/main.cpp b/projects/cmd_sync_test/src/main.cpp
index e3283fb188c2b15fc84cc05dd8a1be41456dd8fb..c3455be6dadb8f8c0ffd34e52080c80570b3ee58 100644
--- a/projects/cmd_sync_test/src/main.cpp
+++ b/projects/cmd_sync_test/src/main.cpp
@@ -164,7 +164,9 @@ int main(int argc, const char** argv) {
 		vkcv::Window::pollEvents();
 		
 		uint32_t swapchainWidth, swapchainHeight;
-		core.beginFrame(swapchainWidth, swapchainHeight);
+		if (!core.beginFrame(swapchainWidth, swapchainHeight)) {
+			continue;
+		}
 		
 		if ((swapchainWidth != windowWidth) || ((swapchainHeight != windowHeight))) {
 			depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle();
diff --git a/projects/first_mesh/src/main.cpp b/projects/first_mesh/src/main.cpp
index 97e866c3687640e6b6c7b489aedf747d15d8dd2b..cd0e096002869a4752affae14ba757e224ca9332 100644
--- a/projects/first_mesh/src/main.cpp
+++ b/projects/first_mesh/src/main.cpp
@@ -152,7 +152,9 @@ int main(int argc, const char** argv) {
 			continue;
 		
 		uint32_t swapchainWidth, swapchainHeight;
-		core.beginFrame(swapchainWidth, swapchainHeight);
+		if (!core.beginFrame(swapchainWidth, swapchainHeight)) {
+			continue;
+		}
 		
 		if ((swapchainWidth != windowWidth) || ((swapchainHeight != windowHeight))) {
 			depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle();
diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp
index 70366d1325bc101d9cfaa82272d70afc5a3865ae..2ede653ff98e19159e0155b282cab1b309a13816 100644
--- a/projects/first_triangle/src/main.cpp
+++ b/projects/first_triangle/src/main.cpp
@@ -144,7 +144,9 @@ int main(int argc, const char** argv) {
         window.pollEvents();
 		
 		uint32_t swapchainWidth, swapchainHeight; // No resizing = No problem
-		core.beginFrame(swapchainWidth, swapchainHeight);
+		if (!core.beginFrame(swapchainWidth, swapchainHeight)) {
+			continue;
+		}
 		
         auto end = std::chrono::system_clock::now();
         auto deltatime = end - start;
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index ddcb0086db0053a4c0afdf70b9b95a27f822567e..908cb617052e67f9ffb62775845ff8e861300d66 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -109,17 +109,23 @@ namespace vkcv
 
 	Result Core::acquireSwapchainImage() {
     	uint32_t imageIndex;
+		
+    	vk::Result result;
     	
-		const auto& acquireResult = m_Context.getDevice().acquireNextImageKHR(
-			m_swapchain.getSwapchain(), 
-			std::numeric_limits<uint64_t>::max(), 
-			m_SyncResources.swapchainImageAcquired,
-			nullptr, 
-			&imageIndex, {}
-		);
+		try {
+			result = m_Context.getDevice().acquireNextImageKHR(
+					m_swapchain.getSwapchain(),
+					std::numeric_limits<uint64_t>::max(),
+					m_SyncResources.swapchainImageAcquired,
+					nullptr,
+					&imageIndex, {}
+			);
+		} catch (vk::OutOfDateKHRError e) {
+			result = vk::Result::eErrorOutOfDateKHR;
+		}
 		
-		if (acquireResult != vk::Result::eSuccess) {
-			std::cerr << vk::to_string(acquireResult) << std::endl;
+		if (result != vk::Result::eSuccess) {
+			std::cerr << vk::to_string(result) << std::endl;
 			return Result::ERROR;
 		}
 		
@@ -127,7 +133,7 @@ namespace vkcv
 		return Result::SUCCESS;
 	}
 
-	void Core::beginFrame(uint32_t& width, uint32_t& height) {
+	bool Core::beginFrame(uint32_t& width, uint32_t& height) {
 		if (m_swapchain.shouldUpdateSwapchain()) {
 			m_Context.getDevice().waitIdle();
 			
@@ -154,6 +160,8 @@ namespace vkcv
 		
 		width = extent.width;
 		height = extent.height;
+		
+		return (m_currentSwapchainImageIndex != std::numeric_limits<uint32_t>::max());
 	}
 
 	void Core::recordDrawcallsToCmdStream(
@@ -302,16 +310,22 @@ namespace vkcv
 			m_SyncResources.renderFinished, 
 			m_SyncResources.swapchainImageAcquired };
 
-		vk::Result presentResult;
 		const vk::SwapchainKHR& swapchain = m_swapchain.getSwapchain();
 		const vk::PresentInfoKHR presentInfo(
 			waitSemaphores,
 			swapchain,
-			m_currentSwapchainImageIndex, 
-			presentResult);
-			queueManager.getPresentQueue().handle.presentKHR(presentInfo);
-		if (presentResult != vk::Result::eSuccess) {
-			std::cout << "Error: swapchain present failed" << std::endl;
+			m_currentSwapchainImageIndex);
+		
+		vk::Result result;
+		
+		try {
+			result = queueManager.getPresentQueue().handle.presentKHR(presentInfo);
+		} catch (vk::OutOfDateKHRError e) {
+			result = vk::Result::eErrorOutOfDateKHR;
+		}
+		
+		if (result != vk::Result::eSuccess) {
+			std::cout << "Error: swapchain present failed... " << vk::to_string(result) << std::endl;
 		}
 	}