diff --git a/src/vkcv/BufferManager.cpp b/src/vkcv/BufferManager.cpp
index cb2425a51ee177d062120b0eb61ae089f6f1692f..db314e21d09379e3acf29c24405926466e52e151 100644
--- a/src/vkcv/BufferManager.cpp
+++ b/src/vkcv/BufferManager.cpp
@@ -28,28 +28,29 @@ namespace vkcv {
 	}
 	
 	/**
-	 * @brief searches memory type index for buffer allocation, inspired by vulkan tutorial and "https://github.com/KhronosGroup/Vulkan-Hpp/blob/master/samples/utils/utils.hpp"
+	 * @brief searches memory type index for buffer allocation, combines requirements of buffer and application
 	 * @param physicalMemoryProperties Memory Properties of physical device
-	 * @param typeBits
+	 * @param typeBits Bit field for suitable memory types
 	 * @param requirements Property flags that are required
 	 * @return memory type index for Buffer
 	 */
-	uint32_t searchMemoryType(const vk::PhysicalDeviceMemoryProperties& physicalMemoryProperties, uint32_t typeBits, vk::MemoryPropertyFlags requirements) {
-		uint32_t memoryTypeIndex = 0;
-		
-		for (uint32_t i = 0; i < physicalMemoryProperties.memoryTypeCount; i++)
-		{
-			if ((typeBits & 1) &&
-				((physicalMemoryProperties.memoryTypes[i].propertyFlags & requirements) == requirements))
-			{
-				memoryTypeIndex = i;
-				break;
-			}
-			
-			typeBits >>= 1;
+	uint32_t searchBufferMemoryType(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);
 		}
-		
-		return memoryTypeIndex;
+
+		// failed to find memory type
+		return -1;
 	}
 	
 	uint64_t BufferManager::createBuffer(BufferType type, size_t size, BufferMemoryType memoryType) {
@@ -103,7 +104,7 @@ namespace vkcv {
 				break;
 		}
 		
-		const uint32_t memoryTypeIndex = searchMemoryType(
+		const uint32_t memoryTypeIndex = searchBufferMemoryType(
 				physicalDevice.getMemoryProperties(),
 				requirements.memoryTypeBits,
 				memoryTypeFlags
diff --git a/src/vkcv/ImageManager.cpp b/src/vkcv/ImageManager.cpp
index c99f1b8a278f825c46f8fe7d3540ec47041d7be2..a77976f548cc54556f0a12695faccb5664fbbb48 100644
--- a/src/vkcv/ImageManager.cpp
+++ b/src/vkcv/ImageManager.cpp
@@ -8,7 +8,14 @@
 
 namespace vkcv {
 
-	uint32_t searchMemoryType(const vk::PhysicalDeviceMemoryProperties& physicalMemoryProperties, uint32_t typeBits, vk::MemoryPropertyFlags requirements) {
+	/**
+	 * @brief searches memory type index for image allocation, combines requirements of image and application
+	 * @param physicalMemoryProperties Memory Properties of physical device
+	 * @param typeBits Bit field for suitable memory types
+	 * @param requirements Property flags that are required
+	 * @return memory type index for image
+	 */
+	uint32_t searchImageMemoryType(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);
@@ -75,7 +82,7 @@ namespace vkcv {
 		vk::MemoryPropertyFlags memoryTypeFlags = vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent;
 		bool mappable = false;
 
-		const uint32_t memoryTypeIndex = searchMemoryType(
+		const uint32_t memoryTypeIndex = searchImageMemoryType(
 			physicalDevice.getMemoryProperties(),
 			requirements.memoryTypeBits,
 			memoryTypeFlags