diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp
index fbd1cc9cce12ee9584065708b56810e6859cf733..d44c50161db32ba386ad21926269dea907e35352 100644
--- a/include/vkcv/Core.hpp
+++ b/include/vkcv/Core.hpp
@@ -166,7 +166,9 @@ namespace vkcv
          * @return True if pipeline creation was successful, False if not
          */
         [[nodiscard]]
-        PipelineHandle createComputePipeline(const ShaderProgram &config);
+        PipelineHandle createComputePipeline(
+            const ShaderProgram &config, 
+            const std::vector<vk::DescriptorSetLayout> &descriptorSetLayouts);
 
         /**
          * Creates a basic vulkan render pass using @p config from the render pass config class and returns it using the @p handle.
diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp
index 648118a667caa9b0c155ec4ecc58a4b5b90d9b5c..d79ece30d83bdbba7dd8570c0363c0da395be90e 100644
--- a/projects/first_triangle/src/main.cpp
+++ b/projects/first_triangle/src/main.cpp
@@ -119,8 +119,14 @@ int main(int argc, const char** argv) {
 	// Compute Pipeline
 	vkcv::ShaderProgram computeShaderProgram{};
 	computeShaderProgram.addShader(vkcv::ShaderStage::COMPUTE, std::filesystem::path("shaders/comp.spv"));
+	computeShaderProgram.reflectShader(vkcv::ShaderStage::COMPUTE);
 
-	vkcv::PipelineHandle computePipeline = core.createComputePipeline(computeShaderProgram);
+	// take care, assuming shader has exactly one descriptor set
+	vkcv::DescriptorSetHandle computeDescriptorSet = core.createDescriptorSet(computeShaderProgram.getReflectedDescriptors()[0]);
+
+	vkcv::PipelineHandle computePipeline = core.createComputePipeline(
+		computeShaderProgram, 
+		{ core.getDescriptorSet(computeDescriptorSet).layout });
 
 	/*
 	 * BufferHandle triangleVertices = core.createBuffer(vertices);
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index 057821119d96b5403180e9afdf4a4fd6042cfaea..afa450065a0bf26fe6ed2cab55e83e56b97b01cb 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -101,9 +101,11 @@ namespace vkcv
         return m_PipelineManager->createPipeline(config, *m_PassManager);
     }
 
-    PipelineHandle Core::createComputePipeline(const ShaderProgram &shaderProgram)
+    PipelineHandle Core::createComputePipeline(
+        const ShaderProgram &shaderProgram, 
+        const std::vector<vk::DescriptorSetLayout>& descriptorSetLayouts)
     {
-        return m_PipelineManager->createComputePipeline(shaderProgram);
+        return m_PipelineManager->createComputePipeline(shaderProgram, descriptorSetLayouts);
     }
 
 
diff --git a/src/vkcv/PipelineManager.cpp b/src/vkcv/PipelineManager.cpp
index 6a0a42b276453788c40e2307fe230ff80233a9e5..765263b2cf6cd073a6c049b3ff8e68f368ce9983 100644
--- a/src/vkcv/PipelineManager.cpp
+++ b/src/vkcv/PipelineManager.cpp
@@ -315,9 +315,11 @@ namespace vkcv
         return m_Configs.at(id);
     }
 
-    PipelineHandle PipelineManager::createComputePipeline(const ShaderProgram &shaderProgram) {
-        // Temporally handing over the Shader Program instead of a pipeline config
+    PipelineHandle PipelineManager::createComputePipeline(
+        const ShaderProgram &shaderProgram, 
+        const std::vector<vk::DescriptorSetLayout> &descriptorSetLayouts) {
 
+        // Temporally handing over the Shader Program instead of a pipeline config
         vk::ShaderModule computeModule{};
         if (createShaderModule(computeModule, shaderProgram, ShaderStage::COMPUTE) != vk::Result::eSuccess)
             return PipelineHandle();
@@ -330,14 +332,14 @@ namespace vkcv
                 nullptr
         );
 
-        // TODO: Validation Layer Error -> the size is 0 but has to be greater!
-        const size_t matrixPushConstantSize = shaderProgram.getPushConstantSize();
-        const vk::PushConstantRange pushConstantRange(vk::ShaderStageFlagBits::eAll, 0, matrixPushConstantSize);
+        vk::PipelineLayoutCreateInfo pipelineLayoutCreateInfo({}, descriptorSetLayouts);
 
-        vk::PipelineLayoutCreateInfo pipelineLayoutCreateInfo( // TODO: Check this. I'm not sure if this is correct
-            {},
-            {}, // TODO: For now no Descriptor Set
-            {});// (pushConstantRange)); push constant range must not be size 0, either do not specify or or set size
+        const size_t pushConstantSize = shaderProgram.getPushConstantSize();
+        vk::PushConstantRange pushConstantRange(vk::ShaderStageFlagBits::eCompute, 0, pushConstantSize);
+        if (pushConstantSize > 0) {
+            pipelineLayoutCreateInfo.setPushConstantRangeCount(1);
+            pipelineLayoutCreateInfo.setPPushConstantRanges(&pushConstantRange);
+        }
 
         vk::PipelineLayout vkPipelineLayout{};
         if (m_Device.createPipelineLayout(&pipelineLayoutCreateInfo, nullptr, &vkPipelineLayout) != vk::Result::eSuccess)
diff --git a/src/vkcv/PipelineManager.hpp b/src/vkcv/PipelineManager.hpp
index 568a8d5b8933355b0eb516a997c3df94f54edb89..634f5f4e6464532306e35fd10d9a1623df6ace16 100644
--- a/src/vkcv/PipelineManager.hpp
+++ b/src/vkcv/PipelineManager.hpp
@@ -37,7 +37,9 @@ namespace vkcv
 
         PipelineHandle createPipeline(const PipelineConfig &config, PassManager& passManager);
 
-        PipelineHandle createComputePipeline(const ShaderProgram &shaderProgram);
+        PipelineHandle createComputePipeline(
+            const ShaderProgram& shaderProgram,
+            const std::vector<vk::DescriptorSetLayout>& descriptorSetLayouts);
 
         [[nodiscard]]
         vk::Pipeline getVkPipeline(const PipelineHandle &handle) const;