diff --git a/projects/voxelization/resources/shaders/shader.frag b/projects/voxelization/resources/shaders/shader.frag
index d27f8c767cf7cb99706995d20f90f2dd93f8ed52..eff75dde4b735a49b7be13c8d5f1b53241499007 100644
--- a/projects/voxelization/resources/shaders/shader.frag
+++ b/projects/voxelization/resources/shaders/shader.frag
@@ -85,7 +85,11 @@ void main()	{
     vec3 sunSpecular = cookTorrance(f0, r, N, V, L);
     
     vec3 sun        = lightInfo.sunStrength * lightInfo.sunColor * NoL;
-    sun             *= shadowTest(passPos, lightInfo, shadowMap, shadowMapSampler);
+    
+    float   noise           = 2 * pi * interleavedGradientNoise(gl_FragCoord.xy);
+    vec2    shadowOffset    = vec2(sin(noise), cos(noise)) * 0.00008;
+    float   shadow          = shadowTest(passPos, lightInfo, shadowMap, shadowMapSampler, shadowOffset);
+    sun                     *= shadow;
     
     vec3 F_in       = fresnelSchlick(NoL, f0);
     vec3 F_out      = fresnelSchlick(NoV, f0);
@@ -110,5 +114,4 @@ void main()	{
         (diffuse + sunSpecular) * sun + 
         lambertBRDF(albedo) * diffuseTrace + 
         reflectionBRDF * specularTrace;
-        outColor = sun;
 }
\ No newline at end of file
diff --git a/projects/voxelization/resources/shaders/shadowBlur.comp b/projects/voxelization/resources/shaders/shadowBlur.comp
index f5c3834099111c7aebe8efc04c4caf9fa1197114..3cf744ab79108c5a9c619524dd8824c39886b357 100644
--- a/projects/voxelization/resources/shaders/shadowBlur.comp
+++ b/projects/voxelization/resources/shaders/shadowBlur.comp
@@ -16,7 +16,7 @@ void main(){
     }
     ivec2 coord = ivec2(gl_GlobalInvocationID.xy);
     
-    int blurRadius  = 5;
+    int blurRadius  = 9;
     int minOffset   = -(blurRadius-1) / 2;
     int maxOffset   = -minOffset;
     
@@ -25,7 +25,7 @@ void main(){
     float wTotal = 0;
     vec4 moments = vec4(0);
     
-    float weights1D[3] = { 0.5, 0.25, 0.125 };    // gaussian
+    float weights1D[4] = { 0.5, 0.25, 0.125, 0.0625 };    // gaussian
     
     for(int x = minOffset; x <= maxOffset; x++){
         for(int y = minOffset; y <= maxOffset; y++){
diff --git a/projects/voxelization/resources/shaders/shadowMapping.inc b/projects/voxelization/resources/shaders/shadowMapping.inc
index 09f01f19fca8198e1f1037c7b3335667878e21e4..c97e0b81492633175f5419495b29f94db99df0a1 100644
--- a/projects/voxelization/resources/shaders/shadowMapping.inc
+++ b/projects/voxelization/resources/shaders/shadowMapping.inc
@@ -59,10 +59,11 @@ vec4 unquantizeMoments(vec4 moments){
     return T * moments;
 }
 
-float shadowTest(vec3 worldPos, LightInfo lightInfo, texture2D shadowMap, sampler shadowMapSampler){
+float shadowTest(vec3 worldPos, LightInfo lightInfo, texture2D shadowMap, sampler shadowMapSampler, vec2 offset){
     vec4 lightPos = lightInfo.lightMatrix * vec4(worldPos, 1);
     lightPos /= lightPos.w;
     lightPos.xy = lightPos.xy * 0.5 + 0.5;
+    lightPos.xy += offset;
     
     if(any(lessThan(lightPos.xy, vec2(0))) || any(greaterThan(lightPos.xy, vec2(1)))){
         return 1;
@@ -75,7 +76,7 @@ float shadowTest(vec3 worldPos, LightInfo lightInfo, texture2D shadowMap, sample
     shadowMapSample = unquantizeMoments(shadowMapSample);
     
     float depthBias     = 0.f;
-    float momentBias    = 0.00003;
+    float momentBias    = 0.00005;
     
     return 1-ComputeMSMShadowIntensity(shadowMapSample, lightPos.z, depthBias, momentBias);
 }
diff --git a/projects/voxelization/resources/shaders/voxelization.frag b/projects/voxelization/resources/shaders/voxelization.frag
index 3e5ce1fc1a6321a8d0115729fe10d0f20f0c32cb..0bbd26bff249db1390399b26f2f4b5a139195fef 100644
--- a/projects/voxelization/resources/shaders/voxelization.frag
+++ b/projects/voxelization/resources/shaders/voxelization.frag
@@ -42,7 +42,7 @@ void main()	{
     
     vec3 N      = normalize(passN);
     float NoL   = clamp(dot(N, lightInfo.L), 0, 1);
-    vec3 sun    = lightInfo.sunStrength * lightInfo.sunColor * NoL * shadowTest(passPos, lightInfo, shadowMap, shadowMapSampler);
+    vec3 sun    = lightInfo.sunStrength * lightInfo.sunColor * NoL * shadowTest(passPos, lightInfo, shadowMap, shadowMapSampler, vec2(0));
     vec3 color  = albedo * sun;
     color       = lambertBRDF(albedo) * sun;
     
diff --git a/projects/voxelization/src/ShadowMapping.cpp b/projects/voxelization/src/ShadowMapping.cpp
index e0f5567a19f2e73cf27a705b4cac8260644417dd..3e5fb9fae33bbc5438f875747629ed6070b59727 100644
--- a/projects/voxelization/src/ShadowMapping.cpp
+++ b/projects/voxelization/src/ShadowMapping.cpp
@@ -123,10 +123,10 @@ glm::mat4 computeShadowViewProjectionMatrix(
 	return vulkanCorrectionMatrix * crop * view;
 }
 
-const vk::Format            shadowMapFormat         = vk::Format::eR16G16B16A16Unorm;
+const vk::Format            shadowMapFormat         = vk::Format::eR32G32B32A32Sfloat;
 const vk::Format            shadowMapDepthFormat    = vk::Format::eD32Sfloat;
-const uint32_t              shadowMapResolution     = 2048;
-const vkcv::Multisampling   msaa                    = vkcv::Multisampling::MSAA4X;
+const uint32_t              shadowMapResolution     = 1024;
+const vkcv::Multisampling   msaa                    = vkcv::Multisampling::MSAA8X;
 
 ShadowMapping::ShadowMapping(vkcv::Core* corePtr, const vkcv::VertexLayout& vertexLayout) : 
 	m_corePtr(corePtr),
diff --git a/projects/voxelization/src/Voxelization.cpp b/projects/voxelization/src/Voxelization.cpp
index b62bb42ae1557eafca67475d760a8af502db3c62..a5105bd26cc171d884075ebf5dc0e8f3d511e949 100644
--- a/projects/voxelization/src/Voxelization.cpp
+++ b/projects/voxelization/src/Voxelization.cpp
@@ -80,7 +80,8 @@ Voxelization::Voxelization(
 	vkcv::BufferHandle  lightInfoBuffer,
 	vkcv::ImageHandle   shadowMap,
 	vkcv::SamplerHandle shadowSampler,
-	vkcv::SamplerHandle voxelSampler)
+	vkcv::SamplerHandle voxelSampler,
+	vkcv::Multisampling msaa)
 	:
 	m_corePtr(corePtr), 
 	m_voxelImage(m_corePtr->createImage(vk::Format::eR16G16B16A16Sfloat, voxelResolution, voxelResolution, voxelResolution, true, true)),
@@ -148,9 +149,10 @@ Voxelization::Voxelization(
 
 	vkcv::PassConfig voxelVisualisationPassDefinition(
 		{ voxelVisualisationColorAttachments, voxelVisualisationDepthAttachments });
+	voxelVisualisationPassDefinition.msaa = msaa;
 	m_visualisationPass = m_corePtr->createPass(voxelVisualisationPassDefinition);
 
-	const vkcv::PipelineConfig voxelVisualisationPipeConfig{
+	vkcv::PipelineConfig voxelVisualisationPipeConfig{
 		voxelVisualisationShader,
 		0,
 		0,
@@ -160,6 +162,7 @@ Voxelization::Voxelization(
 		true,
 		false,
 		vkcv::PrimitiveTopology::PointList };	// points are extended to cubes in the geometry shader
+	voxelVisualisationPipeConfig.m_multisampling = msaa;
 	m_visualisationPipe = m_corePtr->createGraphicsPipeline(voxelVisualisationPipeConfig);
 
 	std::vector<uint16_t> voxelIndexData;
diff --git a/projects/voxelization/src/Voxelization.hpp b/projects/voxelization/src/Voxelization.hpp
index e200f660d005e2a26eb8cbf7dd1020b072cd50d2..66c87acb3c13c0d950a28dc33e4084d728da5947 100644
--- a/projects/voxelization/src/Voxelization.hpp
+++ b/projects/voxelization/src/Voxelization.hpp
@@ -16,7 +16,8 @@ public:
 		vkcv::BufferHandle  lightInfoBuffer,
 		vkcv::ImageHandle   shadowMap,
 		vkcv::SamplerHandle shadowSampler,
-		vkcv::SamplerHandle voxelSampler);
+		vkcv::SamplerHandle voxelSampler,
+		vkcv::Multisampling msaa);
 
 	void voxelizeMeshes(
 		vkcv::CommandStreamHandle                       cmdStream,
diff --git a/projects/voxelization/src/main.cpp b/projects/voxelization/src/main.cpp
index a5395baca1edc604c15762e41bd2a0017bb2c7c4..a9c899f3a2b481f9dbc102a963488a6cf8a7fa00 100644
--- a/projects/voxelization/src/main.cpp
+++ b/projects/voxelization/src/main.cpp
@@ -337,7 +337,8 @@ int main(int argc, const char** argv) {
 		shadowMapping.getLightInfoBuffer(),
 		shadowMapping.getShadowMap(),
 		shadowMapping.getShadowSampler(),
-		voxelSampler);
+		voxelSampler,
+		msaa);
 
 	vkcv::Buffer<glm::vec3> cameraPosBuffer = core.createBuffer<glm::vec3>(vkcv::BufferType::UNIFORM, 1);