diff --git a/config/Sources.cmake b/config/Sources.cmake
index 0d0a37876813861c605466566eced727a70f6488..7646cf6f07e172341fcdda4a2f56f4a19955b901 100644
--- a/config/Sources.cmake
+++ b/config/Sources.cmake
@@ -51,4 +51,10 @@ set(vkcv_sources
         
         ${vkcv_source}/vkcv/Framebuffer.hpp
         ${vkcv_source}/vkcv/Framebuffer.cpp
+
+		${vkcv_source}/vkcv/DescriptorManager.hpp
+		${vkcv_source}/vkcv/DescriptorManager.cpp
+
+		${vkcv_include}/vkcv/ResourcesConfig.hpp
+		${vkcv_source}/vkcv/ResourcesConfig.cpp
 )
diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp
index 45e555151584e60f4edd29058e5a59e076f9fafc..79a9d29d636540fe069b192322472c9e641a9039 100644
--- a/include/vkcv/Core.hpp
+++ b/include/vkcv/Core.hpp
@@ -17,12 +17,14 @@
 #include "CommandResources.hpp"
 #include "SyncResources.hpp"
 #include "Result.hpp"
+#include "vkcv/ResourcesConfig.hpp"
 
 namespace vkcv
 {
     // forward declarations
     class PassManager;
     class PipelineManager;
+    class DescriptorManager;
 
     class Core final
     {
@@ -147,6 +149,12 @@ namespace vkcv
         	return Buffer<T>::create(m_Context.getDevice(), m_Context.getPhysicalDevice(), bufferType, size);
         }
 
+        /** TODO:
+         *   @param setDescriptions
+         *   @return
+         */
+        ResourcesHandle createResourceDescription(const std::vector<SetDescription> &setDescriptions);
+
 		/**
 		 * @brief start recording command buffers and increment frame index
 		*/
diff --git a/include/vkcv/Descriptor.hpp b/include/vkcv/Descriptor.hpp
deleted file mode 100644
index 26a028dd49c51bd2acf2de946b2a17f21a6ebed1..0000000000000000000000000000000000000000
--- a/include/vkcv/Descriptor.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#include <vulkan/vulkan.hpp>
-
-namespace vkcv {
-
-	class Descriptor
-	{
-
-	
-		friend class Core;
-	public:
-
-		//Die verschiedenen Pool Sizes f�r die verschiedenen Arten von Buffern
-		struct PoolSizes {
-			std::vector<std::pair<VkDescriptorType, float>> sizes =
-			{
-				{ VK_DESCRIPTOR_TYPE_SAMPLER, 0.5f },
-				{ VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 4.f },
-				{ VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 4.f },
-				{ VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1.f },
-				{ VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1.f },
-				{ VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1.f },
-				{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2.f },
-				{ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2.f }
-			};
-		};
-
-		void createDescriptors(VkDevice device/*, int buffer_size*/);
-		
-		const void destroyDescriptor(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, VkDescriptorPool descriptorPool);
-
-		const VkDescriptorPool createDescPool(VkDescriptorPool descriptorPool, VkDevice device, const PoolSizes& poolSizes, int count);
-
-		const VkDescriptorSetLayout createDescSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, VkDescriptorSetLayoutCreateInfo* info);
-
-		struct DescriptorLayoutInfo;
-
-		struct PoolSizes;
-
-	private:
-
-		//Layout Info
-		struct DescriptorLayoutInfo {
-			std::vector<VkDescriptorSetLayoutBinding> bindings;
-
-			bool operator==(const DescriptorLayoutInfo& other) const;
-
-			size_t hash() const;
-		};
-
-
-		//Informationen zum Set Layout
-		typedef struct VkDescriptorSetLayoutCreateInfo {
-			VkStructureType sType;
-			const void* pNext;
-			VkDescriptorSetLayoutCreateFlags flags;
-			uint32_t bindingCount;
-			const VkDescriptorSetLayoutBinding* pBindings;
-		} VkDescriptorSetLayoutCreateInfo;
-	};
-}
\ No newline at end of file
diff --git a/include/vkcv/Handles.hpp b/include/vkcv/Handles.hpp
index 4ec2bc058409e9119695700b2b727be9426c2bcd..ad48a1ecbd41f75286cc33e88e62699468a5f11f 100644
--- a/include/vkcv/Handles.hpp
+++ b/include/vkcv/Handles.hpp
@@ -13,4 +13,5 @@ namespace vkcv
     struct BufferHandle     {uint64_t id;};
     struct PassHandle       {uint64_t id;};
     struct PipelineHandle   {uint64_t id;};
+    struct ResourcesHandle  {uint64_t id;};
 }
diff --git a/include/vkcv/ResourcesConfig.hpp b/include/vkcv/ResourcesConfig.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..d9e9a3f8864afa3e78d68bb5896d09edf97fda56
--- /dev/null
+++ b/include/vkcv/ResourcesConfig.hpp
@@ -0,0 +1,23 @@
+#pragma once
+
+namespace vkcv
+{
+    enum class ResourceType
+    {
+        // TODO:
+        //  uniform buffers, samplers, images should be supported for now!
+    };
+
+    struct BindingDescription
+    {
+        // TODO:
+        //  should contain something like the binding ID,
+        //  and the descriptor/resource type
+    };
+
+    struct SetDescription
+    {
+        // TODO:
+        //  should contain a collection of BindingDescriptions
+    };
+}
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index 1c6c81be490598fb4f89814206e5773fc4d7a4d1..cbf5474b6a25f7598c8c5bc74df50f1a2145a69a 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -9,6 +9,7 @@
 #include "vkcv/Core.hpp"
 #include "PassManager.hpp"
 #include "PipelineManager.hpp"
+#include "DescriptorManager.hpp"
 #include "Surface.hpp"
 #include "ImageLayoutTransitions.hpp"
 #include "Framebuffer.hpp"
@@ -213,4 +214,12 @@ namespace vkcv
 	vk::Format Core::getSwapchainImageFormat() {
 		return m_swapchain.getSurfaceFormat().format;
 	}
+
+    ResourcesHandle Core::createResourceDescription(const std::vector<SetDescription> &setDescriptions)
+    {
+        // TODO:
+        //  call DescriptorManager's createResourceDescription
+        //  let it do the actual work! No vulkan stuff here.
+        return ResourcesHandle{0};
+    }
 }
diff --git a/src/vkcv/Descriptor.cpp b/src/vkcv/Descriptor.cpp
deleted file mode 100644
index c59aac1c83f48eff8a200458355142643905761f..0000000000000000000000000000000000000000
--- a/src/vkcv/Descriptor.cpp
+++ /dev/null
@@ -1,162 +0,0 @@
-#include "vkcv/Descriptor.hpp"
-
-namespace vkcv
-{
-	const VkDescriptorSetLayout createDescSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, VkDescriptorSetLayoutCreateInfo* info)
-	{
-
-		/* Code, falls nur ein Set mit nur einem Binding erstellt wird
-		VkDescriptorSetLayoutBinding layoutBinding = {};
-		layoutBinding.binding = 0;
-		layoutBinding.descriptorType = VkDescriptorType::VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
-		layoutBinding.descriptorCount = 1;
-		layoutBinding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
-
-		VkDescriptorSetLayoutCreateInfo layoutInfo = {};
-		layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
-		layoutInfo.bindingCount = 1;
-		layoutInfo.pBindings = &layoutBinding;*/
-
-		//Erstellen von der Layout Info
-		DescriptorLayoutInfo layoutinfo;
-		layoutinfo.bindings.reserve(info->bindingCount);
-		bool isSorted = true;
-		int lastBinding = -1;
-
-		//Sortieren und pushen von Bindings f�r Ordnung
-		for (int i = 0; i < info->bindingCount; i++) {
-			layoutinfo.bindings.push_back(info->pBindings[i]);
-
-			//Bindings m�ssen aufsteigend sortiert sein
-			if (info->pBindings[i].binding > lastBinding) {
-				lastBinding = info->pBindings[i].binding;
-			}
-			else {
-				isSorted = false;
-			}
-		}
-		//Sortieren, falls Bindings noch nicht sortiert sind
-		if (!isSorted) {
-			std::sort(layoutinfo.bindings.begin(), layoutinfo.bindings.end(), [](VkDescriptorSetLayoutBinding& a, VkDescriptorSetLayoutBinding& b) {
-				return a.binding < b.binding;
-			});
-		}
-
-		//Test, ob es funktioniert
-		VkResult result = vkCreateDescriptorSetLayout(
-			device,
-			&layoutInfo,
-			nullptr,
-			&descriptorSetLayout
-		);
-		assert(result == VK_SUCCESS);
-
-	}
-
-	const VkDescriptorPool createDescPool(VkDescriptorPool descriptorPool, VkDevice device, const PoolSizes& poolSizes, int count)
-	{
-		//Gr��e des Pools bestimmen 
-		std::vector<VkDescriptorPoolSize> poolSize;
-		poolSize.reserve(poolSizes.sizes.size());
-		for (auto sz : poolSizes.sizes) {
-			poolSize.push_back({ sz.first, uint32_t(sz.second * count) });
-		}
-
-		//Erstelle das createInfo zu den Pools
-		VkDescriptorPoolCreateInfo createInfo = {};
-		createInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
-		createInfo.poolSizeCount = (uint32_t)poolSizes.sizes.size();
-		createInfo.pPoolSizes = poolSize.data();
-		createInfo.maxSets = count;
-
-		//Teste, ob der Pool erstellt werden kann
-		VkResult createDescriptorPool = vkCreateDescriptorPool(
-			device,
-			&createInfo,
-			nullptr,
-			&descriptorPool
-		);
-		assert(createDescriptorPool == VK_SUCCESS);
-
-	}
-
-	const void destroyDescriptor(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, VkDescriptorPool descriptorPool)  
-	{
-		//Destruktor f�r Layout und Pool
-		vkDestroyDescriptorSetLayout(
-			device,
-			descriptorSetLayout,
-			nullptr
-		);
-
-		vkDestroyDescriptorPool(
-			device,
-			descriptorPool,
-			nullptr
-		);
-	}
-
-	void Descriptor::createDescriptors(VkDevice device/*, int buffer_size*/)
-	{
-		//Ben�tigte Variablen
-		VkDescriptorPool descriptorPool;
-		VkDescriptorSetLayout descriptorSetLayout;
-		VkDescriptorSet descriptorSet;
-		VkWriteDescriptorSet descriptorWriteSet;
-		PoolSizes descriptorSizes;
-		int count = 1000;
-		
-		//Erstellung des Pools
-		descriptorPool = createDescPool(descriptorPool, device, descriptorSizes, count);
-
-		//Erstellung der Set Layouts
-		descriptorSetLayout = createDescSetLayout(device, descriptorSetLayout);
-
-		{	
-			//Sets erstellen
-			VkDescriptorSetAllocateInfo allocInfo = {};
-			allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
-			allocInfo.descriptorPool = descriptorPool;
-			allocInfo.descriptorSetCount = count;
-			allocInfo.pSetLayouts = &descriptorSetLayout;
-
-			//Teste, ob Sets erstellt wurden
-			VkResult result = vkAllocateDescriptorSets(
-				device,
-				&allocInfo,
-				&descriptorSet
-			);
-			assert (result == VK_SUCCESS);
-
-		}
-
-		
-		{	/*Buffer Date in Descriptor schreiben
-			VkDescriptorBufferInfo bufferInfo = {};
-			bufferInfo.buffer = buffer;
-			bufferInfo.offset = 0;
-			bufferInfo.range = buffer_size;
-
-			descriptorWriteSet = {};
-			descriptorWriteSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
-			descriptorWriteSet.dstSet = descriptorSet;
-			descriptorWriteSet.dstBinding = 0;
-			descriptorWriteSet.dstArrayElement = 0;
-			descriptorWriteSet.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
-			descriptorWriteSet.descriptorCount = 1;
-			descriptorWriteSet.pBufferInfo = &bufferInfo;
-
-
-			vkUpdateDescriptorSets(
-				device,
-				1,
-				&descriptorWriteSet,
-				0,
-				NULL
-			);*/
-		}
-
-	}
-
-
-}
\ No newline at end of file
diff --git a/src/vkcv/DescriptorManager.cpp b/src/vkcv/DescriptorManager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..32e0d031bb789af5aed9d51ad1bd14b52c4d2b9f
--- /dev/null
+++ b/src/vkcv/DescriptorManager.cpp
@@ -0,0 +1,14 @@
+#include "DescriptorManager.hpp"
+
+
+namespace vkcv
+{
+    ResourcesHandle vkcv::DescriptorManager::createResourceDescription(const std::vector<SetDescription> &setDescriptions)
+    {
+        // TODO: create all vk::DescriptorSets and allocate them from the pool
+        // put them into a ResourceDescription struct
+        // push that struct into m_Resources;
+        // return the index into that object as ResourcesHandle;
+        return ResourcesHandle{0};
+    }
+}
\ No newline at end of file
diff --git a/src/vkcv/DescriptorManager.hpp b/src/vkcv/DescriptorManager.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..5a9d4feb30ce6e69e32eba461cba182afbe88b4c
--- /dev/null
+++ b/src/vkcv/DescriptorManager.hpp
@@ -0,0 +1,32 @@
+#include <vulkan/vulkan.hpp>
+
+#include "vkcv/Handles.hpp"
+#include "vkcv/ResourcesConfig.hpp"
+
+namespace vkcv
+{
+	class DescriptorManager
+	{
+	public:
+	    explicit DescriptorManager(vk::Device) noexcept;
+	    ~DescriptorManager();
+
+
+	    // TODO: Interface
+	    //  user wishes to create descriptor sets {X,Y,Z} each with different descriptions {A,B,C}
+	    //  returns a resource
+        ResourcesHandle createResourceDescription(const std::vector<SetDescription> &setDescriptions);
+
+	private:
+        vk::DescriptorPool m_Pool;
+
+        // TODO: container for all resources requested by the user
+        struct ResourceDescription
+        {
+            std::vector<vk::DescriptorSet> descriptorSets;
+            std::vector<vk::DescriptorSetLayout> descriptorSetLayouts;
+        };
+
+        std::vector<ResourceDescription> m_Resources;
+	};
+}
\ No newline at end of file
diff --git a/src/vkcv/ResourcesConfig.cpp b/src/vkcv/ResourcesConfig.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391