diff --git a/src/core_lua.c b/src/core_lua.c
index d14aae74b254d3f425c86d7893bcc9cfdb414663..bc0480a37ee48648dcf7ab2298da2bf04ae38248 100644
--- a/src/core_lua.c
+++ b/src/core_lua.c
@@ -1269,8 +1269,8 @@ static int gl_fbo_toscreen(lua_State *L)
 	}
 	if (lua_isuserdata(L, 6))
 	{
-		GLuint *s = (GLuint*)auxiliar_checkclass(L, "gl{program}", 6);
-		useShader(*s, 0, 0, w, h, r, g, b, a);
+		shader_type *s = (shader_type*)auxiliar_checkclass(L, "gl{program}", 6);
+		useShader(s, 0, 0, w, h, r, g, b, a);
 	}
 
 	glDisable(GL_BLEND);
diff --git a/src/main.c b/src/main.c
index 5089cd5ba0de6f7296c993914ffd53f3e3735f0c..2727f187fbb13448842e1c9ead8063b9fa6d453f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -47,6 +47,7 @@
 #define HEIGHT 600
 
 lua_State *L = NULL;
+bool no_debug = FALSE;
 int current_mousehandler = LUA_NOREF;
 int current_keyhandler = LUA_NOREF;
 int current_game = LUA_NOREF;
@@ -94,6 +95,12 @@ int docall (lua_State *L, int narg, int nret)
 	return status;
 }
 
+/* No print function, does .. nothing */
+int noprint(lua_State *L)
+{
+	return 0;
+}
+
 void display_utime()
 {
 	struct timeval tv;
@@ -614,6 +621,13 @@ void boot_lua(int state, bool rebooting, int argc, char *argv[])
 		luaopen_shaders(L);
 		luaopen_serial(L);
 
+		// Override "print" if requested
+		if (no_debug)
+		{
+			lua_pushcfunction(L, noprint);
+			lua_setglobal(L, "print");
+		}
+
 		// Make the uids repository
 		lua_newtable(L);
 		lua_setglobal(L, "__uids");
@@ -698,6 +712,7 @@ int main(int argc, char *argv[])
 		if (!strncmp(arg, "-u", 2)) reboot_name = strdup(arg+2);
 		if (!strncmp(arg, "-E", 2)) reboot_einfo = strdup(arg+2);
 		if (!strncmp(arg, "-n", 2)) reboot_new = TRUE;
+		if (!strncmp(arg, "--no-debug", 10)) no_debug = TRUE;
 	}
 
 	boot_lua(1, FALSE, argc, argv);
diff --git a/src/map.c b/src/map.c
index f4f3e2abe6e8fbb4267a9de0e1697fe3cd95cca0..6dbc5252cc8bff54ae49b454f41812578f31d74d 100644
--- a/src/map.c
+++ b/src/map.c
@@ -55,7 +55,7 @@ static int map_object_new(lua_State *L)
 	obj->dx = luaL_checknumber(L, 6);
 	obj->dy = luaL_checknumber(L, 7);
 	obj->scale = luaL_checknumber(L, 8);
-	obj->shader = 0;
+	obj->shader = NULL;
 	obj->tint_r = obj->tint_g = obj->tint_b = 1;
 	for (i = 0; i < nb_textures; i++)
 	{
@@ -116,8 +116,8 @@ static int map_object_texture(lua_State *L)
 static int map_object_shader(lua_State *L)
 {
 	map_object *obj = (map_object*)auxiliar_checkclass(L, "core{mapobj}", 1);
-	GLuint *s = (GLuint*)auxiliar_checkclass(L, "gl{program}", 2);
-	obj->shader = *s;
+	shader_type *s = (shader_type*)auxiliar_checkclass(L, "gl{program}", 2);
+	obj->shader = s;
 	return 0;
 }
 
diff --git a/src/map.h b/src/map.h
index 2a7d876526be3900fb444a97955346709aedfdad..aaf07c2dc772f447466f2e394c59f1abfc9ebc7d 100644
--- a/src/map.h
+++ b/src/map.h
@@ -22,13 +22,14 @@
 #define _MAP_H_
 
 #include "tgl.h"
+#include "useshader.h"
 
 typedef struct {
 	int nb_textures;
 	int *textures_ref;
 	GLuint *textures;
 	bool *textures_is3d;
-	GLuint shader;
+	shader_type *shader;
 	float dx, dy, scale;
 	float tint_r;
 	float tint_g;
diff --git a/src/shaders.c b/src/shaders.c
index 137b0c558ab9b167e446742b87306c593d133ec7..d4a60e48c4ff7db4dea49e74fbcb3f1155495200 100644
--- a/src/shaders.c
+++ b/src/shaders.c
@@ -26,31 +26,33 @@
 #include "types.h"
 #include "music.h"
 #include "script.h"
+#include "useshader.h"
 #include "shaders.h"
 #include "libtcod.h"
 
 bool shaders_active = TRUE;
 
-void useShader(GLuint p, int x, int y, int w, int h, float r, float g, float b, float a)
+void useShader(shader_type *p, int x, int y, int w, int h, float r, float g, float b, float a)
 {
-	glUseProgramObjectARB(p);
+	glUseProgramObjectARB(p->shader);
+	printf("Using shader %d at %dx%d (%dx%d), %f;%f;%f;%f\n", p->shader,x,y,w,h,r,g,b,a);
 	GLfloat t = SDL_GetTicks();
-	glUniform1fvARB(glGetUniformLocationARB(p, "tick"), 1, &t);
+	glUniform1fvARB(p->p_tick, 1, &t);
 	GLfloat d[4];
 	d[0] = r;
 	d[1] = g;
 	d[2] = b;
 	d[3] = a;
-	glUniform4fvARB(glGetUniformLocationARB(p, "displayColor"), 1, d);
+	glUniform4fvARB(p->p_color, 1, d);
 
 	GLfloat c[2];
 	c[0] = x;
 	c[1] = y;
-	glUniform2fvARB(glGetUniformLocationARB(p, "mapCoord"), 1, c);
+	glUniform2fvARB(p->p_mapcoord, 1, c);
 
 	c[0] = w;
 	c[1] = h;
-	glUniform2fvARB(glGetUniformLocationARB(p, "texSize"), 1, c);
+	glUniform2fvARB(p->p_texsize, 1, c);
 }
 
 static GLuint loadShader(const char* code, GLuint type)
@@ -91,21 +93,21 @@ static int program_new(lua_State *L)
 {
 	if (!shaders_active) return 0;
 
-	GLuint *s = (GLuint*)lua_newuserdata(L, sizeof(GLuint));
+	shader_type *p = (shader_type*)lua_newuserdata(L, sizeof(shader_type));
 	auxiliar_setclass(L, "gl{program}", -1);
 
-	*s = glCreateProgramObjectARB();
+	p->shader = glCreateProgramObjectARB();
 
-	printf("New GL Shader program %d\n", *s);
+	printf("New GL Shader program %d\n", p->shader);
 
 	return 1;
 }
 
 static int program_free(lua_State *L)
 {
-	GLuint *s = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1);
+	shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1);
 
-	glDeleteObjectARB(*s);
+	glDeleteObjectARB(p->shader);
 
 	lua_pushnumber(L, 1);
 	return 1;
@@ -113,12 +115,12 @@ static int program_free(lua_State *L)
 
 static int program_compile(lua_State *L)
 {
-	GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1);
+	shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1);
 
-	glLinkProgramARB(*p);
-	CHECKGLSLLINK(*p);
+	glLinkProgramARB(p->shader);
+	CHECKGLSLLINK(p->shader);
 
-	CHECKGLSLVALID(*p);
+	CHECKGLSLVALID(p->shader);
 
 #if 1
 	char buffer[256];
@@ -127,87 +129,93 @@ static int program_compile(lua_State *L)
 	int length;
 	GLenum dummytype;
 
-	glGetObjectParameterivARB(*p, GL_ACTIVE_UNIFORMS, &count);
+	glGetObjectParameterivARB(p->shader, GL_ACTIVE_UNIFORMS, &count);
 	int i;
 	for(i = 0; i<count;++i)
 	{
 		GLint uniLoc;
-		glGetActiveUniformARB(*p, i, 256, &length, &dummysize, &dummytype, buffer);
-		uniLoc = glGetUniformLocationARB(*p, buffer);
+		glGetActiveUniformARB(p->shader, i, 256, &length, &dummysize, &dummytype, buffer);
+		uniLoc = glGetUniformLocationARB(p->shader, buffer);
 		if(uniLoc>=0)	// Test for valid uniform location
 		{
-			printf("*p %i: Uniform: %i: %X %s\n", *p,uniLoc, dummytype, buffer);
+			printf("*p %i: Uniform: %i: %X %s\n", p->shader,uniLoc, dummytype, buffer);
 		}
 	}
 #endif
+
+	p->p_tick = glGetUniformLocationARB(p->shader, "tick");
+	p->p_color = glGetUniformLocationARB(p->shader, "displayColor");
+	p->p_mapcoord = glGetUniformLocationARB(p->shader, "mapCoord");
+	p->p_texsize = glGetUniformLocationARB(p->shader, "texSize");
+
 	lua_pushboolean(L, TRUE);
 	return 1;
 }
 
 static int program_attach(lua_State *L)
 {
-	GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1);
+	shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1);
 	GLuint *s = (GLuint*)auxiliar_checkclass(L, "gl{shader}", 2);
 
-	glAttachObjectARB(*p, *s);
+	glAttachObjectARB(p->shader, *s);
 
 	return 0;
 }
 
 static int program_detach(lua_State *L)
 {
-	GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1);
+	shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1);
 	GLuint *s = (GLuint*)auxiliar_checkclass(L, "gl{shader}", 2);
 
-	glDetachObjectARB(*p, *s);
+	glDetachObjectARB(p->shader, *s);
 
 	return 0;
 }
 
 static int program_set_uniform_number(lua_State *L)
 {
-	GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1);
+	shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1);
 	const char *var = luaL_checkstring(L, 2);
 	GLfloat i = luaL_checknumber(L, 3);
 
-	glUseProgramObjectARB(*p);
-	glUniform1fvARB(glGetUniformLocationARB(*p, var), 1, &i);
+	glUseProgramObjectARB(p->shader);
+	glUniform1fvARB(glGetUniformLocationARB(p->shader, var), 1, &i);
 	glUseProgramObjectARB(0);
 	return 0;
 }
 
 static int program_set_uniform_number2(lua_State *L)
 {
-	GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1);
+	shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1);
 	const char *var = luaL_checkstring(L, 2);
 	GLfloat i[2];
 	i[0] = luaL_checknumber(L, 3);
 	i[1] = luaL_checknumber(L, 4);
 
-	glUseProgramObjectARB(*p);
-	glUniform2fvARB(glGetUniformLocationARB(*p, var), 1, i);
+	glUseProgramObjectARB(p->shader);
+	glUniform2fvARB(glGetUniformLocationARB(p->shader, var), 1, i);
 	glUseProgramObjectARB(0);
 	return 0;
 }
 
 static int program_set_uniform_number3(lua_State *L)
 {
-	GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1);
+	shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1);
 	const char *var = luaL_checkstring(L, 2);
 	GLfloat i[3];
 	i[0] = luaL_checknumber(L, 3);
 	i[1] = luaL_checknumber(L, 4);
 	i[2] = luaL_checknumber(L, 5);
 
-	glUseProgramObjectARB(*p);
-	glUniform3fvARB(glGetUniformLocationARB(*p, var), 1, i);
+	glUseProgramObjectARB(p->shader);
+	glUniform3fvARB(glGetUniformLocationARB(p->shader, var), 1, i);
 	glUseProgramObjectARB(0);
 	return 0;
 }
 
 static int program_set_uniform_number4(lua_State *L)
 {
-	GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1);
+	shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1);
 	const char *var = luaL_checkstring(L, 2);
 	GLfloat i[4];
 	i[0] = luaL_checknumber(L, 3);
@@ -215,34 +223,34 @@ static int program_set_uniform_number4(lua_State *L)
 	i[2] = luaL_checknumber(L, 5);
 	i[3] = luaL_checknumber(L, 6);
 
-	glUseProgramObjectARB(*p);
-	glUniform4fvARB(glGetUniformLocationARB(*p, var), 1, i);
+	glUseProgramObjectARB(p->shader);
+	glUniform4fvARB(glGetUniformLocationARB(p->shader, var), 1, i);
 	glUseProgramObjectARB(0);
 	return 0;
 }
 
 static int program_set_uniform_texture(lua_State *L)
 {
-	GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1);
+	shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1);
 	const char *var = luaL_checkstring(L, 2);
 	GLint i = luaL_checknumber(L, 3);
 
-	glUseProgramObjectARB(*p);
-	glUniform1ivARB(glGetUniformLocationARB(*p, var), 1, &i);
+	glUseProgramObjectARB(p->shader);
+	glUniform1ivARB(glGetUniformLocationARB(p->shader, var), 1, &i);
 	glUseProgramObjectARB(0);
 	return 0;
 }
 
 static int program_use(lua_State *L)
 {
-	GLuint *p = (GLuint*)auxiliar_checkclass(L, "gl{program}", 1);
+	shader_type *p = (shader_type*)auxiliar_checkclass(L, "gl{program}", 1);
 	bool active = lua_toboolean(L, 2);
 
 	if (active)
 	{
-		glUseProgramObjectARB(*p);
+		glUseProgramObjectARB(p->shader);
 		GLfloat t = SDL_GetTicks();
-		glUniform1fvARB(glGetUniformLocationARB(*p, "tick"), 1, &t);
+		glUniform1fvARB(glGetUniformLocationARB(p->shader, "tick"), 1, &t);
 	}
 	else
 	{
diff --git a/src/useshader.h b/src/useshader.h
index 6a01d6f2d39d36321b949e2c0c2542e1bf6d25fe..af77810665c589e3e658caa9db09742f8fbee67f 100644
--- a/src/useshader.h
+++ b/src/useshader.h
@@ -1,2 +1,13 @@
+#ifndef __USESHADER_H__
+#define __USESHADER_H__
+
+typedef struct {
+	GLuint shader;
+	GLint p_tick, p_color, p_mapcoord, p_texsize;
+	int params_ref;
+} shader_type;
+
 extern bool shaders_active;
-extern void useShader(GLuint p, int x, int y, int w, int h, float r, float g, float b, float a);
+extern void useShader(shader_type *p, int x, int y, int w, int h, float r, float g, float b, float a);
+
+#endif