Index: code/trunk/data/gui/scripts/AudioMenu.lua
===================================================================
--- code/trunk/data/gui/scripts/AudioMenu.lua	(revision 7648)
+++ code/trunk/data/gui/scripts/AudioMenu.lua	(revision 7689)
@@ -2,4 +2,11 @@
 
 local P = createMenuSheet("AudioMenu")
+
+P.buttonList = {}
+
+function P.onShow()
+    P.oldindex = -2
+    P.index = -1
+end
 
 function P.onLoad()
@@ -42,4 +49,10 @@
         listboxwindow:setItemSelectState(0,true)
     end
+
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/AudioBackButton"),
+            ["function"]  = P.AudioBackButton_clicked
+    }
+    P.buttonList[1] = item
 end
 
@@ -172,4 +185,8 @@
 end
 
+function P.onKeyPressed() 
+    buttonIteratorHelper(P.buttonList, code, P, 1, 1)
+end
+
 return P
 
Index: code/trunk/data/gui/scripts/ControlsMenu.lua
===================================================================
--- code/trunk/data/gui/scripts/ControlsMenu.lua	(revision 7648)
+++ code/trunk/data/gui/scripts/ControlsMenu.lua	(revision 7689)
@@ -2,5 +2,36 @@
 
 local P = createMenuSheet("ControlsMenu")
+P.buttonList = {}
 P.loadAlong = { "MouseControlsMenu", "KeyBindMenu" }
+
+function P.onLoad()
+    P.multiplayerMode = "startClient" 
+
+    --buttons are arranged in a 3x1 matrix:
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/MouseControlsButton"),
+            ["function"]  = P.ControlsMouseControlsButton_clicked
+    }
+    P.buttonList[1] = item
+
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/KeybindingsButton"),
+            ["function"]  = P.ControlsKeyboardControlsButton_clicked
+    }
+    P.buttonList[2] = item
+
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/ControlsBackButton"),
+            ["function"]  = P.ControlsBackButton_clicked
+    }
+    P.buttonList[3] = item
+
+end
+
+function P.onShow()
+    --indices to iterate through buttonlist
+    P.oldindex = -2
+    P.index = -1
+end
 
 function P.ControlsMouseControlsButton_clicked(e)
@@ -16,4 +47,8 @@
 end
 
+function P.onKeyPressed() 
+    buttonIteratorHelper(P.buttonList, code, P, 3, 1)
+end
+
 return P
 
Index: code/trunk/data/gui/scripts/CreditsMenu.lua
===================================================================
--- code/trunk/data/gui/scripts/CreditsMenu.lua	(revision 7648)
+++ code/trunk/data/gui/scripts/CreditsMenu.lua	(revision 7689)
@@ -2,4 +2,20 @@
 
 local P = createMenuSheet("CreditsMenu")
+
+P.buttonList = {}
+
+function P.onLoad()
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/CreditsBackButton"),
+            ["function"]  = P.CreditsBackButton_clicked
+    }
+    P.buttonList[1] = item
+end
+
+function P.onShow()
+    --indices to iterate through buttonlist
+    P.oldindex = -2
+    P.index = -1
+end
 
 function P.CreditsBackButton_clicked(e)
@@ -7,4 +23,8 @@
 end
 
+function P.onKeyPressed() 
+    buttonIteratorHelper(P.buttonList, code, P, 1, 1)
+end
+
 return P
 
Index: code/trunk/data/gui/scripts/GUISheet.lua
===================================================================
--- code/trunk/data/gui/scripts/GUISheet.lua	(revision 7648)
+++ code/trunk/data/gui/scripts/GUISheet.lua	(revision 7689)
@@ -64,3 +64,6 @@
 end
 
+function P:onKeyPressed(e)
+end
+
 return P
Index: code/trunk/data/gui/scripts/GUITools.lua
===================================================================
--- code/trunk/data/gui/scripts/GUITools.lua	(revision 7648)
+++ code/trunk/data/gui/scripts/GUITools.lua	(revision 7689)
@@ -54,2 +54,281 @@
     return height
 end
+
+--function to iterate through a menu sheet by using arrowkeys
+
+--@arguments:
+--  list: 2-dimensional table, arguments are items that contain a button and its function
+--        !!note: each button can only be in the list once!!
+--  code: code of any key on the keyboard
+--  P: menusheet
+--  n: number of rows of the buttontable
+--  m: number of colums of the buttontable
+
+function buttonIteratorHelper(list, code, P, n, m)
+
+    --after a key (down,up,left,right) is pressed the index of the current button has to be updated    
+
+    --key down
+    if code == "208" then
+        if P.index < 0 then     -- initial status
+            P.index = 0
+            P.oldindex = -1
+        else
+            P.oldindex = P.index
+            P.index = (P.index + m) % (m*n)     --modulo operation works as a "wrap around" in the button menu
+                                                
+            while list[P.index+1] == nil do     
+                P.oldindex = P.index
+                P.index = (P.index + m) % (m*n)
+            end
+        end
+
+    --key up
+    elseif code == "200" then
+        if P.index < 0 then
+            P.index = 0
+            P.oldindex = -1
+        elseif(P.index == 0) then
+            P.oldindex = P.index
+            P.index = m*n-m
+
+            while list[P.index+1] == nil do
+                P.oldindex = P.index
+                P.index = (P.index-m)%(m*n)
+            end
+        else
+            P.oldindex = P.index
+            P.index = (P.index -m) % (m*n)
+
+            while list[P.index+1] == nil do
+                P.oldindex = P.index
+                P.index = (P.index-m)%(m*n)
+            end
+        end
+
+    --key right
+    elseif code == "205" then
+        if P.index < 0 then
+            P.index = 0
+            P.oldindex = -1
+        elseif (P.index+1) % m == 0 then     -- we are at the right-end of a row
+            P.oldindex = P.index
+            P.index = P.index + 1 -m
+
+            while list[P.index+1] == nil do
+                P.oldindex = P.index
+                P.index = P.index + 1
+            end
+        else
+            P.oldindex = P.index
+            P.index = P.index + 1
+
+            while list[P.index+1] == nil do
+                if (P.index+1) % m == 0 then     -- we are at the right-end of a row
+                    P.oldindex = P.index
+                    P.index = P.index + 1-m
+
+                else    
+                    P.oldindex = P.index
+                    P.index = P.index + 1
+                end
+            end
+        end    
+
+    --key left
+    elseif code == "203" then
+        if P.index < 0 then
+            P.index = 0
+            P.oldindex = -1
+        elseif P.index % m == 0 then         -- we are at the left-end of a row 
+            P.oldindex = P.index
+            P.index = P.index +m-1
+
+            while list[P.index+1] == nil do
+                P.oldindex = P.index
+                P.index = P.index -1
+            end
+        else
+            P.oldindex = P.index
+            P.index = P.index -1
+
+            while list[P.index+1] == nil do
+                if P.index % m == 0 then     -- we are at the left-end of a row 
+                    P.oldindex = P.index
+                    P.index = P.index -1 + m
+                else                
+                    P.oldindex = P.index
+                    P.index = P.index -1
+                end
+            end   
+        end
+    end
+       
+    --to update the new current button
+    if (code == "208" or code == "200" or code == "203" or code == "205") and P.oldindex~= P.index then
+
+        local system = CEGUI.System:getSingleton()
+        local window = winMgr:getWindow("orxonox/MainMenuBackground")
+
+        local item = list[P.index+1]
+        local child = item["button"] 
+
+        --teste ob der Button nicht schon gehighlightet ist
+        if child:getProperty("NormalImageRightEdge") == "set:TaharezGreenLook image:ButtonRightHighlight" then
+            --nop
+        else
+            child:setProperty("NormalImageRightEdge", string.sub(child:getProperty("NormalImageRightEdge"),1,-7) .. "Highlight")
+            child:setProperty("NormalImageLeftEdge", string.sub(child:getProperty("NormalImageLeftEdge"),1,-7) .. "Highlight")
+            child:setProperty("NormalImageBackground", string.sub(child:getProperty("NormalImageBackground"),1,-7) .. "Highlight")
+            if P.oldindex >= 0 then
+                if list[P.oldindex+1] ~= nil then
+                    local item = list[P.oldindex+1]
+                    local oldChild = item["button"]
+                    oldChild:setProperty("NormalImageRightEdge", string.sub(oldChild:getProperty("NormalImageRightEdge"),1,-10) .. "Normal")
+                    oldChild:setProperty("NormalImageLeftEdge", string.sub(oldChild:getProperty("NormalImageLeftEdge"),1,-10) .. "Normal")
+                    oldChild:setProperty("NormalImageBackground", string.sub(oldChild:getProperty("NormalImageBackground"),1,-10) .. "Normal")
+                end
+            end
+        end
+
+        --for every highlighted button check if index is on its position. If not, set imageproperty on "normal"
+        local i = 1
+        while i < (n*m) do
+            if i == P.index +1 then 
+                i = i+1
+            else
+                if list[i] ~= nil then 
+                local item = list[i]
+                local child = item["button"]
+                    if child:getProperty("NormalImageRightEdge") == "set:TaharezGreenLook image:ButtonRightHighlight" then
+                        child:setProperty("NormalImageRightEdge", string.sub(child:getProperty("NormalImageRightEdge"),1,-10) .. "Normal")
+                        child:setProperty("NormalImageLeftEdge", string.sub(child:getProperty("NormalImageLeftEdge"),1,-10) .. "Normal")
+                        child:setProperty("NormalImageBackground", string.sub(child:getProperty("NormalImageBackground"),1,-10) .. "Normal")
+                    end
+                end
+            end
+                i=i+1
+        end
+    end
+    
+    --enter
+    if code == "28" then
+        local item = list[P.index+1]
+        local child = item["button"] 
+        child:setProperty("NormalImageRightEdge", string.sub(child:getProperty("NormalImageRightEdge"),1,-10) .. "Normal")
+        child:setProperty("NormalImageLeftEdge", string.sub(child:getProperty("NormalImageLeftEdge"),1,-10) .. "Normal")
+        child:setProperty("NormalImageBackground", string.sub(child:getProperty("NormalImageBackground"),1,-10) .. "Normal")
+
+        local foo = item["function"]
+        foo()
+    end
+
+end
+
+--write index and oldindex on the console
+--works like buttonIteratorHelper
+function indexTester(list,code,P,n,m)
+    --key down
+    if code == "208" then
+        if P.index < 0 then     -- initial status
+            P.index = 0
+            P.oldindex = -1
+        else
+            P.oldindex = P.index
+            P.index = (P.index + m) % (m*n)
+
+            while list[P.index+1] == nil do
+                P.oldindex = P.index
+                P.index = (P.index + m) % (m*n)
+            end
+        end
+
+    --key up
+    elseif code == "200" then
+        if P.index < 0 then
+            P.index = 0
+            P.oldindex = -1
+        elseif(P.index == 0) then
+            P.oldindex = P.index
+            P.index = m*n-m
+
+            while list[P.index+1] == nil do
+                P.oldindex = P.index
+                P.index = (P.index-m)%(m*n)
+            end
+        else
+            P.oldindex = P.index
+            P.index = (P.index -m) % (m*n)
+
+            while list[P.index+1] == nil do
+                P.oldindex = P.index
+                P.index = P.index -m
+            end
+        end
+
+    --key right
+    elseif code == "205" then
+        if P.index < 0 then
+            P.index = 0
+            P.oldindex = -1
+        elseif (P.index+1) % m == 0 then     -- we are at the right-end of a row
+            P.oldindex = P.index
+            P.index = P.index + 1 -m
+
+            while list[P.index+1] == nil do
+                P.oldindex = P.index
+                P.index = P.index + 1
+            end
+        else
+            P.oldindex = P.index
+            P.index = P.index + 1
+
+            while list[P.index+1] == nil do
+                if (P.index+1) % m == 0 then     -- we are at the right-end of a row
+                    P.oldindex = P.index
+                    P.index = P.index + 1-m
+
+                else    
+                    P.oldindex = P.index
+                    P.index = P.index + 1
+                end
+            end
+        end    
+
+    --key left
+    elseif code == "203" then
+        if P.index < 0 then
+            P.index = 0
+            P.oldindex = -1
+        elseif P.index % m == 0 then         -- we are at the left-end of a row 
+            P.oldindex = P.index
+            P.index = P.index +m-1
+
+            while list[P.index+1] == nil do
+                P.oldindex = P.index
+                P.index = P.index -1
+            end
+        else
+            P.oldindex = P.index
+            P.index = P.index -1
+
+            while list[P.index+1] == nil do
+                if P.index % m == 0 then     -- we are at the left-end of a row 
+                    P.oldindex = P.index
+                    P.index = P.index -1 + m
+                else                
+                    P.oldindex = P.index
+                    P.index = P.index -1
+                end
+            end   
+        end
+    end    
+
+    cout(0, P.oldindex)
+    cout(0, P.index)
+
+end
+
+
+
+
Index: code/trunk/data/gui/scripts/GraphicsMenu.lua
===================================================================
--- code/trunk/data/gui/scripts/GraphicsMenu.lua	(revision 7648)
+++ code/trunk/data/gui/scripts/GraphicsMenu.lua	(revision 7689)
@@ -2,4 +2,12 @@
 
 local P = createMenuSheet("GraphicsMenu")
+
+P.buttonList = {}
+
+function P.onShow()
+    --indices to iterate through buttonlist (trivial in this menu sheet)
+    P.oldindex = -2
+    P.index = -1
+end
 
 function P.onLoad()
@@ -83,4 +91,10 @@
     scrollbar_active = false
     block = false
+
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/GraphicsBackButton"),
+            ["function"]  = P.GraphicsBackButton_clicked
+    }
+    P.buttonList[1] = item
 end
 
@@ -195,4 +209,8 @@
 end
 
+function P.onKeyPressed() 
+    buttonIteratorHelper(P.buttonList, code, P, 1, 1)
+end
+
 return P
 
Index: code/trunk/data/gui/scripts/HostMenu.lua
===================================================================
--- code/trunk/data/gui/scripts/HostMenu.lua	(revision 7689)
+++ code/trunk/data/gui/scripts/HostMenu.lua	(revision 7689)
@@ -0,0 +1,126 @@
+-- HostMenu.lua
+
+local P = createMenuSheet("HostMenu")
+
+P.multiplayerMode = "startServer"
+
+P.buttonList = {}
+P.levelList = {}
+P.itemList = {}
+P.showAll = false
+
+function P.onLoad()
+    P.multiplayerMode = "startServer" 
+    local window = winMgr:getWindow("orxonox/MultiplayerShowAllCheckbox")
+    local button = tolua.cast(window,"CEGUI::Checkbox")
+    button:setSelected(false)
+    P.createLevelList()
+
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/HostMenuStartButton"),
+            ["function"]  = P.HostMenuStartButton_clicked
+    }
+    P.buttonList[1] = item
+
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/HostMenuBackButton"),
+            ["function"]  = P.HostMenuBackButton_clicked
+    }
+    P.buttonList[2] = item
+end
+
+function P.onShow()
+    if P.multiplayerMode == "startServer" then
+        local window = winMgr:getWindow("orxonox/HostMenuHostButton")
+        local button = tolua.cast(window,"CEGUI::RadioButton")
+        button:setSelected(true)
+        P.createLevelList()
+    end
+
+    if P.multiplayerMode == "startDedicated" then
+        local window = winMgr:getWindow("orxonox/HostMenuDedicatedButton")
+        local button = tolua.cast(window,"CEGUI::RadioButton")
+        button:setSelected(true)
+        P.createLevelList()
+    end
+
+    P.oldindex = -2
+    P.index = -1
+
+end
+
+function P.createLevelList()
+    P.levelList = {}
+    P.itemList = {}
+    local listbox = CEGUI.toListbox(winMgr:getWindow("orxonox/HostMenuListbox"))
+    listbox:resetList()
+    orxonox.GUIManager:setItemTooltipsEnabledHelper(listbox, true)
+    local preselect = orxonox.LevelManager:getInstance():getDefaultLevel()
+    local size = orxonox.LevelManager:getInstance():getNumberOfLevels()
+    local index = 0
+    local level = nil
+    while index < size do
+        level = orxonox.LevelManager:getInstance():getAvailableLevelListItem(index)
+        if level ~= nil then
+            if P.showAll or not level:hasTag("test") then
+                table.insert(P.levelList, level)
+            end
+        end
+        index = index + 1
+    end
+    --TODO: Reintroduce sorting, if needed. At the moment it's sorted by filename.
+    --table.sort(levelList)
+    for k,v in pairs(P.levelList) do
+        local item = CEGUI.createListboxTextItem(v:getName())
+        item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush")
+        listbox:addItem(item)
+        if v:getXMLFilename() == preselect then
+            listbox:setItemSelectState(item, true)
+        end
+        P.itemList[k] = listbox:getListboxItemFromIndex(k-1)
+        orxonox.GUIManager:setTooltipTextHelper(P.itemList[k], v:getDescription())
+    end
+end
+
+function P.HostMenuBuildServerButton_clicked(e)
+    P.multiplayerMode = "startServer"
+    P.createLevelList()
+end
+
+function P.HostMenuDedicatedButton_clicked(e)
+    P.multiplayerMode = "startDedicated"
+    P.createLevelList()
+end
+
+function P.HostMenuBackButton_clicked(e)
+    hideMenuSheet(P.name)
+end
+
+function P.HostMenuStartButton_clicked(e)    
+    local listbox = CEGUI.toListbox(winMgr:getWindow("orxonox/HostMenuListbox"))
+    local choice = listbox:getFirstSelectedItem()
+    if choice ~= nil then
+        local index = listbox:getItemIndex(choice)
+        local level = P.levelList[index+1]
+        if level ~= nil then
+            orxonox.LevelManager:getInstance():setDefaultLevel(level:getXMLFilename())
+            orxonox.execute(P.multiplayerMode)
+            hideAllMenuSheets()
+        end
+    end
+end
+
+function P.MultiplayerShowAll_clicked(e)
+    local checkbox = tolua.cast(winMgr:getWindow("orxonox/MultiplayerShowAllCheckbox"), "CEGUI::Checkbox")
+    local show = checkbox:isSelected()
+    if show ~= P.showAll then
+        P.showAll = show
+        P.createLevelList()
+   end
+end
+
+function P.onKeyPressed() 
+    buttonIteratorHelper(P.buttonList, code, P, 1, 2)
+end
+
+return P
Index: code/trunk/data/gui/scripts/InGameMenu.lua
===================================================================
--- code/trunk/data/gui/scripts/InGameMenu.lua	(revision 7648)
+++ code/trunk/data/gui/scripts/InGameMenu.lua	(revision 7689)
@@ -12,5 +12,4 @@
     orxonox.Game:getInstance():popState()
     orxonox.Game:getInstance():popState()
-    orxonox.Game:getInstance():requestState("mainmenu")
     hideMenuSheet("InGameMenu")
 end
Index: code/trunk/data/gui/scripts/MainMenu.lua
===================================================================
--- code/trunk/data/gui/scripts/MainMenu.lua	(revision 7648)
+++ code/trunk/data/gui/scripts/MainMenu.lua	(revision 7689)
@@ -3,4 +3,51 @@
 local P = createMenuSheet("MainMenu")
 P.loadAlong = { "SingleplayerMenu", "MultiplayerMenu", "SettingsMenu", "CreditsMenu" }
+
+P.buttonList = {}
+
+function P.onLoad()
+    --buttons are arranged in a 6x1 Matrix (list)
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/QuickGameTestButton"),
+            ["function"]  = P.QuickGameTestButton_clicked
+    }
+    table.insert(P.buttonList,item)
+
+    item = {
+            ["button"] = winMgr:getWindow("orxonox/SingleplayerButton"),
+            ["function"]  = P.SingleplayerButton_clicked
+    }
+    table.insert(P.buttonList,item)
+
+    item = {
+            ["button"] = winMgr:getWindow("orxonox/MultiplayerButton"),
+            ["function"]  = P.MultiplayerButton_clicked
+    }
+    table.insert(P.buttonList,item)
+
+    item = {
+            ["button"] = winMgr:getWindow("orxonox/SettingsButton"),
+            ["function"]  = P.SettingsButton_clicked
+    }
+    table.insert(P.buttonList,item)
+
+    item = {
+            ["button"] = winMgr:getWindow("orxonox/CreditsButton"),
+            ["function"]  = P.CreditsButton_clicked
+    }
+    table.insert(P.buttonList,item)
+
+    item = {
+            ["button"] = winMgr:getWindow("orxonox/ExitButton"),
+            ["function"]  = P.ExitButton_clicked
+    }
+    table.insert(P.buttonList,item) 
+end
+
+function P.onShow()
+    --indices to iterate through buttonlist
+    P.oldindex = -2
+    P.index = -1
+end
 
 -- events for MainMenu
@@ -30,4 +77,8 @@
 end
 
+function P.onKeyPressed() 
+    buttonIteratorHelper(P.buttonList, code, P, 6, 1)
+end
+
 return P
 
Index: code/trunk/data/gui/scripts/MenuSheet.lua
===================================================================
--- code/trunk/data/gui/scripts/MenuSheet.lua	(revision 7648)
+++ code/trunk/data/gui/scripts/MenuSheet.lua	(revision 7689)
@@ -16,5 +16,5 @@
     newSheet.bHidePrevious  = handleDefArg(_bHidePrevious,  true)
     newSheet.tShowCursor    = handleDefArg(_tShowCusor,     TriBool.True)
-    newSheet.tUseKeyboard   = handleDefArg(_tUseKeyboard,   TriBool.Dontcare)
+    newSheet.tUseKeyboard   = handleDefArg(_tUseKeyboard,   TriBool.True)
     newSheet.bBlockJoyStick = handleDefArg(_bBlockJoyStick, false)
 
Index: code/trunk/data/gui/scripts/MultiplayerMenu.lua
===================================================================
--- code/trunk/data/gui/scripts/MultiplayerMenu.lua	(revision 7648)
+++ code/trunk/data/gui/scripts/MultiplayerMenu.lua	(revision 7689)
@@ -3,87 +3,53 @@
 local P = createMenuSheet("MultiplayerMenu")
 
-P.levelList = {}
-P.itemList = {}
-P.showAll = false
+P.buttonList = {}
 
 function P.onLoad()
-    P.multiplayerMode = "startClient"
+    P.multiplayerMode = "startClient" 
+
+    --button are arranged in a 2x2 matrix, the left lower item is nil
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/MultiplayerJoinButton"),
+            ["function"]  = P.MultiplayerJoinButton2_clicked
+    }
+    P.buttonList[1] = item
+
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/MultiplayerHostButton"),
+            ["function"]  = P.MultiplayerHostButton2_clicked
+    }
+    P.buttonList[2] = item
+
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/MultiplayerBackButton"),
+            ["function"]  = P.MultiplayerBackButton_clicked
+    }
+    P.buttonList[4] = item
+
 end
 
 function P.onShow()
-    if P.multiplayerMode == "startClient" then
-        local window = winMgr:getWindow("orxonox/MultiplayerJoinButton")
-        local button = tolua.cast(window,"CEGUI::RadioButton")
-        button:setSelected(true)
-        local checkbox = winMgr:getWindow("orxonox/MultiplayerShowAllCheckbox")
-        checkbox:setProperty("Disabled", "True")
-        P.showServerList()
-    end
-    if P.multiplayerMode == "startServer" then
-        local window = winMgr:getWindow("orxonox/MultiplayerHostButton")
-        local button = tolua.cast(window,"CEGUI::RadioButton")
-        button:setSelected(true)
-        local checkbox = winMgr:getWindow("orxonox/MultiplayerShowAllCheckbox")
-        checkbox:setProperty("Disabled", "False")
-        P.showLevelList()
-    end
-    if P.multiplayerMode == "startDedicated" then
-        local window = winMgr:getWindow("orxonox/MultiplayerDedicatedButton")
-        local button = tolua.cast(window,"CEGUI::RadioButton")
-        button:setSelected(true)
-        local checkbox = winMgr:getWindow("orxonox/MultiplayerShowAllCheckbox")
-        checkbox:setProperty("Disabled", "True")
-        P.showLevelList()
-    end
-end
+    P.showServerList()
 
-function P.MultiplayerJoinButton_clicked(e)
-    P.multiplayerMode = "startClient"
-    local checkbox = winMgr:getWindow("orxonox/MultiplayerShowAllCheckbox")
-    checkbox:setProperty("Disabled", "True")
-    P.showServerList()
+    --indices to iterate through buttonlist
+    P.oldindex = -2
+    P.index = -1
 end
 
 function P.MultiplayerHostButton_clicked(e)
-    P.multiplayerMode = "startServer"
-    local checkbox = winMgr:getWindow("orxonox/MultiplayerShowAllCheckbox")
-    checkbox:setProperty("Disabled", "False")
-    P.showLevelList()
+    showMenuSheet("HostMenu", true)
 end
 
-function P.MultiplayerDedicatedButton_clicked(e)
-    P.multiplayerMode = "startDedicated"
-    local checkbox = winMgr:getWindow("orxonox/MultiplayerShowAllCheckbox")
-    checkbox:setProperty("Disabled", "True")
-    P.showLevelList()
-end
 
-function P.MultiplayerShowAll_clicked(e)
-    local checkbox = tolua.cast(winMgr:getWindow("orxonox/MultiplayerShowAllCheckbox"), "CEGUI::Checkbox")
-    local show = checkbox:isSelected()
-    if show ~= P.showAll then
-        P.showAll = show
-        P.createLevelList()
+function P.MultiplayerJoinButton_clicked(e)
+    local choice = winMgr:getWindow("orxonox/MultiplayerListbox"):getFirstSelectedItem()
+    if choice then
+        local client = orxonox.Client:getInstance()
+        local index = tolua.cast(choice, "CEGUI::ListboxItem"):getID()
+        client:setDestination( P.serverList[index][2], 55556 )
+    else
+        return
     end
-end
-
-function P.MultiplayerStartButton_clicked(e)
-    local choice = winMgr:getWindow("orxonox/MultiplayerListbox"):getFirstSelectedItem()
-    if P.multiplayerMode == "startClient" then
-        if choice then
-            local client = orxonox.Client:getInstance()
-            local index = tolua.cast(choice, "CEGUI::ListboxItem"):getID()
-            client:setDestination( P.serverList[index][2], 55556 )
-        else
-            return
-        end
-    else
-        if choice then
-            orxonox.LevelManager:getInstance():setDefaultLevel(choice:getText() .. ".oxw")
-        else
-            return
-        end
-    end
-    orxonox.execute(P.multiplayerMode)
+    orxonox.execute("startClient")
     hideAllMenuSheets()
 end
@@ -91,41 +57,4 @@
 function P.MultiplayerBackButton_clicked(e)
     hideMenuSheet(P.name)
-end
-
-function P.showLevelList()
-    P.createLevelList()
-end
-
-function P.createLevelList()
-    P.levelList = {}
-    P.itemList = {}
-    local listbox = CEGUI.toListbox(winMgr:getWindow("orxonox/MultiplayerListbox"))
-    listbox:resetList()
-    orxonox.GUIManager:setItemTooltipsEnabledHelper(listbox, true)
-    local preselect = orxonox.LevelManager:getInstance():getDefaultLevel()
-    local size = orxonox.LevelManager:getInstance():getNumberOfLevels()
-    local index = 0
-    local level = nil
-    while index < size do
-        level = orxonox.LevelManager:getInstance():getAvailableLevelListItem(index)
-        if level ~= nil then
-            if P.showAll or not level:hasTag("test") then
-                table.insert(P.levelList, level)
-            end
-        end
-        index = index + 1
-    end
-    --TODO: Reintroduce sorting, if needed. At the moment it's sorted by filename.
-    --table.sort(levelList)
-    for k,v in pairs(P.levelList) do
-        local item = CEGUI.createListboxTextItem(v:getName())
-        item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush")
-        listbox:addItem(item)
-        if v:getXMLFilename() == preselect then
-            listbox:setItemSelectState(item, true)
-        end
-        P.itemList[k] = listbox:getListboxItemFromIndex(k-1)
-        orxonox.GUIManager:setTooltipTextHelper(P.itemList[k], v:getDescription())
-    end
 end
 
@@ -161,4 +90,8 @@
 end
 
+function P.onKeyPressed() 
+    buttonIteratorHelper(P.buttonList, code, P, 2, 2)
+end
+
 return P
 
Index: code/trunk/data/gui/scripts/SettingsMenu.lua
===================================================================
--- code/trunk/data/gui/scripts/SettingsMenu.lua	(revision 7648)
+++ code/trunk/data/gui/scripts/SettingsMenu.lua	(revision 7689)
@@ -3,4 +3,48 @@
 local P = createMenuSheet("SettingsMenu")
 P.loadAlong = { "ControlsMenu", "AudioMenu", "GraphicsMenu" }
+
+P.buttonList = {}
+
+function P.onLoad()
+    --"Gameplay" and "Multiplayer Options" are not integrated in the list
+    --buttons are arranged in a 4x2 matrix. The lower-right element is not in the matrix!
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/SettingsMenu/GraphicsButton"),
+            ["function"]  = P.SettingsGraphicsButton_clicked
+    }
+    P.buttonList[2] = item
+
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/SettingsMenu/AudioButton"),
+            ["function"]  = P.SettingsAudioButton_clicked
+    }
+    P.buttonList[4] = item
+
+
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/SettingsMenu/ControlsButton"),
+            ["function"]  = P.SettingsControlsButton_clicked
+    }
+    P.buttonList[5] = item
+
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/SettingsMenu/MiscellaneousButton"),
+            ["function"]  = P.SettingsMiscellaneousButton_clicked
+    }
+    P.buttonList[6] = item
+
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/SettingsMenu/SettingsBackButton"),
+            ["function"]  = P.SettingsBackButton_clicked
+    }
+    P.buttonList[7] = item
+
+end
+
+function P.onShow()
+    --indices to iterate through buttonlist
+    P.oldindex = 3
+    P.index = 2
+end
 
 function P.SettingsGameplayButton_clicked(e)
@@ -32,4 +76,8 @@
 end
 
+function P.onKeyPressed() 
+    buttonIteratorHelper(P.buttonList, code, P, 4, 2)
+end
+
 return P
 
Index: code/trunk/data/gui/scripts/SheetManager.lua
===================================================================
--- code/trunk/data/gui/scripts/SheetManager.lua	(revision 7648)
+++ code/trunk/data/gui/scripts/SheetManager.lua	(revision 7689)
@@ -5,4 +5,7 @@
 local activeMenuSheets = {size = 0, topSheetTuple = nil}
 local menuSheetsRoot = guiMgr:getMenuRootWindow()
+local bInGameConsoleClosed = false
+local mainMenuLoaded = false
+orxonox.GUIManager:subscribeEventHelper(menuSheetsRoot, "KeyDown", "keyPressed")
 
 -----------------------
@@ -69,5 +72,5 @@
 
     -- Count the number of sheets that don't need input till the first that does.
-    local counter = noInputSheetCounter()
+    local counter = noInputSheetIndex()
     -- Pause game control if this is the first menu to be displayed
     -- HUGE HACK?
@@ -100,4 +103,9 @@
     menuSheetsRoot:addChildWindow(menuSheet.window)
 
+    -- If sheet is the MainMenu
+    if name == "MainMenu" then
+        mainMenuLoaded = true
+    end
+
     -- Handle input distribution
     if bNoInput == false then
@@ -118,6 +126,7 @@
         end
     end
-
+    
     menuSheet:show()
+    menuSheetsRoot:activate()
 
     return menuSheet
@@ -161,4 +170,9 @@
     activeMenuSheets.topSheetTuple = activeMenuSheets[activeMenuSheets.size]
 
+    -- If sheet is the MainMenu
+    if name == "MainMenu" then
+        mainMenuLoaded = false
+    end
+
     -- Leave the input state
     if not sheetTuple.bNoInput then
@@ -179,5 +193,5 @@
 
     -- Count the number of sheets that don't need input till the first that does.
-    local counter = noInputSheetCounter()
+    local counter = noInputSheetIndex()
     -- Resume control if the last (non-noInput) menu is hidden
     if counter == 0 then
@@ -199,9 +213,15 @@
     -- HUGE, very HUGE hacks!
 
-    -- Count the number of sheets that don't need input till the first that does.
-    local counter = noInputSheetCounter()
+    -- If the InGameConsole is active, ignore the ESC command.
+    if bInGameConsoleClosed == true then
+        bInGameConsoleClosed = false
+        return
+    end
+
+    -- Count the number of sheets that don't need input till the first that does.
+    local counter = noInputSheetIndex()
 
     -- If the first sheet that needs input is the MainMenu.
-    if counter == 1 and activeMenuSheets[1].sheet.name == "MainMenu" then
+    if noInputSheetCounter() == 1 and activeMenuSheets[counter].sheet.name == "MainMenu" then
         orxonox.execute("exit")
     -- If there is at least one sheet that needs input.
@@ -213,15 +233,45 @@
 end
 
+function keyPressed(e)
+    local we = tolua.cast(e, "CEGUI::KeyEventArgs")
+    local sheet = activeMenuSheets[activeMenuSheets.size]
+    code = tostring(we.scancode)
+    -- Some preprocessing
+    if not mainMenuLoaded and not sheet.bNoInput then
+        if code == "1" then
+            keyESC()
+        elseif code == "0"then
+            orxonox.CommandExecutor:execute("openConsole")
+        end
+    end
+    sheet.sheet:onKeyPressed()
+end
+
 function setBackgroundImage(imageSet, imageName)
     guiMgr:setBackgroundImage(imageSet, imageName)
 end
 
+function noInputSheetIndex()
+    -- Count the number of sheets that don't need input till the first that does.
+    local index = activeMenuSheets.size
+    while index > 0 and activeMenuSheets[index].bNoInput do
+        index = index - 1
+    end
+    return index
+end
+
 function noInputSheetCounter()
-    -- Count the number of sheets that don't need input till the first that does.
+    -- Count the number of sheets that do need input.
     local counter = activeMenuSheets.size
-    while counter > 0 and activeMenuSheets[counter].bNoInput do
-        counter = counter - 1
+    for i = 1,activeMenuSheets.size do
+        if activeMenuSheets[i].bNoInput then
+            counter = counter - 1
+        end
     end
     return counter
+end
+
+function inGameConsoleClosed()
+    bInGameConsoleClosed = not bInGameConsoleClosed;
 end
 
Index: code/trunk/data/gui/scripts/SingleplayerMenu.lua
===================================================================
--- code/trunk/data/gui/scripts/SingleplayerMenu.lua	(revision 7648)
+++ code/trunk/data/gui/scripts/SingleplayerMenu.lua	(revision 7689)
@@ -3,4 +3,5 @@
 local P = createMenuSheet("SingleplayerMenu")
 
+P.buttonList = {}
 P.levelList = {}
 P.itemList = {}
@@ -12,4 +13,17 @@
     button:setSelected(false)
     P.createLevelList()
+
+    --buttons are arranged in a 1x2 matrix
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/SingleplayerStartButton"),
+            ["function"]  = P.SingleplayerStartButton_clicked
+    }
+    P.buttonList[1] = item
+
+    local item = {
+            ["button"] = winMgr:getWindow("orxonox/SingleplayerBackButton"),
+            ["function"]  = P.SingleplayerBackButton_clicked
+    }
+    P.buttonList[2] = item
 end
 
@@ -47,4 +61,10 @@
 end
 
+function P.onShow()
+    --indices to iterate through buttonlist
+    P.oldindex = -2
+    P.index = -1
+end
+
 function P.SingleplayerStartButton_clicked(e)
     local listbox = CEGUI.toListbox(winMgr:getWindow("orxonox/SingleplayerLevelListbox"))
@@ -74,4 +94,8 @@
 end
 
+function P.onKeyPressed() 
+    buttonIteratorHelper(P.buttonList, code, P, 1, 2)
+end
+
 return P
 
