diff --git a/src/gui/__init__.py b/src/gui/__init__.py
--- a/src/gui/__init__.py
+++ b/src/gui/__init__.py
@@ -4,6 +4,7 @@ import tkinter as tk
 import config
 from .mainwindow import MainWindow
 from .boardview import BoardView
+from .settings import Settings
 
 
 class GUI:
@@ -21,6 +22,7 @@ class GUI:
 		self.root.bind("<<redrawImgView>>", lambda e: self.mainWindow.redrawImgView())
 		self.root.bind("<Left>",lambda e: self.sendMsg("prevFrame"))
 		self.root.bind("<Right>",lambda e: self.sendMsg("nextFrame"))
+		self.root.bind("<F12>",lambda e: Settings(self))
 
 	def __call__(self,ownMessages,coreMessages):
 		self._coreMessages=coreMessages
diff --git a/src/gui/mainwindow.py b/src/gui/mainwindow.py
--- a/src/gui/mainwindow.py
+++ b/src/gui/mainwindow.py
@@ -1,12 +1,13 @@
 import tkinter as tk
 from tkinter import N,S,E,W
 
-from . import menu
+from .util import MsgMixin
+from .menu import MainMenu
 from .boardview import BoardView
 from .imgview import ImgView
 
 
-class MainWindow(tk.Frame):
+class MainWindow(tk.Frame,MsgMixin):
 	def __init__(self,parent,master=None):
 		self.parent=parent
 
@@ -14,17 +15,13 @@ class MainWindow(tk.Frame):
 		self.grid(column=0,row=0,sticky=(N,S,E,W))
 		self._createWidgets()
 
-		self.bind("<Left>",lambda e: self.sendMsg("prevFrame"))
-		self.bind("<Right>",lambda e: self.sendMsg("nextFrame"))
-
 	def setCurrentFrame(self,frame):
 		self.imgView.setImg(frame)
 
 	def _createWidgets(self):
 		# menu
 		self.parent.root.option_add('*tearOff',False)
-		menubar=menu.createTopBar(self.parent.root)
-		menu.createMainMenu(menubar)
+		self._menu=MainMenu(self.parent,self.parent.root)
 
 		# a captured frame with overlay graphics
 		self._imgWrapper=tk.Frame(self,width=480,height=360)
@@ -37,14 +34,6 @@ class MainWindow(tk.Frame):
 		self.boardView=BoardView(self._boardWrapper)
 		self._boardWrapper.grid(column=1,row=0,sticky=(N,S,E,W))
 
-		# more controls below the board
-		self.scaleTresB=tk.Scale(self, orient=tk.HORIZONTAL, length=200, from_=0.0, to=100.0, command=self.refreshTresholds)
-		self.scaleTresW=tk.Scale(self, orient=tk.HORIZONTAL, length=200, from_=0.0, to=100.0, command=self.refreshTresholds)
-		self.scaleTresB.set(30.0) # !! proper defaults
-		self.scaleTresW.set(60.0)
-		self.scaleTresB.grid(column=0,row=1,columnspan=2)
-		self.scaleTresW.grid(column=0,row=2,columnspan=2)
-
 		self.columnconfigure(0,weight=1)
 		self.columnconfigure(1,weight=1)
 		self.rowconfigure(0,weight=1)
@@ -55,9 +44,3 @@ class MainWindow(tk.Frame):
 	## Redraws the current image and its overlay.
 	def redrawImgView(self):
 		self.imgView.redraw()
-
-	def refreshTresholds(self,_):
-		self.parent.sendMsg("setTresholds",tuple(),{"tresB":self.scaleTresB.get(), "tresW":self.scaleTresW.get()})
-
-	def sendMsg(self,actionName,args=tuple(),kwargs=None):
-		self.parent.sendMsg(actionName,args,kwargs)
diff --git a/src/gui/menu.py b/src/gui/menu.py
--- a/src/gui/menu.py
+++ b/src/gui/menu.py
@@ -1,18 +1,28 @@
-from tkinter import Menu
-
+import tkinter as tk
 
-def createTopBar(root):
-	menubar = Menu(root)
-	root['menu'] = menubar
-	return menubar
+from .util import MsgMixin
+from .settings import Settings
 
 
-def createMainMenu(menubar):
-	file = Menu(menubar)
-	_help = Menu(menubar)
-	menubar.add_cascade(menu=file, label='File')
-	menubar.add_cascade(menu=_help, label='Help')
+class MainMenu(MsgMixin):
+	def __init__(self,parent,root):
+		self.root=root
+		self.parent=parent
+		self._createWidgets()
+
+	def _createWidgets(self):
+		bar=self._createTopBar()
 
-	file.add_command(label="Settings")
+		file = tk.Menu(bar)
+		help_ = tk.Menu(bar)
+		bar.add_cascade(menu=file, label='File')
+		bar.add_cascade(menu=help_, label='Help')
+
+		file.add_command(label="Settings",command=lambda: Settings(self.parent))
 
-	_help.add_command(label="About")
+		help_.add_command(label="About")
+
+	def _createTopBar(self):
+		menubar = tk.Menu(self.root)
+		self.root['menu'] = menubar
+		return menubar
diff --git a/src/gui/settings.py b/src/gui/settings.py
new file mode 100644
--- /dev/null
+++ b/src/gui/settings.py
@@ -0,0 +1,35 @@
+import tkinter as tk
+from tkinter import N,S,E,W
+
+from .util import MsgMixin
+
+
+class Settings(tk.Toplevel,MsgMixin):
+	def __init__(self,parent):
+		self.parent=parent
+
+		tk.Toplevel.__init__(self, parent.root)
+
+		self.title("Settings | OneEye")
+
+		self.columnconfigure(0,weight=1)
+		self.content=tk.Frame(self)
+		self.content.grid(column=0,row=0,sticky=(N,S,E,W))
+		self.content.columnconfigure(0,weight=1)
+		self._create()
+
+	def _create(self):
+		self.scaleTresB=tk.Scale(self.content, orient=tk.HORIZONTAL, length=200, from_=0.0, to=100.0, command=self.refreshTresholds)
+		self.scaleTresW=tk.Scale(self.content, orient=tk.HORIZONTAL, length=200, from_=0.0, to=100.0, command=self.refreshTresholds)
+		self.scaleTresB.set(30.0) # !! proper defaults
+		self.scaleTresW.set(60.0)
+
+		blackLabel=tk.Label(self.content,text="Black stone treshold (intensity)")
+		whiteLabel=tk.Label(self.content,text="White stone treshold (intensity)")
+		blackLabel.grid(column=0,row=0)
+		self.scaleTresB.grid(column=0,row=1,sticky=(E,W))
+		whiteLabel.grid(column=0,row=2)
+		self.scaleTresW.grid(column=0,row=3,sticky=(E,W))
+
+	def refreshTresholds(self,_):
+		self.parent.sendMsg("setTresholds",tuple(),{"tresB":self.scaleTresB.get(), "tresW":self.scaleTresW.get()})
diff --git a/src/gui/util.py b/src/gui/util.py
new file mode 100644
--- /dev/null
+++ b/src/gui/util.py
@@ -0,0 +1,3 @@
+class MsgMixin:
+	def sendMsg(self,actionName,args=tuple(),kwargs=None):
+		self.parent.sendMsg(actionName,args,kwargs)