diff --git a/config/Sources.cmake b/config/Sources.cmake
index df1880cea6a46ea279a2173eebf1108300778fb5..9e121ffc1c120e771ebbb5366efe3412f6dcac3c 100644
--- a/config/Sources.cmake
+++ b/config/Sources.cmake
@@ -24,6 +24,12 @@ set(vkcv_sources
 		${vkcv_include}/vkcv/BufferManager.hpp
 		${vkcv_source}/vkcv/BufferManager.cpp
 
+		${vkcv_include}/vkcv/Image.hpp
+		${vkcv_source}/vkcv/Image.cpp
+
+		${vkcv_include}/vkcv/ImageManager.hpp
+		${vkcv_source}/vkcv/ImageManager.cpp
+
 		${vkcv_include}/vkcv/SwapChain.hpp
 		${vkcv_source}/vkcv/SwapChain.cpp
 
diff --git a/include/vkcv/Image.hpp b/include/vkcv/Image.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..9b632c290989658dfae8154205e94ac7ab2e1a5e
--- /dev/null
+++ b/include/vkcv/Image.hpp
@@ -0,0 +1,19 @@
+#pragma once
+/**
+ * @authors Lars Hoerttrich
+ * @file vkcv/Buffer.hpp
+ * @brief class for image handles
+ */
+#include "ImageManager.hpp"
+
+namespace vkcv {
+	class Image {
+	public:
+		static Image create(ImageManager* manager);
+	private:
+		ImageManager* const m_manager;
+		const uint64_t m_handle_id;
+
+		Image(ImageManager* manager, uint64_t id);
+	};
+}
diff --git a/include/vkcv/ImageManager.hpp b/include/vkcv/ImageManager.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..db53ad72c6cd8d980e84f5d082c28464c7b5f0fc
--- /dev/null
+++ b/include/vkcv/ImageManager.hpp
@@ -0,0 +1,45 @@
+#pragma once
+/**
+ * @authors Lars Hoerttrich
+ * @file vkcv/ImageManager.hpp
+ * @brief class creating and managing images
+ */
+#include <vector>
+#include <vulkan/vulkan.hpp>
+
+namespace vkcv {
+	class Core;
+	class ImageManager 
+	{
+		friend class Core;
+	private:
+		struct Image
+		{
+			vk::Image m_handle;
+			vk::DeviceMemory m_memory;
+			void* m_mapped = nullptr;
+			bool m_mappable;
+		};
+		Core* m_core;
+		std::vector<Image> m_images;
+		ImageManager() noexcept;
+	public:
+		~ImageManager() noexcept;
+		ImageManager(ImageManager&& other) = delete;
+		ImageManager(const ImageManager& other) = delete;
+
+		ImageManager& operator=(ImageManager&& other) = delete;
+		ImageManager& operator=(const ImageManager& other) = delete;
+
+
+		uint64_t createImage();
+
+		/**
+		 * Destroys and deallocates image represented by a given
+		 * buffer handle id.
+		 *
+		 * @param id Buffer handle id
+		 */
+		void destroyImage(uint64_t id);
+	};
+}
\ No newline at end of file
diff --git a/src/vkcv/Image.cpp b/src/vkcv/Image.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4af32f97cb5501029325aeccd938790b6271680e
--- /dev/null
+++ b/src/vkcv/Image.cpp
@@ -0,0 +1,19 @@
+/**
+ * @authors Lars Hoerttrich
+ * @file vkcv/Image.cpp
+ * @brief class for image handles
+ */
+#include "vkcv/Image.hpp"
+namespace vkcv{
+	Image Image::create(ImageManager* manager)
+	{
+		return Image(manager, manager->createImage());
+	}
+
+	Image::Image(ImageManager* manager, uint64_t id) :
+		m_manager(manager),
+		m_handle_id(id)
+	{
+	}
+
+}
diff --git a/src/vkcv/ImageManager.cpp b/src/vkcv/ImageManager.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ec82ca09c26696a8c0fc69ff34c08a5b6f30e170
--- /dev/null
+++ b/src/vkcv/ImageManager.cpp
@@ -0,0 +1,47 @@
+/**
+ * @authors Lars Hoerttrich
+ * @file vkcv/ImageManager.cpp
+ * @brief class creating and managing images
+ */
+#include "vkcv/ImageManager.hpp"
+#include "vkcv/Core.hpp"
+
+namespace vkcv {
+	
+	ImageManager::ImageManager() noexcept :
+		m_core(nullptr), m_images()
+	{
+	}
+
+	ImageManager::~ImageManager() noexcept {
+		for (size_t id = 0; id < m_images.size(); id++) {
+			destroyImage(id);
+		}
+	}
+
+	uint64_t ImageManager::createImage()
+	{
+		
+		return uint64_t();
+	}
+
+	void ImageManager::destroyImage(uint64_t id)
+	{
+		if (id >= m_images.size()) {
+			return;
+		}
+		auto& image = m_images[id];
+
+		const vk::Device& device = m_core->getContext().getDevice();
+
+		if (image.m_memory) {
+			device.freeMemory(image.m_memory);
+		}
+
+		if (image.m_handle) {
+			device.destroyImage(image.m_handle);
+		}
+	}
+
+
+}
\ No newline at end of file