diff --git a/Effects/water.eff b/Effects/water.eff
index b6648efe1..66bc48143 100644
--- a/Effects/water.eff
+++ b/Effects/water.eff
@@ -411,12 +411,15 @@
 
 			<program>
 				<vertex-shader>Shaders/water-ALS.vert</vertex-shader>
+				<vertex-shader>Shaders/shadows-include.vert</vertex-shader>
 				<fragment-shader>Shaders/water-ALS-high.frag</fragment-shader>
 				<fragment-shader>Shaders/noise.frag</fragment-shader>
 				<fragment-shader>Shaders/cloud-shadowfunc.frag</fragment-shader>
 				<fragment-shader>Shaders/hazes.frag</fragment-shader>
 				<fragment-shader>Shaders/secondary_lights.frag</fragment-shader>
 				<fragment-shader>Shaders/filters-ALS.frag</fragment-shader>
+				<fragment-shader>Shaders/shadows-include.frag</fragment-shader>
+				<fragment-shader>Shaders/clustered-include.frag</fragment-shader>
 			</program>
 			<!--<uniform>
 				<name>water_reflection</name>
@@ -458,6 +461,27 @@
                                 <type>sampler-2d</type>
                                 <value type="int">8</value>
                         </uniform>
+			<!-- BEGIN shadows include -->
+			<uniform>
+				<name>shadow_tex</name>
+				<type>sampler-2d</type>
+				<value type="int">10</value>
+			</uniform>
+			<uniform>
+				<name>shadows_enabled</name>
+				<type>bool</type>
+				<value>
+					<use>shadows_enabled</use>
+				</value>
+			</uniform>
+			<uniform>
+				<name>sun_atlas_size</name>
+				<type>int</type>
+				<value>
+					<use>sun_atlas_size</use>
+				</value>
+			</uniform>
+			<!-- END shadows include -->
                         <uniform>
                                 <name>use_specified_water_shallowness</name>
                                 <type>int</type>
@@ -1183,10 +1207,14 @@
 
 			<program>
 				<vertex-shader>Shaders/water-ALS.vert</vertex-shader>
+				<vertex-shader>Shaders/shadows-include.vert</vertex-shader>
 				<fragment-shader>Shaders/water-ALS-base.frag</fragment-shader>
 				<fragment-shader>Shaders/hazes.frag</fragment-shader>
+				<fragment-shader>Shaders/secondary_lights.frag</fragment-shader>
 				<fragment-shader>Shaders/noise.frag</fragment-shader>
 				<fragment-shader>Shaders/filters-ALS.frag</fragment-shader>
+				<fragment-shader>Shaders/shadows-include.frag</fragment-shader>
+				<fragment-shader>Shaders/clustered-include.frag</fragment-shader>
 			</program>
 			<!--<uniform>
 				<name>water_reflection</name>
@@ -1213,6 +1241,27 @@
 				<type>sampler-2d</type>
 				<value type="int">6</value>
 			</uniform>
+			<!-- BEGIN shadows include -->
+			<uniform>
+				<name>shadow_tex</name>
+				<type>sampler-2d</type>
+				<value type="int">10</value>
+			</uniform>
+			<uniform>
+				<name>shadows_enabled</name>
+				<type>bool</type>
+				<value>
+					<use>shadows_enabled</use>
+				</value>
+			</uniform>
+			<uniform>
+				<name>sun_atlas_size</name>
+				<type>int</type>
+				<value>
+					<use>sun_atlas_size</use>
+				</value>
+			</uniform>
+			<!-- END shadows include -->
             <!-- normalmap is .dds-->
             <uniform>
                 <name>normalmap_dds</name>
diff --git a/Shaders/water-ALS-base.frag b/Shaders/water-ALS-base.frag
index 1a5d203c1..43a0c0da0 100644
--- a/Shaders/water-ALS-base.frag
+++ b/Shaders/water-ALS-base.frag
@@ -24,6 +24,7 @@ varying vec3 viewerdir;
 varying vec3 lightdir;
 //varying vec3 specular_light;
 varying vec3 relPos;
+varying vec4 ecPosition;
 
 varying float earthShade;
 varying float yprime_alt;
@@ -61,9 +62,13 @@ const float terminator_width = 200000.0;
 const float EarthRadius = 5800000.0;
 
 float fog_func (in float targ, in float alt);
+float light_distance_fading(in float dist);
 vec3 get_hazeColor(in float light_arg);
 vec3 filter_combined (in vec3 color) ;
 
+float getShadowing();
+vec3 getClusteredLightsContribution(vec3 p, vec3 n, vec3 texel);
+
 /////// functions /////////
 
 void rotationmatrix(in float angle, out mat4 rotmat)
@@ -385,10 +390,23 @@ void main(void)
 	
 	vec4 finalColor;
 
+	// compute object shadow effect
+
+	float shadowValue = getShadowing();
+	specular = specular * shadowValue;
+	refl = refl * (0.7 + 0.3 *shadowValue);
 
 
 	finalColor = refl + specular * smoothstep(0.3, 0.6, ground_scattering);
 
+
+	// For the clustered lighting function we use the simple up direction (Normal) to get an 
+	// approximate lighting contribution, as the procedural normal map is done afterwards.
+	//finalColor += vec4(getClusteredLightsContribution(ecPosition.xyz, Normal, vec3(1.0)), 0.0) * light_distance_fading(dist) * 2.0 * pow(max(0.0,dot(E,N)), water_shininess);
+
+
+
+
 	//add foam
 	vec4 foam_texel = texture2D(sea_foam, vec2(waterTex2 * tscale) * 25.0);
 	
diff --git a/Shaders/water-ALS-high.frag b/Shaders/water-ALS-high.frag
index adf37d64b..d7b3f0aa1 100644
--- a/Shaders/water-ALS-high.frag
+++ b/Shaders/water-ALS-high.frag
@@ -28,6 +28,8 @@ varying vec3 lightdir;
 varying vec3 relPos;
 varying vec3 rawPos;
 varying vec2 TopoUV;
+varying vec4 ecPosition;
+
 uniform vec3 floor_color;
 
 varying float earthShade;
@@ -102,6 +104,8 @@ vec3 searchlight();
 vec3 landing_light(in float offset, in float offsetv);
 vec3 filter_combined (in vec3 color) ;
 
+float getShadowing();
+vec3 getClusteredLightsContribution(vec3 p, vec3 n, vec3 texel);
 
 //////////////////////
 
@@ -473,15 +477,12 @@ void main(void)
 	
 	vec4 finalColor;
 	
-	// compute cloud shadow effect
+	// compute cloud and object shadow effects
 
-	float shadowValue;
-	if (cloud_shadow_flag == 1)
-		{
-		shadowValue = shadow_func(relPos.x, relPos.y, 0.3 * noise_250m + 0.5 * noise_500m+0.2 * noise_1500m, dist);
-		specular = specular * shadowValue;
-		refl = refl * (0.7 + 0.3 *shadowValue);
-		}
+	float shadowValue = getShadowing();
+	if (cloud_shadow_flag == 1) { shadowValue *= shadow_func(relPos.x, relPos.y, 0.3 * noise_250m + 0.5 * noise_500m+0.2 * noise_1500m, dist); }
+	specular = specular * shadowValue;
+	refl = refl * (0.7 + 0.3 *shadowValue);
 
 	// compute secondary light effect
 
@@ -506,7 +507,13 @@ void main(void)
 
 	
 
-	finalColor = refl + specular * smoothstep(0.3, 0.6, ground_scattering) + vec4 (secondary_light, 0.0) * light_distance_fading(dist) * 2.0 * pow(max(0.0,dot(E,N)), water_shininess);
+	finalColor = refl + specular * smoothstep(0.3, 0.6, ground_scattering);
+
+	// For the clustered lighting function we use the simple up direction (Normal) to get an 
+	// approximate lighting contribution, as the procedural normal map is done afterwards.
+	//vec3 light_contribution = secondary_light + getClusteredLightsContribution(ecPosition.xyz, Normal, vec3(1.0));
+	vec3 light_contribution = secondary_light;
+	finalColor += vec4(light_contribution, 0.0) * light_distance_fading(dist) * 2.0 * pow(max(0.0,dot(E,N)), water_shininess);
 
 	finalColor = clamp(finalColor, 0.0,1.0);
 
diff --git a/Shaders/water-ALS.vert b/Shaders/water-ALS.vert
index 750bdec7d..a81dd65e9 100644
--- a/Shaders/water-ALS.vert
+++ b/Shaders/water-ALS.vert
@@ -13,6 +13,7 @@ varying vec4 waterTex4;
 varying vec3 relPos;
 varying vec3 rawPos;
 varying vec2 TopoUV;
+varying vec4 ecPosition;
 
 varying vec3 viewerdir;
 varying vec3 lightdir;
@@ -47,10 +48,13 @@ const float lonAdjust = 0.9999537058469516; //actual extents: +-180.008333333333
 
 vec3 specular_light;
 
+void setupShadows(vec4 eyeSpacePos);
+
 // This is the value used in the skydome scattering shader - use the same here for consistency?
 const float EarthRadius = 5800000.0;
 const float terminator_width = 200000.0;
 
+
 float light_func (in float x, in float a, in float b, in float c, in float d, in float e)
 {
 //x = x - 0.5;
@@ -87,7 +91,7 @@ void main(void)
     vec3 shadedFogColor = vec3(0.55, 0.67, 0.88);
     rawPos = (osg_ViewMatrixInverse *gl_ModelViewMatrix * gl_Vertex).xyz;
 
-    vec4 ecPosition = gl_ModelViewMatrix * gl_Vertex;
+    ecPosition = gl_ModelViewMatrix * gl_Vertex;
 
     viewerdir = vec3(gl_ModelViewMatrixInverse[3]) - vec3(gl_Vertex);
     lightdir = normalize(vec3(gl_ModelViewMatrixInverse * gl_LightSource[0].position));
@@ -292,5 +296,5 @@ else // the faster, full-day version without lightfields
 gl_FrontColor.rgb = specular_light;
 gl_BackColor.rgb = gl_FrontColor.rgb;
 
-
+	setupShadows(ecPosition);
 }