diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp
index bf9514d5ba4c9d5dbf8d41be2a489dae826886a8..b97c707dafad515ca55380a8c56754f58f7c1a68 100644
--- a/include/vkcv/Core.hpp
+++ b/include/vkcv/Core.hpp
@@ -222,6 +222,11 @@ namespace vkcv
         [[nodiscard]]
         Image createImage(vk::Format format, uint32_t width, uint32_t height, uint32_t depth = 1);
 
+        [[nodiscard]]
+        const uint32_t getImageWidth(ImageHandle imageHandle);
+        [[nodiscard]]
+        const uint32_t getImageHeight(ImageHandle imageHandle);
+
         /** TODO:
          *   @param setDescriptions
          *   @return
diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt
index 5edb802b3adf16878c2dec4050d8444278739026..28b2184b2a83515a514f1428733bcf8cf1499633 100644
--- a/modules/CMakeLists.txt
+++ b/modules/CMakeLists.txt
@@ -1,6 +1,7 @@
 
 # Add new modules here:
 add_subdirectory(asset_loader)
+add_subdirectory(material)
 add_subdirectory(camera)
 add_subdirectory(gui)
 add_subdirectory(shader_compiler)
diff --git a/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp b/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp
index 034702360db512669254127b4e86fb4730fb24ad..98a30f99703d6589e56e614503e4125f8f8022c1 100644
--- a/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp
+++ b/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp
@@ -40,16 +40,41 @@ namespace vkcv::material
         SamplerHandle& metRoughSmp)
     {
         //Test if Images and samplers valid, if not use default
-        if (colorImg) {
-            //TODO
+        uint32_t width  = core->getImageWidth(colorImg); //use colorImg size as default
+        uint32_t height = core->getImageHeight(colorImg);
+        uint32_t n = width * height;
+        struct vec3 {
+            float x, y, z;
+        };
+        struct vec4 {
+            float x, y, z, a;
+        }; 
+
+        if (!colorImg) {
+            width = core->getImageWidth(metRoughImg); // if colorImg has no size
+            height = core->getImageHeight(metRoughImg);
+            n = width * height;
+            vkcv::Image defaultColor = core->createImage(vk::Format::eR8G8B8A8Srgb, width, height);
+            std::vector<vec4> colorData(n);
+            std::fill(colorData.begin(), colorData.end(), vec4{ 228, 51 , 255, 1 });
+            defaultColor.fill(colorData.data());
+            colorImg = defaultColor.getHandle();
         }
-        if (normalImg) {
-            //TODO
+        if (!normalImg || (core->getImageWidth(normalImg)!=width)|| (core->getImageHeight(normalImg) != height)) {
+            vkcv::Image defaultNormal = core->createImage(vk::Format::eR8G8B8A8Srgb, width, height);
+            std::vector<vec4> normalData(n);
+            std::fill(normalData.begin(), normalData.end(), vec4{ 228, 51 , 255, 1 });
+            defaultNormal.fill(normalData.data());
+            normalImg = defaultNormal.getHandle();
         }
-        if (metRoughImg) {
-            //TODO
+        if (!metRoughImg || (core->getImageWidth(metRoughImg) != width) || (core->getImageHeight(metRoughImg) != height)) {
+            vkcv::Image defaultRough = core->createImage(vk::Format::eR8G8B8A8Srgb, width, height);
+            std::vector<vec4> roughData(n);
+            std::fill(roughData.begin(), roughData.end(), vec4{ 228, 51 , 255, 1 });
+            defaultRough.fill(roughData.data());
+            metRoughImg = defaultRough.getHandle();
         }
-        if (colorSmp) {            
+        if (!colorSmp) {            
             colorSmp = core->createSampler(
                 vkcv::SamplerFilterType::LINEAR,
                 vkcv::SamplerFilterType::LINEAR,
@@ -57,7 +82,7 @@ namespace vkcv::material
                 vkcv::SamplerAddressMode::REPEAT
             );            
         }
-        if (normalSmp) {            
+        if (!normalSmp) {            
             normalSmp = core->createSampler(
                 vkcv::SamplerFilterType::LINEAR,
                 vkcv::SamplerFilterType::LINEAR,
@@ -65,7 +90,7 @@ namespace vkcv::material
                 vkcv::SamplerAddressMode::REPEAT
             );            
         }
-        if (metRoughSmp) {
+        if (!metRoughSmp) {
             metRoughSmp = core->createSampler(
                 vkcv::SamplerFilterType::LINEAR,
                 vkcv::SamplerFilterType::LINEAR,
@@ -87,7 +112,7 @@ namespace vkcv::material
             vkcv::SamplerDescriptorWrite(1, colorSmp),
             vkcv::SamplerDescriptorWrite(3, normalSmp),
             vkcv::SamplerDescriptorWrite(5, metRoughSmp) };
-        core->writeResourceDescription(descriptorSetHandle, 0, setWrites);
+        core->writeDescriptorSet(descriptorSetHandle, setWrites);
 
         return PBRMaterial(colorImg, colorSmp, normalImg, normalSmp, metRoughImg, metRoughSmp, descriptorSetHandle);        
     }
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index 49707d4cffc18719d8fbb18a9e632e12ba679c2e..3d8e6188980e3c048aa8da66f812f6cdd78afada 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -456,6 +456,16 @@ namespace vkcv
     	return Image::create(m_ImageManager.get(), format, width, height, depth);
 	}
 
+	const uint32_t Core::getImageWidth(ImageHandle imageHandle)
+	{
+		return m_ImageManager->getImageWidth(imageHandle);
+	}
+
+	const uint32_t Core::getImageHeight(ImageHandle imageHandle)
+	{
+		return m_ImageManager->getImageHeight(imageHandle);
+	}
+
     DescriptorSetHandle Core::createDescriptorSet(const std::vector<DescriptorBinding>& bindings)
     {
         return m_DescriptorManager->createDescriptorSet(bindings);