diff --git a/projects/indirect_dispatch/src/App.cpp b/projects/indirect_dispatch/src/App.cpp
index 64ef58dafc38713c1a3319176732b77df3c98f11..db97d57cecedb55431d52ffc91c951d6b3897abc 100644
--- a/projects/indirect_dispatch/src/App.cpp
+++ b/projects/indirect_dispatch/src/App.cpp
@@ -96,6 +96,7 @@ void App::run() {
 	eMotionVectorVisualisationMode  motionVectorVisualisationMode   = eMotionVectorVisualisationMode::None;
 	eMotionVectorMode               motionBlurMotionMode            = eMotionVectorMode::MaxTileNeighbourhood;
 
+    bool    freezeFrame                     = false;
 	float   objectVerticalSpeed             = 5;
 	float   objectAmplitude                 = 0;
 	float   objectMeanHeight                = 1;
@@ -104,10 +105,9 @@ void App::run() {
 	int     cameraShutterSpeedInverse       = 24;
 	float   motionVectorVisualisationRange  = 0.008;
 
+	glm::mat4 viewProjection            = m_cameraManager.getActiveCamera().getMVP();
 	glm::mat4 viewProjectionPrevious    = m_cameraManager.getActiveCamera().getMVP();
 
-
-
 	struct Object {
 		MeshResources meshResources;
 		glm::mat4 modelMatrix   = glm::mat4(1.f);
@@ -132,6 +132,8 @@ void App::run() {
 	};
 	sceneObjects.push_back(sphere);
 
+	auto frameEndTime = std::chrono::system_clock::now();
+
 	while (m_window.isWindowOpen()) {
 		vkcv::Window::pollEvents();
 
@@ -151,21 +153,27 @@ void App::run() {
 			m_motionBlur.setResolution(m_windowWidth, m_windowHeight);
 		}
 
-		auto frameEndTime   = std::chrono::system_clock::now();
+		if (!freezeFrame) {
+			frameEndTime = std::chrono::system_clock::now();
+		}
 		auto deltatime      = std::chrono::duration_cast<std::chrono::microseconds>(frameEndTime - frameStartTime);
 
 		m_cameraManager.update(0.000001 * static_cast<double>(deltatime.count()));
-		const glm::mat4 viewProjection = m_cameraManager.getActiveCamera().getMVP();
 
 		const auto      time                = frameEndTime - appStartTime;
 		const float     fCurrentTime        = std::chrono::duration_cast<std::chrono::milliseconds>(time).count() * 0.001f;
 
 		// update matrices
-		for (Object& obj : sceneObjects) {
-			if (obj.modelMatrixUpdate) {
-				obj.modelMatrixUpdate(fCurrentTime, obj);
+		if (!freezeFrame) {
+
+			viewProjection = m_cameraManager.getActiveCamera().getMVP();
+
+			for (Object& obj : sceneObjects) {
+				if (obj.modelMatrixUpdate) {
+					obj.modelMatrixUpdate(fCurrentTime, obj);
+				}
+				obj.mvp = viewProjection * obj.modelMatrix;
 			}
-			obj.mvp = viewProjection * obj.modelMatrix;
 		}
 
 		const vkcv::CommandStreamHandle cmdStream = m_core.createCommandStream(vkcv::QueueType::Graphics);
@@ -322,6 +330,8 @@ void App::run() {
 		gui.beginGUI();
 		ImGui::Begin("Settings");
 
+		ImGui::Checkbox("Freeze frame", &freezeFrame);
+
 		ImGui::Combo(
 			"Debug view",
 			reinterpret_cast<int*>(&motionVectorVisualisationMode),
@@ -350,11 +360,13 @@ void App::run() {
 
 		m_core.endFrame();
 
-		viewProjectionPrevious  = viewProjection;
-		frameStartTime = frameEndTime;
+		if (!freezeFrame) {
+			viewProjectionPrevious = viewProjection;
+			frameStartTime = frameEndTime;
 
-		for (Object& obj : sceneObjects) {
-			obj.mvpPrevious = obj.mvp;
+			for (Object& obj : sceneObjects) {
+				obj.mvpPrevious = obj.mvp;
+			}
 		}
 	}
 }
\ No newline at end of file