diff --git a/projects/bindless_textures/src/main.cpp b/projects/bindless_textures/src/main.cpp
index 6aa0a9d6106dd06c08dd5219c9570430b49ce229..f8fa8db91fb9566771862b59ad9314c9fae2e288 100644
--- a/projects/bindless_textures/src/main.cpp
+++ b/projects/bindless_textures/src/main.cpp
@@ -7,10 +7,7 @@
 #include <vkcv/shader/GLSLCompiler.hpp>
 
 int main(int argc, const char** argv) {
-	const char* applicationName = "First Mesh";
-
-	uint32_t windowWidth = 800;
-	uint32_t windowHeight = 600;
+	const char* applicationName = "Bindless Textures";
 
 	vkcv::Features features;
 	features.requireExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
@@ -48,7 +45,7 @@ int main(int argc, const char** argv) {
 		features
 	);
 
-	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, windowWidth,windowHeight,false);
+	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, 800, 600, true);
 
 	vkcv::asset::Scene mesh;
 
@@ -206,7 +203,7 @@ int main(int argc, const char** argv) {
 
 	core.writeDescriptorSet(descriptorSet, setWrites);
 
-	vkcv::ImageHandle depthBuffer = core.createImage(vk::Format::eD32Sfloat, windowWidth, windowHeight, 1, false).getHandle();
+	vkcv::ImageHandle depthBuffer;
 
 	const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle();
 
@@ -234,11 +231,14 @@ int main(int argc, const char** argv) {
 			continue;
 		}
 		
-		if ((swapchainWidth != windowWidth) || ((swapchainHeight != windowHeight))) {
-			depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle();
-			
-			windowWidth = swapchainWidth;
-			windowHeight = swapchainHeight;
+		if ((!depthBuffer) ||
+			(swapchainWidth != core.getImageWidth(depthBuffer)) ||
+			(swapchainHeight != core.getImageHeight(depthBuffer))) {
+			depthBuffer = core.createImage(
+					vk::Format::eD32Sfloat,
+					swapchainWidth,
+					swapchainHeight
+			).getHandle();
 		}
   
 		auto end = std::chrono::system_clock::now();
diff --git a/projects/first_mesh/src/main.cpp b/projects/first_mesh/src/main.cpp
index 3f4378a6a2187ba33b7965fd6d008577541f7351..c8da98abd87579c2b91b2422dda544dd257b03af 100644
--- a/projects/first_mesh/src/main.cpp
+++ b/projects/first_mesh/src/main.cpp
@@ -8,9 +8,6 @@
 int main(int argc, const char** argv) {
 	const char* applicationName = "First Mesh";
 
-	uint32_t windowWidth = 800;
-	uint32_t windowHeight = 600;
-
 	vkcv::Core core = vkcv::Core::create(
 		applicationName,
 		VK_MAKE_VERSION(0, 0, 1),
@@ -18,7 +15,7 @@ int main(int argc, const char** argv) {
 		{ VK_KHR_SWAPCHAIN_EXTENSION_NAME }
 	);
 
-	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, windowWidth, windowHeight, false);
+	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, 800, 600, true);
 
 	vkcv::asset::Scene mesh;
 
@@ -148,14 +145,7 @@ int main(int argc, const char** argv) {
 
 	core.writeDescriptorSet(descriptorSet, setWrites);
 	
-	auto swapchainExtent = core.getSwapchain(windowHandle).getExtent();
-	
-	vkcv::ImageHandle depthBuffer = core.createImage(
-			vk::Format::eD32Sfloat,
-			swapchainExtent.width,
-			swapchainExtent.height,
-			1, false
-	).getHandle();
+	vkcv::ImageHandle depthBuffer;
 
 	const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle();
 
@@ -182,11 +172,14 @@ int main(int argc, const char** argv) {
 			continue;
 		}
 		
-		if ((swapchainWidth != swapchainExtent.width) || ((swapchainHeight != swapchainExtent.height))) {
-			depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle();
-			
-			swapchainExtent.width = swapchainWidth;
-			swapchainExtent.height = swapchainHeight;
+		if ((!depthBuffer) ||
+			(swapchainWidth != core.getImageWidth(depthBuffer)) ||
+			(swapchainHeight != core.getImageHeight(depthBuffer))) {
+			depthBuffer = core.createImage(
+					vk::Format::eD32Sfloat,
+					swapchainWidth,
+					swapchainHeight
+			).getHandle();
 		}
   
 		auto end = std::chrono::system_clock::now();
diff --git a/projects/first_scene/src/main.cpp b/projects/first_scene/src/main.cpp
index 3dd6fc40d516c6f1ae3358d60c02fc4ed219245a..3e424919d2289c45e129c6b476ff026455403982 100644
--- a/projects/first_scene/src/main.cpp
+++ b/projects/first_scene/src/main.cpp
@@ -20,7 +20,7 @@ int main(int argc, const char** argv) {
 			{vk::QueueFlagBits::eTransfer, vk::QueueFlagBits::eGraphics, vk::QueueFlagBits::eCompute},
 			{ VK_KHR_SWAPCHAIN_EXTENSION_NAME }
 	);
-	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, windowWidth, windowHeight, false);
+	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, windowWidth, windowHeight, true);
 	vkcv::Window& window = core.getWindow(windowHandle);
 	vkcv::camera::CameraManager cameraManager(window);
 
@@ -92,13 +92,7 @@ int main(int argc, const char** argv) {
 		return EXIT_FAILURE;
 	}
 	
-	auto swapchainExtent = core.getSwapchain(windowHandle).getExtent();
-
-	vkcv::ImageHandle depthBuffer = core.createImage(
-			vk::Format::eD32Sfloat,
-			swapchainExtent.width,
-			swapchainExtent.height
-	).getHandle();
+	vkcv::ImageHandle depthBuffer;
 
 	const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle();
 	
@@ -114,11 +108,14 @@ int main(int argc, const char** argv) {
 			continue;
 		}
 		
-		if ((swapchainWidth != swapchainExtent.width) || ((swapchainHeight != swapchainExtent.height))) {
-			depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle();
-			
-			swapchainExtent.width = swapchainWidth;
-			swapchainExtent.height = swapchainHeight;
+		if ((!depthBuffer) ||
+			(swapchainWidth != core.getImageWidth(depthBuffer)) ||
+			(swapchainHeight != core.getImageHeight(depthBuffer))) {
+			depthBuffer = core.createImage(
+					vk::Format::eD32Sfloat,
+					swapchainWidth,
+					swapchainHeight
+			).getHandle();
 		}
   
 		auto end = std::chrono::system_clock::now();
diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp
index b4ba9046e07ecd3534844b493642098aa5847307..3bdefe3ae55fc89879461ed37025f8fe00e39a8a 100644
--- a/projects/first_triangle/src/main.cpp
+++ b/projects/first_triangle/src/main.cpp
@@ -56,12 +56,12 @@ int main(int argc, const char** argv) {
 
 	const vkcv::GraphicsPipelineConfig trianglePipelineDefinition {
 		triangleShaderProgram,
-		swapchainExtent.width,
-		swapchainExtent.height,
+		UINT32_MAX,
+		UINT32_MAX,
 		trianglePass,
 		{},
 		{},
-		false
+		true
 	};
 
 	vkcv::GraphicsPipelineHandle trianglePipeline = core.createGraphicsPipeline(trianglePipelineDefinition);
diff --git a/projects/indirect_draw/src/main.cpp b/projects/indirect_draw/src/main.cpp
index 9b062ab56245c44e5021f164b9e06fed8edd15c3..2a213a2ad7b8ecdaf4b4a51cf4327addc7a881a5 100644
--- a/projects/indirect_draw/src/main.cpp
+++ b/projects/indirect_draw/src/main.cpp
@@ -259,9 +259,6 @@ void compileMeshForIndirectDraw(vkcv::Core &core,
 int main(int argc, const char** argv) {
 	const char* applicationName = "Indirect draw";
 
-	uint32_t windowWidth = 800;
-	uint32_t windowHeight = 600;
-
 	vkcv::Features features;
 	features.requireExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
     features.requireFeature([](vk::PhysicalDeviceFeatures &features){
@@ -305,7 +302,7 @@ int main(int argc, const char** argv) {
 		features
 	);
 
-	vkcv::WindowHandle windowHandle = core.createWindow(applicationName,windowWidth,windowHeight,false);
+	vkcv::WindowHandle windowHandle = core.createWindow(applicationName,800,600,true);
 
     vkcv::gui::GUI gui (core, windowHandle);
 
@@ -526,7 +523,8 @@ int main(int argc, const char** argv) {
 	cameraManager.getCamera(camIndex0).setPosition(glm::vec3(0, 0, -3));
 	cameraManager.getCamera(camIndex0).setNearFar(0.1f, 20.f);
 
-    vkcv::ImageHandle depthBuffer = core.createImage(vk::Format::eD32Sfloat, windowWidth, windowHeight, 1, false).getHandle();
+    vkcv::ImageHandle depthBuffer;
+	
     const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle();
 
     auto start = std::chrono::system_clock::now();
@@ -552,11 +550,10 @@ int main(int argc, const char** argv) {
 			continue;
 		}
 		
-		if ((swapchainWidth != windowWidth) || ((swapchainHeight != windowHeight))) {
+		if ((!depthBuffer) ||
+			(swapchainWidth != core.getImageWidth(depthBuffer)) ||
+			(swapchainHeight != core.getImageHeight(depthBuffer))) {
 			depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle();
-			
-			windowWidth = swapchainWidth;
-			windowHeight = swapchainHeight;
 		}
   
 		auto end = std::chrono::system_clock::now();
diff --git a/projects/mesh_shader/src/main.cpp b/projects/mesh_shader/src/main.cpp
index 0a9914abf0a28f82eee06c5d2a67067faaff4109..afaec1a8ba5dded5f16bad65c68f25f442029091 100644
--- a/projects/mesh_shader/src/main.cpp
+++ b/projects/mesh_shader/src/main.cpp
@@ -77,9 +77,6 @@ CameraPlanes computeCameraPlanes(const vkcv::camera::Camera& camera) {
 
 int main(int argc, const char** argv) {
 	const char* applicationName = "Mesh shader";
-
-	const int windowWidth = 1280;
-	const int windowHeight = 720;
 	
 	vkcv::Features features;
 	features.requireExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
@@ -95,7 +92,7 @@ int main(int argc, const char** argv) {
 		{ vk::QueueFlagBits::eTransfer,vk::QueueFlagBits::eGraphics, vk::QueueFlagBits::eCompute },
 		features
 	);
-	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, windowWidth, windowHeight, false);
+	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, 1280, 720, true);
 	vkcv::Window &window = core.getWindow(windowHandle);
 
     vkcv::gui::GUI gui (core, windowHandle);
@@ -202,17 +199,15 @@ int main(int argc, const char** argv) {
 
     vkcv::DescriptorSetLayoutHandle vertexShaderDescriptorSetLayout = core.createDescriptorSetLayout(bunnyShaderProgram.getReflectedDescriptors().at(0));
     vkcv::DescriptorSetHandle vertexShaderDescriptorSet = core.createDescriptorSet(vertexShaderDescriptorSetLayout);
-
-	auto swapchainExtent = core.getSwapchain(windowHandle).getExtent();
 	
 	const vkcv::GraphicsPipelineConfig bunnyPipelineDefinition {
 			bunnyShaderProgram,
-			swapchainExtent.width,
-			swapchainExtent.height,
+			UINT32_MAX,
+			UINT32_MAX,
 			renderPass,
 			{ bunnyLayout },
 			{ vertexShaderDescriptorSetLayout },
-			false
+			true
 	};
 
 	struct ObjectMatrices {
@@ -257,12 +252,12 @@ int main(int argc, const char** argv) {
 
 	const vkcv::GraphicsPipelineConfig meshShaderPipelineDefinition{
 		meshShaderProgram,
-		swapchainExtent.width,
-		swapchainExtent.height,
+		UINT32_MAX,
+		UINT32_MAX,
 		renderPass,
 		{meshShaderLayout},
 		{meshShaderDescriptorSetLayout},
-		false
+		true
 	};
 
 	vkcv::GraphicsPipelineHandle meshShaderPipeline = core.createGraphicsPipeline(meshShaderPipelineDefinition);
@@ -289,12 +284,7 @@ int main(int argc, const char** argv) {
 
     core.writeDescriptorSet( meshShaderDescriptorSet, meshShaderWrites);
 
-    vkcv::ImageHandle depthBuffer = core.createImage(
-			vk::Format::eD32Sfloat,
-			swapchainExtent.width,
-			swapchainExtent.height,
-			1, false
-	).getHandle();
+    vkcv::ImageHandle depthBuffer;
 
     auto start = std::chrono::system_clock::now();
 
@@ -321,6 +311,16 @@ int main(int argc, const char** argv) {
 			continue;
 		}
 		
+		if ((!depthBuffer) ||
+			(swapchainWidth != core.getImageWidth(depthBuffer)) ||
+			(swapchainHeight != core.getImageHeight(depthBuffer))) {
+			depthBuffer = core.createImage(
+					vk::Format::eD32Sfloat,
+					swapchainWidth,
+					swapchainHeight
+			).getHandle();
+		}
+		
 		auto end = std::chrono::system_clock::now();
 		auto deltatime = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
 		start = end;
diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp
index db17621eb6ee46a2a4e6e0564323c59045915c57..f1490e6f035b1a378afcb59436814986b3aca51f 100644
--- a/projects/particle_simulation/src/main.cpp
+++ b/projects/particle_simulation/src/main.cpp
@@ -22,7 +22,7 @@ int main(int argc, const char **argv) {
             {vk::QueueFlagBits::eTransfer, vk::QueueFlagBits::eGraphics, vk::QueueFlagBits::eCompute},
 			{ VK_KHR_SWAPCHAIN_EXTENSION_NAME }
     );
-	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, windowWidth, windowHeight, false);
+	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, windowWidth, windowHeight, true);
     vkcv::Window& window = core.getWindow(windowHandle);
 	vkcv::camera::CameraManager cameraManager(window);
 
@@ -212,7 +212,7 @@ int main(int argc, const char **argv) {
     cameraManager.getCamera(camIndex1).setPosition(glm::vec3(0.0f, 0.0f, -2.0f));
     cameraManager.getCamera(camIndex1).setCenter(glm::vec3(0.0f, 0.0f, 0.0f));
 
-	auto swapchainExtent = core.getSwapchain(windowHandle).getExtent();
+	const auto swapchainExtent = core.getSwapchain(windowHandle).getExtent();
 	
     vkcv::ImageHandle colorBuffer = core.createImage(
 			colorFormat,
@@ -223,16 +223,6 @@ int main(int argc, const char **argv) {
 	
 	vkcv::effects::BloomAndFlaresEffect bloomAndFlares (core);
 	bloomAndFlares.setUpsamplingLimit(3);
-	
-    window.e_resize.add([&](int width, int height) {
-		swapchainExtent = core.getSwapchain(windowHandle).getExtent();
-        colorBuffer = core.createImage(
-				colorFormat,
-				swapchainExtent.width,
-				swapchainExtent.height,
-				1, false, true, true
-		).getHandle();
-    });
 
     vkcv::ShaderProgram tonemappingShader;
     compiler.compile(vkcv::ShaderStage::COMPUTE, "shaders/tonemapping.comp", [&](vkcv::ShaderStage shaderStage, const std::filesystem::path& path) {
@@ -255,6 +245,16 @@ int main(int argc, const char **argv) {
         if (!core.beginFrame(swapchainWidth, swapchainHeight, windowHandle)) {
             continue;
         }
+	
+		if ((core.getImageWidth(colorBuffer) != swapchainWidth) ||
+			(core.getImageHeight(colorBuffer) != swapchainHeight)) {
+			colorBuffer = core.createImage(
+					colorFormat,
+					swapchainWidth,
+					swapchainHeight,
+					1, false, true, true
+			).getHandle();
+		}
 
         color.fill(&colorData);
         position.fill(&pos);
@@ -315,8 +315,8 @@ int main(int argc, const char **argv) {
         core.writeDescriptorSet(tonemappingDescriptor, tonemappingDescriptorWrites);
 
         uint32_t tonemappingDispatchCount[3];
-        tonemappingDispatchCount[0] = std::ceil(swapchainExtent.width / 8.f);
-        tonemappingDispatchCount[1] = std::ceil(swapchainExtent.height / 8.f);
+        tonemappingDispatchCount[0] = std::ceil(swapchainWidth / 8.f);
+        tonemappingDispatchCount[1] = std::ceil(swapchainHeight / 8.f);
         tonemappingDispatchCount[2] = 1;
 
         core.recordComputeDispatchToCmdStream(
diff --git a/projects/rtx_ambient_occlusion/src/main.cpp b/projects/rtx_ambient_occlusion/src/main.cpp
index d4c8ec2cac8e26f70da346738da04de16a766a26..becd80c4e4478da38a8e3722cbf30d39fd159ca6 100644
--- a/projects/rtx_ambient_occlusion/src/main.cpp
+++ b/projects/rtx_ambient_occlusion/src/main.cpp
@@ -13,9 +13,6 @@
 int main(int argc, const char** argv) {
 	const char* applicationName = "RTX Ambient Occlusion";
 
-	uint32_t windowWidth = 800;
-	uint32_t windowHeight = 600;
-
 	// prepare raytracing extensions. IMPORTANT: configure compiler to build in 64 bit mode
 	vkcv::rtx::RTXExtensions rtxExtensions;
 	std::vector<const char*> raytracingInstanceExtensions = rtxExtensions.getInstanceExtensions();
@@ -35,7 +32,7 @@ int main(int argc, const char** argv) {
 
 	vkcv::rtx::ASManager asManager(&core);
 
-	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, windowWidth, windowHeight, false);
+	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, 800, 600, true);
 
 	vkcv::camera::CameraManager cameraManager(core.getWindow(windowHandle));
 	uint32_t camIndex = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL);
@@ -91,7 +88,7 @@ int main(int argc, const char** argv) {
 
 	vkcv::rtx::ShaderBindingTableRegions rtxRegions = rtxModule.createRegions();
 
-	vkcv::ImageHandle depthBuffer = core.createImage(vk::Format::eD32Sfloat, windowWidth, windowHeight).getHandle();
+	vkcv::ImageHandle depthBuffer;
 
 	const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle();
 
@@ -109,11 +106,14 @@ int main(int argc, const char** argv) {
 			continue;
 		}
 
-		if ((swapchainWidth != windowWidth) || ((swapchainHeight != windowHeight))) {
-			depthBuffer = core.createImage(vk::Format::eD32Sfloat, swapchainWidth, swapchainHeight).getHandle();
-
-			windowWidth = swapchainWidth;
-			windowHeight = swapchainHeight;
+		if ((!depthBuffer) ||
+			(swapchainWidth != core.getImageWidth(depthBuffer)) ||
+			((swapchainHeight != core.getImageHeight(depthBuffer)))) {
+			depthBuffer = core.createImage(
+					vk::Format::eD32Sfloat,
+					swapchainWidth,
+					swapchainHeight
+			).getHandle();
 		}
 
 		auto end = std::chrono::system_clock::now();
diff --git a/projects/saf_r/src/main.cpp b/projects/saf_r/src/main.cpp
index a188c33d63f8c5d190ee02ce4aaef5adc2a8b967..84087c1eabe8aa32e3ac3f9ebe9c7d9936f52d9e 100644
--- a/projects/saf_r/src/main.cpp
+++ b/projects/saf_r/src/main.cpp
@@ -39,7 +39,7 @@ int main(int argc, const char** argv) {
 		{ "VK_KHR_swapchain" }
 	);
 
-	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, windowWidth, windowHeight, false);
+	vkcv::WindowHandle windowHandle = core.createWindow(applicationName, windowWidth, windowHeight, true);
 
 	//configuring the compute Shader
 	vkcv::PassConfig computePassDefinition({});
@@ -172,12 +172,12 @@ int main(int argc, const char** argv) {
 	//create the render pipeline + compute pipeline
 	const vkcv::GraphicsPipelineConfig safrPipelineDefinition{
 			safrShaderProgram,
-			(uint32_t)windowWidth,
-			(uint32_t)windowHeight,
+			UINT32_MAX,
+			UINT32_MAX,
 			safrPass,
 			{},
 			{ descriptorSetLayout },
-			false
+			true
 	};
 
 	vkcv::GraphicsPipelineHandle safrPipeline = core.createGraphicsPipeline(safrPipelineDefinition);
@@ -274,7 +274,7 @@ int main(int argc, const char** argv) {
         pushConstantsCompute.appendDrawcall(raytracingPushData);
 
 		//dispatch compute shader
-		uint32_t computeDispatchCount[3] = {static_cast<uint32_t> (std::ceil( swapchainWidth/16.f)),
+		uint32_t computeDispatchCount[3] = {static_cast<uint32_t> (std::ceil(swapchainWidth/16.f)),
                                             static_cast<uint32_t> (std::ceil(swapchainHeight/16.f)),
                                             1 }; // Anzahl workgroups
 		core.recordComputeDispatchToCmdStream(cmdStream,