diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index c51778d22fcdc67884109ed8895d05fd89992114..c745523f1bd59805e33f3117a75592954c98d61b 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -544,7 +544,14 @@ function _M:setupCommands()
 		end,
 
 		EXIT = function()
-			local menu = require("engine.dialogs.GameMenu").new{"resume", "keybinds", "resolution", "save", "quit"}
+			local menu menu = require("engine.dialogs.GameMenu").new{
+				"resume",
+				"keybinds",
+				{"Graphic Mode", function() game:unregisterDialog(menu) game:registerDialog(require("mod.dialogs.GraphicMode").new()) end},
+				"resolution",
+				"save",
+				"quit"
+			}
 			self:registerDialog(menu)
 		end,
 
diff --git a/game/modules/tome/dialogs/GraphicMode.lua b/game/modules/tome/dialogs/GraphicMode.lua
new file mode 100644
index 0000000000000000000000000000000000000000..0780611a6771427d1e8e9c027ca36d47cd1e7d1f
--- /dev/null
+++ b/game/modules/tome/dialogs/GraphicMode.lua
@@ -0,0 +1,55 @@
+require "engine.class"
+require "engine.Dialog"
+
+module(..., package.seeall, class.inherit(engine.Dialog))
+
+function _M:init()
+	self:generateList()
+
+	engine.Dialog.init(self, "Change graphic mode", 300, #self.list * 30 + 20)
+
+	self.sel = 1
+	self.scroll = 1
+	self.max = math.floor((self.ih - 5) / self.font_h) - 1
+
+	self:keyCommands({
+		__TEXTINPUT = function(c)
+			if c:find("^[a-z]$") then
+				self.sel = util.bound(1 + string.byte(c) - string.byte('a'), 1, #self.list)
+				self:use()
+			end
+		end,
+	},{
+		MOVE_UP = function() self.sel = util.boundWrap(self.sel - 1, 1, #self.list) self.scroll = util.scroll(self.sel, self.scroll, self.max) self.changed = true end,
+		MOVE_DOWN = function() self.sel = util.boundWrap(self.sel + 1, 1, #self.list) self.scroll = util.scroll(self.sel, self.scroll, self.max) self.changed = true end,
+		ACCEPT = function() self:use() end,
+		EXIT = function() game:unregisterDialog(self) end,
+	})
+	self:mouseZones{
+		{ x=2, y=5, w=350, h=self.font_h*self.max, fct=function(button, x, y, xrel, yrel, tx, ty)
+			self.sel = util.bound(self.scroll + math.floor(ty / self.font_h), 1, #self.list)
+			if button == "left" then self:use()
+			elseif button == "right" then
+			end
+		end },
+	}
+end
+
+function _M:use()
+	game.gfxmode = self.list[self.sel].mode
+	game:setupDisplayMode()
+	game:unregisterDialog(self)
+end
+
+function _M:generateList()
+	local list = {
+		{name="32x32 Graphical", mode=1},
+		{name="16x16 Graphical", mode=2},
+		{name="16x16 ASCII",     mode=3},
+	}
+	self.list = list
+end
+
+function _M:drawDialog(s)
+	self:drawSelectionList(s, 2, 5, self.font_h, self.list, self.sel, "name", self.scroll, self.max)
+end