diff --git a/include/vkcv/Buffer.hpp b/include/vkcv/Buffer.hpp
index 5a95471bf2ccfb0709ee31e1e6131817575ee0ff..d327067ce409e845bcac5e4c9f56e7de59df89c2 100644
--- a/include/vkcv/Buffer.hpp
+++ b/include/vkcv/Buffer.hpp
@@ -7,6 +7,8 @@
 #include "Handles.hpp"
 #include "BufferManager.hpp"
 
+#include <vector>
+
 namespace vkcv {
 
 	template<typename T>
@@ -36,10 +38,14 @@ namespace vkcv {
 			return m_count * sizeof(T);
 		}
 		
-		void fill(T* data, size_t count = 0, size_t offset = 0) {
+		void fill(const T* data, size_t count = 0, size_t offset = 0) {
 			 m_manager->fillBuffer(m_handle, data, count * sizeof(T), offset * sizeof(T));
 		}
 		
+		void fill(const std::vector<T>& vector, size_t offset = 0) {
+			fill( static_cast<const T*>(vector.data()), static_cast<size_t>(vector.size()), offset);
+		}
+		
 		[[nodiscard]]
 		T* map(size_t offset = 0, size_t count = 0) {
 			return reinterpret_cast<T*>(m_manager->mapBuffer(m_handle, offset * sizeof(T), count * sizeof(T)));
diff --git a/include/vkcv/BufferManager.hpp b/include/vkcv/BufferManager.hpp
index 4b12f47ba8497bd09260d24523c28f207f64a98c..322873b348dab7c45d446b5053d61379dfde0b6b 100644
--- a/include/vkcv/BufferManager.hpp
+++ b/include/vkcv/BufferManager.hpp
@@ -103,7 +103,7 @@ namespace vkcv
 		 * @param size Size of data in bytes
 		 * @param offset Offset to fill in data in bytes
 		 */
-		void fillBuffer(const BufferHandle& handle, void* data, size_t size, size_t offset);
+		void fillBuffer(const BufferHandle& handle, const void* data, size_t size, size_t offset);
 		
 		/**
 		 * Maps memory to a buffer represented by a given
diff --git a/projects/first_mesh/src/main.cpp b/projects/first_mesh/src/main.cpp
index fe53ab112a97e69b61f51f3a88e6f6656aa90ead..102e6f38ba197ac624ab15132e0e5f722c13e2b7 100644
--- a/projects/first_mesh/src/main.cpp
+++ b/projects/first_mesh/src/main.cpp
@@ -45,13 +45,21 @@ int main(int argc, const char** argv) {
 	}
 
 	assert(mesh.vertexGroups.size() > 0);
-	const size_t vertexBufferSize = mesh.vertexGroups[0].vertexBuffer.data.size();
-	auto vertexBuffer = core.createBuffer<uint8_t>(vkcv::BufferType::VERTEX, vertexBufferSize, vkcv::BufferMemoryType::DEVICE_LOCAL);
-	vertexBuffer.fill(mesh.vertexGroups[0].vertexBuffer.data.data(), vertexBufferSize);
+	auto vertexBuffer = core.createBuffer<uint8_t>(
+			vkcv::BufferType::VERTEX,
+			mesh.vertexGroups[0].vertexBuffer.data.size(),
+			vkcv::BufferMemoryType::DEVICE_LOCAL
+	);
+	
+	vertexBuffer.fill(mesh.vertexGroups[0].vertexBuffer.data);
 
-	const size_t indexBufferSize = mesh.vertexGroups[0].indexBuffer.data.size();
-	auto indexBuffer = core.createBuffer<uint8_t>(vkcv::BufferType::INDEX, indexBufferSize, vkcv::BufferMemoryType::DEVICE_LOCAL);
-	indexBuffer.fill(mesh.vertexGroups[0].indexBuffer.data.data(), indexBufferSize);
+	auto indexBuffer = core.createBuffer<uint8_t>(
+			vkcv::BufferType::INDEX,
+			mesh.vertexGroups[0].indexBuffer.data.size(),
+			vkcv::BufferMemoryType::DEVICE_LOCAL
+	);
+	
+	indexBuffer.fill(mesh.vertexGroups[0].indexBuffer.data);
 
 	// an example attachment for passes that output to the window
 	const vkcv::AttachmentDescription present_color_attachment(
diff --git a/src/vkcv/BufferManager.cpp b/src/vkcv/BufferManager.cpp
index 740e89993860a7f71ac78aedae5cf3ed946c7b49..ab34a3df149c96d30c9ee4e0665ba47765d19751 100644
--- a/src/vkcv/BufferManager.cpp
+++ b/src/vkcv/BufferManager.cpp
@@ -123,7 +123,7 @@ namespace vkcv {
 	}
 	
 	struct StagingStepInfo {
-		void* data;
+		const void* data;
 		size_t size;
 		size_t offset;
 		
@@ -152,7 +152,7 @@ namespace vkcv {
 		const vk::Device& device = core->getContext().getDevice();
 		
 		void* mapped = device.mapMemory(info.stagingMemory, 0, mapped_size);
-		memcpy(mapped, reinterpret_cast<char*>(info.data) + info.stagingPosition, mapped_size);
+		memcpy(mapped, reinterpret_cast<const char*>(info.data) + info.stagingPosition, mapped_size);
 		device.unmapMemory(info.stagingMemory);
 		
 		SubmitInfo submitInfo;
@@ -218,7 +218,7 @@ namespace vkcv {
 		return buffer.m_memory;
 	}
 	
-	void BufferManager::fillBuffer(const BufferHandle& handle, void *data, size_t size, size_t offset) {
+	void BufferManager::fillBuffer(const BufferHandle& handle, const void *data, size_t size, size_t offset) {
 		const uint64_t id = handle.getId();
 		
 		if (size == 0) {