diff --git a/include/vkcv/BufferManager.hpp b/include/vkcv/BufferManager.hpp
index 7144350afede0dc597f0fe6c6da2e4af5a9075e9..1f10c8dc4bbdf3142ffffcd6e1061fc83d52c0f6 100644
--- a/include/vkcv/BufferManager.hpp
+++ b/include/vkcv/BufferManager.hpp
@@ -136,12 +136,21 @@ namespace vkcv
 			const BufferHandle& handle,
 			vk::CommandBuffer cmdBuffer);
 
-		void readBufferMemoryBarrier(
+
+		/**
+		 * Reads buffer data from GPU for a given buffer handle
+		 * and writes it to data pointer. Uses cmdBuffer to
+		 * create neccessary memory barriers.
+		 * 
+		 * @param handle Buffer handle to read
+		 * @param cmdBuffer commandbuffer to execute memory barriers
+		 * @param data data pointer to which result will be written
+		 *
+		 */
+		void readBuffer(
 		    const BufferHandle& handle,
 		    vk::CommandBuffer cmdBuffer,
 		    void* data);
-
-        void readBuffer(const BufferHandle& handle, void *data);
 	};
 	
 }
diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp
index 66a50e5640783048a41f5ca18dbdffc6f5be679b..50a5a8a452a930a772533fe7cf7c627540442461 100644
--- a/include/vkcv/Core.hpp
+++ b/include/vkcv/Core.hpp
@@ -303,7 +303,7 @@ namespace vkcv
 		void prepareImageForStorage(const CommandStreamHandle& cmdStream, const ImageHandle& image);
 		void recordImageMemoryBarrier(const CommandStreamHandle& cmdStream, const ImageHandle& image);
 		void recordBufferMemoryBarrier(const CommandStreamHandle& cmdStream, const BufferHandle& buffer);
-		void readBufferMemoryBarrier(const CommandStreamHandle cmdStream, const BufferHandle buffer, void *data);
+		void recordReadBuffer(const CommandStreamHandle cmdStream, const BufferHandle buffer, void *data);
 		void resolveMSAAImage(const CommandStreamHandle& cmdStream, const ImageHandle& src, const ImageHandle& dst);
 
 		[[nodiscard]]
diff --git a/projects/neural_network/src/main.cpp b/projects/neural_network/src/main.cpp
index 648b025e31cfed2cf06706d61ce9e013ae5a07ca..8958adbb9d6b9eea79f2b5a8e7a95298bb7ffe60 100644
--- a/projects/neural_network/src/main.cpp
+++ b/projects/neural_network/src/main.cpp
@@ -63,7 +63,7 @@ int main(int argc, const char** argv) {
         std::cout << "Error. Could not create compute pipeline. Exiting." << std::endl;
         return EXIT_FAILURE;
     }
-
+    for(int i =0;i<3;i++){
     auto cmdStream = core.createCommandStream(vkcv::QueueType::Compute);
     uint32_t computeDispatchCount[3] = {64,1,1 };
 
@@ -78,12 +78,13 @@ int main(int argc, const char** argv) {
 
     int output[64] = { 0 };
     std::fill_n(output, 64, -1);
-    core.readBufferMemoryBarrier(cmdStream, inputBuffer.getHandle(), &output);
+    core.recordReadBuffer(cmdStream, inputBuffer.getHandle(), &output);
     core.submitCommandStream(cmdStream);
     std::cout << "[";
     for (int i = 0; i < 64; i++) {
         std::cout << output[i] << ", ";
     }
     std::cout << "]" << std::endl;
+    }
     return 0;
 }
diff --git a/src/vkcv/BufferManager.cpp b/src/vkcv/BufferManager.cpp
index fbe6e2e7d0008b3856a44de82eb5e8d76f987cf5..ea0408094d86d72206eff7d31566e4af7c182d80 100644
--- a/src/vkcv/BufferManager.cpp
+++ b/src/vkcv/BufferManager.cpp
@@ -330,33 +330,15 @@ namespace vkcv {
 			nullptr);
 	}
 
-    void BufferManager::readBuffer(const BufferHandle& handle, void *data) {
-        const uint64_t id = handle.getId();
-        size_t size = getBufferSize(handle);
-
-        if (size == 0) {
-            size = SIZE_MAX;
-        }
-
-        if (id >= m_buffers.size()) {
-            return;
-        }
-
-        auto& buffer = m_buffers[id];
 
-        const vma::Allocator& allocator = m_core->getContext().getAllocator();
-
-
-        const size_t max_size = std::min(size, buffer.m_size);
-
-        void* mapped = allocator.mapMemory(buffer.m_allocation);
-        memcpy(reinterpret_cast<int*>(data), reinterpret_cast<char*>(mapped) , max_size);
-        allocator.unmapMemory(buffer.m_allocation);
-    }
-
-    void BufferManager ::readBufferMemoryBarrier(const BufferHandle& handle, vk::CommandBuffer cmdBuffer, void *data) {
+    void BufferManager ::readBuffer(const BufferHandle& handle, vk::CommandBuffer cmdBuffer, void *data) {
 
         const uint64_t id = handle.getId();
+		size_t size = getBufferSize(handle);
+
+		if (size == 0) {
+			size = SIZE_MAX;
+		}
 
         if (id >= m_buffers.size()) {
             vkcv_log(vkcv::LogLevel::ERROR, "Invalid buffer handle");
@@ -382,7 +364,14 @@ namespace vkcv {
                 memoryBarrier,
                 nullptr);
 
-        readBuffer(handle, data);
+		const vma::Allocator& allocator = m_core->getContext().getAllocator();
+
+
+		const size_t max_size = std::min(size, buffer.m_size);
+
+		void* mapped = allocator.mapMemory(buffer.m_allocation);
+		memcpy(reinterpret_cast<int*>(data), reinterpret_cast<char*>(mapped), max_size);
+		allocator.unmapMemory(buffer.m_allocation);
 
         vk::BufferMemoryBarrier memoryBarrier2(
                 vk::AccessFlagBits::eTransferWrite,
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index aaf8a7a6aeacc4af7fdfc4b42914dcd54a754e57..6c3a388b8c0f668b7994b7cd6c7c5106f2ab10dd 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -698,9 +698,9 @@ namespace vkcv
 		}, nullptr);
 	}
 
-	void Core::readBufferMemoryBarrier(const CommandStreamHandle cmdStream, const BufferHandle buffer, void *data) {
+	void Core::recordReadBuffer(const CommandStreamHandle cmdStream, const BufferHandle buffer, void *data) {
 		recordCommandsToStream(cmdStream, [buffer, this, data](const vk::CommandBuffer cmdBuffer) {
-			m_BufferManager->readBufferMemoryBarrier(buffer, cmdBuffer, data);
+			m_BufferManager->readBuffer(buffer, cmdBuffer, data);
 		}, nullptr);
 	}