diff --git a/game/data/gfx/border_1.png b/game/data/gfx/border_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..d78094cb84a22e1fcbf7f2019bc15545db9acd2f
Binary files /dev/null and b/game/data/gfx/border_1.png differ
diff --git a/game/data/gfx/border_2.png b/game/data/gfx/border_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..08acdb6b556a549a6902d0e9b88393b2985b91dd
Binary files /dev/null and b/game/data/gfx/border_2.png differ
diff --git a/game/data/gfx/border_3.png b/game/data/gfx/border_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..e917cb161cbadb1709b6d257c00ed09063c6920a
Binary files /dev/null and b/game/data/gfx/border_3.png differ
diff --git a/game/data/gfx/border_4.png b/game/data/gfx/border_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a8591342fd58477c3fdbfc23525084dae112f8a
Binary files /dev/null and b/game/data/gfx/border_4.png differ
diff --git a/game/data/gfx/border_6.png b/game/data/gfx/border_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..18d4c24bee37a54a014cf2d33bc5c9b099386abc
Binary files /dev/null and b/game/data/gfx/border_6.png differ
diff --git a/game/data/gfx/border_7.png b/game/data/gfx/border_7.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8061a78e7ea5faa7ccf27740c352169ce9b6852
Binary files /dev/null and b/game/data/gfx/border_7.png differ
diff --git a/game/data/gfx/border_8.png b/game/data/gfx/border_8.png
new file mode 100644
index 0000000000000000000000000000000000000000..1bf00062ae37fbbdcb8aaa238a0058e6a8d7ea18
Binary files /dev/null and b/game/data/gfx/border_8.png differ
diff --git a/game/data/gfx/border_9.png b/game/data/gfx/border_9.png
new file mode 100644
index 0000000000000000000000000000000000000000..31eb00d4b44439baa6e8d2b4526e3b18e731f9d2
Binary files /dev/null and b/game/data/gfx/border_9.png differ
diff --git a/game/engine/Dialog.lua b/game/engine/Dialog.lua
index c19c13db8dbae84e7dc51bb9d22009eb8be30f21..567ab7e83815d2423628f8d385b7b531e07596a1 100644
--- a/game/engine/Dialog.lua
+++ b/game/engine/Dialog.lua
@@ -1,8 +1,12 @@
 require "engine.class"
+require "engine.Tiles"
+require "engine.KeyCommand"
 
 --- Handles dialog windows
 module(..., package.seeall, class.make)
 
+tiles = engine.Tiles.new(16, 16)
+
 --- Create a calendar
 -- @param definition the file to load that returns a table containing calendar months
 -- @param datestring a string to format the date when requested, in the format "%s %s %s %d %d", standing for, day, month, year, hour, minute
@@ -12,9 +16,10 @@ function _M:init(title, w, h, x, y, alpha, font)
 	self.x = x or (game.w - self.w) / 2
 	self.y = y or (game.h - self.h) / 2
 	self.font = font
-	if not font then self.font = core.display.newFont("/data/font/VeraMono.ttf", 12) end
+	if not font then self.font = core.display.newFont("/data/font/Vera.ttf", 12) end
 	self.surface = core.display.newSurface(w, h)
-	self.internal_surface = core.display.newSurface(w, h - 5 - self.font:height())
+	self.iw, self.ih = w - 2 * 5, h - 8 - 16 - 3
+	self.internal_surface = core.display.newSurface(self.iw, self.ih)
 	self.surface:alpha(alpha or 220)
 	self.changed = true
 end
@@ -24,14 +29,42 @@ function _M:display()
 
 	local s = self.surface
 	s:erase()
-	s:drawColorString(self.font, self.title, 2, 0, 255,255,255)
+
+	s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_7.png"), 0, 0)
+	s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_9.png"), self.w - 9, 0)
+	s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_1.png"), 0, self.h - 9)
+	s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_3.png"), self.w - 9, self.h - 9)
+	for i = 8, self.w - 9 do
+		s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_8.png"), i, 0)
+		s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_8.png"), i, 20)
+		s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_8.png"), i, self.h - 3)
+	end
+	for i = 8, self.h - 9 do
+		s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_4.png"), 0, i)
+		s:merge(tiles:get(nil, 0,0,0, 0,0,0, "border_4.png"), self.w - 3, i)
+	end
+
+	local tw, th = self.font:size(self.title)
+	s:drawColorString(self.font, self.title, (self.w - tw) / 2, 4, 255,255,255)
 
 	self.internal_surface:erase()
 	self:drawDialog(self.internal_surface)
-	s:merge(self.internal_surface, 0, 5 + self.font:height())
+	s:merge(self.internal_surface, 5, 20 + 3)
 
 	return self.surface
 end
 
 function _M:drawDialog(s)
 end
+
+function _M:keyCommands(t)
+	self.old_key = game.key
+	game.key = engine.KeyCommand.new()
+	game.key:addCommands(t)
+	game.key:setCurrent()
+end
+
+function _M:unload()
+	game.key = self.old_key
+	game.key:setCurrent()
+end
diff --git a/game/engine/Game.lua b/game/engine/Game.lua
index 75b40cfaa3dd85bb128feb2a479f5e6cf94c91bd..f2aa9a1a9c51719046411364e7025f0d13fdfdf7 100644
--- a/game/engine/Game.lua
+++ b/game/engine/Game.lua
@@ -54,4 +54,5 @@ function _M:unregisterDialog(d)
 	if not self.dialogs[d] then return end
 	table.remove(self.dialogs, self.dialogs[d])
 	self.dialogs[d] = nil
+	d:unload()
 end
diff --git a/game/engine/Key.lua b/game/engine/Key.lua
index 90c05dfd7930d20cb938cb5818daa6730728dcd9..817c74fbd5b4e8f68e18e183ac6205b0d970fa1a 100644
--- a/game/engine/Key.lua
+++ b/game/engine/Key.lua
@@ -271,3 +271,5 @@ _MENU		= 319
 _POWER		= 320		-- Power Macintosh power key
 _EURO		= 321		-- Some european keyboards
 _UNDO		= 322		-- Atari keyboard has Undo
+
+__DEFAULT 	= -10000
diff --git a/game/engine/KeyCommand.lua b/game/engine/KeyCommand.lua
index 565fcdfc8acedba21d3801a70d78c8098c5b7fe5..a6f1308ca2e955b749b72e516cdcf74e2d6942c9 100644
--- a/game/engine/KeyCommand.lua
+++ b/game/engine/KeyCommand.lua
@@ -10,8 +10,8 @@ function _M:init()
 end
 
 function _M:receiveKey(sym, ctrl, shift, alt, meta, unicode)
-	if not self.commands[sym] then return end
-	if (ctrl or shift or alt or meta) and not self.commands[sym].anymod then
+	if not self.commands[sym] and not self.commands[self.__DEFAULT] then return end
+	if self.commands[sym] and (ctrl or shift or alt or meta) and not self.commands[sym].anymod then
 		local mods = {}
 		if alt then mods[#mods+1] = "alt" end
 		if ctrl then mods[#mods+1] = "ctrl" end
@@ -21,8 +21,10 @@ function _M:receiveKey(sym, ctrl, shift, alt, meta, unicode)
 		if self.commands[sym][mods] then
 			self.commands[sym][mods](sym, ctrl, shift, alt, meta, unicode)
 		end
-	elseif self.commands[sym].plain then
+	elseif self.commands[sym] and self.commands[sym].plain then
 		self.commands[sym].plain(sym, ctrl, shift, alt, meta, unicode)
+	elseif self.commands[self.__DEFAULT] and self.commands[self.__DEFAULT].plain then
+		self.commands[self.__DEFAULT].plain(sym, ctrl, shift, alt, meta, unicode)
 	end
 end
 
diff --git a/game/engine/utils.lua b/game/engine/utils.lua
index 6ed5608137b2ecf609dbcc46e2468c87b798e59c..aed5486ffd87d84a83a200e3afee9e6c121327b4 100644
--- a/game/engine/utils.lua
+++ b/game/engine/utils.lua
@@ -141,6 +141,9 @@ do
 local tmps = core.display.newSurface(1, 1)
 getmetatable(tmps).__index.drawColorString = function(s, font, str, x, y, r, g, b)
 	local list = str:split("#%x%x%x%x%x%x#", true)
+	r = r or 255
+	g = g or 255
+	b = b or 255
 	for i, v in ipairs(list) do
 		local _, _, nr, ng, nb = v:find("^#(%x%x)(%x%x)(%x%x)#")
 		if nr and ng and nb then
@@ -152,4 +155,11 @@ getmetatable(tmps).__index.drawColorString = function(s, font, str, x, y, r, g,
 		end
 	end
 end
+
+getmetatable(tmps).__index.drawColorStringCentered = function(s, font, str, dx, dy, dw, dh, r, g, b)
+	local w, h = font:size(str)
+	local x, y = dx + (dw - w) / 2, dy + (dh - h) / 2
+	s:drawColorString(font, str, x, y, r, g, b)
+end
+
 end
diff --git a/game/modules/tome/dialogs/Quit.lua b/game/modules/tome/dialogs/Quit.lua
index 1863c764acab90547ca5f564c3802264bdb0aa78..a45540fa8085b9bad69af44c34e0cd29a17c3a3d 100644
--- a/game/modules/tome/dialogs/Quit.lua
+++ b/game/modules/tome/dialogs/Quit.lua
@@ -4,9 +4,17 @@ require "engine.Dialog"
 module(..., package.seeall, class.inherit(engine.Dialog))
 
 function _M:init()
-	engine.Dialog.init(self, "Realy exit ToME?", 200, 150)
+	engine.Dialog.init(self, "Realy exit ToME?", 300, 100)
+	self:keyCommands{
+		_y = function()
+			os.exit()
+		end,
+		__DEFAULT = function()
+			game:unregisterDialog(self)
+		end,
+	}
 end
 
-function _M:drawDialog(s)
-	s:drawString(self.font, "Press Y to quit, any other keys to stay", 2, 2, 255,255,255)
+function _M:drawDialog(s, w, h)
+	s:drawColorStringCentered(self.font, "Press Y to quit, any other keys to stay", 2, 2, self.iw - 2, self.ih - 2)
 end