diff --git a/Materials/regions/europe.xml b/Materials/regions/europe.xml
index 736cac277..e31bc9345 100644
--- a/Materials/regions/europe.xml
+++ b/Materials/regions/europe.xml
@@ -367,6 +367,7 @@
       <texture>Terrain/tidal.png</texture>
       <texture n="10">Terrain/mud.png</texture>
       <texture n="14">Terrain/sand_overlay.png</texture>
+      <texture n="15">Terrain/sand1.png</texture>
       <texture n="20">Terrain/sand6_hires.png</texture>
     </texture-set>
     <parameters>
@@ -380,6 +381,8 @@
       <overlay_alpha>1.21</overlay_alpha>
       <use_grain>0</use_grain>
       <grain_layer_magnification>4.0</grain_layer_magnification>
+      <waterline-start>0.99</waterline-start>
+      <waterline-end>0.995</waterline-end>
     </parameters>
     <xsize>1000</xsize>
     <ysize>1000</ysize>
diff --git a/Materials/regions/global-summer.xml b/Materials/regions/global-summer.xml
index dd704b892..8e5d36435 100644
--- a/Materials/regions/global-summer.xml
+++ b/Materials/regions/global-summer.xml
@@ -418,9 +418,14 @@
   <material include="Materials/base/water.xml">
     <name>Ocean</name>
     <effect>Effects/water</effect>
-    <texture>Terrain/water.png</texture>
+    <texture-set>
+      <texture n="0">Terrain/water.png</texture>
+      <texture n="15">Terrain/sand1.png</texture>
+    </texture-set>
     <parameters>
       <edge-hardness>0.8</edge-hardness>
+      <waterline-start>0.99</waterline-start>
+      <waterline-end>0.995</waterline-end>
     </parameters>
   </material>
 
@@ -565,6 +570,7 @@
       <texture>Terrain/tidal.png</texture>
       <texture n="10">Terrain/mud.png</texture>
       <texture n="14">Terrain/sand_overlay.png</texture>
+      <texture n="15">Terrain/sand1.png</texture>
       <texture n="20">Terrain/sand6_hires.png</texture>
     </texture-set>
     <parameters>
@@ -578,6 +584,8 @@
       <overlay_alpha>1.21</overlay_alpha>
       <use_grain>0</use_grain>
       <grain_layer_magnification>4.0</grain_layer_magnification>
+      <waterline-start>0.99</waterline-start>
+      <waterline-end>0.995</waterline-end>
     </parameters>
     <xsize>1000</xsize>
     <ysize>1000</ysize>
diff --git a/Materials/regions/united_kingdom.xml b/Materials/regions/united_kingdom.xml
index 8433c70d1..03572cb10 100644
--- a/Materials/regions/united_kingdom.xml
+++ b/Materials/regions/united_kingdom.xml
@@ -366,6 +366,7 @@
     <texture-set>
       <texture>Terrain/tidal.png</texture>
       <texture n="10">Terrain/mud.png</texture>
+      <texture n="15">Terrain/sand1.png</texture>
       <texture n="14">Terrain/sand_overlay.png</texture>
       <texture n="20">Terrain/sand6_hires.png</texture>
     </texture-set>
@@ -380,6 +381,8 @@
       <overlay_alpha>1.21</overlay_alpha>
       <use_grain>0</use_grain>
       <grain_layer_magnification>4.0</grain_layer_magnification>
+      <waterline-start>0.99</waterline-start>
+      <waterline-end>0.995</waterline-end>
     </parameters>
     <xsize>1000</xsize>
     <ysize>1000</ysize>
diff --git a/Shaders/ws30-ALS-ultra.frag b/Shaders/ws30-ALS-ultra.frag
index 9ebf488c1..35e6ec53f 100644
--- a/Shaders/ws30-ALS-ultra.frag
+++ b/Shaders/ws30-ALS-ultra.frag
@@ -443,11 +443,18 @@ void main()
 
   if ((water_shader == 1) && (fg_photoScenery == false) && fg_materialParams3[lc].x > 0.5) { 
     // This is a water fragment, so calculate the fragment color procedurally
-    // and mix with some sand colour if near an edge
-    //bool adjacentwater = fg_materialParams3[lc_n.x].x > 0.5;
-    //texel = mix(generateWaterTexel(), texel, adjacentwater ? 0.0 : smoothstep(0.1, 0.2, mfact[0]));
-    //texel = mix(generateWaterTexel(), vec4(0.6,0.6,0.4,1.0), adjacentwater ? 0.0 : smoothstep(0.1, 0.2, mfact[0]));
-    texel = mix(vec4(0.6,0.6,0.4,1.0), generateWaterTexel(), smoothstep(0.98,1.0,steepness));    
+    // and mix with some sand and cliff colour depending on steepness
+    vec4 steep_texel = lookup_ground_texture_array(2, ground_tex_coord, lc, dxdy_gc);  // Uses the same index as the gradient texture, which it is
+    vec4 beach_texel = lookup_ground_texture_array(3, ground_tex_coord, lc, dxdy_gc);  // Use the dot texture, which is overloaded to be the beach texture
+    float waterline_min_steepness = fg_materialParams3[lc].y;
+    float waterline_max_steepness = fg_materialParams3[lc].z;
+
+    // Mix from a rocky texture to beach for steep slopes, which invariably represent the elevation mesh not being perfectly
+    // aligned with the landclass mesh.
+    texel = mix(steep_texel, beach_texel, smoothstep(waterline_max_steepness - 0.1, waterline_max_steepness - 0.03, steepness));
+
+    // Mix from the beach into the water, which produces a pleasing translucent shallow water effect.
+    texel = mix(texel, generateWaterTexel(), smoothstep(waterline_min_steepness,waterline_max_steepness,steepness));    
     fragColor = texel;
     fragColor.rgb += getClusteredLightsContribution(ecPosition.xyz, n, fragColor.rgb);    
   } else {
diff --git a/Shaders/ws30-water.frag b/Shaders/ws30-water.frag
index 38d353634..779fca7e6 100644
--- a/Shaders/ws30-water.frag
+++ b/Shaders/ws30-water.frag
@@ -52,6 +52,10 @@ varying vec4 waterTex2;
 varying vec4 waterTex4;
 varying vec3 specular_light;
 
+//WS3.0 varying
+varying float steepness;
+
+
 /////// functions /////////
 
 float getShadowing();
@@ -343,14 +347,14 @@ vec4 generateWaterTexel()
   if (dist < 10000.0)
   {
     float foamSlope = 0.10 + 0.1 * windScale;
-    float waveSlope = N.g;
+    float waveSlope = N.g + min(50.0*(1.0 - steepness), 0.1);
 
-    if ((windEffect >= 8.0) && (waveSlope >= foamSlope)) {
+    if ((steepness < 0.9999) || (windEffect >= 8.0) && (waveSlope >= foamSlope)) {
       //add foam
       st = vec2(waterTex2 * tscale) * 25.0;
       vec4 foam_texel = texture(textureArray, vec3(st, ATLAS_INDEX_SEA_FOAM) );
 
-      texel = mix(texel, max(texel, texel + foam_texel), smoothstep(0.01, 0.50, N.g));
+      texel = mix(texel, max(texel, texel + foam_texel), smoothstep(0.01, 0.50, waveSlope));
     }
   }