diff --git a/projects/wobble_bobble/shaders/init_particle_weights.comp b/projects/wobble_bobble/shaders/init_particle_weights.comp
index 3530bfa1a329c682bbc5b5eca7c3bbdcc32cb22f..1ab68813c535876658b53cf9e6401f4f01df0793 100644
--- a/projects/wobble_bobble/shaders/init_particle_weights.comp
+++ b/projects/wobble_bobble/shaders/init_particle_weights.comp
@@ -9,8 +9,8 @@ layout(set=0, binding=0, std430) restrict buffer particleBuffer {
     Particle particles [];
 };
 
-layout(set=0, binding=1) uniform texture3D gridImage;
-layout(set=0, binding=2) uniform sampler gridSampler;
+layout(set=1, binding=0) uniform texture3D gridImage;
+layout(set=1, binding=1) uniform sampler gridSampler;
 
 void main()	{
     if (gl_GlobalInvocationID.x < particles.length()) {
diff --git a/projects/wobble_bobble/shaders/particle.inc b/projects/wobble_bobble/shaders/particle.inc
index 92ce70eb5e3b8f7bf474908cae9356622f46bf07..a622485eab5bbcafdc51c030281e53b1cc1c5f11 100644
--- a/projects/wobble_bobble/shaders/particle.inc
+++ b/projects/wobble_bobble/shaders/particle.inc
@@ -42,6 +42,7 @@ struct Simulation {
 	float gamma;
 	int mode;
 	float gravity;
+	int count;
 };
 
 const float PI = 3.1415926535897932384626433832795;
diff --git a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
index 71d342e14129c2d6b8404044df11b52e0d9c9d2a..b37955cc2b8afbcccd56aed8de2d1eeecf0d530f 100644
--- a/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
+++ b/projects/wobble_bobble/shaders/transform_particles_to_grid.comp
@@ -9,11 +9,11 @@ layout(set=0, binding=0, std430) readonly buffer particleBuffer {
     Particle particles [];
 };
 
-layout(set=0, binding=1) uniform simulationBlock {
+layout(set=1, binding=0) uniform simulationBlock {
     Simulation simulation;
 };
 
-layout(set=0, binding=2, rgba16f) restrict writeonly uniform image3D gridImage;
+layout(set=2, binding=0, rgba16f) restrict writeonly uniform image3D gridImage;
 
 layout( push_constant ) uniform constants {
     float t;
diff --git a/projects/wobble_bobble/shaders/update_particle_velocities.comp b/projects/wobble_bobble/shaders/update_particle_velocities.comp
index 60b5a72e3c8f77eec5e13280b6fc8eaad57393c0..409e7e37b96b2d405e979f4b4295f529388275fa 100644
--- a/projects/wobble_bobble/shaders/update_particle_velocities.comp
+++ b/projects/wobble_bobble/shaders/update_particle_velocities.comp
@@ -10,12 +10,12 @@ layout(set=0, binding=0, std430) restrict buffer particleBuffer {
     Particle particles [];
 };
 
-layout(set=0, binding=1) uniform simulationBlock {
+layout(set=1, binding=0) uniform simulationBlock {
     Simulation simulation;
 };
 
-layout(set=0, binding=2) uniform texture3D gridImage;
-layout(set=0, binding=3) uniform sampler gridSampler;
+layout(set=2, binding=0) uniform texture3D gridImage;
+layout(set=2, binding=1) uniform sampler gridSampler;
 
 layout( push_constant ) uniform constants {
     float t;
diff --git a/projects/wobble_bobble/src/main.cpp b/projects/wobble_bobble/src/main.cpp
index 6fd28707b77a31cc68babc647c384cab440d977f..baba070e599409a13f01fba302e4427ce0238ef8 100644
--- a/projects/wobble_bobble/src/main.cpp
+++ b/projects/wobble_bobble/src/main.cpp
@@ -42,6 +42,7 @@ struct Simulation {
 	float gamma;
 	int mode;
 	float gravity;
+	int count;
 };
 
 struct Physics {
@@ -235,8 +236,13 @@ vkcv::ComputePipelineHandle createComputePipeline(vkcv::Core& core, vkcv::shader
 	return core.createComputePipeline(config);
 }
 
-void resetParticles(vkcv::Buffer<Particle>& particles, const glm::vec3& velocity,
+vkcv::BufferHandle resetParticles(vkcv::Core& core, size_t count, const glm::vec3& velocity,
 					float density, float size, int form, int mode) {
+	vkcv::Buffer<Particle> particles = core.createBuffer<Particle>(
+			vkcv::BufferType::STORAGE,
+			count
+	);
+	
 	std::vector<Particle> particles_vec (particles.getCount());
 	
 	switch (form) {
@@ -267,6 +273,7 @@ void resetParticles(vkcv::Buffer<Particle>& particles, const glm::vec3& velocity
 	}
 	
 	particles.fill(particles_vec);
+	return particles.getHandle();
 }
 
 int main(int argc, const char **argv) {
@@ -302,16 +309,11 @@ int main(int argc, const char **argv) {
 			swapchainExtent.height
 	).getHandle();
 	
-	vkcv::Buffer<Particle> particles = core.createBuffer<Particle>(
-			vkcv::BufferType::STORAGE,
-			1024
-	);
-	
 	vkcv::Image grid = core.createImage(
 			vk::Format::eR16G16B16A16Sfloat,
-			64,
-			64,
-			64,
+			32,
+			32,
+			32,
 			false,
 			true
 	);
@@ -344,8 +346,17 @@ int main(int argc, const char **argv) {
 	sim->gamma = 1.330f;
 	sim->mode = SIM_MODE_RANDOM;
 	sim->gravity = 9.81f;
-	
-	resetParticles(particles, initialVelocity, sim->density, sim->size, sim->form, sim->mode);
+	sim->count = 1024;
+	
+	vkcv::BufferHandle particlesHandle = resetParticles(
+			core,
+			sim->count,
+			initialVelocity,
+			sim->density,
+			sim->size,
+			sim->form,
+			sim->mode
+	);
 	
 	vkcv::shader::GLSLCompiler compiler;
 	
@@ -358,12 +369,17 @@ int main(int argc, const char **argv) {
 	
 	{
 		vkcv::DescriptorWrites writes;
-		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
-		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(1, grid.getHandle()));
-		writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(2, gridSampler));
+		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle));
 		core.writeDescriptorSet(initParticleWeightsSets[0], writes);
 	}
 	
+	{
+		vkcv::DescriptorWrites writes;
+		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(0, grid.getHandle()));
+		writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(1, gridSampler));
+		core.writeDescriptorSet(initParticleWeightsSets[1], writes);
+	}
+	
 	std::vector<vkcv::DescriptorSetHandle> transformParticlesToGridSets;
 	vkcv::ComputePipelineHandle transformParticlesToGridPipeline = createComputePipeline(
 			core, compiler,
@@ -373,12 +389,22 @@ int main(int argc, const char **argv) {
 	
 	{
 		vkcv::DescriptorWrites writes;
-		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
-		writes.uniformBufferWrites.push_back(vkcv::BufferDescriptorWrite(1, simulation.getHandle()));
-		writes.storageImageWrites.push_back(vkcv::StorageImageDescriptorWrite(2, grid.getHandle()));
+		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle));
 		core.writeDescriptorSet(transformParticlesToGridSets[0], writes);
 	}
 	
+	{
+		vkcv::DescriptorWrites writes;
+		writes.uniformBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, simulation.getHandle()));
+		core.writeDescriptorSet(transformParticlesToGridSets[1], writes);
+	}
+	
+	{
+		vkcv::DescriptorWrites writes;
+		writes.storageImageWrites.push_back(vkcv::StorageImageDescriptorWrite(0, grid.getHandle()));
+		core.writeDescriptorSet(transformParticlesToGridSets[2], writes);
+	}
+	
 	std::vector<vkcv::DescriptorSetHandle> updateParticleVelocitiesSets;
 	vkcv::ComputePipelineHandle updateParticleVelocitiesPipeline = createComputePipeline(
 			core, compiler,
@@ -388,13 +414,23 @@ int main(int argc, const char **argv) {
 	
 	{
 		vkcv::DescriptorWrites writes;
-		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
-		writes.uniformBufferWrites.push_back(vkcv::BufferDescriptorWrite(1, simulation.getHandle()));
-		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(2, grid.getHandle()));
-		writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(3, gridSampler));
+		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle));
 		core.writeDescriptorSet(updateParticleVelocitiesSets[0], writes);
 	}
 	
+	{
+		vkcv::DescriptorWrites writes;
+		writes.uniformBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, simulation.getHandle()));
+		core.writeDescriptorSet(updateParticleVelocitiesSets[1], writes);
+	}
+	
+	{
+		vkcv::DescriptorWrites writes;
+		writes.sampledImageWrites.push_back(vkcv::SampledImageDescriptorWrite(0, grid.getHandle()));
+		writes.samplerWrites.push_back(vkcv::SamplerDescriptorWrite(1, gridSampler));
+		core.writeDescriptorSet(updateParticleVelocitiesSets[2], writes);
+	}
+	
 	vkcv::ShaderProgram gfxProgramGrid;
 	
 	compiler.compile(
@@ -510,7 +546,7 @@ int main(int argc, const char **argv) {
 	
 	{
 		vkcv::DescriptorWrites writes;
-		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particles.getHandle()));
+		writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle));
 		core.writeDescriptorSet(gfxSetParticles, writes);
 	}
 	
@@ -629,7 +665,7 @@ int main(int argc, const char **argv) {
 	drawcallsParticles.push_back(vkcv::DrawcallInfo(
 			triangleMesh,
 			{ vkcv::DescriptorSetUsage(0, core.getDescriptorSet(gfxSetParticles).vulkanHandle) },
-			particles.getCount()
+			sim->count
 	));
 	
 	std::vector<vkcv::DrawcallInfo> drawcallsLines;
@@ -693,37 +729,50 @@ int main(int argc, const char **argv) {
 		auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);
 		
 		const uint32_t dispatchSizeGrid[3] = {grid.getWidth() / 4, grid.getHeight() / 4, grid.getDepth() / 4};
-		const uint32_t dispatchSizeParticles[3] = {static_cast<uint32_t>(particles.getCount() + 63) / 64, 1, 1};
+		const uint32_t dispatchSizeParticles[3] = {static_cast<uint32_t>(sim->count + 63) / 64, 1, 1};
 		
 		for (int step = 0; step < 1; step++) {
 			core.recordBeginDebugLabel(cmdStream, "INIT PARTICLE WEIGHTS", {0.78f, 0.89f, 0.94f, 1.0f});
-			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.recordBufferMemoryBarrier(cmdStream, particlesHandle);
 			core.prepareImageForSampling(cmdStream, grid.getHandle());
 			
 			core.recordComputeDispatchToCmdStream(
 					cmdStream,
 					initParticleWeightsPipeline,
 					dispatchSizeParticles,
-					{vkcv::DescriptorSetUsage(
-							0, core.getDescriptorSet(initParticleWeightsSets[0]).vulkanHandle
-					)},
+					{
+						vkcv::DescriptorSetUsage(
+								0, core.getDescriptorSet(initParticleWeightsSets[0]).vulkanHandle
+						),
+						vkcv::DescriptorSetUsage(
+								1, core.getDescriptorSet(initParticleWeightsSets[1]).vulkanHandle
+						)
+					},
 					vkcv::PushConstants(0)
 			);
 			
-			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.recordBufferMemoryBarrier(cmdStream, particlesHandle);
 			core.recordEndDebugLabel(cmdStream);
 			
 			core.recordBeginDebugLabel(cmdStream, "TRANSFORM PARTICLES TO GRID", {0.47f, 0.77f, 0.85f, 1.0f});
-			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.recordBufferMemoryBarrier(cmdStream, particlesHandle);
 			core.prepareImageForStorage(cmdStream, grid.getHandle());
 			
 			core.recordComputeDispatchToCmdStream(
 					cmdStream,
 					transformParticlesToGridPipeline,
 					dispatchSizeGrid,
-					{vkcv::DescriptorSetUsage(
-							0, core.getDescriptorSet(transformParticlesToGridSets[0]).vulkanHandle
-					)},
+					{
+						vkcv::DescriptorSetUsage(
+								0, core.getDescriptorSet(transformParticlesToGridSets[0]).vulkanHandle
+						),
+						vkcv::DescriptorSetUsage(
+								1, core.getDescriptorSet(transformParticlesToGridSets[1]).vulkanHandle
+						),
+						vkcv::DescriptorSetUsage(
+								2, core.getDescriptorSet(transformParticlesToGridSets[2]).vulkanHandle
+						)
+					},
 					physicsPushConstants
 			);
 			
@@ -731,7 +780,7 @@ int main(int argc, const char **argv) {
 			core.recordEndDebugLabel(cmdStream);
 			
 			core.recordBeginDebugLabel(cmdStream, "UPDATE PARTICLE VELOCITIES", {0.78f, 0.89f, 0.94f, 1.0f});
-			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.recordBufferMemoryBarrier(cmdStream, particlesHandle);
 			core.recordBufferMemoryBarrier(cmdStream, simulation.getHandle());
 			core.prepareImageForSampling(cmdStream, grid.getHandle());
 			
@@ -739,13 +788,21 @@ int main(int argc, const char **argv) {
 					cmdStream,
 					updateParticleVelocitiesPipeline,
 					dispatchSizeParticles,
-					{vkcv::DescriptorSetUsage(
-							0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle
-					)},
+					{
+						vkcv::DescriptorSetUsage(
+								0, core.getDescriptorSet(updateParticleVelocitiesSets[0]).vulkanHandle
+						),
+						vkcv::DescriptorSetUsage(
+								1, core.getDescriptorSet(updateParticleVelocitiesSets[1]).vulkanHandle
+						),
+						vkcv::DescriptorSetUsage(
+								2, core.getDescriptorSet(updateParticleVelocitiesSets[2]).vulkanHandle
+						)
+					},
 					physicsPushConstants
 			);
 			
-			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.recordBufferMemoryBarrier(cmdStream, particlesHandle);
 			core.recordEndDebugLabel(cmdStream);
 		}
 		
@@ -772,7 +829,7 @@ int main(int argc, const char **argv) {
 			core.recordEndDebugLabel(cmdStream);
 		} else {
 			core.recordBeginDebugLabel(cmdStream, "RENDER PARTICLES", { 0.13f, 0.20f, 0.22f, 1.0f });
-			core.recordBufferMemoryBarrier(cmdStream, particles.getHandle());
+			core.recordBufferMemoryBarrier(cmdStream, particlesHandle);
 			
 			core.recordDrawcallsToCmdStream(
 					cmdStream,
@@ -815,6 +872,7 @@ int main(int argc, const char **argv) {
 		
 		ImGui::Spacing();
 		
+		ImGui::SliderInt("Particle Count", &(sim->count), 1, 100000);
 		ImGui::SliderFloat("Density", &(sim->density), std::numeric_limits<float>::epsilon(), 5000.0f);
 		ImGui::SameLine(0.0f, 10.0f);
 		if (ImGui::SmallButton("Reset##density")) {
@@ -847,7 +905,24 @@ int main(int argc, const char **argv) {
 		ImGui::DragFloat3("Initial Velocity", reinterpret_cast<float*>(&initialVelocity), 0.001f);
 		ImGui::SameLine(0.0f, 10.0f);
 		if (ImGui::Button("Reset##particle_velocity")) {
-			resetParticles(particles, initialVelocity, sim->density, sim->size, sim->form, sim->mode);
+			particlesHandle = resetParticles(
+					core,
+					sim->count,
+					initialVelocity,
+					sim->density,
+					sim->size,
+					sim->form,
+					sim->mode
+			);
+			
+			vkcv::DescriptorWrites writes;
+			writes.storageBufferWrites.push_back(vkcv::BufferDescriptorWrite(0, particlesHandle));
+			
+			core.writeDescriptorSet(initParticleWeightsSets[0], writes);
+			core.writeDescriptorSet(transformParticlesToGridSets[0], writes);
+			core.writeDescriptorSet(updateParticleVelocitiesSets[0], writes);
+			
+			core.writeDescriptorSet(gfxSetParticles, writes);
 		}
 		
 		ImGui::SliderFloat("Gravity", &(sim->gravity), 0.0f, 10.0f);