Index: code/trunk/src/core/Shell.cc
===================================================================
--- code/trunk/src/core/Shell.cc	(revision 1539)
+++ code/trunk/src/core/Shell.cc	(revision 1540)
@@ -36,6 +36,6 @@
 
 #define SHELL_UPDATE_LISTENERS(function) \
-    for (std::list<ShellListener*>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ++it) \
-        (*it)->function()
+    for (std::list<ShellListener*>::iterator it = this->listeners_.begin(); it != this->listeners_.end(); ) \
+        (*(it++))->function()
 
 namespace orxonox
Index: code/trunk/src/orxonox/console/InGameConsole.cc
===================================================================
--- code/trunk/src/orxonox/console/InGameConsole.cc	(revision 1539)
+++ code/trunk/src/orxonox/console/InGameConsole.cc	(revision 1540)
@@ -71,5 +71,5 @@
         RegisterObject(InGameConsole);
 
-        this->active_ = false;
+        this->bActive_ = false;
         this->cursor_ = 0.0;
         this->cursorSymbol_ = '|';
@@ -201,5 +201,4 @@
         // for the beginning, don't scroll
         this->scroll_ = 0;
-        this->scrollTimer_ = 0;
         this->cursor_ = 0;
 
@@ -307,78 +306,76 @@
     void InGameConsole::tick(float dt)
     {
-        this->scrollTimer_ += dt;
-        if (this->scrollTimer_ >= 0.01)
-        {
-            float top = this->consoleOverlayContainer_->getTop();
-            float timePassed = scrollTimer_;
-            this->scrollTimer_ = 0;
-            if (this->scroll_ != 0)
-            {
-                // scroll
-                top = top + timePassed * this->scroll_;
-                this->consoleOverlayContainer_->setTop(top);
-            }
-            if (top <= -1.2 * InGameConsole::REL_HEIGHT)
+        if (this->scroll_ != 0)
+        {
+            float top = this->consoleOverlayContainer_->getTop() + dt * this->scroll_;
+            this->consoleOverlayContainer_->setTop(top);
+
+            if (this->scroll_ < 0 && top <= -1.2 * InGameConsole::REL_HEIGHT)
             {
                 // window has completely scrolled up
                 this->scroll_ = 0;
                 this->consoleOverlay_->hide();
-                this->active_ = false;
-                Shell::getInstance().unregisterListener(this);
-            }
-            if (top >= 0)
+            }
+
+            if (this->scroll_ > 0 && top >= 0)
             {
                 // window has completely scrolled down
                 this->scroll_ = 0;
                 this->consoleOverlayContainer_->setTop(0);
-                this->active_ = true;
-            }
-        }
-
-        this->cursor_ += dt;
-        if (this->cursor_ >= InGameConsole::BLINK)
-        {
-            this->cursor_ = 0;
-            bShowCursor_ = !bShowCursor_;
-            if (bShowCursor_)
-              this->consoleOverlayCursor_->show();
-            else
-              this->consoleOverlayCursor_->hide();
-        }
-
-        /*if (this->cursor_ >= 2 * InGameConsole::BLINK)
-          this->cursor_ = 0;
-
-        if (this->cursor_ >= InGameConsole::BLINK && this->cursorSymbol_ == '|')
-        {
-            this->cursorSymbol_ = ' ';
+            }
+        }
+
+        if (this->bActive_)
+        {
+            this->cursor_ += dt;
+            if (this->cursor_ >= InGameConsole::BLINK)
+            {
+                this->cursor_ = 0;
+                bShowCursor_ = !bShowCursor_;
+                if (bShowCursor_)
+                  this->consoleOverlayCursor_->show();
+                else
+                  this->consoleOverlayCursor_->hide();
+            }
+
+            /*if (this->cursor_ >= 2 * InGameConsole::BLINK)
+              this->cursor_ = 0;
+
+            if (this->cursor_ >= InGameConsole::BLINK && this->cursorSymbol_ == '|')
+            {
+                this->cursorSymbol_ = ' ';
+                this->cursorChanged();
+            }
+            else if (this->cursor_ < InGameConsole::BLINK && this->cursorSymbol_ == ' ')
+            {
+                this->cursorSymbol_ = '|';
+                this->cursorChanged();
+            }*/
+
+            // this creates a flickering effect
+            this->consoleOverlayNoise_->setTiling(1, rand() % 5 + 1);
+        }
+    }
+
+    /**
+        @brief Shows the InGameConsole.
+    */
+    void InGameConsole::activate()
+    {
+        if (!this->bActive_)
+        {
+            this->bActive_ = true;
+            InputManager::setInputState(InputManager::IS_CONSOLE);
+            Shell::getInstance().registerListener(this);
+
+            this->resize();
+            this->linesChanged();
             this->cursorChanged();
-        }
-        else if (this->cursor_ < InGameConsole::BLINK && this->cursorSymbol_ == ' ')
-        {
-            this->cursorSymbol_ = '|';
-            this->cursorChanged();
-        }*/
-
-        // this creates a flickering effect
-        this->consoleOverlayNoise_->setTiling(1, rand() % 5 + 1);
-    }
-
-    /**
-        @brief Shows the InGameConsole.
-    */
-    void InGameConsole::activate()
-    {
-        InputManager::setInputState(InputManager::IS_CONSOLE);
-        Shell::getInstance().registerListener(this);
-        this->linesChanged();
-        this->cursorChanged();
-
-        this->consoleOverlay_->show();
-        // just in case window size has changed...
-        this->resize();
-        // scroll down
-        this->scroll_ = 1;
-        // the rest is done by tick
+            this->consoleOverlay_->show();
+
+            // scroll down
+            this->scroll_ = 1;
+            // the rest is done by tick
+        }
     }
 
@@ -388,8 +385,14 @@
     void InGameConsole::deactivate()
     {
-        // scroll up
-        this->scroll_ = -1;
-        // the rest is done by tick
-        InputManager::setInputState(InputManager::IS_NORMAL);
+        if (this->bActive_)
+        {
+            this->bActive_ = false;
+            InputManager::setInputState(InputManager::IS_NORMAL);
+            Shell::getInstance().unregisterListener(this);
+
+            // scroll up
+            this->scroll_ = -1;
+            // the rest is done by tick
+        }
     }
 
Index: code/trunk/src/orxonox/console/InGameConsole.h
===================================================================
--- code/trunk/src/orxonox/console/InGameConsole.h	(revision 1539)
+++ code/trunk/src/orxonox/console/InGameConsole.h	(revision 1540)
@@ -50,8 +50,5 @@
             void tick(float dt);
 
-            void activate();
-            void deactivate();
             void resize();
-
             static void openConsole();
             static void closeConsole();
@@ -61,4 +58,7 @@
             InGameConsole(const InGameConsole& other);
             ~InGameConsole();
+
+            void activate();
+            void deactivate();
 
             virtual void linesChanged();
@@ -80,4 +80,5 @@
             static float BLINK;
 
+            bool bActive_;
             int windowW_;
             int windowH_;
@@ -86,9 +87,7 @@
             unsigned int numLinesShifted_;
             int scroll_;
-            float scrollTimer_;
             float cursor_;
             unsigned int inputWindowStart_;
             char cursorSymbol_;
-            bool active_;
             bool bShowCursor_;
             std::string displayedText_;
