diff --git a/game/engines/default/engine/LogFlasher.lua b/game/engines/default/engine/LogFlasher.lua
index 90ee7cdaa8b77051cd8ba75302b2a4a021bb0b6e..ca9512c75e41bdc551e745561e71d12075d87c7f 100644
--- a/game/engines/default/engine/LogFlasher.lua
+++ b/game/engines/default/engine/LogFlasher.lua
@@ -58,11 +58,14 @@ function _M:call(style, str, ...)
 	if self.flashing == 0 and #self.log > 0 then self.log = {} end
 
 	local base = ""
-	if #self.log > 0 then base = table.remove(self.log) end
+	if #self.log > 0 then base = table.remove(self.log)[1] end
 
 	local lines = (base .. " " .. str:format(...)):splitLines(self.w - 4, self.font)
 	for i = 1, #lines do
-		table.insert(self.log, lines[i])
+		self.surface:erase(0,0,0,255)
+		self.surface:drawColorStringBlended(self.font, lines[i], 0, 0, self.color[1], self.color[2], self.color[3])
+		local t = self.surface:glTexture()
+		table.insert(self.log, {lines[i],t})
 	end
 	self.flashing_style = style
 	self.flashing = 20
@@ -79,23 +82,20 @@ function _M:empty(force)
 end
 
 function _M:display()
-	-- If nothing changed, return the same surface as before
-	if not self.changed then return self.surface end
 	self.changed = false
 
 	-- Erase and the display the map
 	if self.flashing_style == BAD then
-		self.surface:erase(self.bgcolor[1] + self.flashing * 10, self.bgcolor[2], self.bgcolor[3])
+		core.display.drawQuad(self.display_x, self.display_y, self.w, self.h, self.bgcolor[1] + self.flashing * 10, self.bgcolor[2], self.bgcolor[3], 255)
 	elseif self.flashing_style == NEUTRAL then
-		self.surface:erase(self.bgcolor[1], self.bgcolor[2], self.bgcolor[3] + self.flashing * 10)
+		core.display.drawQuad(self.display_x, self.display_y, self.w, self.h, self.bgcolor[1], self.bgcolor[2], self.bgcolor[3] + self.flashing * 10, 255)
 	else
-		self.surface:erase(self.bgcolor[1], self.bgcolor[2] + self.flashing * 10, self.bgcolor[3])
-        end
-	self.surface:drawColorStringBlended(self.font, self.log[1] or "", 0, 0, self.color[1], self.color[2], self.color[3])
+		core.display.drawQuad(self.display_x, self.display_y, self.w, self.h, self.bgcolor[1], self.bgcolor[2] + self.flashing * 10, self.bgcolor[3], 255)
+	end
+
+--	if self.log[1] then self.log[1][2]:toScreen(self.display_x, self.display_y, self.w, self.h) end
 
 	self.flashing = self.flashing - 1
-	if self.flashing > 0 then self.changed = true
+	if self.flashing > 0 then
 	else table.remove(self.log, 1) end
-
-	return self.surface
 end
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index 9235e0b44bf72cf18787597d77dc09b60c638bbe..d03d73ea8d069508865139f949ba3c7fc37ad50b 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -403,8 +403,10 @@ function _M:onTurn()
 end
 
 function _M:display()
+	local st = core.game.getTime()
 	-- Now the map, if any
 	if self.level and self.level.map and self.level.map.finished then
+print("=====display01", core.game.getTime()-st)
 		-- Display the map and compute FOV for the player if needed
 		if self.level.map.changed then
 			self.player:playerFOV()
@@ -415,6 +417,7 @@ function _M:display()
 			self.level.data.background(self.level)
 		end
 
+print("=====display02", core.game.getTime()-st)
 		-- Display using Framebuffer, sotaht we can use shaders and all
 		if self.fbo then
 			self.fbo:use(true)
@@ -433,34 +436,46 @@ function _M:display()
 			self.target:display()
 		end
 
+print("=====display03", core.game.getTime()-st)
+
 		if not self.zone_name_s then
-			self.zone_name_s = core.display.drawStringBlendedNewSurface(self.player_display.font, ("%s (%d)"):format(self.zone.name, self.level.level), 0, 255, 255)
+			local s = core.display.drawStringBlendedNewSurface(self.player_display.font, ("%s (%d)"):format(self.zone.name, self.level.level), 0, 255, 255)
+			self.zone_name_s = s:glTexture()
+			self.zone_name_w, self.zone_name_h = s:getSize()
 		end
-		local znsx, znsy = self.zone_name_s:getSize()
 		self.zone_name_s:toScreen(
-			self.level.map.display_x + self.level.map.viewport.width - znsx,
-			self.level.map.display_y + self.level.map.viewport.height - znsy
+			self.level.map.display_x + self.level.map.viewport.width - self.zone_name_w,
+			self.level.map.display_y + self.level.map.viewport.height - self.zone_name_h,
+			self.zone_name_w, self.zone_name_h
 		)
+print("=====display04", core.game.getTime()-st)
 
 		-- Minimap display
 		self.level.map:minimapDisplay(0, 20, util.bound(self.player.x - 25, 0, self.level.map.w - 50), util.bound(self.player.y - 25, 0, self.level.map.h - 50), 50, 50, 1)
+print("=====display05", core.game.getTime()-st)
 	end
 
 	-- We display the player's interface
-	self.flash:display():toScreen(self.flash.display_x, self.flash.display_y)
+	self.flash:display()
+print("=====display06", core.game.getTime()-st)
 	self.logdisplay:display():toScreen(self.logdisplay.display_x, self.logdisplay.display_y)
+print("=====display07", core.game.getTime()-st)
 	self.player_display:display():toScreen(self.player_display.display_x, self.player_display.display_y)
+print("=====display08", core.game.getTime()-st)
 	if self.show_npc_list then
 		self.npcs_display:display():toScreen(self.npcs_display.display_x, self.npcs_display.display_y)
 	else
 		self.hotkeys_display:display():toScreen(self.hotkeys_display.display_x, self.hotkeys_display.display_y)
 	end
 	if self.player then self.player.changed = false end
+print("=====display09", core.game.getTime()-st)
 
 	-- Tooltip is displayed over all else
 	self:targetDisplayTooltip(game.w, game.h)
+print("=====display10", core.game.getTime()-st)
 
 	engine.GameTurnBased.display(self)
+print("=====display11", core.game.getTime()-st)
 end
 
 function _M:setupCommands()
diff --git a/src/core_lua.c b/src/core_lua.c
index f6fce6950adeaccaaf665857ce15950607906917..d0a1a58025b3dec35c16c69657d2c9c5af2f11db 100644
--- a/src/core_lua.c
+++ b/src/core_lua.c
@@ -726,6 +726,38 @@ static int gl_texture_to_sdl(lua_State *L)
 	return 1;
 }
 
+static int gl_draw_quad(lua_State *L)
+{
+	int x = luaL_checknumber(L, 1);
+	int y = luaL_checknumber(L, 2);
+	int w = luaL_checknumber(L, 3);
+	int h = luaL_checknumber(L, 4);
+	float r = luaL_checknumber(L, 5) / 255;
+	float g = luaL_checknumber(L, 6) / 255;
+	float b = luaL_checknumber(L, 7) / 255;
+	float a = luaL_checknumber(L, 8) / 255;
+
+	if (lua_isuserdata(L, 9))
+	{
+		GLuint *t = (GLuint*)auxiliar_checkclass(L, "gl{texture}", 9);
+		glBindTexture(GL_TEXTURE_2D, *t);
+	}
+	else
+		glBindTexture(GL_TEXTURE_2D, 0);
+
+	glColor4f(r, g, b, a);
+	glBegin( GL_QUADS );                 /* Draw A Quad              */
+	glTexCoord2f(0,0); glVertex2f(0  + x, 0  + y);
+	glTexCoord2f(0,1); glVertex2f(0  + x, h + y);
+	glTexCoord2f(1,1); glVertex2f(w + x, h + y);
+	glTexCoord2f(1,0); glVertex2f(w + x, 0  + y);
+	glEnd( );                            /* Done Drawing The Quad    */
+
+	glColor4f(1, 1, 1, 1);
+	return 0;
+}
+
+
 static int sdl_load_image(lua_State *L)
 {
 	const char *name = luaL_checkstring(L, 1);
@@ -1345,6 +1377,7 @@ static const struct luaL_reg displaylib[] =
 	{"newSurface", sdl_new_surface},
 	{"newTile", sdl_new_tile},
 	{"newFBO", gl_new_fbo},
+	{"drawQuad", gl_draw_quad},
 	{"FBOActive", gl_fbo_is_active},
 	{"drawStringNewSurface", sdl_surface_drawstring_newsurface},
 	{"drawStringBlendedNewSurface", sdl_surface_drawstring_newsurface_aa},