Index: code/trunk/src/orxonox/objects/quest/AddQuest.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/AddQuest.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/AddQuest.cc	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file AddQuest.cc
-    @brief
-    Implementation of the AddQuest class.
+    @file
+    @brief Implementation of the AddQuest class.
 */
 
@@ -45,6 +44,6 @@
 #include "Quest.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     CreateFactory(AddQuest);
 
@@ -109,5 +108,5 @@
         }
 
-        COUT(3) << "Quest {" << this->getQuestId() << "} successfully added to player." << std::endl;
+        COUT(3) << "Quest {" << this->getQuestId() << "} successfully added to player: " << player << " ." << std::endl;
         return true;
     }
Index: code/trunk/src/orxonox/objects/quest/AddQuest.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/AddQuest.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/AddQuest.h	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file AddQuest.h
-    @brief
-    Definition of the AddQuest class.
+    @file
+    @brief Definition of the AddQuest class.
 */
 
@@ -43,6 +42,6 @@
 #include "ChangeQuestStatus.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
@@ -58,10 +57,10 @@
     {
         public:
-            AddQuest(BaseObject* creator);
-            virtual ~AddQuest();
-
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a AddQuest object through XML.
-
-            virtual bool invoke(PlayerInfo* player); //!< Invokes the QuestEffect.
+        AddQuest(BaseObject* creator);
+        virtual ~AddQuest();
+    
+        virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a AddQuest object through XML.
+    
+        virtual bool invoke(PlayerInfo* player); //!< Invokes the QuestEffect.
 
     };
Index: code/trunk/src/orxonox/objects/quest/AddQuestHint.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/AddQuestHint.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/AddQuestHint.cc	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file AddQuestHint.cc
-    @brief
-    Implementation of the AddQuestHint class.
+    @file
+    @brief Implementation of the AddQuestHint class.
 */
 
@@ -44,6 +43,6 @@
 #include "QuestHint.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     CreateFactory(AddQuestHint);
 
@@ -130,5 +129,5 @@
         }
 
-        COUT(3) << "QuestHint {" << this->getHintId() << "} successfully added to player." << std::endl;
+        COUT(3) << "QuestHint {" << this->getHintId() << "} successfully added to player: " << player << " ." << std::endl;
         return true;
 
Index: code/trunk/src/orxonox/objects/quest/AddQuestHint.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/AddQuestHint.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/AddQuestHint.h	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file AddQuestHint.h
-    @brief
-    Definition of the AddQuestHint class.
+    @file
+    @brief Definition of the AddQuestHint class.
 */
 
@@ -42,6 +41,6 @@
 #include "QuestEffect.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
@@ -73,4 +72,5 @@
             inline const std::string & getHintId(void) const
                 { return this->hintId_; }
+            
             bool setHintId(const std::string & id); //!< Sets the id of the QuestHint.
 
Index: code/trunk/src/orxonox/objects/quest/AddReward.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/AddReward.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/AddReward.cc	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file AddReward.cc
-    @brief
-    Implementation of the AddReward class.
+    @file
+    @brief Implementation of the AddReward class.
 */
 
@@ -41,6 +40,6 @@
 #include "Rewardable.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     CreateFactory(AddReward);
 
@@ -106,4 +105,6 @@
     bool AddReward::invoke(PlayerInfo* player)
     {
+        COUT(3) << "AddReward on player: " << player << " ." << std::endl;
+        
         bool check = true;
         for ( std::list<Rewardable*>::iterator reward = this->rewards_.begin(); reward != this->rewards_.end(); ++reward )
@@ -111,4 +112,6 @@
             check = check && (*reward)->reward(player);
         }
+        
+        COUT(3) << "Rewardable successfully added to player." << player << " ." << std::endl;
 
         return check;
Index: code/trunk/src/orxonox/objects/quest/AddReward.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/AddReward.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/AddReward.h	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file AddReward.h
-    @brief
-    Definition of the AddReward class.
+    @file
+    @brief Definition of the AddReward class.
 */
 
@@ -43,6 +42,6 @@
 #include "QuestEffect.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
@@ -78,4 +77,5 @@
             inline void addRewardable(Rewardable* reward)
                 { this->rewards_.push_back(reward); }
+        
             const Rewardable* getRewardables(unsigned int index) const; //!< Returns the Rewardable object at the given index.
 
Index: code/trunk/src/orxonox/objects/quest/CMakeLists.txt
===================================================================
--- code/trunk/src/orxonox/objects/quest/CMakeLists.txt	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/CMakeLists.txt	(revision 2662)
@@ -14,4 +14,5 @@
   QuestHint.cc
   QuestItem.cc
+  QuestListener.cc
   QuestManager.cc
   Rewardable.cc
Index: code/trunk/src/orxonox/objects/quest/ChangeQuestStatus.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/ChangeQuestStatus.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/ChangeQuestStatus.cc	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file ChangeQuestStatus.cc
-    @brief
-    Implementation of the ChangeQuestStatus class.
+    @file
+    @brief Implementation of the ChangeQuestStatus class.
 */
 
@@ -40,6 +39,6 @@
 #include "QuestItem.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
Index: code/trunk/src/orxonox/objects/quest/ChangeQuestStatus.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/ChangeQuestStatus.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/ChangeQuestStatus.h	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file ChangeQuestStatus.h
-    @brief
-    Definition of the ChangeQuestStatus class.
+    @file
+    @brief Definition of the ChangeQuestStatus class.
 */
 
@@ -43,6 +42,6 @@
 #include "QuestEffect.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
@@ -63,6 +62,6 @@
         protected:
             /**
-                @brief Returns the id of the Quest.
-                @return Returns the id of the Quest.
+            @brief Returns the id of the Quest.
+            @return Returns the id of the Quest.
             */
             inline const std::string & getQuestId(void) const
Index: code/trunk/src/orxonox/objects/quest/CompleteQuest.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/CompleteQuest.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/CompleteQuest.cc	(revision 2662)
@@ -28,7 +28,6 @@
  
 /**
-    @file CompleteQuest.cc
-    @brief
-    Implementation of the CompleteQuest class.
+    @file
+    @brief Implementation of the CompleteQuest class.
 */
 
@@ -43,6 +42,6 @@
 #include "Quest.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     CreateFactory(CompleteQuest);
 
Index: code/trunk/src/orxonox/objects/quest/CompleteQuest.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/CompleteQuest.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/CompleteQuest.h	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file CompleteQuest.h
-    @brief
-    Definition of the CompleteQuest class.
+    @file
+    @brief Definition of the CompleteQuest class.
 */
 
@@ -43,6 +42,6 @@
 #include "ChangeQuestStatus.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
Index: code/trunk/src/orxonox/objects/quest/FailQuest.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/FailQuest.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/FailQuest.cc	(revision 2662)
@@ -28,7 +28,6 @@
  
 /**
-    @file FailQuest.cc
-    @brief
-    Implementation of the FailQuest class.
+    @file
+    @brief Implementation of the FailQuest class.
 */
 
@@ -43,6 +42,6 @@
 #include "Quest.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     CreateFactory(FailQuest);
 
Index: code/trunk/src/orxonox/objects/quest/FailQuest.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/FailQuest.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/FailQuest.h	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file FailQuest.h
-    @brief
-    Definition of the FailQuest class.
+    @file
+    @brief Definition of the FailQuest class.
 */
 
@@ -43,6 +42,6 @@
 #include "ChangeQuestStatus.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
Index: code/trunk/src/orxonox/objects/quest/GlobalQuest.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/GlobalQuest.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/GlobalQuest.cc	(revision 2662)
@@ -28,7 +28,6 @@
  
 /**
-    @file GlobalQuest.cc
-    @brief
-    Implementation of the GlobalQuest class.
+    @file
+    @brief Implementation of the GlobalQuest class.
 */
 
@@ -38,10 +37,11 @@
 #include "orxonox/objects/infos/PlayerInfo.h"
 #include "core/CoreIncludes.h"
+#include "core/Super.h"
 #include "util/Exception.h"
 
 #include "QuestEffect.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     CreateFactory(GlobalQuest);
 
@@ -88,19 +88,19 @@
     bool GlobalQuest::fail(PlayerInfo* player)
     {
-        if(this->isFailable(player)) //!< Check whether the Quest can be failed.
-        {
-            this->setStatus(player, questStatus::failed);
-            
-            //! Iterate through all players possessing this Quest.
-            for(std::set<PlayerInfo*>::const_iterator it = players_.begin(); it != players_.end(); it++)
-            {
-                QuestEffect::invokeEffects(*it, this->getFailEffectList());
-            }
-
-            return true;
-        }
-        
-        COUT(4) << "A non-completable quest was trying to be failed." << std::endl;
-        return false;
+        if(!this->isFailable(player)) //!< Check whether the Quest can be failed.
+        {
+            COUT(4) << "A non-completable quest was trying to be failed." << std::endl;
+            return false;
+        }
+        
+        Quest::fail(player);
+    
+    //! Iterate through all players possessing this Quest.
+    for(std::set<PlayerInfo*>::const_iterator it = players_.begin(); it != players_.end(); it++)
+    {
+        QuestEffect::invokeEffects(*it, this->getFailEffectList());
+    }
+
+    return true;
     }
 
@@ -117,20 +117,20 @@
     bool GlobalQuest::complete(PlayerInfo* player)
     {
-        if(this->isCompletable(player)) //!< Check whether the Quest can be completed.
-        {
-            this->setStatus(player, questStatus::completed);
-            
-            //! Iterate through all players possessing the Quest.
-            for(std::set<PlayerInfo*>::const_iterator it = players_.begin(); it != players_.end(); it++)
-            {
-                QuestEffect::invokeEffects(*it, this->getCompleteEffectList());
-            }
-            
-            QuestEffect::invokeEffects(player, this->rewards_); //!< Invoke reward QuestEffects on the player completing the Quest.
-            return true;
-        }
-        
-        COUT(4) << "A non-completable quest was trying to be completed." << std::endl;
-        return false;
+        if(!this->isCompletable(player)) //!< Check whether the Quest can be completed.
+        {
+            COUT(4) << "A non-completable quest was trying to be completed." << std::endl;
+            return false;
+        }
+        
+        //! Iterate through all players possessing the Quest.
+        for(std::set<PlayerInfo*>::const_iterator it = players_.begin(); it != players_.end(); it++)
+        {
+            QuestEffect::invokeEffects(*it, this->getCompleteEffectList());
+        }
+    
+        Quest::complete(player);
+    
+        QuestEffect::invokeEffects(player, this->rewards_); //!< Invoke reward QuestEffects on the player completing the Quest.
+        return true;
     }
 
@@ -207,5 +207,5 @@
         }
 
-    return questStatus::inactive;
+        return questStatus::inactive;
     }
 
Index: code/trunk/src/orxonox/objects/quest/GlobalQuest.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/GlobalQuest.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/GlobalQuest.h	(revision 2662)
@@ -28,7 +28,6 @@
  
 /**
-    @file GlobalQuest.h
-    @brief
-    Definition of the GlobalQuest class.
+    @file
+    @brief Definition of the GlobalQuest class.
 */
 
@@ -44,6 +43,6 @@
 #include "Quest.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
@@ -56,13 +55,13 @@
             <QuestDescription title="Title" description="Description." /> //The description of the quest.
             <subquests>
-        <Quest id ="questId1" /> //A list of n subquest, be aware, each of the <Quest /> tags must have a description and so on and so forth as well.
-        ...
-        <Quest id="questIdn" />
-        </subquests>
-        <hints>
-        <QuestHint id="hintId1" /> //A list of n QuestHints, see QuestHint for the full XML representation of those.
-        ...
-        <QuestHint id="hintIdn" />
-        </hints>
+                <Quest id ="questId1" /> //A list of n subquest, be aware, each of the <Quest /> tags must have a description and so on and so forth as well.
+                ...
+                <Quest id="questIdn" />
+            </subquests>
+            <hints>
+                <QuestHint id="hintId1" /> //A list of n QuestHints, see QuestHint for the full XML representation of those.
+                ...
+                <QuestHint id="hintIdn" />
+            </hints>
             <fail-effects>
                 <QuestEffect /> //A list of QuestEffects, invoked on all players possessing this quest, when the Quest is failed, see QuestEffect for the full XML representation.
Index: code/trunk/src/orxonox/objects/quest/LocalQuest.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/LocalQuest.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/LocalQuest.cc	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file LocalQuest.cc
-    @brief
-    Implementation of the LocalQuest class.
+    @file
+    @brief Implementation of the LocalQuest class.
 */
 
@@ -37,4 +36,5 @@
 
 #include "core/CoreIncludes.h"
+#include "core/Super.h"
 #include "util/Exception.h"
 
@@ -42,6 +42,6 @@
 #include "QuestEffect.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     CreateFactory(LocalQuest);
 
@@ -86,13 +86,14 @@
     bool LocalQuest::fail(PlayerInfo* player)
     {
-        if(this->isFailable(player)) //!< Checks whether the quest can be failed.
-        {
-            this->setStatus(player, questStatus::failed);
-            QuestEffect::invokeEffects(player, this->getFailEffectList()); //!< Invoke the failEffects.
-            return true;
-        }
-        
-        COUT(4) << "A non-failable quest was trying to be failed." << std::endl;
-        return false;
+        if(!this->isFailable(player)) //!< Checks whether the quest can be failed.
+        {
+            COUT(4) << "A non-failable quest was trying to be failed." << std::endl;
+            return false;
+        }
+        
+        Quest::fail(player);
+        
+        QuestEffect::invokeEffects(player, this->getFailEffectList()); //!< Invoke the failEffects.
+        return true;
     }
 
@@ -108,13 +109,14 @@
     bool LocalQuest::complete(PlayerInfo* player)
     {
-        if(this->isCompletable(player)) //!< Checks whether the Quest can be completed.
-        {
-            this->setStatus(player, questStatus::completed);
-            QuestEffect::invokeEffects(player, this->getCompleteEffectList()); //!< Invoke the complete QuestEffects.
-            return true;
-        }
-        
-        COUT(4) << "A non-completable quest was trying to be completed." << std::endl;
-        return false;
+        if(!this->isCompletable(player)) //!< Checks whether the Quest can be completed.
+        {
+            COUT(4) << "A non-completable quest was trying to be completed." << std::endl;
+            return false;
+        }
+        
+        Quest::complete(player);
+        
+        QuestEffect::invokeEffects(player, this->getCompleteEffectList()); //!< Invoke the complete QuestEffects.
+        return true;
     }
 
Index: code/trunk/src/orxonox/objects/quest/LocalQuest.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/LocalQuest.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/LocalQuest.h	(revision 2662)
@@ -28,7 +28,6 @@
  
 /**
-    @file LocalQuest.h
-    @brief
-    Definition of the LocalQuest class.
+    @file
+    @brief Definition of the LocalQuest class.
 */
 
@@ -44,6 +43,6 @@
 #include "Quest.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
@@ -56,13 +55,13 @@
             <QuestDescription title="Title" description="Description." /> //The description of the quest.
             <subquests>
-        <Quest id ="questId1" /> //A list of n subquest, be aware, each of the <Quest /> tags must have a description and so on and so forth as well.
-        ...
-        <Quest id="questIdn" />
-        </subquests>
-        <hints>
-        <QuestHint id="hintId1" /> //A list of n QuestHints, see QuestHint for the full XML representation of those.
-        ...
-        <QuestHint id="hintIdn" />
-        </hints>
+                <Quest id ="questId1" /> //A list of n subquest, be aware, each of the <Quest /> tags must have a description and so on and so forth as well.
+                ...
+                <Quest id="questIdn" />
+                </subquests>
+                <hints>
+                <QuestHint id="hintId1" /> //A list of n QuestHints, see QuestHint for the full XML representation of those.
+                ...
+                <QuestHint id="hintIdn" />
+                </hints>
             <fail-effects>
                 <QuestEffect /> //A list of QuestEffects, invoked when the Quest is failed, see QuestEffect for the full XML representation.
Index: code/trunk/src/orxonox/objects/quest/Quest.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/Quest.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/Quest.cc	(revision 2662)
@@ -28,7 +28,6 @@
  
 /**
-    @file Quest.cc
-    @brief
-    Implementation of the Quest class.
+    @file
+    @brief Implementation of the Quest class.
 */
 
@@ -43,7 +42,8 @@
 #include "QuestHint.h"
 #include "QuestEffect.h"
-
-namespace orxonox {
-
+#include "QuestListener.h"
+
+namespace orxonox
+{
     /**
     @brief
@@ -363,4 +363,42 @@
         return this->getStatus(player) == questStatus::completed;
     }
+    
+    /**
+    @brief
+        Fails the Quest for an input player.
+    @param player
+        The player.
+    @return
+        Returns true if the Quest could be failed, false if not.
+    */
+    bool Quest::fail(PlayerInfo* player)
+    {
+        QuestListener::advertiseStatusChange(this->listeners_, "fail"); //!< Tells the QuestListeners, that the status has changed to failed.
+        this->setStatus(player, questStatus::failed);
+        
+        COUT(4) << "Quest {" << this->getId() << "} is failed for player: " << player << " ." <<std::endl;
+        
+        this->getDescription()->sendFailQuestNotification();
+        return true;
+    }
+    
+    /**
+    @brief
+        Completes the Quest for an input player.
+    @param player
+        The player.
+    @return
+        Returns true if the Quest could be completed, false if not.
+    */
+    bool Quest::complete(PlayerInfo* player)
+    {
+        QuestListener::advertiseStatusChange(this->listeners_, "complete"); //!< Tells the QuestListeners, that the status has changed to completed.
+        this->setStatus(player, questStatus::completed);
+        
+        COUT(4) << "Quest {" << this->getId() << "} is completed for player: " << player << " ." <<std::endl;
+        
+        this->getDescription()->sendCompleteQuestNotification();
+        return true;
+    }
 
     /**
@@ -374,12 +412,38 @@
     bool Quest::start(PlayerInfo* player)
     {
-        if(this->isStartable(player)) //!< Checks whether the quest can be started.
-        {
-            this->setStatus(player, questStatus::active);
-            return true;
-        }
-        
-        COUT(4) << "A non-startable quest was trying to be started." << std::endl;
-        return false;
+        if(!this->isStartable(player)) //!< Checks whether the quest can be started.
+        {
+            COUT(4) << "A non-startable quest was trying to be started." << std::endl;
+            return false;
+        }
+        
+        COUT(4) << "Quest {" << this->getId() << "} is started for player: " << player << " ." <<std::endl;
+        
+        QuestListener::advertiseStatusChange(this->listeners_, "start"); //!< Tells the QuestListeners, that the status has changed to active.
+        
+        this->setStatus(player, questStatus::active);
+        
+        this->getDescription()->sendAddQuestNotification();
+        return true;
+    }
+    
+    /**
+    @brief
+        Adds a QuestListener to the list of QuestListeners listening to this Quest.
+    @param listener
+        The QuestListener to be added.
+    @return
+        Returns true if successful, false if not.
+    */
+    bool Quest::addListener(QuestListener* listener)
+    {
+        if(listener == NULL)
+        {
+            COUT(2) << "A NULL-QuestListener was trying to be added to a Quests listeners." << std::endl;
+            return false;
+        }
+        
+        this->listeners_.push_back(listener);
+        return true;
     }
 
Index: code/trunk/src/orxonox/objects/quest/Quest.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/Quest.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/Quest.h	(revision 2662)
@@ -28,9 +28,7 @@
  
 /**
-    @file Quest.h
-    @brief
-    Definition of the Quest class.
-    
-    The Quest is the parent class of LocalQuest and GlobalQuest.
+    @file
+    @brief Definition of the Quest class.
+        The Quest is the parent class of LocalQuest and GlobalQuest.
 */
  
@@ -47,19 +45,19 @@
 #include "QuestItem.h"
 
-namespace questStatus
+namespace orxonox
 {
+    namespace questStatus
+    {
 
-    //!Different states of a Quest.
-    enum Enum
-    {
-        inactive,
-        active,
-        failed,
-        completed
-    };
+        //!Different states of a Quest.
+        enum Enum
+        {
+            inactive,
+            active,
+            failed,
+            completed
+        };
 
-}
-
-namespace orxonox {
+    }
 
     /**
@@ -90,26 +88,28 @@
                 { return this->parentQuest_; }
                 
-	    /**
-	    @brief Returns the list of subquests.
-	    @return Returns a reference to the list of subquests of the quest.
-	    */
-	    inline const std::list<Quest*> & getSubQuestList(void) const
-		{ return this->subQuests_; }
-		    
-	    /**
-	    @brief Returns the list of all QuestHints of this Quest.
-	    @return Returns a reference to the list of QuestHints of the Quest.
-	    */
-	    inline const std::list<QuestHint*> & getHintsList(void) const
-		{ return this->hints_; }
-	    
-	    bool isInactive(const PlayerInfo* player) const; //!< Returns true if the quest status for the specific player is 'inactive'.
-	    bool isActive(const PlayerInfo* player) const; //!< Returns true if the quest status for the specific player is 'active'.
-	    bool isFailed(const PlayerInfo* player) const; //!< Returns true if the quest status for the specific player is 'failed'.
-	    bool isCompleted(const PlayerInfo* player) const; //!< Returns true if the quest status for the specific player is 'completed'.
-	    
-	    bool start(PlayerInfo* player); //!< Sets a Quest to active.
-	    virtual bool fail(PlayerInfo* player) = 0; //!< Fails the Quest.
-	    virtual bool complete(PlayerInfo* player) = 0; //!< Completes the Quest.
+            /**
+            @brief Returns the list of subquests.
+            @return Returns a reference to the list of subquests of the quest.
+            */
+            inline const std::list<Quest*> & getSubQuestList(void) const
+                { return this->subQuests_; }
+
+            /**
+            @brief Returns the list of all QuestHints of this Quest.
+            @return Returns a reference to the list of QuestHints of the Quest.
+            */
+            inline const std::list<QuestHint*> & getHintsList(void) const
+                { return this->hints_; }
+        
+            bool isInactive(const PlayerInfo* player) const; //!< Returns true if the quest status for the specific player is 'inactive'.
+            bool isActive(const PlayerInfo* player) const; //!< Returns true if the quest status for the specific player is 'active'.
+            bool isFailed(const PlayerInfo* player) const; //!< Returns true if the quest status for the specific player is 'failed'.
+            bool isCompleted(const PlayerInfo* player) const; //!< Returns true if the quest status for the specific player is 'completed'.
+        
+            bool start(PlayerInfo* player); //!< Sets a Quest to active.
+            virtual bool fail(PlayerInfo* player); //!< Fails the Quest.
+            virtual bool complete(PlayerInfo* player); //!< Completes the Quest.
+        
+            bool addListener(QuestListener* listener); //!< Adds a QuestListener to the list of QuestListeners listening to this Quest.
 
         protected:
@@ -131,9 +131,9 @@
                 { return this->failEffects_; }
                 
-	    /**
-	    @brief Returns the list of complete QuestEffects.
-	    @return Returns a reference to the list of complete QuestEffects.
-	    */
-	    inline std::list<QuestEffect*> & getCompleteEffectList(void)
+            /**
+            @brief Returns the list of complete QuestEffects.
+            @return Returns a reference to the list of complete QuestEffects.
+            */
+            inline std::list<QuestEffect*> & getCompleteEffectList(void)
                 { return this->completeEffects_; }
 
@@ -141,5 +141,5 @@
             virtual bool setStatus(PlayerInfo* player, const questStatus::Enum & status) = 0; //!< Changes the status for a specific player.
             
-    private:
+        private:
             Quest* parentQuest_; //!< Pointer to the parentquest.
             std::list<Quest*> subQuests_; //!< List of all the subquests.
@@ -149,4 +149,6 @@
             std::list<QuestEffect*> failEffects_; //!< A list of all QuestEffects to be invoked, when the Quest has been failed.
             std::list<QuestEffect*> completeEffects_; //!< A list of QuestEffects to be invoked, when the Quest has been completed.
+            
+            std::list<QuestListener*> listeners_; //!< A list of QuestListeners, that listen to what exactly happens with this Quest.
             
             bool setParentQuest(Quest* quest); //!< Sets the parentquest of the Quest.
Index: code/trunk/src/orxonox/objects/quest/QuestDescription.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestDescription.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/QuestDescription.cc	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file QuestDescription.cc
-    @brief
-    Implementation of the QuestDescription class.
+    @file
+    @brief Implementation of the QuestDescription class.
 */
 
@@ -38,7 +37,8 @@
 
 #include "core/CoreIncludes.h"
+#include "orxonox/overlays/notifications/Notification.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     CreateFactory(QuestDescription);
 
@@ -74,6 +74,61 @@
         XMLPortParam(QuestDescription, "title", setTitle, getTitle, xmlelement, mode);
         XMLPortParam(QuestDescription, "description", setDescription, getDescription, xmlelement, mode);
+        XMLPortParam(QuestDescription, "failMessage", setFailMessage, getFailMessage, xmlelement, mode);
+        XMLPortParam(QuestDescription, "completeMessage", setCompleteMessage, getCompleteMessage, xmlelement, mode);
 
         COUT(3) << "New QuestDescription with title '" << this->getTitle() << "' created." << std::endl;
+    }
+    
+    /**
+    @brief
+        This method is a helper for sending QuestDescriptions as Notifications.
+    @param item
+        The item the QuestDescription is for.
+    @param status
+        The status the QuestDescription us for.
+    @return
+        Returns true if successful.
+    */
+    bool QuestDescription::notificationHelper(const std::string & item, const std::string & status) const
+    {
+        std::string message = "";
+        std::string title = "";
+        if(item == "hint")
+        {
+            title = "You received a hint: '" + this->title_ + "'";
+            message = this->description_;
+        }
+        else if(item == "quest")
+        {
+            if(status == "start")
+            {
+                title = "You received a new quest: '" + this->title_ + "'";
+                message = this->description_;
+            }
+            else if(status == "fail")
+            {
+                title = "You failed the quest: '" + this->title_ + "'";
+                message = this->failMessage_;
+            }
+            else if(status == "complete")
+            {
+                title = "You successfully completed the quest: '" + this->title_ + "'";
+                message = this->completeMessage_;
+            }
+            else
+            {
+                COUT(2) << "Bad input in notificationHelper, this should not be happening!" << std::endl;
+                return false;
+            }
+        }
+        else
+        {
+            COUT(2) << "Bad input in notificationHelper, this should not be happening!" << std::endl;
+            return false;
+        }
+        
+        Notification* notification = new Notification(0, message, title, 30);
+        notification->send();
+        return true;
     }
 
Index: code/trunk/src/orxonox/objects/quest/QuestDescription.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestDescription.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/QuestDescription.h	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file QuestDescription.h
-    @brief
-    Definition of the QuestDescription class.
+    @file
+    @brief Definition of the QuestDescription class.
 */
 
@@ -43,6 +42,6 @@
 #include "core/XMLPort.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
@@ -52,10 +51,10 @@
         Creating a QuestDescription through XML goes as follows:
         
-        <QuestDescription title="Title" description="Description Text" />
+        <QuestDescription title="Title" description="Description Text" failMessage="You fail." completeMessage="You win!" />
     @author
         Damian 'Mozork' Frick
     */
-    class _OrxonoxExport QuestDescription : public BaseObject {
-
+    class _OrxonoxExport QuestDescription : public BaseObject
+    {
         public:
             QuestDescription(BaseObject* creator);
@@ -64,21 +63,67 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a QuestDescription object through XML.
 
-        /**
-        @brief Returns the title.
-        @return Returns a string containing the title of the QuestDescription.
-        */
+            /**
+            @brief Returns the title.
+            @return Returns a string containing the title of the QuestDescription.
+            */
             inline const std::string & getTitle(void) const
                 { return this->title_; }
         
-        /**
-        @brief Returns the description text.
-        @return Returns a string containing the description text of the QuestDescription.
-        */
+            /**
+            @brief Returns the description text.
+            @return Returns a string containing the description text of the QuestDescription.
+            */
             inline const std::string & getDescription(void) const
                 { return this->description_; }
+        
+            /**
+            @brief Returns the fail message.
+            @return Returns a string containing the fail message of the QuestDescription.
+            */
+            inline const std::string & getFailMessage(void) const
+                { return this->failMessage_; }
+        
+            /**
+            @brief Returns the complete message.
+            @return Returns a string containing the complete message of the QuestDescription.
+            */
+            inline const std::string & getCompleteMessage(void) const
+                { return this->completeMessage_; }
+        
+            /**
+            @brief Sends a Notification displaying that a QuestHint was added.
+            @return Returns true if successful.
+            */
+            inline bool sendAddHintNotification(void) const
+                { return notificationHelper("hint", ""); }
+        
+            /**
+            @brief Sends a Notification displaying that a Quest was added.
+            @return Returns true if successful.
+            */
+            inline bool sendAddQuestNotification(void) const
+                { return notificationHelper("quest", "start"); }
+        
+            /**
+            @brief Sends a Notification displaying that a Quest was failed.
+            @return Returns true if successful.
+            */
+            inline bool sendFailQuestNotification(void) const
+                { return notificationHelper("quest", "fail"); }
+        
+            /**
+            @brief Sends a Notification displaying that a Quest was completed.
+            @return Returns true if successful.
+            */
+            inline bool sendCompleteQuestNotification(void) const
+                { return notificationHelper("quest", "complete"); }
 
         private:
             std::string title_; //!< The title.
             std::string description_; //!< The description.
+            std::string failMessage_; //!< The message displayed when the Quest is failed.
+            std::string completeMessage_; //!< The message displayed when the Quest is completed.
+
+            bool notificationHelper(const std::string & item, const std::string & status) const; //!< Helper for sending QuestDescriptions as Notifications.
 
             /**
@@ -89,5 +134,5 @@
                 { this->title_ = title; }
                 
-        /**
+            /**
             @brief Sets the description text.
             @param description The description text to be set.
@@ -96,4 +141,18 @@
                 { this->description_ = description; }
 
+            /**
+            @brief Sets the fail message.
+            @param message The fail message to be set.
+            */
+            inline void setFailMessage(const std::string & message)
+                { this->failMessage_ = message; }
+                
+            /**
+            @brief Sets the complete message.
+            @param message The complete message to be set.
+            */
+            inline void setCompleteMessage(const std::string & message)
+                { this->completeMessage_ = message; }
+
     };
 
Index: code/trunk/src/orxonox/objects/quest/QuestEffect.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestEffect.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/QuestEffect.cc	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file QuestEffect.cc
-    @brief
-    Implementation of the QuestEffect class.
+    @file
+    @brief Implementation of the QuestEffect class.
 */
 
@@ -40,6 +39,6 @@
 #include "orxonox/objects/infos/PlayerInfo.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
@@ -71,7 +70,9 @@
         Returns false if there was an error, view console of log for further detail.
     */
-    bool QuestEffect::invokeEffects(PlayerInfo* player, std::list<QuestEffect*> & effects)
+    /*static*/ bool QuestEffect::invokeEffects(PlayerInfo* player, std::list<QuestEffect*> & effects)
     {
         bool check = true;
+        
+        COUT(4) << "Invoking QuestEffects on player: " << player << " ."  << std::endl;
 
         for (std::list<QuestEffect*>::iterator effect = effects.begin(); effect != effects.end(); effect++)
Index: code/trunk/src/orxonox/objects/quest/QuestEffect.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestEffect.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/QuestEffect.h	(revision 2662)
@@ -28,7 +28,6 @@
  
 /**
-    @file QuestEffect.h
-    @brief
-    Definition of the QuestEffect class.
+    @file
+    @brief Definition of the QuestEffect class.
 */
 
@@ -42,6 +41,6 @@
 #include "core/BaseObject.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
Index: code/trunk/src/orxonox/objects/quest/QuestEffectBeacon.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestEffectBeacon.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/QuestEffectBeacon.cc	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file QuestEffectBeacon.cc
-    @brief
-    Implementation of the QuestEffectBeacon class.
+    @file
+    @brief Implementation of the QuestEffectBeacon class.
 */
 
@@ -46,6 +45,6 @@
 #include "QuestEffect.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     CreateFactory(QuestEffectBeacon);
 
@@ -54,10 +53,10 @@
         Constructor. Registers the object and initializes defaults.
     */
-    QuestEffectBeacon::QuestEffectBeacon(BaseObject* creator) : PositionableEntity(creator)
+    QuestEffectBeacon::QuestEffectBeacon(BaseObject* creator) : StaticEntity(creator)
     {
         RegisterObject(QuestEffectBeacon);
         
         this->status_ = QuestEffectBeaconStatus::active;
-        this->times_ = INFINITE;
+        this->times_ = INFINITE_TIME;
     }
 
@@ -91,5 +90,5 @@
         SUPER(QuestEffectBeacon, processEvent, event);
     
-    SetSubclassEvent(QuestEffectBeacon, "execute", execute, event, PlayerTrigger);
+        SetSubclassEvent(QuestEffectBeacon, "execute", execute, event, PlayerTrigger);
     }
     
@@ -145,7 +144,7 @@
             this->decrementTimes(); //!< Decrement the number of times the beacon can be used.
             return true;
-    }
-
-    return false;
+        }
+
+        return false;
     }
     
@@ -187,5 +186,5 @@
             return false;
         }
-        if(this->getTimes() == INFINITE) //!< If times is infinity the QuestEffectBeacon can be executed an infinite number fo times.
+        if(this->getTimes() == INFINITE_TIME) //!< If times is infinity the QuestEffectBeacon can be executed an infinite number fo times.
         {
             return true;
@@ -193,8 +192,8 @@
         
         this->times_ = this->times_ - 1; //!< Decrement number of times the QuestEffectBeacon can be executed.
-    if(this->getTimes() == 0) //!< Set the QuestEffectBeacon to inactive when the number of times it can be executed is reduced to 0.
-    {
+        if(this->getTimes() == 0) //!< Set the QuestEffectBeacon to inactive when the number of times it can be executed is reduced to 0.
+        {
             this->status_ = QuestEffectBeaconStatus::inactive;
-    }
+        }
         
         return true;
@@ -213,5 +212,5 @@
     bool QuestEffectBeacon::setTimes(const int & n)
     {
-        if(n < 0 && n != INFINITE)
+        if(n < 0 && n != INFINITE_TIME)
         {
             return false;
Index: code/trunk/src/orxonox/objects/quest/QuestEffectBeacon.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestEffectBeacon.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/QuestEffectBeacon.h	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file QuestEffectBeacon.h
-    @brief
-    Definition of the QuestEffectBeacon class.
+    @file
+    @brief Definition of the QuestEffectBeacon class.
 */
 
@@ -38,19 +37,19 @@
 #include "OrxonoxPrereqs.h"
 
-#include "orxonox/objects/worldentities/PositionableEntity.h"
+#include "orxonox/objects/worldentities/StaticEntity.h"
 
-namespace QuestEffectBeaconStatus
+namespace orxonox
 {
+    namespace QuestEffectBeaconStatus
+    {
 
-    //! The status of the beacon, can be either active or inactive.
-    enum Enum
-    {
-        inactive,
-        active
-    };
+        //! The status of the beacon, can be either active or inactive.
+        enum Enum
+        {
+            inactive,
+            active
+        };
 
-}
-
-namespace orxonox {
+    }
 
     /**
@@ -61,7 +60,7 @@
         A QuestEffectBeacon can be inactive or active.
         
-    Creating a QuestEffectBeacon through XML goes as follows:
-    
-    <QuestEffectBeacon times=n> //Where 'n' is eighter a number >= 0, which means the QuestEffectBeacon can be executed n times. Or n = -1, which means the QuestEffectBeacon can be executed an infinite number of times.
+        Creating a QuestEffectBeacon through XML goes as follows:
+        
+        <QuestEffectBeacon times=n> //Where 'n' is eighter a number >= 0, which means the QuestEffectBeacon can be executed n times. Or n = -1, which means the QuestEffectBeacon can be executed an infinite number of times.
             <effects>
                 <QuestEffect /> //A list of QuestEffects, invoked when the QuestEffectBeacon is executed, see QuestEffect for the full XML representation.
@@ -70,37 +69,37 @@
             </effects>
             <events>
-        <execute>
-            <EventListener event=eventIdString />
-        </execute>
-        </events>
-        <attached>
-           <PlayerTrigger name=eventIdString /> //A PlayerTrigger triggering the execution of the QuestEffectBeacon.
-        </attached>
-    </QuestEffectBeacon>
+                <execute>
+                    <EventListener event=eventIdString />
+                </execute>
+            </events>
+            <attached>
+                <PlayerTrigger name=eventIdString /> //A PlayerTrigger triggering the execution of the QuestEffectBeacon.
+            </attached>
+        </QuestEffectBeacon>
     @author
         Damian 'Mozork' Frick
     */
-    class _OrxonoxExport QuestEffectBeacon : public PositionableEntity
+    class _OrxonoxExport QuestEffectBeacon : public StaticEntity
     {
-    public:
-        QuestEffectBeacon(BaseObject* creator);
-        virtual ~QuestEffectBeacon();
-        
-        virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a QuestEffectBeacon object through XML.
-        
-        virtual void processEvent(Event& event); //!< Processes an event for this QuestEffectBeacon.
-        
-        bool execute(bool b, PlayerTrigger* trigger); //!< Executes the QuestEffects of the QuestEffectBeacon.
-        
-        /**
-        @brief Tests whether the QuestEffectBeacon is active.
-        @return Returns true if the QuestEffectBeacon is active, fals if not.
-        */
-        inline bool isActive(void)
-           { return this->status_ == QuestEffectBeaconStatus::active; }
-        
-        bool setActive(bool activate); //!< Set the status of the QuestEffectBeacon.
-        
-    protected:
+        public:
+            QuestEffectBeacon(BaseObject* creator);
+            virtual ~QuestEffectBeacon();
+            
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a QuestEffectBeacon object through XML.
+            
+            virtual void processEvent(Event& event); //!< Processes an event for this QuestEffectBeacon.
+            
+            bool execute(bool b, PlayerTrigger* trigger); //!< Executes the QuestEffects of the QuestEffectBeacon.
+            
+            /**
+            @brief Tests whether the QuestEffectBeacon is active.
+            @return Returns true if the QuestEffectBeacon is active, fals if not.
+            */
+            inline bool isActive(void)
+            { return this->status_ == QuestEffectBeaconStatus::active; }
+            
+            bool setActive(bool activate); //!< Set the status of the QuestEffectBeacon.
+            
+        protected:
             bool decrementTimes(void); //!< Decrement the number of times the QuestEffectBeacon can still be executed.
             
@@ -111,8 +110,8 @@
             inline const int & getTimes(void) const
                 { return this->times_; }
-
+    
         private:
-            static const int INFINITE = -1; //!< Constant to avoid using magic numbers.
-        
+            static const int INFINITE_TIME = -1; //!< Constant to avoid using magic numbers.
+            
             std::list<QuestEffect*> effects_; //!< The list of QuestEffects to be invoked on the executing player.
             int times_; //!< Number of times the beacon can be exectued.
Index: code/trunk/src/orxonox/objects/quest/QuestHint.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestHint.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/QuestHint.cc	(revision 2662)
@@ -28,7 +28,6 @@
  
 /**
-    @file QuestHint.cc
-    @brief
-    Implementation of the QuestHint class.
+    @file
+    @brief Implementation of the QuestHint class.
 */
 
@@ -41,8 +40,9 @@
 #include "orxonox/objects/infos/PlayerInfo.h"
 #include "QuestManager.h"
+#include "QuestDescription.h"
 #include "Quest.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     CreateFactory(QuestHint);
 
@@ -122,4 +122,6 @@
             {
                 this->playerStatus_[player] = questHintStatus::active;
+                
+                this->getDescription()->sendAddHintNotification();
                 return true;
             }
Index: code/trunk/src/orxonox/objects/quest/QuestHint.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestHint.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/QuestHint.h	(revision 2662)
@@ -28,7 +28,6 @@
  
 /**
-    @file QuestHint.h
-    @brief
-    Definition of the QuestHint class.
+    @file
+    @brief Definition of the QuestHint class.
 */
 
@@ -44,18 +43,17 @@
 #include "QuestItem.h"
 
-namespace questHintStatus
-{
-
-    //! The status of the hint.
-    enum Enum
-    {
-        inactive,
-        active
-    };
-
-}
-
 namespace orxonox
 {
+    namespace questHintStatus
+    {
+
+        //! The state of the hint.
+        enum Enum
+        {
+            inactive,
+            active
+        };
+
+    }
 
     /**
@@ -96,5 +94,5 @@
         private:
             Quest* quest_; //!< The Quest the QuestHint belongs to.
-            std::map<const PlayerInfo*, questHintStatus::Enum> playerStatus_; //!< List of the status for each player, with the Player-pointer as key.
+            std::map<const PlayerInfo*, questHintStatus::Enum> playerStatus_; //!< List of the states for each player, with the Player-pointer as key.
 
     };
Index: code/trunk/src/orxonox/objects/quest/QuestItem.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestItem.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/QuestItem.cc	(revision 2662)
@@ -28,7 +28,6 @@
  
 /**
-    @file QuestItem.cc
-    @brief
-    Implementation of the QuestItem class.
+    @file
+    @brief Implementation of the QuestItem class.
 */
 
@@ -40,6 +39,6 @@
 #include "QuestDescription.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
@@ -99,8 +98,6 @@
     @return
         Returns true if the string is likely to be of the required form.
-    @todo
-        Clarify form, more vigorous checks.
     */
-    bool QuestItem::isId(const std::string & id)
+    /*static*/ bool QuestItem::isId(const std::string & id)
     {
         return id.size() >= 32;
Index: code/trunk/src/orxonox/objects/quest/QuestItem.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestItem.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/QuestItem.h	(revision 2662)
@@ -28,9 +28,7 @@
  
 /**
-    @file QuestItem.h
-    @brief
-    Definition of the QuestItem class.
-    
-    The QuestItem is the parent class of Quest and QuestHint.
+    @file
+    @brief Definition of the QuestItem class.
+        The QuestItem is the parent class of Quest and QuestHint.
 */
 
@@ -46,7 +44,6 @@
 #include "core/XMLPort.h"
 
-namespace orxonox {
-
-
+namespace orxonox
+{
     /**
     @brief
@@ -67,12 +64,13 @@
             /**
             @brief Returns the id of this QuestItem.
-        @return Returns the id of the QuestItem.
+            @return Returns the id of the QuestItem.
             */
             inline const std::string & getId(void) const
                 { return this->id_; }
-        /**
-        @brief Returns the QuestDescription of the QuestItem.
-        @return Returns a pointer to the QuestDescription object of the QuestItem.
-        */
+            
+            /**
+            @brief Returns the QuestDescription of the QuestItem.
+            @return Returns a pointer to the QuestDescription object of the QuestItem.
+            */
             inline const QuestDescription* getDescription(void) const
                 { return this->description_; }
Index: code/trunk/src/orxonox/objects/quest/QuestListener.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestListener.cc	(revision 2662)
+++ code/trunk/src/orxonox/objects/quest/QuestListener.cc	(revision 2662)
@@ -0,0 +1,204 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Damian 'Mozork' Frick
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+/**
+    @file
+    @brief Implementation of the QuestListener class.
+*/
+
+#include "OrxonoxStableHeaders.h"
+#include "QuestListener.h"
+
+#include "core/CoreIncludes.h"
+#include "core/XMLPort.h"
+#include "util/Exception.h"
+
+#include "Quest.h"
+#include "QuestManager.h"
+
+namespace orxonox
+{
+    CreateFactory(QuestListener);
+
+    /**
+    @brief
+        Constructor. Registers the object and initializes variables.
+    */
+    QuestListener::QuestListener(BaseObject* creator) : BaseObject(creator)
+    {
+        RegisterObject(QuestListener);
+        
+        this->mode_ = questListenerMode::all;
+        this->quest_ = NULL;
+    }
+    
+    /**
+    @brief
+        Destructor.
+    */
+    QuestListener::~QuestListener()
+    {
+    }
+    
+    /**
+    @brief
+        Method for creating a Quest object through XML.
+    */
+    void QuestListener::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(QuestListener, XMLPort, xmlelement, mode);
+
+        XMLPortParam(QuestListener, "questId", setQuestId, getQuestId, xmlelement, mode);
+        XMLPortParam(QuestListener, "mode", setMode, getMode, xmlelement, mode);
+
+        this->quest_->addListener(this); //!< Adds the QuestListener to the Quests list of listeners.
+        
+        COUT(3) << "QuestListener created for quest: {" << this->quest_->getId() << "} with mode '" << this->getMode() << "'." << std::endl;
+    }
+    
+    /**
+    @brief
+        Makes all QuestListener in the list aware that a certain status change has occured and executes them if the status change affects them.
+    @param listeners
+        The list of QuestListeners that have to be made aware of the status change.
+    @param status
+        The status that has changed. Can be 'start' (if the Quest was started), 'complete' (if the Quest was completed) or 'fail' (if the Quest was failed).
+    */
+    /* static */ void QuestListener::advertiseStatusChange(std::list<QuestListener*> & listeners, const std::string & status)
+    {
+        for (std::list<QuestListener*>::iterator it = listeners.begin(); it != listeners.end(); ++it) //!< Iterate through all QuestListeners
+        {
+            QuestListener* listener = *it;
+            if(listener->getMode() == status || listener->getMode() == "all") //!< Check whether the status change affects the give QuestListener.
+            {
+                listener->execute();
+            }
+        }
+    }
+    
+    /**
+    @brief
+        Sets the questId of the Quest the QuestListener reacts to.
+    @param id
+        The questId of the Quest the QUestListener reacts to.
+    @return
+        Returns true if successful.
+    */
+    bool QuestListener::setQuestId(const std::string & id)
+    {
+        this->quest_ = QuestManager::findQuest(id); //!< Find the Quest corresponding to the given questId.
+        
+        if(this->quest_ == NULL) //!< If there is no such Quest.
+        {
+            ThrowException(Argument, "This is bad! The QuestListener has not found a Quest with a corresponding id..");
+            return false;
+        }
+        
+        return true;
+    }
+    
+    /**
+    @brief
+        Sets the mode of the QuestListener.
+    @param mode
+        The mode to be set. Can be eighter 'all', 'start', 'fail' or 'complete'.
+    @return
+        Returns true if successful.
+    */
+    bool QuestListener::setMode(const std::string & mode)
+    {
+        if(mode == "all")
+        {
+            this->mode_ = questListenerMode::all;
+        }
+        else if(mode == "start")
+        {
+            this->mode_ = questListenerMode::start;
+        }
+        else if(mode == "fail")
+        {
+            this->mode_ = questListenerMode::fail;
+        }
+        else if(mode == "complete")
+        {
+            this->mode_ = questListenerMode::complete;
+        }
+        else
+        {
+            COUT(2) << "QuestListener with invalid mode '" << mode << "' created. Mode set to 'all'." << std::endl;
+        this->mode_ = questListenerMode::all;
+        return false;
+        }
+        
+        return true;
+    }
+    
+    /**
+    @brief
+        Get the mode of the QuestListener.
+    @return
+        Return the mode of the QuestListener. Can be eighter 'all', 'start', 'fail' or 'complete'.
+    */
+    const std::string QuestListener::getMode(void)
+    {
+        if(this->mode_ == questListenerMode::all)
+        {
+            return "all";
+        }
+        else if(this->mode_ == questListenerMode::start)
+        {
+            return "start";
+        }
+        else if(this->mode_ == questListenerMode::fail)
+        {
+            return "fail";
+        }
+        else if(this->mode_ == questListenerMode::complete)
+        {
+            return "complete";
+        }
+        else
+        {
+            COUT(1) << "An unforseen, never to happen, Error has occured. This is impossible!" << std::endl;
+        return "";
+        }
+    }
+
+    /**
+    @brief
+        Executes the QuestListener, resp. fires an Event.
+    @return
+        Returns true if successful.
+    */
+    bool QuestListener::execute()
+    {
+        this->fireEvent(true);
+        return true;
+    }
+
+}
Index: code/trunk/src/orxonox/objects/quest/QuestListener.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestListener.h	(revision 2662)
+++ code/trunk/src/orxonox/objects/quest/QuestListener.h	(revision 2662)
@@ -0,0 +1,111 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Damian 'Mozork' Frick
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+/**
+    @file
+    @brief Definition of the QuestListener class.
+*/
+
+#ifndef _QuestListener_H__
+#define _QuestListener_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include <string>
+#include <list>
+
+#include "core/BaseObject.h"
+
+#include "Quest.h"
+
+namespace orxonox
+{
+    namespace questListenerMode
+    {
+
+        //! The mode of the QuestListener.
+        enum Enum
+        {
+            all,
+            start,
+            fail,
+            complete
+        };
+
+    }
+
+    /**
+    @brief
+        Provides a way to react to the starting, completing and failing of Quests.
+        
+        The XML representation goes as follows:
+        You can use the QuestListener as if it were a Trigger or EventListener, that fires an Event when the status (depending on the set mode) of the given Quest changes.
+        
+        <BaseObject> // The object that should react to the status change of a Quest.
+            <events>
+                <function> // Where function is the method of the object that schould be executed. Normally this would be visibility or activity.
+                    <QuestListener questId="someQuestId" mode="someMode" /> // Where someQuestId is the identifier for the Quest the QuestListener is reacting to, and someMode is the kind of status change the QUestListener reacts to (all, start, complete or fail).
+                </function>
+            </events>
+        </BaseObject>
+    @author
+    Damian 'Mozork' Frick
+    */
+    class _OrxonoxExport QuestListener : public BaseObject
+    {
+    public:
+        QuestListener(BaseObject* creator);
+        virtual ~QuestListener();
+        
+        virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a QuestListener object through XML.
+        
+        static void advertiseStatusChange(std::list<QuestListener*> & listeners, const std::string & status); //!< Makes all QuestListener in the list aware that a certain status change has occured.
+        
+        bool setQuestId(const std::string & id); //!< Sets the questId of the Quest the QuestListener reacts to.
+        bool setMode(const std::string & mode); //!< Sets the mode of the QuestListener.
+        
+        const std::string getMode(void); //!< Get the mode of the QuestListener.
+        
+        /**
+        @brief Get the questId of the Quest the QuestListener reacts to.
+        @return Returns the questId of the Quest the QuestListener reacts to.
+        */
+        inline const std::string & getQuestId(void)
+                { return this->quest_->getId(); }
+        
+        bool execute(void); //!< Executes the QuestListener, resp. fires an Event.
+        
+    private:
+        questListenerMode::Enum mode_; //!< The mode of the QuestListener.
+        Quest* quest_; //!< A pointer to the Quest the QuestListener is reacting to.
+    
+    };
+
+}
+
+#endif /* _QuestListener_H__ */
Index: code/trunk/src/orxonox/objects/quest/QuestManager.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestManager.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/QuestManager.cc	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file QuestManager.cc
-    @brief
-    Implementation of the QuestManager class.
+    @file
+    @brief Implementation of the QuestManager class.
 */
 
@@ -42,6 +41,6 @@
 #include "QuestHint.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     //! All Quests registered by their id's.
     std::map<std::string, Quest*> QuestManager::questMap_s;
@@ -76,5 +75,5 @@
         Returns true if successful, false if not.
     */
-    bool QuestManager::registerQuest(Quest* quest)
+    /*static*/ bool QuestManager::registerQuest(Quest* quest)
     {
         if(quest == NULL) //!< Doh! Just as if there were actual quests behind NULL-pointers.
@@ -108,5 +107,5 @@
         Returns true if successful, false if not.
     */
-    bool QuestManager::registerHint(QuestHint* hint)
+    /*static*/ bool QuestManager::registerHint(QuestHint* hint)
     {
         if(hint == NULL) //!< Still not liking NULL-pointers.
@@ -142,5 +141,5 @@
         Throws an exception if the given questId is invalid.
     */
-    Quest* QuestManager::findQuest(const std::string & questId)
+    /*static*/ Quest* QuestManager::findQuest(const std::string & questId)
     {
         if(!QuestItem::isId(questId)) //!< Check vor validity of the given id.
@@ -176,5 +175,5 @@
         Throws an exception if the given hintId is invalid.
     */
-    QuestHint* QuestManager::findHint(const std::string & hintId)
+    /*static*/ QuestHint* QuestManager::findHint(const std::string & hintId)
     {
         if(!QuestItem::isId(hintId)) //!< Check vor validity of the given id.
Index: code/trunk/src/orxonox/objects/quest/QuestManager.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestManager.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/QuestManager.h	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file QuestManager.h
-    @brief
-    Definition of the QuestManager class.
+    @file
+    @brief Definition of the QuestManager class.
 */
 
@@ -43,6 +42,6 @@
 #include "core/BaseObject.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
Index: code/trunk/src/orxonox/objects/quest/Rewardable.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/Rewardable.cc	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/Rewardable.cc	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file Rewardable.cc
-    @brief
-    Implementation of the Rewardable class.
+    @file
+    @brief Implementation of the Rewardable class.
 */
 
@@ -38,6 +37,6 @@
 #include "core/CoreIncludes.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
Index: code/trunk/src/orxonox/objects/quest/Rewardable.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/Rewardable.h	(revision 2262)
+++ code/trunk/src/orxonox/objects/quest/Rewardable.h	(revision 2662)
@@ -28,7 +28,6 @@
 
 /**
-    @file Rewardable.h
-    @brief
-    Definition of the Rewardable class.
+    @file
+    @brief Definition of the Rewardable class.
 */
 
@@ -40,6 +39,6 @@
 #include "core/BaseObject.h"
 
-namespace orxonox {
-
+namespace orxonox
+{
     /**
     @brief
@@ -52,5 +51,4 @@
     class _OrxonoxExport Rewardable : public BaseObject
     {
-
         public:
             Rewardable(BaseObject* creator);
@@ -61,10 +59,10 @@
                 Method to transcribe a rewardable object to the player.
                 Must be implemented by every class inheriting from Rewardable.
-        @param player
+            @param player
                 A pointer to the ControllableEntity, do whatever you want with it.
-        @return
+            @return
                 Return true if successful.
             */
-            virtual bool reward(PlayerInfo* player) = 0; //!<
+            virtual bool reward(PlayerInfo* player) = 0;
 
     };
