Index: code/trunk/src/orxonox/objects/quest/QuestManager.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestManager.cc	(revision 2992)
+++ code/trunk/src/orxonox/objects/quest/QuestManager.cc	(revision 2993)
@@ -38,8 +38,8 @@
 #include "core/ConsoleCommand.h"
 #include "core/input/InputManager.h"
-#include "util/Convert.h"
 
 #include "util/Exception.h"
 #include "gui/GUIManager.h"
+#include "objects/infos/PlayerInfo.h"
 #include "Quest.h"
 #include "QuestHint.h"
@@ -49,7 +49,4 @@
     //! Pointer to the current (and single) instance of this class.
     /*static*/ QuestManager* QuestManager::singletonRef_s = NULL;
-    /*static*/ bool QuestManager::GUIOpen = false;
-
-    SetConsoleCommand(QuestManager, toggleQuestGUI, true);
 
     /**
@@ -220,4 +217,10 @@
     }
 
+    /**
+    @brief
+        
+    @param name
+    @return
+    */
     QuestContainer* QuestManager::getQuestTree(std::string & name)
     {
@@ -227,26 +230,24 @@
         if(gui == NULL)
         {
-            COUT(1) << "Something BAD happened." << std::endl;
+            COUT(1) << "Error: No GUIOverlay with the given name '" << name << "' present." << std::endl;
             return NULL;
         }
-        COUT(1) << player << std::endl;
-        ConverterExplicit<BaseObject, PlayerInfo>::convert(player, *(gui->getOwner()));
+        BaseObject* obj = gui->getOwner();
+        if(obj == NULL)
+        {
+            COUT(1) << "Error: GUIOverlay has no owner. " << std::endl;
+            return NULL;
+        }
+        player = dynamic_cast<PlayerInfo*>(obj);
     
         QuestContainer* root = NULL;
         QuestContainer* current = NULL;
         
-        std::list<Quest*>* pRootQuests = new std::list<Quest*>();
-        std::list<Quest*> rootQuests = *pRootQuests;
-        getRootQuests(player, rootQuests);
-        
-        for(std::list<Quest*>::iterator it = rootQuests.begin(); it != rootQuests.end(); it++)
-        {
-            Quest* quest = *it;
-            
-            QuestContainer* container = new QuestContainer;
-
-            container->description = quest->getDescription();
-            addHints(container, quest, player);
-            addSubQuests(container, quest, player);
+        std::list<Quest*>* rootQuests = new std::list<Quest*>();
+        getRootQuests(player, *rootQuests);
+        
+        for(std::list<Quest*>::iterator it = rootQuests->begin(); it != rootQuests->end(); it++)
+        {
+            QuestContainer* container = addSubQuest(*it, player);
 
             if(root == NULL)
@@ -265,9 +266,16 @@
             current->next = NULL;
 
-        delete pRootQuests;
+        delete rootQuests;
 
         return root;
     }
 
+    /**
+    @brief
+        
+    @param player
+    @param list
+    @return
+    */
     void QuestManager::getRootQuests(const PlayerInfo* player, std::list<Quest*> & list)
     {
@@ -282,10 +290,41 @@
     }
 
-    void QuestManager::addSubQuests(QuestContainer* container, Quest* quest, const PlayerInfo* player)
-    {
+    /**
+    @brief
+        
+    @param quest
+    @param player
+    @return
+    */
+    QuestContainer* QuestManager::addSubQuest(Quest* quest, const PlayerInfo* player)
+    {
+        if(quest == NULL)
+            return NULL;
+
+        QuestContainer* container = new QuestContainer;
+        container->description = quest->getDescription();
+        container->hint = addHints(quest, player);
+
+        if(quest->isActive(player))
+        {
+            container->status = "active";
+        }
+        else if(quest->isCompleted(player))
+        {
+            container->status = "completed";
+        }
+        else if(quest->isFailed(player))
+        {
+            container->status = "failed";
+        }
+        else
+        {
+            container->status = "";
+            COUT(1) << "An error occured. A Quest of un-specified status wanted to be displayed." << std::endl;
+        }
+        
+        std::list<Quest*> quests = quest->getSubQuestList();
         QuestContainer* current = NULL;
         QuestContainer* first = NULL;
-
-        std::list<Quest*> quests = quest->getSubQuestList();
         for(std::list<Quest*>::iterator it = quests.begin(); it != quests.end(); it++)
         {
@@ -293,30 +332,33 @@
             if(!subQuest->isInactive(player))
             {
-                QuestContainer* subQuestContainer = new QuestContainer;
-
-                subQuestContainer->description = subQuest->getDescription();
-                addHints(subQuestContainer, subQuest, player);
-                addSubQuests(subQuestContainer, subQuest, player);
+                QuestContainer* subContainer = addSubQuest(subQuest, player);
 
                 if(first == NULL)
                 {
-                    first = subQuestContainer;
+                    first = subContainer;
                 }
                 else
                 {
-                    current->next = subQuestContainer;
+                    current->next = subContainer;
                 }
                 
-                current = subQuestContainer;
-            }
-        }
-
+                current = subContainer;
+            }
+        }
         if(current != NULL)
             current->next = NULL;
         container->subQuests = first;
         
-    }
-
-    void QuestManager::addHints(QuestContainer* container, Quest* quest, const PlayerInfo* player)
+        return container;
+    }
+
+    /**
+    @brief
+        
+    @param quest
+    @param player
+    @return
+    */
+    HintContainer* QuestManager::addHints(Quest* quest, const PlayerInfo* player)
     {
         HintContainer* current = NULL;
@@ -346,24 +388,5 @@
         if(current != NULL)
             current->next = NULL;
-        container->hint = first;
-    }
-
-    /*static*/ void QuestManager::toggleQuestGUI(void)
-    {
-        if (!QuestManager::GUIOpen)
-        {
-            GUIManager::getInstancePtr()->showGUI("QuestGUI");
-            GUIManager::getInstancePtr()->executeCode("showCursor()");
-            InputManager::getInstance().requestEnterState("guiMouseOnly");
-            GUIManager::getInstancePtr()->executeCode("loadQuestsList()");
-            GUIOpen = true;
-        }
-        else
-        {
-            GUIManager::getInstancePtr()->executeCode("hideGUI(\"QuestGUI\")");
-            GUIManager::getInstancePtr()->executeCode("hideCursor()");
-            InputManager::getInstance().requestLeaveState("guiMouseOnly");
-            GUIOpen = false;
-        }
+        return first;
     }
 
Index: code/trunk/src/orxonox/objects/quest/QuestManager.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestManager.h	(revision 2992)
+++ code/trunk/src/orxonox/objects/quest/QuestManager.h	(revision 2993)
@@ -55,4 +55,5 @@
     {
         const QuestDescription* description;
+        std::string status;
         HintContainer* hint;
         QuestContainer* subQuests;
@@ -93,9 +94,6 @@
             QuestContainer* getQuestTree(std::string & name); // tolua_export
 
-            static void toggleQuestGUI(void); //!< Opens the GUI.
-
         private:
             static QuestManager* singletonRef_s;
-            static bool GUIOpen;
 
             std::map<std::string, Quest*> questMap_; //!< All Quests registered by their id's.
@@ -103,6 +101,6 @@
 
             void getRootQuests(const PlayerInfo* player, std::list<Quest*> & list);
-            void addHints(QuestContainer* container, Quest* quest, const PlayerInfo* player);
-            void addSubQuests(QuestContainer* container, Quest* quest, const PlayerInfo* player);
+            HintContainer* addHints(Quest* quest, const PlayerInfo* player);
+            QuestContainer* addSubQuest(Quest* quest, const PlayerInfo* player);
 
     }; // tolua_export
Index: code/trunk/src/orxonox/overlays/OrxonoxOverlay.cc
===================================================================
--- code/trunk/src/orxonox/overlays/OrxonoxOverlay.cc	(revision 2992)
+++ code/trunk/src/orxonox/overlays/OrxonoxOverlay.cc	(revision 2993)
@@ -57,4 +57,5 @@
     SetConsoleCommand(OrxonoxOverlay, scaleOverlay, false).accessLevel(AccessLevel::User);
     SetConsoleCommand(OrxonoxOverlay, scrollOverlay, false).accessLevel(AccessLevel::User);
+    SetConsoleCommand(OrxonoxOverlay, toggleVisibility, false).accessLevel(AccessLevel::User);
     SetConsoleCommand(OrxonoxOverlay, rotateOverlay, false).accessLevel(AccessLevel::User);
 
@@ -311,4 +312,24 @@
     /**
     @brief
+        Toggles the visibility of an Overlay by it's name.
+    @param name
+        The name of the overlay defined BaseObject::setName() (usually done with the "name"
+        attribute in the xml file).
+    */
+    /*static*/ void OrxonoxOverlay::toggleVisibility(const std::string& name)
+    {
+        std::map<std::string, OrxonoxOverlay*>::const_iterator it = overlays_s.find(name);
+        if (it != overlays_s.end())
+        {
+            OrxonoxOverlay* overlay= (*it).second;
+            if(overlay->isVisible())
+                overlay->hide();
+            else
+                overlay->show();
+        }
+    }
+
+    /**
+    @brief
         Scrolls an overlay by its name.
     @param name
Index: code/trunk/src/orxonox/overlays/OrxonoxOverlay.h
===================================================================
--- code/trunk/src/orxonox/overlays/OrxonoxOverlay.h	(revision 2992)
+++ code/trunk/src/orxonox/overlays/OrxonoxOverlay.h	(revision 2993)
@@ -149,4 +149,5 @@
         //! ConsoleCommand: Accesses the overlay by its name and scrolls it.
         static void scrollOverlay(const std::string& name, const Vector2& scroll);
+        static void toggleVisibility(const std::string& name);
         //! ConsoleCommand: Accesses the overlay by its name and rotates it.
         static void rotateOverlay(const std::string& name, const Degree& angle);
