Index: code/branches/console/src/libraries/core/Shell.cc
===================================================================
--- code/branches/console/src/libraries/core/Shell.cc	(revision 5968)
+++ code/branches/console/src/libraries/core/Shell.cc	(revision 5969)
@@ -35,8 +35,4 @@
 #include "Core.h"
 #include "ConsoleCommand.h"
-
-#define SHELL_UPDATE_LISTENERS(function) \
-    for (std::list<ShellListener*>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ) \
-        (*(it++))->function()
 
 namespace orxonox
@@ -153,5 +149,5 @@
     void Shell::registerListener(ShellListener* listener)
     {
-        this->listeners_.insert(this->listeners_.end(), listener);
+        this->listeners_.push_back(listener);
     }
 
@@ -161,5 +157,5 @@
         {
             if ((*it) == listener)
-                this->listeners_.erase(it++);
+                it = this->listeners_.erase(it);
             else
                 ++it;
@@ -170,5 +166,5 @@
     {
         this->inputBuffer_->setCursorPosition(cursor);
-        SHELL_UPDATE_LISTENERS(cursorChanged);
+        this->updateListeners<&ShellListener::cursorChanged>();
     }
 
@@ -199,5 +195,5 @@
         this->finishedLastLine_ = true;
 
-        SHELL_UPDATE_LISTENERS(linesChanged);
+        this->updateListeners<&ShellListener::linesChanged>();
     }
 
@@ -258,5 +254,5 @@
                 if (!this->scrollPosition_)
                 {
-                    SHELL_UPDATE_LISTENERS(lineAdded);
+                    this->updateListeners<&ShellListener::lineAdded>();
                 }
             }
@@ -265,5 +261,5 @@
                 (*this->lines_.begin()) += output;
                 this->finishedLastLine_ = newline;
-                SHELL_UPDATE_LISTENERS(onlyLastLineChanged);
+                this->updateListeners<&ShellListener::onlyLastLineChanged>();
             }
 
@@ -273,6 +269,6 @@
     void Shell::inputChanged()
     {
-        SHELL_UPDATE_LISTENERS(inputChanged);
-        SHELL_UPDATE_LISTENERS(cursorChanged);
+        this->updateListeners<&ShellListener::inputChanged>();
+        this->updateListeners<&ShellListener::cursorChanged>();
     }
 
@@ -299,6 +295,6 @@
     {
         this->inputBuffer_->removeBehindCursor();
-        SHELL_UPDATE_LISTENERS(inputChanged);
-        SHELL_UPDATE_LISTENERS(cursorChanged);
+        this->updateListeners<&ShellListener::inputChanged>();
+        this->updateListeners<&ShellListener::cursorChanged>();
     }
 
@@ -306,5 +302,5 @@
     {
         this->inputBuffer_->removeAtCursor();
-        SHELL_UPDATE_LISTENERS(inputChanged);
+        this->updateListeners<&ShellListener::inputChanged>();
     }
 
@@ -313,6 +309,6 @@
         this->inputBuffer_->clear();
         this->historyPosition_ = 0;
-        SHELL_UPDATE_LISTENERS(inputChanged);
-        SHELL_UPDATE_LISTENERS(cursorChanged);
+        this->updateListeners<&ShellListener::inputChanged>();
+        this->updateListeners<&ShellListener::cursorChanged>();
     }
 
@@ -320,5 +316,5 @@
     {
         this->inputBuffer_->increaseCursor();
-        SHELL_UPDATE_LISTENERS(cursorChanged);
+        this->updateListeners<&ShellListener::cursorChanged>();
     }
 
@@ -326,5 +322,5 @@
     {
         this->inputBuffer_->decreaseCursor();
-        SHELL_UPDATE_LISTENERS(cursorChanged);
+        this->updateListeners<&ShellListener::cursorChanged>();
     }
 
@@ -332,5 +328,5 @@
     {
         this->inputBuffer_->setCursorToEnd();
-        SHELL_UPDATE_LISTENERS(cursorChanged);
+        this->updateListeners<&ShellListener::cursorChanged>();
     }
 
@@ -338,5 +334,5 @@
     {
         this->inputBuffer_->setCursorToBegin();
-        SHELL_UPDATE_LISTENERS(cursorChanged);
+        this->updateListeners<&ShellListener::cursorChanged>();
     }
 
@@ -366,5 +362,5 @@
             ++this->scrollPosition_;
 
-            SHELL_UPDATE_LISTENERS(linesChanged);
+            this->updateListeners<&ShellListener::linesChanged>();
         }
     }
@@ -377,5 +373,5 @@
             --this->scrollPosition_;
 
-            SHELL_UPDATE_LISTENERS(linesChanged);
+            this->updateListeners<&ShellListener::linesChanged>();
         }
     }
@@ -393,5 +389,5 @@
         this->scrollIterator_ = this->lines_.begin();
 
-        SHELL_UPDATE_LISTENERS(exit);
+        this->updateListeners<&ShellListener::exit>();
     }
 }
Index: code/branches/console/src/libraries/core/Shell.h
===================================================================
--- code/branches/console/src/libraries/core/Shell.h	(revision 5968)
+++ code/branches/console/src/libraries/core/Shell.h	(revision 5969)
@@ -132,4 +132,11 @@
             void exit();
 
+            template <void (ShellListener::*F)()>
+            void updateListeners()
+            {
+                for (std::list<ShellListener*>::const_iterator it = this->listeners_.begin(); it != this->listeners_.end(); )
+                    ((*(it++))->*F)();
+            }
+
             std::list<ShellListener*> listeners_;
             InputBuffer* inputBuffer_;
Index: code/branches/console/src/orxonox/overlays/InGameConsole.cc
===================================================================
--- code/branches/console/src/orxonox/overlays/InGameConsole.cc	(revision 5968)
+++ code/branches/console/src/orxonox/overlays/InGameConsole.cc	(revision 5969)
@@ -68,5 +68,6 @@
     */
     InGameConsole::InGameConsole()
-        : consoleOverlay_(0)
+        : shell_(Shell::getInstance())
+        , consoleOverlay_(0)
         , consoleOverlayContainer_(0)
         , consoleOverlayNoise_(0)
@@ -174,5 +175,5 @@
         // create the corresponding input state
         inputState_ = InputManager::getInstance().createInputState("console", false, false, InputStatePriority::Console);
-        inputState_->setKeyHandler(Shell::getInstance().getInputBuffer());
+        inputState_->setKeyHandler(this->shell_.getInputBuffer());
         bHidesAllInputChanged();
 
@@ -252,5 +253,5 @@
         this->consoleOverlayContainer_->setTop(-1.2 * this->relativeHeight);
 
-        Shell::getInstance().addOutputLevel(true);
+        this->shell_.addOutputLevel(true);
 
         COUT(4) << "Info: InGameConsole initialized" << std::endl;
@@ -266,9 +267,9 @@
     void InGameConsole::linesChanged()
     {
-        std::list<std::string>::const_iterator it = Shell::getInstance().getNewestLineIterator();
+        std::list<std::string>::const_iterator it = this->shell_.getNewestLineIterator();
         int max = 0;
         for (int i = 1; i < LINES; ++i)
         {
-            if (it != Shell::getInstance().getEndIterator())
+            if (it != this->shell_.getEndIterator())
             {
                 ++it;
@@ -295,5 +296,5 @@
     {
         if (LINES > 1)
-            this->print(*Shell::getInstance().getNewestLineIterator(), 1);
+            this->print(*this->shell_.getNewestLineIterator(), 1);
     }
 
@@ -314,7 +315,7 @@
     {
         if (LINES > 0)
-            this->print(Shell::getInstance().getInput(), 0);
-
-        if (Shell::getInstance().getInput() == "" || Shell::getInstance().getInput().size() == 0)
+            this->print(this->shell_.getInput(), 0);
+
+        if (this->shell_.getInput() == "" || this->shell_.getInput().size() == 0)
             this->inputWindowStart_ = 0;
     }
@@ -325,5 +326,5 @@
     void InGameConsole::cursorChanged()
     {
-        unsigned int pos = Shell::getInstance().getCursorPosition() - inputWindowStart_;
+        unsigned int pos = this->shell_.getCursorPosition() - inputWindowStart_;
         if (pos > maxCharsPerLine_)
             pos = maxCharsPerLine_;
@@ -482,8 +483,8 @@
                 if (output.size() > this->maxCharsPerLine_)
                 {
-                    if (Shell::getInstance().getInputBuffer()->getCursorPosition() < this->inputWindowStart_)
-                        this->inputWindowStart_ = Shell::getInstance().getInputBuffer()->getCursorPosition();
-                    else if (Shell::getInstance().getInputBuffer()->getCursorPosition() >= (this->inputWindowStart_ + this->maxCharsPerLine_ - 1))
-                        this->inputWindowStart_ = Shell::getInstance().getInputBuffer()->getCursorPosition() - this->maxCharsPerLine_ + 1;
+                    if (this->shell_.getInputBuffer()->getCursorPosition() < this->inputWindowStart_)
+                        this->inputWindowStart_ = this->shell_.getInputBuffer()->getCursorPosition();
+                    else if (this->shell_.getInputBuffer()->getCursorPosition() >= (this->inputWindowStart_ + this->maxCharsPerLine_ - 1))
+                        this->inputWindowStart_ = this->shell_.getInputBuffer()->getCursorPosition() - this->maxCharsPerLine_ + 1;
 
                     output = output.substr(this->inputWindowStart_, this->maxCharsPerLine_);
@@ -506,5 +507,5 @@
             this->bActive_ = true;
             InputManager::getInstance().enterState("console");
-            Shell::getInstance().registerListener(this);
+            this->shell_.registerListener(this);
 
             this->windowResized(this->windowW_, this->windowH_);
@@ -528,5 +529,5 @@
             this->bActive_ = false;
             InputManager::getInstance().leaveState("console");
-            Shell::getInstance().unregisterListener(this);
+            this->shell_.unregisterListener(this);
 
             // scroll up
Index: code/branches/console/src/orxonox/overlays/InGameConsole.h
===================================================================
--- code/branches/console/src/orxonox/overlays/InGameConsole.h	(revision 5968)
+++ code/branches/console/src/orxonox/overlays/InGameConsole.h	(revision 5969)
@@ -81,4 +81,5 @@
 
     private: // variables
+        Shell& shell_;
         bool bActive_;
         int windowW_;
