diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp
index 817c3f5840895158f621ae0c022df07c3c97978a..decf51ae8c546814b93a87aac42bb9e60c3471e0 100644
--- a/include/vkcv/Core.hpp
+++ b/include/vkcv/Core.hpp
@@ -31,6 +31,7 @@ namespace vkcv
     // forward declarations
     class PassManager;
     class PipelineManager;
+    class ComputePipelineManager;
     class DescriptorManager;
     class BufferManager;
     class SamplerManager;
@@ -66,6 +67,7 @@ namespace vkcv
 
         std::unique_ptr<PassManager>            m_PassManager;
         std::unique_ptr<PipelineManager>        m_PipelineManager;
+        std::unique_ptr<ComputePipelineManager> m_ComputePipelineManager;
         std::unique_ptr<DescriptorManager>      m_DescriptorManager;
         std::unique_ptr<BufferManager>          m_BufferManager;
         std::unique_ptr<SamplerManager>         m_SamplerManager;
@@ -162,7 +164,7 @@ namespace vkcv
          * @return True if pipeline creation was successful, False if not
          */
         [[nodiscard]]
-        PipelineHandle createComputePipeline(
+        ComputePipelineHandle createComputePipeline(
             const ShaderProgram &shaderProgram,
             const std::vector<vk::DescriptorSetLayout> &descriptorSetLayouts);
 
@@ -266,7 +268,7 @@ namespace vkcv
 
 		void recordComputeDispatchToCmdStream(
 			CommandStreamHandle cmdStream,
-			PipelineHandle computePipeline,
+            ComputePipelineHandle computePipeline,
 			const uint32_t dispatchCount[3],
 			const std::vector<DescriptorSetUsage> &descriptorSetUsages,
 			const PushConstants& pushConstants);
@@ -279,7 +281,7 @@ namespace vkcv
 
 		void recordComputeIndirectDispatchToCmdStream(
 			const CommandStreamHandle               cmdStream,
-			const PipelineHandle                    computePipeline,
+			const ComputePipelineHandle             computePipeline,
 			const vkcv::BufferHandle                buffer,
 			const size_t                            bufferArgOffset,
 			const std::vector<DescriptorSetUsage>&  descriptorSetUsages,
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index 1998a789e1af02456d76cb83498408684fe01cac..6585c0bb6cba55920593c0e85a6d40d729d77011 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -95,6 +95,7 @@ namespace vkcv
             m_window(window),
             m_PassManager{std::make_unique<PassManager>(m_Context.m_Device)},
             m_PipelineManager{std::make_unique<PipelineManager>(m_Context.m_Device)},
+            m_ComputePipelineManager{std::make_unique<ComputePipelineManager>(m_Context.m_Device)},
             m_DescriptorManager(std::make_unique<DescriptorManager>(m_Context.m_Device)),
             m_BufferManager{std::unique_ptr<BufferManager>(new BufferManager())},
             m_SamplerManager(std::unique_ptr<SamplerManager>(new SamplerManager(m_Context.m_Device))),
@@ -140,11 +141,11 @@ namespace vkcv
         return m_PipelineManager->createPipeline(config, *m_PassManager);
     }
 
-    PipelineHandle Core::createComputePipeline(
+    ComputePipelineHandle Core::createComputePipeline(
         const ShaderProgram &shaderProgram, 
         const std::vector<vk::DescriptorSetLayout>& descriptorSetLayouts)
     {
-        return m_PipelineManager->createComputePipeline(shaderProgram, descriptorSetLayouts);
+        return m_ComputePipelineManager->createComputePipeline(shaderProgram, descriptorSetLayouts);
     }
 
     PassHandle Core::createPass(const PassConfig &config)
@@ -468,16 +469,16 @@ namespace vkcv
 
 	void Core::recordComputeDispatchToCmdStream(
 		CommandStreamHandle cmdStreamHandle,
-		PipelineHandle computePipeline,
+		ComputePipelineHandle computePipeline,
 		const uint32_t dispatchCount[3],
 		const std::vector<DescriptorSetUsage>& descriptorSetUsages,
 		const PushConstants& pushConstants) {
 
 		auto submitFunction = [&](const vk::CommandBuffer& cmdBuffer) {
 
-			const auto pipelineLayout = m_PipelineManager->getVkPipelineLayout(computePipeline);
+			const auto pipelineLayout = m_ComputePipelineManager->getVkPipelineLayout(computePipeline);
 
-			cmdBuffer.bindPipeline(vk::PipelineBindPoint::eCompute, m_PipelineManager->getVkPipeline(computePipeline));
+			cmdBuffer.bindPipeline(vk::PipelineBindPoint::eCompute, m_ComputePipelineManager->getVkPipeline(computePipeline));
 			for (const auto& usage : descriptorSetUsages) {
 				cmdBuffer.bindDescriptorSets(
 					vk::PipelineBindPoint::eCompute,
@@ -546,7 +547,7 @@ namespace vkcv
 	
 	void Core::recordComputeIndirectDispatchToCmdStream(
 		const CommandStreamHandle               cmdStream,
-		const PipelineHandle                    computePipeline,
+		const ComputePipelineHandle             computePipeline,
 		const vkcv::BufferHandle                buffer,
 		const size_t                            bufferArgOffset,
 		const std::vector<DescriptorSetUsage>&  descriptorSetUsages,
@@ -554,9 +555,9 @@ namespace vkcv
 
 		auto submitFunction = [&](const vk::CommandBuffer& cmdBuffer) {
 
-			const auto pipelineLayout = m_PipelineManager->getVkPipelineLayout(computePipeline);
+			const auto pipelineLayout = m_ComputePipelineManager->getVkPipelineLayout(computePipeline);
 
-			cmdBuffer.bindPipeline(vk::PipelineBindPoint::eCompute, m_PipelineManager->getVkPipeline(computePipeline));
+			cmdBuffer.bindPipeline(vk::PipelineBindPoint::eCompute, m_ComputePipelineManager->getVkPipeline(computePipeline));
 			for (const auto& usage : descriptorSetUsages) {
 				cmdBuffer.bindDescriptorSets(
 					vk::PipelineBindPoint::eCompute,