diff --git a/projects/first_mesh/src/main.cpp b/projects/first_mesh/src/main.cpp
index 0649bdd12ae50d34c4c9b37119a022ac9b59bafa..5e6ba7c86e8cfa22808791f3609fdba2a564ef5e 100644
--- a/projects/first_mesh/src/main.cpp
+++ b/projects/first_mesh/src/main.cpp
@@ -108,7 +108,7 @@ int main(int argc, const char** argv) {
 
 	// since we only use one descriptor set (namely, desc set 0), directly address it
 	// recreate copies of the bindings and the handles (to check whether they are properly reused instead of actually recreated)
-	std::unordered_map<uint32_t, vkcv::DescriptorBinding> set0Bindings = firstMeshProgram.getReflectedDescriptors().at(0);
+	const vkcv::DescriptorBindings& set0Bindings = firstMeshProgram.getReflectedDescriptors().at(0);
     auto set0BindingsExplicitCopy = set0Bindings;
 
 	vkcv::DescriptorSetLayoutHandle setLayoutHandle = core.createDescriptorSetLayout(set0Bindings);
diff --git a/projects/saf_r/src/main.cpp b/projects/saf_r/src/main.cpp
index e1b8736691054abfb8ec71ae51faac2e5613187d..9f6a1f1deed1c2ccc6456e9b6b2534ab61df8428 100644
--- a/projects/saf_r/src/main.cpp
+++ b/projects/saf_r/src/main.cpp
@@ -29,7 +29,6 @@ int main(int argc, const char** argv) {
 		applicationName,
 		VK_MAKE_VERSION(0, 0, 1),
 		{ vk::QueueFlagBits::eTransfer,vk::QueueFlagBits::eGraphics, vk::QueueFlagBits::eCompute },
-		{},
 		{ "VK_KHR_swapchain" }
 	);
 
@@ -53,7 +52,10 @@ int main(int argc, const char** argv) {
 		computeShaderProgram.addShader(shaderStage, path);
 	});
 
-	vkcv::DescriptorSetHandle computeDescriptorSet = core.createDescriptorSet(computeShaderProgram.getReflectedDescriptors()[0]);
+	const vkcv::DescriptorBindings& computeDescriptorBindings = computeShaderProgram.getReflectedDescriptors().at(0);
+	
+	vkcv::DescriptorSetLayoutHandle computeDescriptorSetLayout = core.createDescriptorSetLayout(computeDescriptorBindings);
+	vkcv::DescriptorSetHandle computeDescriptorSet = core.createDescriptorSet(computeDescriptorSetLayout);
 
 	const std::vector<vkcv::VertexAttachment> computeVertexAttachments = computeShaderProgram.getVertexAttachments();
 
@@ -74,9 +76,10 @@ int main(int argc, const char** argv) {
 			safrShaderProgram.addShader(shaderStage, path);
 		});
 
-	uint32_t setID = 0;
-	std::vector<vkcv::DescriptorBinding> descriptorBindings = { safrShaderProgram.getReflectedDescriptors()[setID] };
-	vkcv::DescriptorSetHandle descriptorSet = core.createDescriptorSet(descriptorBindings);
+	const vkcv::DescriptorBindings& descriptorBindings = safrShaderProgram.getReflectedDescriptors().at(0);
+	vkcv::DescriptorSetLayoutHandle descriptorSetLayout = core.createDescriptorSetLayout(descriptorBindings);
+	
+	vkcv::DescriptorSetHandle descriptorSet = core.createDescriptorSet(descriptorSetLayout);
 
 	//materials for the spheres
 	std::vector<safrScene::Material> materials;
@@ -176,12 +179,14 @@ int main(int argc, const char** argv) {
 			(uint32_t)windowHeight,
 			safrPass,
 			{},
-			{ core.getDescriptorSet(descriptorSet).layout },
+			{ core.getDescriptorSetLayout(descriptorSetLayout).vulkanHandle },
 			false
 	};
 
 	vkcv::PipelineHandle safrPipeline = core.createGraphicsPipeline(safrPipelineDefinition);
-	vkcv::PipelineHandle computePipeline = core.createComputePipeline(computeShaderProgram, { core.getDescriptorSet(computeDescriptorSet).layout });
+	vkcv::PipelineHandle computePipeline = core.createComputePipeline(computeShaderProgram, {
+		core.getDescriptorSetLayout(computeDescriptorSetLayout).vulkanHandle
+	});
 
 	if (!safrPipeline || !computePipeline)
 	{