diff --git a/game/engine/Shader.lua b/game/engine/Shader.lua
index 86b37fd047a66e9cc0e77238284981339ddb7b7b..1c3899949de9aceccdd91dab7d2f58c4cbce0556 100644
--- a/game/engine/Shader.lua
+++ b/game/engine/Shader.lua
@@ -93,17 +93,19 @@ function _M:loaded()
 		setfenv(f, setmetatable(self.args or {}, {__index=_G}))
 		local def = f()
 		_M.progs[self.name] = self:createProgram(def)
-	end
-
-	self.shad = _M.progs[self.name]
 
-	for k, v in pairs(self.args) do
-		if type(v) == "number" then
-			self.shad:paramNumber(k, v)
-		elseif type(v) == "table"
-			if v.texture then
-				self.shad:paramNumber(k, v.texture, v.is3d)
+		for k, v in pairs(def.args) do
+			if type(v) == "number" then
+				print("[SHADER] setting param", k, v)
+				_M.progs[self.name]:paramNumber(k, v)
+			elseif type(v) == "table" then
+				if v.texture then
+					print("[SHADER] setting texture param", k, v.texture)
+					_M.progs[self.name]:paramTexture(k, v.texture, v.is3d)
+				end
 			end
 		end
 	end
+
+	self.shad = _M.progs[self.name]
 end
diff --git a/game/modules/tome/data/general/grids/basic.lua b/game/modules/tome/data/general/grids/basic.lua
index d5d16d31088479e18a567f996d854b4ab9d723ce..ea12f0cc20a294b60ce18f1db34ddd69f2c51b49 100644
--- a/game/modules/tome/data/general/grids/basic.lua
+++ b/game/modules/tome/data/general/grids/basic.lua
@@ -62,7 +62,7 @@ newEntity{
 
 newEntity{
 	define_as = "WALL",
---	shader = "water", shader_args = {},
+	shader = "water", shader_args = {},
 	name = "wall", image = "terrain/granite_wall1.png",
 	display = '#', color_r=255, color_g=255, color_b=255, back_color=colors.GREY,
 	always_remember = true,
diff --git a/game/modules/tome/data/gfx/shaders/water.frag b/game/modules/tome/data/gfx/shaders/water.frag
index 5d0d7db109c6166efe6446b35f74b0273a77de79..cd6f9dd27f6ae0cc15db98daa5feebbd41ce0d88 100644
--- a/game/modules/tome/data/gfx/shaders/water.frag
+++ b/game/modules/tome/data/gfx/shaders/water.frag
@@ -1,6 +1,7 @@
 uniform int tick;
 uniform sampler3D noisevol;
 uniform sampler2D noise2d;
+uniform float red;
 
 void main(void)
 {
@@ -17,4 +18,9 @@ void main(void)
 	vec4 n = texture2D(noise2d, gl_TexCoord[0].xy);
 	n.x = 1;
 	gl_FragColor = n;
+
+//	int i = (tick / 30) % 255;
+//	float t = (float)i;
+//	t = t / 255;
+//	gl_FragColor = vec4(red, 0, t, 1);
 }
diff --git a/game/modules/tome/data/gfx/shaders/water.lua b/game/modules/tome/data/gfx/shaders/water.lua
index c2735c36c510f50ffa824c9804d3e4278c39190d..58b7ce3507d0807bf4c2dc5a3f631c0461d6d39c 100644
--- a/game/modules/tome/data/gfx/shaders/water.lua
+++ b/game/modules/tome/data/gfx/shaders/water.lua
@@ -17,7 +17,13 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
+local noise = core.noise.new(2)
+local tex = noise:makeTexture2D("simplex", 128, 128, 4, 0, 0)
+
 return {
 	frag = "water",
+	args = {
+		noise2d = { texture = tex },
+	},
 	clone = false,
 }
diff --git a/src/shaders.c b/src/shaders.c
index 60c3f70402d81b8115a4726387a2444b4098b807..92e15ad7a50839677ac3c686b747194635079578 100644
--- a/src/shaders.c
+++ b/src/shaders.c
@@ -159,8 +159,8 @@ static int program_set_uniform_number(lua_State *L)
 	const char *var = luaL_checkstring(L, 2);
 	GLfloat i = luaL_checknumber(L, 3);
 
-	CHECKGL(glUseProgramObjectARB(p));
-	CHECKGL(glUniform1fvARB(glGetUniformLocationARB(p, var), 1, &i));
+	CHECKGL(glUseProgramObjectARB(*p));
+	CHECKGL(glUniform1fvARB(glGetUniformLocationARB(*p, var), 1, &i));
 	CHECKGL(glUseProgramObjectARB(0));
 	return 0;
 }
@@ -173,12 +173,12 @@ static int program_set_uniform_texture(lua_State *L)
 	bool is3d = lua_toboolean(L, 4);
 
 	GLint i = 1;
-	CHECKGL(glUseProgramObjectARB(p));
+	CHECKGL(glUseProgramObjectARB(*p));
 	CHECKGL(glActiveTexture(GL_TEXTURE1));
 	CHECKGL(glBindTexture(is3d ? GL_TEXTURE_3D : GL_TEXTURE_2D, *t));
-	CHECKGL(glUniform1ivARB(glGetUniformLocationARB(p, var), 1, &i));
-	CHECKGL(glActiveTexture(GL_TEXTURE0));
+	CHECKGL(glUniform1ivARB(glGetUniformLocationARB(*p, var), 1, &i));
 	CHECKGL(glUseProgramObjectARB(0));
+//	CHECKGL(glActiveTexture(GL_TEXTURE0));
 	return 0;
 }