diff --git a/API.txt b/API.txt
index 106b9e107345e836aa9eace45a437e45722af9f2..69cf250ae70aaa323760a6fdec3bddace9c0333d 100644
--- a/API.txt
+++ b/API.txt
@@ -66,6 +66,8 @@ ocount:     There must be at least this many of the above neighbors around the
 	    0.
 facedir:    The value passed to the param2 variable when adding the plant node
 	    to the map.  Defaults to 0.
+depthmax:   If a node spawns on top of a water source, the water must be at
+	    most this deep.  Defaults to 1 node.
 
 -----
 The second function, grow_plants() is defined like so:
diff --git a/plants/init.lua b/plants/init.lua
index 8f33d19e64d923ac999165c14a9b398d5ac3d427..731a35caea1f4c8035c7da6f9846c7f0bc84bf41 100644
--- a/plants/init.lua
+++ b/plants/init.lua
@@ -18,7 +18,7 @@ local enable_flowers = true
 local enable_junglegrass = true
 local enable_poisonivy = true
 
-local plantlife_debug = false
+local plantlife_debug = true
 
 local plantlife_seed_diff = 123
 local perlin_octaves = 3
@@ -90,13 +90,13 @@ end
 
 -- The spawning ABM
 
-spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid, seed_diff, lightmin, lightmax, nneighbors, ocount, facedir)
+spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid, seed_diff, lightmin, lightmax, nneighbors, ocount, facedir, depthmax)
 	if seed_diff == nil then seed_diff = 0 end
 	if lightmin == nil then lightmin = 0 end
 	if lightmax == nil then lightmax = LIGHT_MAX end
 	if nneighbors == nil then nneighbors = ssurface end
 	if ocount == nil then ocount = 0 end
-	dbg(sdelay.." "..splant.." "..sradius.." "..schance.." "..ssurface.." "..dump(savoid).." "..lightmin.." "..lightmax.." "..dump(nneighbors).." "..ocount)
+	if depthmax == nil then depthmax = 1 end
 	minetest.register_abm({
 		nodenames = { ssurface },
 		interval = sdelay,
@@ -119,8 +119,13 @@ spawn_on_surfaces = function(sdelay, splant, sradius, schance, ssurface, savoid,
 						dbg("Spawn: poisonivy:climbing at "..dump(p_top).." on "..ssurface)
 						minetest.env:add_node(p_top, { name = "poisonivy:climbing", param2 = walldir })
 					else
-						dbg("Spawn: "..splant.." at "..dump(p_top).." on "..ssurface)
-						minetest.env:add_node(p_top, { name = splant, param2 = facedir })
+						local deepnode = minetest.env:get_node({ x = pos.x, y = pos.y-depthmax-1, z = pos.z }).name
+						if (ssurface ~= "default:water_source")
+							or (ssurface == "default:water_source"
+							and deepnode ~= "default:water_source") then
+							dbg("Spawn: "..splant.." at "..dump(p_top).." on "..ssurface)
+							minetest.env:add_node(p_top, { name = splant, param2 = facedir })
+						end
 					end
 				end
 			end
@@ -289,11 +294,11 @@ if enable_flowers then
 		},	
 	})
 
-	spawn_on_surfaces(spawn_delay/2, "flowers:flower_waterlily", 10  , spawn_chance*3, "default:water_source"   , {"group:flower"}, flowers_seed_diff, 10, nil, {"default:dirt_with_grass"}, nil, nil,10)
+	spawn_on_surfaces(spawn_delay/2, "flowers:flower_waterlily", 3,   spawn_chance*2, "default:water_source"   , {"group:flower"}, flowers_seed_diff, 10, nil, nil,                         nil, nil, 4)
 
-	spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed"  ,  0.1, spawn_chance*2, "default:water_source"   , {"group:flower"}, flowers_seed_diff,  4,  10, {"default:dirt_with_grass"},   0,   1)
-	spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed"  ,  0.1, spawn_chance*2, "default:dirt_with_grass", {"group:flower"}, flowers_seed_diff,  4,  10, {"default:water_source"}   ,   1,   1)
-	spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed"  ,  0.1, spawn_chance*2, "default:stone"          , {"group:flower"}, flowers_seed_diff,  4,  10, {"default:water_source"}   ,   6,   1)
+	spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed"  , 0.1, spawn_chance*2, "default:water_source"   , {"group:flower"}, flowers_seed_diff,  4,  10, {"default:dirt_with_grass"},   0,   1)
+	spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed"  , 0.1, spawn_chance*2, "default:dirt_with_grass", {"group:flower"}, flowers_seed_diff,  4,  10, {"default:water_source"}   ,   1,   1)
+	spawn_on_surfaces(spawn_delay*2, "flowers:flower_seaweed"  , 0.1, spawn_chance*2, "default:stone"          , {"group:flower"}, flowers_seed_diff,  4,  10, {"default:water_source"}   ,   6,   1)
 
 
 	minetest.register_craftitem(":flowers:flower_pot", {
diff --git a/plants/init.lua~ b/plants/init.lua~
index 87fb897f4781dc3e439690cc9477745bcf95b70a..8f33d19e64d923ac999165c14a9b398d5ac3d427 100644
--- a/plants/init.lua~
+++ b/plants/init.lua~
@@ -25,7 +25,7 @@ local perlin_octaves = 3
 local perlin_persistence = 0.2
 local perlin_scale = 25
 
-local plantlife_limit = 0.6 -- compared against perlin noise.  lower = more abundant
+local plantlife_limit = 0.5 -- compared against perlin noise.  lower = more abundant
 
 local spawn_delay = 2000 -- 2000
 local spawn_chance = 100 -- 100
@@ -384,10 +384,10 @@ if enable_junglegrass then
 		},
 	})
 
-	spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/50, "default:dirt_with_grass", {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
-	spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/50, "default:sand"           , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
-	spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/10, "default:desert_sand"    , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
-	spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance/10, "default:desert_sand"    , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
+	spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance, "default:dirt_with_grass", {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
+	spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance*2, "default:sand"           , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
+	spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance*3, "default:desert_sand"    , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
+	spawn_on_surfaces(spawn_delay*2, "junglegrass:shortest", 4, spawn_chance*3, "default:desert_sand"    , {"group:junglegrass", "default:junglegrass", "default:dry_shrub"}, junglegrass_seed_diff, 5)
 
 	for i in ipairs(grasses_list) do
 		grow_plants(grow_delay, grow_chance/2, grasses_list[i][1], grasses_list[i][2], "default:desert_sand", {"default:dirt_with_grass", "default:sand", "default:desert_sand"})