diff --git a/src/vkcv/ImageManager.cpp b/src/vkcv/ImageManager.cpp
index 39cca04b3ba5fa9842a225272cf6a8732838a938..70b4a6016c5faddff7073589794af7c77dc0d2d0 100644
--- a/src/vkcv/ImageManager.cpp
+++ b/src/vkcv/ImageManager.cpp
@@ -59,12 +59,15 @@ namespace vkcv {
 		const vk::Device& device = m_core->getContext().getDevice();
 
 		vk::ImageType imageType = vk::ImageType::e3D;
+		vk::ImageViewType imageViewType = vk::ImageViewType::e3D;
 		
 		if (depth <= 1) {
 			if (height <= 1) {
 				imageType = vk::ImageType::e1D;
+				imageViewType = vk::ImageViewType::e1D;
 			} else {
 				imageType = vk::ImageType::e2D;
+				imageViewType = vk::ImageViewType::e2D;
 			}
 		}
 		
@@ -81,7 +84,7 @@ namespace vkcv {
 				format, imageType, imageTiling, imageUsageFlags
 		);
 		
-		vk::ImageCreateInfo imageCreateInfo(
+		const vk::ImageCreateInfo imageCreateInfo(
 			createFlags,
 			imageType,
 			format,
@@ -111,11 +114,69 @@ namespace vkcv {
 		vk::DeviceMemory memory = device.allocateMemory(vk::MemoryAllocateInfo(requirements.size, memoryTypeIndex));
 		device.bindImageMemory(image, memory, 0);
 
+		const vk::ImageViewCreateInfo imageViewCreateInfo (
+				{},
+				image,
+				imageViewType,
+				format,
+				vk::ComponentMapping(
+						vk::ComponentSwizzle::eIdentity,
+						vk::ComponentSwizzle::eIdentity,
+						vk::ComponentSwizzle::eIdentity,
+						vk::ComponentSwizzle::eIdentity
+				),
+				vk::ImageSubresourceRange(
+						vk::ImageAspectFlagBits::eColor,
+						0,
+						1,
+						0,
+						1
+				)
+		);
+		
+		vk::ImageView view = device.createImageView(imageViewCreateInfo);
+		
 		const uint64_t id = m_images.size();
-		m_images.push_back({ image, memory, width, height, depth, format });
+		m_images.push_back({ image, memory, view, width, height, depth, format });
 		return ImageHandle(id);
 	}
-
+	
+	vk::Image ImageManager::getVulkanImage(const ImageHandle &handle) const {
+		const uint64_t id = handle.getId();
+		
+		if (id >= m_images.size()) {
+			return nullptr;
+		}
+		
+		auto& image = m_images[id];
+		
+		return image.m_handle;
+	}
+	
+	vk::DeviceMemory ImageManager::getVulkanDeviceMemory(const ImageHandle &handle) const {
+		const uint64_t id = handle.getId();
+		
+		if (id >= m_images.size()) {
+			return nullptr;
+		}
+		
+		auto& image = m_images[id];
+		
+		return image.m_memory;
+	}
+	
+	vk::ImageView ImageManager::getVulkanImageView(const ImageHandle &handle) const {
+		const uint64_t id = handle.getId();
+		
+		if (id >= m_images.size()) {
+			return nullptr;
+		}
+		
+		auto& image = m_images[id];
+		
+		return image.m_view;
+	}
+	
 	void ImageManager::switchImageLayout(const ImageHandle& handle, vk::ImageLayout oldLayout, vk::ImageLayout newLayout) {
 		//alternativly we could use switch case for every variable to set
 		vk::AccessFlags sourceAccessMask;
@@ -270,6 +331,11 @@ namespace vkcv {
 		auto& image = m_images[id];
 
 		const vk::Device& device = m_core->getContext().getDevice();
+		
+		if (image.m_view) {
+			device.destroyImageView(image.m_view);
+			image.m_view = nullptr;
+		}
 
 		if (image.m_memory) {
 			device.freeMemory(image.m_memory);
diff --git a/src/vkcv/ImageManager.hpp b/src/vkcv/ImageManager.hpp
index 22a4301977392876e520cecc6ccbfd7982cb3d59..98c4e4e67bbe27eed453f655c56138200d78e5f4 100644
--- a/src/vkcv/ImageManager.hpp
+++ b/src/vkcv/ImageManager.hpp
@@ -20,6 +20,7 @@ namespace vkcv {
 		{
 			vk::Image m_handle;
 			vk::DeviceMemory m_memory;
+			vk::ImageView m_view;
 			uint32_t m_width = 0;
 			uint32_t m_height = 0;
 			uint32_t m_depth = 0;
@@ -41,11 +42,20 @@ namespace vkcv {
 		ImageManager& operator=(ImageManager&& other) = delete;
 		ImageManager& operator=(const ImageManager& other) = delete;
 		
+		ImageHandle createImage(uint32_t width, uint32_t height, uint32_t depth, vk::Format format);
+		
+		[[nodiscard]]
+		vk::Image getVulkanImage(const ImageHandle& handle) const;
+		
+		[[nodiscard]]
+		vk::DeviceMemory getVulkanDeviceMemory(const ImageHandle& handle) const;
+		
+		[[nodiscard]]
+		vk::ImageView getVulkanImageView(const ImageHandle& handle) const;
+		
 		void switchImageLayout(const ImageHandle& handle, vk::ImageLayout oldLayout, vk::ImageLayout newLayout);
 		void fillImage(const ImageHandle& handle, void* data, size_t size);
 
-		ImageHandle createImage(uint32_t width, uint32_t height, uint32_t depth, vk::Format format);
-
 		/**
 		 * Destroys and deallocates image represented by a given
 		 * buffer handle.