diff --git a/include/vkcv/ImageManager.hpp b/include/vkcv/ImageManager.hpp
index db53ad72c6cd8d980e84f5d082c28464c7b5f0fc..b2957f6a5ae7ea8b0e4eab86828fb47463404bc6 100644
--- a/include/vkcv/ImageManager.hpp
+++ b/include/vkcv/ImageManager.hpp
@@ -31,8 +31,9 @@ namespace vkcv {
 		ImageManager& operator=(ImageManager&& other) = delete;
 		ImageManager& operator=(const ImageManager& other) = delete;
 
+		void copyBufferToImage(vk::Buffer bufffer, vk::Image image, uint32_t width, uint32_t height);
 
-		uint64_t createImage();
+		uint64_t createImage(uint32_t width, uint32_t height);
 
 		/**
 		 * Destroys and deallocates image represented by a given
diff --git a/src/vkcv/ImageManager.cpp b/src/vkcv/ImageManager.cpp
index ec82ca09c26696a8c0fc69ff34c08a5b6f30e170..db60960d5543e698e2ab631f738b85694b10a365 100644
--- a/src/vkcv/ImageManager.cpp
+++ b/src/vkcv/ImageManager.cpp
@@ -7,6 +7,25 @@
 #include "vkcv/Core.hpp"
 
 namespace vkcv {
+
+	uint32_t searchMemoryType(const vk::PhysicalDeviceMemoryProperties& physicalMemoryProperties, uint32_t typeBits, vk::MemoryPropertyFlags requirements) {
+		const uint32_t memoryCount = physicalMemoryProperties.memoryTypeCount;
+		for (uint32_t memoryIndex = 0; memoryIndex < memoryCount; ++memoryIndex) {
+			const uint32_t memoryTypeBits = (1 << memoryIndex);
+			const bool isRequiredMemoryType = typeBits & memoryTypeBits;
+
+			const vk::MemoryPropertyFlags properties =
+				physicalMemoryProperties.memoryTypes[memoryIndex].propertyFlags;
+			const bool hasRequiredProperties =
+				(properties & requirements) == requirements;
+
+			if (isRequiredMemoryType && hasRequiredProperties)
+				return static_cast<int32_t>(memoryIndex);
+		}
+
+		// failed to find memory type
+		return -1;
+	}
 	
 	ImageManager::ImageManager() noexcept :
 		m_core(nullptr), m_images()
@@ -19,10 +38,55 @@ namespace vkcv {
 		}
 	}
 
-	uint64_t ImageManager::createImage()
+	void ImageManager::copyBufferToImage(vk::Buffer bufffer, vk::Image image, uint32_t width, uint32_t height)
+	{
+		//TODO
+	}
+
+
+	uint64_t ImageManager::createImage(uint32_t width, uint32_t height)
 	{
+		vk::ImageCreateFlags createFlags;
+		vk::ImageUsageFlags imageUsageFlags = (vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eTransferDst);
+		vk::Format format = vk::Format::eR8G8B8A8Unorm; // als Argument variabel?
+
+
+		const vk::Device& device = m_core->getContext().getDevice();
+
+		vk::ImageCreateInfo imageCreateInfo(
+			createFlags,
+			vk::ImageType::e2D,
+			format, vk::Extent3D(width, height, 1),
+			1,
+			1,
+			vk::SampleCountFlagBits::e1,
+			vk::ImageTiling::eOptimal,
+			imageUsageFlags,
+			vk::SharingMode::eExclusive,
+			{},
+			vk::ImageLayout::eUndefined
+		);
+
+		vk::Image image = device.createImage(imageCreateInfo);
 		
-		return uint64_t();
+		const vk::MemoryRequirements requirements = device.getImageMemoryRequirements(image);
+		const vk::PhysicalDevice& physicalDevice = m_core->getContext().getPhysicalDevice();
+
+		vk::MemoryPropertyFlags memoryTypeFlags = vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent;
+		bool mappable = false;
+
+		const uint32_t memoryTypeIndex = searchMemoryType(
+			physicalDevice.getMemoryProperties(),
+			requirements.memoryTypeBits,
+			memoryTypeFlags
+		);
+
+		vk::DeviceMemory memory = device.allocateMemory(vk::MemoryAllocateInfo(requirements.size, memoryTypeIndex));
+		device.bindImageMemory(image, memory, 0);
+
+		const uint64_t id = m_images.size();
+		m_images.push_back({ image, memory, nullptr, mappable });
+		return id;
 	}
 
 	void ImageManager::destroyImage(uint64_t id)