diff --git a/projects/first_scene/resources/shaders/frag.spv b/projects/first_scene/resources/shaders/frag.spv
index 926d2ca0ac35ef13c6175c68ca83c8f68b9ade96..087e4e22fb2fcec27d99b3ff2aa1a705fe755796 100644
Binary files a/projects/first_scene/resources/shaders/frag.spv and b/projects/first_scene/resources/shaders/frag.spv differ
diff --git a/projects/first_scene/resources/shaders/shader.frag b/projects/first_scene/resources/shaders/shader.frag
index e92bd3e49de768d12b96efcb88facbc76c445c20..b5494bea7d6497e2e3dcd8559606864a71adb74e 100644
--- a/projects/first_scene/resources/shaders/shader.frag
+++ b/projects/first_scene/resources/shaders/shader.frag
@@ -11,5 +11,5 @@ layout(set=0, binding=1) uniform sampler    textureSampler;
 
 void main()	{
 	outColor = texture(sampler2D(meshTexture, textureSampler), passUV).rgb;
-    outColor = passNormal * 0.5 + 0.5;
+    //outColor = passNormal * 0.5 + 0.5;
 }
\ No newline at end of file
diff --git a/projects/first_scene/src/main.cpp b/projects/first_scene/src/main.cpp
index c867cdf1071cf470601001a77ff090bdf709876c..8b805d84970a33e7fe257da09453edc9484dae8e 100644
--- a/projects/first_scene/src/main.cpp
+++ b/projects/first_scene/src/main.cpp
@@ -4,6 +4,7 @@
 #include <vkcv/camera/CameraManager.hpp>
 #include <chrono>
 #include <vkcv/asset/asset_loader.hpp>
+#include <vkcv/Logger.hpp>
 
 glm::mat4 arrayTo4x4Matrix(std::array<float,16> array){
     glm::mat4 matrix;
@@ -43,7 +44,7 @@ int main(int argc, const char** argv) {
 
 	vkcv::asset::Scene scene;
 
-	const char* path = argc > 1 ? argv[1] : "resources/Cutlery/CutlerySzene.gltf";
+	const char* path = argc > 1 ? argv[1] : "resources/Sponza/Sponza.gltf";
 	int result = vkcv::asset::loadScene(path, scene);
 
 	if (result == 1) {
@@ -57,8 +58,6 @@ int main(int argc, const char** argv) {
 	assert(!scene.vertexGroups.empty());
 	std::vector<std::vector<uint8_t>> vBuffers;
     std::vector<std::vector<uint8_t>> iBuffers;
-	//vBuffers.reserve(scene.vertexGroups.size());
-    //iBuffers.reserve(scene.vertexGroups.size());
 
     std::vector<vkcv::VertexBufferBinding> vBufferBindings;
     std::vector<std::vector<vkcv::VertexBufferBinding>> vertexBufferBindings;
@@ -132,7 +131,37 @@ int main(int argc, const char** argv) {
 
 	uint32_t setID = 0;
 	std::vector<vkcv::DescriptorBinding> descriptorBindings = { sceneShaderProgram.getReflectedDescriptors()[setID] };
-	vkcv::DescriptorSetHandle descriptorSet = core.createDescriptorSet(descriptorBindings);
+
+    vkcv::SamplerHandle sampler = core.createSampler(
+        vkcv::SamplerFilterType::LINEAR,
+        vkcv::SamplerFilterType::LINEAR,
+        vkcv::SamplerMipmapMode::LINEAR,
+        vkcv::SamplerAddressMode::REPEAT
+    );
+
+    std::vector<vkcv::Image> sceneImages;
+    std::vector<vkcv::DescriptorSetHandle> descriptorSets;
+    for (const auto& vertexGroup : scene.vertexGroups) {
+        descriptorSets.push_back(core.createDescriptorSet(descriptorBindings));
+
+        const auto &material = scene.materials[vertexGroup.materialIndex];
+
+        int baseColorIndex = material.baseColor;
+        if (baseColorIndex < 0) {
+            vkcv_log(vkcv::LogLevel::WARNING ,"Material lacks base color");
+            baseColorIndex = 0;
+        }
+
+        vkcv::asset::Texture &sceneTexture = scene.textures[baseColorIndex];
+
+        sceneImages.push_back(core.createImage(vk::Format::eR8G8B8A8Srgb, sceneTexture.w, sceneTexture.h));
+        sceneImages.back().fill(sceneTexture.data.data());
+
+        vkcv::DescriptorWrites setWrites;
+        setWrites.sampledImageWrites = { vkcv::SampledImageDescriptorWrite(0, sceneImages.back().getHandle()) };
+        setWrites.samplerWrites = { vkcv::SamplerDescriptorWrite(1, sampler) };
+        core.writeDescriptorSet(descriptorSets.back(), setWrites);
+    }
 
 	const vkcv::PipelineConfig scenePipelineDefinition(
 		sceneShaderProgram,
@@ -140,7 +169,7 @@ int main(int argc, const char** argv) {
         UINT32_MAX,
 		scenePass,
 		vAttributes,
-		{ core.getDescriptorSet(descriptorSet).layout },
+		{ core.getDescriptorSet(descriptorSets[0]).layout },
 		true);
 	vkcv::PipelineHandle scenePipeline = core.createGraphicsPipeline(scenePipelineDefinition);
 	
@@ -148,34 +177,17 @@ int main(int argc, const char** argv) {
 		std::cout << "Error. Could not create graphics pipeline. Exiting." << std::endl;
 		return EXIT_FAILURE;
 	}
-	
-	// FIXME There should be a test here to make sure there is at least 1
-	// texture in the scene.
-	vkcv::asset::Texture &tex = scene.textures[0];
-	vkcv::Image texture = core.createImage(vk::Format::eR8G8B8A8Srgb, tex.w, tex.h);
-	texture.fill(tex.data.data());
-
-	vkcv::SamplerHandle sampler = core.createSampler(
-		vkcv::SamplerFilterType::LINEAR,
-		vkcv::SamplerFilterType::LINEAR,
-		vkcv::SamplerMipmapMode::LINEAR,
-		vkcv::SamplerAddressMode::REPEAT
-	);
-
-	vkcv::DescriptorWrites setWrites;
-	setWrites.sampledImageWrites    = { vkcv::SampledImageDescriptorWrite(0, texture.getHandle()) };
-	setWrites.samplerWrites         = { vkcv::SamplerDescriptorWrite(1, sampler) };
-	core.writeDescriptorSet(descriptorSet, setWrites);
 
 	vkcv::ImageHandle depthBuffer = core.createImage(vk::Format::eD32Sfloat, windowWidth, windowHeight).getHandle();
 
 	const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle();
 
-    vkcv::DescriptorSetUsage    descriptorUsage(0, core.getDescriptorSet(descriptorSet).vulkanHandle);
     std::vector<vkcv::DrawcallInfo> drawcalls;
+	for(int i = 0; i < scene.vertexGroups.size(); i++){
+        vkcv::Mesh renderMesh(vertexBufferBindings[i], indexBuffers[i].getVulkanHandle(), scene.vertexGroups[i].numIndices);
+
+        vkcv::DescriptorSetUsage descriptorUsage(0, core.getDescriptorSet(descriptorSets[i]).vulkanHandle);
 
-	for(int l = 0; l < scene.vertexGroups.size(); l++){
-        vkcv::Mesh renderMesh(vertexBufferBindings[l], indexBuffers[l].getVulkanHandle(), scene.vertexGroups[l].numIndices);
 	    drawcalls.push_back(vkcv::DrawcallInfo(renderMesh, {descriptorUsage}));
 	}