diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp
index 0114fb99549dc42edf99d04c3e7db350c8f9956b..c11cdf32db944a1603af8699f760233acb000da3 100644
--- a/include/vkcv/Core.hpp
+++ b/include/vkcv/Core.hpp
@@ -30,6 +30,12 @@ namespace vkcv
 		BufferHandle	buffer;
 	};
 
+	struct Mesh {
+		std::vector<VertexBufferBinding>    vertexBufferBindings;
+		BufferHandle                        indexBuffer;
+		size_t                              indexCount;
+	};
+
     // forward declarations
     class PassManager;
     class PipelineManager;
@@ -227,9 +233,7 @@ namespace vkcv
 			const PipelineHandle					pipelineHandle,
 			const size_t							pushConstantSize, 
 			const void*								pushConstantData, 
-			const std::vector<VertexBufferBinding>	&vertexBufferBindings, 
-			const BufferHandle						&indexBuffer,
-			const size_t							indexCount,
+			const Mesh								&mesh,
 			const vkcv::ResourcesHandle				resourceHandle,
 			const size_t							resourceDescriptorSetIndex,
 			const std::vector<ImageHandle>			&renderTargets);
diff --git a/projects/cmd_sync_test/src/main.cpp b/projects/cmd_sync_test/src/main.cpp
index e635eb68dcdfd890189d21d2bc0053e28ceb23fb..64c08943ca89a5a07bf41aced7a79d4838c4bf37 100644
--- a/projects/cmd_sync_test/src/main.cpp
+++ b/projects/cmd_sync_test/src/main.cpp
@@ -60,6 +60,15 @@ int main(int argc, const char** argv) {
 	
 	indexBuffer.fill(mesh.vertexGroups[0].indexBuffer.data);
 
+	vkcv::Mesh boxMesh;
+	boxMesh.indexBuffer = indexBuffer.getHandle();
+	boxMesh.vertexBufferBindings = {
+		{ mesh.vertexGroups[0].vertexBuffer.attributes[0].offset, vertexBuffer.getHandle() },
+		{ mesh.vertexGroups[0].vertexBuffer.attributes[1].offset, vertexBuffer.getHandle() },
+		{ mesh.vertexGroups[0].vertexBuffer.attributes[2].offset, vertexBuffer.getHandle() }
+	};
+	boxMesh.indexCount = mesh.vertexGroups[0].numIndices;
+
 	// an example attachment for passes that output to the window
 	const vkcv::AttachmentDescription present_color_attachment(
 		vkcv::AttachmentLayout::UNDEFINED,
@@ -136,12 +145,6 @@ int main(int argc, const char** argv) {
 		vkcv::SamplerAddressMode::REPEAT
 	);
 
-	std::vector<vkcv::VertexBufferBinding> vertexBufferBindings = {
-		{ mesh.vertexGroups[0].vertexBuffer.attributes[0].offset, vertexBuffer.getHandle() },
-		{ mesh.vertexGroups[0].vertexBuffer.attributes[1].offset, vertexBuffer.getHandle() },
-		{ mesh.vertexGroups[0].vertexBuffer.attributes[2].offset, vertexBuffer.getHandle() }
-	};
-
 	vkcv::DescriptorWrites setWrites;
 	setWrites.sampledImageWrites	= { vkcv::SampledImageDescriptorWrite(0, texture.getHandle()) };
 	setWrites.samplerWrites			= { vkcv::SamplerDescriptorWrite(1, sampler) };
@@ -170,9 +173,7 @@ int main(int argc, const char** argv) {
 			trianglePipeline,
 			sizeof(mvp),
 			&mvp,
-			vertexBufferBindings,
-			indexBuffer.getHandle(),
-			mesh.vertexGroups[0].numIndices,
+			boxMesh,
 			set,
 			0,
 			{ swapchainInput, depthBuffer });
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index ff3bb54787c75043e37fb8c327287d64eaaab691..d72f87d6cb5c47b9f8fe9db174177c0ee8aca106 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -142,16 +142,14 @@ namespace vkcv
 	}
 
 	void Core::renderMesh(
-		const PassHandle						renderpassHandle, 
-		const PipelineHandle					pipelineHandle, 
-		const size_t							pushConstantSize, 
-		const void								*pushConstantData,
-		const std::vector<VertexBufferBinding>& vertexBufferBindings, 
-		const BufferHandle						&indexBuffer,
-		const size_t							indexCount,
-		const vkcv::ResourcesHandle				resourceHandle,
-		const size_t							resourceDescriptorSetIndex,
-		const std::vector<ImageHandle>&			renderTargets) {
+		const PassHandle				renderpassHandle, 
+		const PipelineHandle			pipelineHandle, 
+		const size_t					pushConstantSize, 
+		const void						*pushConstantData,
+		const Mesh						&mesh,
+		const vkcv::ResourcesHandle		resourceHandle,
+		const size_t					resourceDescriptorSetIndex,
+		const std::vector<ImageHandle>&	renderTargets) {
 
 		if (m_currentSwapchainImageIndex == std::numeric_limits<uint32_t>::max()) {
 			return;
@@ -183,7 +181,6 @@ namespace vkcv
 		const vk::Pipeline pipeline		= m_PipelineManager->getVkPipeline(pipelineHandle);
 		const vk::PipelineLayout pipelineLayout = m_PipelineManager->getVkPipelineLayout(pipelineHandle);
 		const vk::Rect2D renderArea(vk::Offset2D(0, 0), vk::Extent2D(width, height));
-		const vk::Buffer vulkanIndexBuffer	= m_BufferManager->getBuffer(indexBuffer);
 
 		const vk::ImageView swapchainImageView = m_swapchainImageViews[m_currentSwapchainImageIndex];
 
@@ -259,8 +256,8 @@ namespace vkcv
                 cmdBuffer.setScissor(0, 1, &dynamicScissor);
             }
 
-            for (uint32_t i = 0; i < vertexBufferBindings.size(); i++) {
-                const auto &vertexBinding = vertexBufferBindings[i];
+            for (uint32_t i = 0; i < mesh.vertexBufferBindings.size(); i++) {
+                const auto &vertexBinding = mesh.vertexBufferBindings[i];
                 const auto vertexBuffer = bufferManager->getBuffer(vertexBinding.buffer);
                 cmdBuffer.bindVertexBuffers(i, (vertexBuffer), (vertexBinding.offset));
             }
@@ -270,9 +267,11 @@ namespace vkcv
                 cmdBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipelineLayout, 0, descriptorSet, nullptr);
             }
 
-            cmdBuffer.bindIndexBuffer(vulkanIndexBuffer, 0, vk::IndexType::eUint16);	//FIXME: choose proper size
+            const vk::Buffer indexBuffer = m_BufferManager->getBuffer(mesh.indexBuffer);
+
+            cmdBuffer.bindIndexBuffer(indexBuffer, 0, vk::IndexType::eUint16);	//FIXME: choose proper size
             cmdBuffer.pushConstants(pipelineLayout, vk::ShaderStageFlagBits::eAll, 0, pushConstantSize, pushConstantData);
-            cmdBuffer.drawIndexed(indexCount, 1, 0, 0, {});
+            cmdBuffer.drawIndexed(mesh.indexCount, 1, 0, 0, {});
             cmdBuffer.endRenderPass();
         };