Index: code/trunk/src/orxonox/OrxonoxPrereqs.h
===================================================================
--- code/trunk/src/orxonox/OrxonoxPrereqs.h	(revision 2171)
+++ code/trunk/src/orxonox/OrxonoxPrereqs.h	(revision 2261)
@@ -99,4 +99,5 @@
     class QuestDescription;
     class QuestEffect;
+    class QuestEffectBeacon;
     class QuestHint;
     class QuestItem;
@@ -129,4 +130,5 @@
     class DistanceTrigger;
     class EventTrigger;
+    class PlayerTrigger;
 
     class WeaponSystem;
Index: code/trunk/src/orxonox/objects/quest/AddQuest.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/AddQuest.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/AddQuest.cc	(revision 2261)
@@ -27,11 +27,19 @@
  */
 
+/**
+    @file AddQuest.cc
+    @brief
+    Implementation of the AddQuest class.
+*/
+
 #include "OrxonoxStableHeaders.h"
 #include "AddQuest.h"
 
 #include <string>
+
 #include "core/CoreIncludes.h"
 #include "util/Exception.h"
 
+#include "orxonox/objects/infos/PlayerInfo.h"
 #include "QuestManager.h"
 #include "Quest.h"
@@ -41,5 +49,8 @@
     CreateFactory(AddQuest);
 
-
+    /**
+    @brief
+        Constructor. Registers the object.
+    */
     AddQuest::AddQuest(BaseObject* creator) : ChangeQuestStatus(creator)
     {
@@ -55,21 +66,26 @@
     }
 
+    /**
+    @brief
+        Method for creating a AddQuest object through XML.
+    */
     void AddQuest::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
         SUPER(AddQuest, XMLPort, xmlelement, mode);
-
+        
+        COUT(3) << "New AddQuest, with target Quest {" << this->getQuestId() << "}, created." << std::endl;
     }
 
     /**
     @brief
-        Invokes the effect.
+        Invokes the QuestEffect.
     @param player
-        The player the effect is invoked on.
+        The player the QuestEffect is invoked on.
     @return
-        Returns true if the effect was successfully invoked.
+        Returns true if the QuestEffect was successfully invoked.
     */
-    bool AddQuest::invoke(Player* player)
+    bool AddQuest::invoke(PlayerInfo* player)
     {
-        if(player == NULL)
+        if(player == NULL) //!< Null-pointers are badass.
         {
             COUT(2) << "Input player is NULL." << std::endl;
@@ -77,8 +93,10 @@
         }
 
+        COUT(3) << "AddQuest on player: " << player << " ." << std::endl;
+
         try
         {
             Quest* quest = QuestManager::findQuest(this->getQuestId());
-            if(!quest->start(player))
+            if(quest == NULL || !quest->start(player))
             {
                return false;
@@ -91,4 +109,5 @@
         }
 
+        COUT(3) << "Quest {" << this->getQuestId() << "} successfully added to player." << std::endl;
         return true;
     }
Index: code/trunk/src/orxonox/objects/quest/AddQuest.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/AddQuest.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/AddQuest.h	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file AddQuest.h
+    @brief
+    Definition of the AddQuest class.
+*/
+
 #ifndef _AddQuest_H__
 #define _AddQuest_H__
@@ -39,9 +45,11 @@
 namespace orxonox {
 
-    class Player; //Forward declaration, remove when fully integrated into the objecthirarchy.
-
     /**
     @brief
-        Adds a quest, resp. changes the quests status to active.
+        Adds a Quest, resp. changes the quests status to active for the player invoking the Quest.
+        
+        Creating a AddQuest through XML goes as follows:
+        
+        <AddQuest questId="id" />  //Where id is a GUID, see http://en.wikipedia.org/wiki/Globally_Unique_Identifier#Basic_structure for more information, and identifies the Quest that should be added.
     @author
         Damian 'Mozork' Frick
@@ -53,7 +61,7 @@
             virtual ~AddQuest();
 
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a AddQuest object through XML.
 
-            virtual bool invoke(Player* player); //!< Invokes the effect.
+            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 2171)
+++ code/trunk/src/orxonox/objects/quest/AddQuestHint.cc	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file AddQuestHint.cc
+    @brief
+    Implementation of the AddQuestHint class.
+*/
+
 #include "OrxonoxStableHeaders.h"
 #include "AddQuestHint.h"
@@ -33,4 +39,5 @@
 #include "util/Exception.h"
 
+#include "orxonox/objects/infos/PlayerInfo.h"
 #include "QuestManager.h"
 #include "QuestItem.h"
@@ -41,4 +48,8 @@
     CreateFactory(AddQuestHint);
 
+    /**
+    @brief
+        Constructor. Registers the object.
+    */
     AddQuestHint::AddQuestHint(BaseObject* creator) : QuestEffect(creator)
     {
@@ -54,4 +65,8 @@
     }
 
+    /**
+    @brief
+        Method for creating a AddQuestHint object through XML.
+    */
     void AddQuestHint::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
@@ -59,28 +74,39 @@
 
         XMLPortParam(AddQuestHint, "hintId", setHintId, getHintId, xmlelement, mode);
-
+        
+        COUT(3) << "New AddQuestHint, with target QuestHint {" << this->getHintId() << "}, created." << std::endl;
     }
 
-    inline void AddQuestHint::setHintId(const std::string & id)
+    /**
+    @brief
+        Sets the id of the QuestHint to be added to the player the QuestEffect is invoked on.
+    @param id
+        The QuestHint id.
+    @param
+        Returns true if successful.
+    */
+    bool AddQuestHint::setHintId(const std::string & id)
     {
         if(!QuestItem::isId(id))
         {
             COUT(2) << "Invalid id. QuestItem id {" << id << "} could not be set." << std::endl;
-            return;
+            return false;
         }
+        
         this->hintId_ = id;
+        return true;
     }
 
     /**
     @brief
-        Invokes the effect.
+        Invokes the QuestEffect.
     @param player
         The player.
     @return
-        Returns true if the effect was successfully invoked.
+        Returns true if the QuestEffect was successfully invoked.
     */
-    bool AddQuestHint::invoke(Player* player)
+    bool AddQuestHint::invoke(PlayerInfo* player)
     {
-        if(player == NULL)
+        if(player == NULL) //!< NULL-pointers are evil!
         {
             COUT(2) << "The input player is NULL." << std::endl;
@@ -88,8 +114,10 @@
         }
 
+        COUT(3) << "AddQuestHint on player: " << player << " ." << std::endl;
+
         try
         {
             QuestHint* hint = QuestManager::findHint(this->hintId_);
-            if(!hint->activate(player))
+            if(hint == NULL || !hint->setActive(player))
             {
                 return false;
@@ -102,4 +130,5 @@
         }
 
+        COUT(3) << "QuestHint {" << this->getHintId() << "} successfully added to player." << std::endl;
         return true;
 
Index: code/trunk/src/orxonox/objects/quest/AddQuestHint.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/AddQuestHint.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/AddQuestHint.h	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file AddQuestHint.h
+    @brief
+    Definition of the AddQuestHint class.
+*/
+
 #ifndef _AddQuestHint_H__
 #define _AddQuestHint_H__
@@ -38,9 +44,11 @@
 namespace orxonox {
 
-    class Player; //Forward declaration, remove when fully integrated into the objecthirarchy.
-
     /**
     @brief
-        Adds a QuestHint, resp. Activates the QuestHint.
+        Adds a QuestHint, resp. activates the QuestHint of the given id for the player the QuestEffect is invoked on.
+        
+    Creating a AddQuestHint through XML goes as follows:
+        
+        <AddQuestHint hintId="id" />  //Where id is a GUID, see http://en.wikipedia.org/wiki/Globally_Unique_Identifier#Basic_structure for more information, and identifies the QuestHint that should be added.
     @author
         Damian 'Mozork' Frick
@@ -52,14 +60,18 @@
             virtual ~AddQuestHint();
 
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a AddQuestHint object through XML.
 
-            virtual bool invoke(Player* player); //!< Invokes the effect.
+            virtual bool invoke(PlayerInfo* player); //!< Invokes the QuestEffect.
 
         private:
-            std::string hintId_;
+            std::string hintId_; //!< The id of the QuestHint.
 
+            /**
+            @brief Returns the id of the QuestHint.
+            @return Returns the id of the QuestHint.
+            */
             inline const std::string & getHintId(void) const
                 { return this->hintId_; }
-            void setHintId(const std::string & id);
+            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 2171)
+++ code/trunk/src/orxonox/objects/quest/AddReward.cc	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file AddReward.cc
+    @brief
+    Implementation of the AddReward class.
+*/
+
 #include "OrxonoxStableHeaders.h"
 #include "AddReward.h"
@@ -32,4 +38,5 @@
 #include "core/CoreIncludes.h"
 
+#include "orxonox/objects/infos/PlayerInfo.h"
 #include "Rewardable.h"
 
@@ -38,9 +45,11 @@
     CreateFactory(AddReward);
 
+    /**
+    @brief
+        Constructor. Registers the object.
+    */
     AddReward::AddReward(BaseObject* creator) : QuestEffect(creator)
     {
         RegisterObject(AddReward);
-
-        this->initialize();
     }
 
@@ -53,4 +62,7 @@
     }
 
+    /**
+        Method for creating a AddReward object through XML.
+    */
     void AddReward::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
@@ -58,16 +70,16 @@
 
         XMLPortObject(AddReward, Rewardable, "", addRewardable, getRewardables, xmlelement, mode);
-
+        
+        COUT(3) << "New AddReward, with " << this->rewards_.size() << " Rewardables created." << std::endl;
     }
 
     /**
     @brief
-        Initializes the object. Needs to be called first by every constructor of this class.
+        Returns the Rewardable object at the given index.
+    @param index
+        The index.
+    @return
+        Returns a pointer to the Rewardable object at the given index.
     */
-    void AddReward::initialize(void)
-    {
-        RegisterObject(AddReward);
-    }
-
     const Rewardable* AddReward::getRewardables(unsigned int index) const
     {
@@ -86,11 +98,11 @@
     /**
     @brief
-        Invokes the effect.
+        Invokes the QuestEffect.
     @param player
         The player.
     @return
-        Returns true if the effect was invoked successfully.
+        Returns true if the QuestEffect was invoked successfully.
     */
-    bool AddReward::invoke(Player* player)
+    bool AddReward::invoke(PlayerInfo* player)
     {
         bool check = true;
Index: code/trunk/src/orxonox/objects/quest/AddReward.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/AddReward.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/AddReward.h	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file AddReward.h
+    @brief
+    Definition of the AddReward class.
+*/
+
 #ifndef _AddReward_H__
 #define _AddReward_H__
@@ -39,9 +45,15 @@
 namespace orxonox {
 
-    class Player; //Forward declaration, remove when fully integrated into the objecthirarchy.
-
     /**
     @brief
-        Adds a list of rewards to a player.
+        Adds a list of Rewardables to a player.
+        
+        Creating a AddReward through XML goes as follows:
+        
+        <AddReward>
+            <Rewardable /> //A list of Rewardable objects to be rewarded the player, see the specific Rewardables for their respective XML representations.
+            ...
+            <Rewardable />
+        </AddReward>
     @author
         Damian 'Mozork' Frick
@@ -53,16 +65,18 @@
             virtual ~AddReward();
 
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a AddReward object through XML.
 
-            virtual bool invoke(Player* player); //!< Invokes the effect.
+            virtual bool invoke(PlayerInfo* player); //!< Invokes the QuestEffect.
 
         private:
-            std::list<Rewardable*> rewards_;
+            std::list<Rewardable*> rewards_; //!< A list of Rewardables to be added to the player invoking the QuestEffect.
 
-            void initialize(void); //!< Initializes the object.
-
+            /**
+            @brief Add a Rewardable object to the list of objects to be awarded to the player invoking the QuestEffect.
+            @param reward Pointer to the Rewardable to be added.
+            */
             inline void addRewardable(Rewardable* reward)
                 { this->rewards_.push_back(reward); }
-            const Rewardable* getRewardables(unsigned int index) const;
+            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 2171)
+++ code/trunk/src/orxonox/objects/quest/CMakeLists.txt	(revision 2261)
@@ -11,4 +11,5 @@
   QuestDescription.cc
   QuestEffect.cc
+  QuestEffectBeacon.cc
   QuestHint.cc
   QuestItem.cc
Index: code/trunk/src/orxonox/objects/quest/ChangeQuestStatus.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/ChangeQuestStatus.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/ChangeQuestStatus.cc	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file ChangeQuestStatus.cc
+    @brief
+    Implementation of the ChangeQuestStatus class.
+*/
+
 #include "OrxonoxStableHeaders.h"
 #include "ChangeQuestStatus.h"
@@ -36,4 +42,8 @@
 namespace orxonox {
 
+    /**
+    @brief
+        Constructor. Registers the object.
+    */
     ChangeQuestStatus::ChangeQuestStatus(BaseObject* creator) : QuestEffect(creator)
     {
@@ -49,14 +59,8 @@
     }
 
-    void ChangeQuestStatus::setQuestId(const std::string & id)
-    {
-        if(!QuestItem::isId(id))
-        {
-            COUT(2) << "Invalid id. QuestItem id {" << id << "} could not be set." << std::endl;
-            return;
-        }
-        this->questId_ = id;
-    }
-
+    /**
+    @brief
+        Method for creating a ChangeQuestStatus object through XML.
+    */
     void ChangeQuestStatus::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
@@ -66,3 +70,23 @@
     }
 
+    /**
+    @brief
+        Sets the id of the Quest the Questffect changes the status of.
+    @param id
+        The id of the Quest.
+    @return
+        Returns true if successful.
+    */
+    bool ChangeQuestStatus::setQuestId(const std::string & id)
+    {
+        if(!QuestItem::isId(id))
+        {
+            COUT(2) << "Invalid id. QuestItem id {" << id << "} could not be set." << std::endl;
+            return false;
+        }
+        
+        this->questId_ = id;
+        return true;
+    }
+
 }
Index: code/trunk/src/orxonox/objects/quest/ChangeQuestStatus.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/ChangeQuestStatus.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/ChangeQuestStatus.h	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file ChangeQuestStatus.h
+    @brief
+    Definition of the ChangeQuestStatus class.
+*/
+
 #ifndef _ChangeQuestStatus_H__
 #define _ChangeQuestStatus_H__
@@ -39,9 +45,7 @@
 namespace orxonox {
 
-    class Player; //Forward declaration, remove when fully integrated into the objecthirarchy.
-
     /**
     @brief
-        An effect which changes a quests status.
+        A QuestEffect which changes the status of a specified Quest for the player invoking the QuestEffect.
     @author
         Damian 'Mozork' Frick
@@ -53,16 +57,20 @@
             virtual ~ChangeQuestStatus();
 
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a ChangeQuestStatus object through XML.
 
-            virtual bool invoke(Player* player) = 0; //!< Invokes the effect.
+            virtual bool invoke(PlayerInfo* player) = 0; //!< Invokes the QuestEffect.
 
         protected:
-            inline const std::string & getQuestId(void) const //!< Returns the quest id.
+            /**
+                @brief Returns the id of the Quest.
+                @return Returns the id of the Quest.
+            */
+            inline const std::string & getQuestId(void) const
                 { return this->questId_; }
 
-            std::string questId_; //!< The id of the quest the status should be changed of.
-
         private:
-            void setQuestId(const std::string & id);
+            std::string questId_; //!< The id of the Quest the status should be changed of.
+            
+            bool setQuestId(const std::string & id); //!< Sets the id of the Quest.
 
     };
Index: code/trunk/src/orxonox/objects/quest/CompleteQuest.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/CompleteQuest.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/CompleteQuest.cc	(revision 2261)
@@ -26,4 +26,10 @@
  *
  */
+ 
+/**
+    @file CompleteQuest.cc
+    @brief
+    Implementation of the CompleteQuest class.
+*/
 
 #include "OrxonoxStableHeaders.h"
@@ -33,4 +39,5 @@
 #include "util/Exception.h"
 
+#include "orxonox/objects/infos/PlayerInfo.h"
 #include "QuestManager.h"
 #include "Quest.h"
@@ -40,4 +47,8 @@
     CreateFactory(CompleteQuest);
 
+    /**
+    @brief
+        Constructor. Registers the object.
+    */
     CompleteQuest::CompleteQuest(BaseObject* creator) : ChangeQuestStatus(creator)
     {
@@ -53,20 +64,26 @@
     }
 
+    /**
+    @brief
+        Method for creating a CompleteQuest object through XML.
+    */
     void CompleteQuest::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
         SUPER(CompleteQuest, XMLPort, xmlelement, mode);
+        
+        COUT(3) << "New CompleteQuest, with target Quest {" << this->getQuestId() << "}, created." << std::endl;
     }
 
     /**
     @brief
-        Invokes the effect.
+        Invokes the QuestEffect.
     @param player
-        The player the effect is invoked on.
+        The player the QuestEffect is invoked on.
     @return
-        Returns true if the effect was invoked successfully.
+        Returns true if the QuestEffect was invoked successfully.
     */
-    bool CompleteQuest::invoke(Player* player)
+    bool CompleteQuest::invoke(PlayerInfo* player)
     {
-        if(player == NULL)
+        if(player == NULL) //!< You know, what we think of NULL-pointers...
         {
             COUT(2) << "Input player is NULL." << std::endl;
@@ -74,8 +91,12 @@
         }
 
+        COUT(3) << "CompleteQuest on player: " << player << " ." << std::endl;
+
+        Quest* quest;
+
         try
         {
-            Quest* quest = QuestManager::findQuest(this->getQuestId());
-            if(!quest->complete(player))
+            quest = QuestManager::findQuest(this->getQuestId());
+            if(quest == NULL || !quest->complete(player))
             {
                return false;
@@ -88,4 +109,5 @@
         }
 
+        COUT(3) << "Quest {" << quest->getId() << "} successfully completed by player: " << player << " ." << std::endl;
         return true;
     }
Index: code/trunk/src/orxonox/objects/quest/CompleteQuest.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/CompleteQuest.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/CompleteQuest.h	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file CompleteQuest.h
+    @brief
+    Definition of the CompleteQuest class.
+*/
+
 #ifndef _CompleteQuest_H__
 #define _CompleteQuest_H__
@@ -39,9 +45,11 @@
 namespace orxonox {
 
-    class Player; //Forward declaration, remove when fully integrated into the objecthirarchy.
-
     /**
     @brief
-        Completes a quest.
+        Completes a Quest (with a specified id) for the player invoking the QuestEffect.
+        
+        Creating a CompleteQuest through XML goes as follows:
+        
+        <CompleteQuest questId="id" />  //Where id is a GUID, see http://en.wikipedia.org/wiki/Globally_Unique_Identifier#Basic_structure for more information, and identifies the Quest that should be completed.
     @author
         Damian 'Mozork' Frick
@@ -53,7 +61,7 @@
             virtual ~CompleteQuest();
 
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a CompleteQuest object through XML.
 
-            virtual bool invoke(Player* player); //!< Invokes the effect.
+            virtual bool invoke(PlayerInfo* player); //!< Invokes the QuestEffect.
 
     };
Index: code/trunk/src/orxonox/objects/quest/FailQuest.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/FailQuest.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/FailQuest.cc	(revision 2261)
@@ -26,4 +26,10 @@
  *
  */
+ 
+/**
+    @file FailQuest.cc
+    @brief
+    Implementation of the FailQuest class.
+*/
 
 #include "OrxonoxStableHeaders.h"
@@ -33,4 +39,5 @@
 #include "util/Exception.h"
 
+#include "orxonox/objects/infos/PlayerInfo.h"
 #include "QuestManager.h"
 #include "Quest.h"
@@ -40,4 +47,8 @@
     CreateFactory(FailQuest);
 
+    /**
+    @brief
+        Constructor. Registers the object.
+    */
     FailQuest::FailQuest(BaseObject* creator) : ChangeQuestStatus(creator)
     {
@@ -53,20 +64,26 @@
     }
 
+    /**
+    @brief
+        Method for creating a FailQuest object through XML.
+    */
     void FailQuest::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
         SUPER(FailQuest, XMLPort, xmlelement, mode);
+        
+        COUT(3) << "New FailQUest, with target Quest {" << this->getQuestId() << "}, created." << std::endl;
     }
 
     /**
     @brief
-        Invokes the effect.
+        Invokes the QuestEffect.
     @param player
-        The player the effect is invoked on.
+        The player the QuestEffect is invoked on.
     @return
-        Returns true if the effect was invoked successfully.
+        Returns true if the QuestEffect was invoked successfully.
     */
-    bool FailQuest::invoke(Player* player)
+    bool FailQuest::invoke(PlayerInfo* player)
     {
-        if(player == NULL)
+        if(player == NULL) //!< We don't know what to do with no player.
         {
             COUT(2) << "Input player is NULL." << std::endl;
@@ -74,8 +91,11 @@
         }
 
+        COUT(3) << "FailQuest on player: " << player << " ." << std::endl;
+
+        Quest* quest;
         try
         {
-            Quest* quest = QuestManager::findQuest(this->getQuestId());
-            if(!quest->fail(player))
+            quest = QuestManager::findQuest(this->getQuestId());
+            if(quest == NULL || !quest->fail(player))
             {
                return false;
@@ -87,5 +107,6 @@
             return false;
         }
-
+        
+        COUT(3) << "Quest {" << quest->getId() << "} failed by player: " << player << " ." << std::endl;
         return true;
     }
Index: code/trunk/src/orxonox/objects/quest/FailQuest.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/FailQuest.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/FailQuest.h	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file FailQuest.h
+    @brief
+    Definition of the FailQuest class.
+*/
+
 #ifndef _FailQuest_H__
 #define _FailQuest_H__
@@ -39,9 +45,11 @@
 namespace orxonox {
 
-    class Player; //Forward declaration, remove when fully integrated into the objecthirarchy.
-
     /**
     @brief
-        Fails a quest.
+        Fails a quest (with a specified id) for the player invoking the QuestEffect.
+        
+        Creating a FailQuest through XML goes as follows:
+        
+        <FailQuest questId="id" />  //Where id is a GUID, see http://en.wikipedia.org/wiki/Globally_Unique_Identifier#Basic_structure for more information, and identifies the Quest that should be failed.
     @author
         Damian 'Mozork' Frick
@@ -53,7 +61,7 @@
             virtual ~FailQuest();
 
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a FailQuest object through XML.
 
-            virtual bool invoke(Player* player); //!< Invokes the effect.
+            virtual bool invoke(PlayerInfo* player); //!< Invokes the QuestEffect.
 
     };
Index: code/trunk/src/orxonox/objects/quest/GlobalQuest.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/GlobalQuest.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/GlobalQuest.cc	(revision 2261)
@@ -26,11 +26,20 @@
  *
  */
+ 
+/**
+    @file GlobalQuest.cc
+    @brief
+    Implementation of the GlobalQuest class.
+*/
 
 #include "OrxonoxStableHeaders.h"
 #include "GlobalQuest.h"
 
+#include "orxonox/objects/infos/PlayerInfo.h"
 #include "core/CoreIncludes.h"
 #include "util/Exception.h"
 
+#include "QuestEffect.h"
+
 namespace orxonox {
 
@@ -39,11 +48,9 @@
     /**
     @brief
-        Constructor.
+        Constructor. Registers the object.
     */
     GlobalQuest::GlobalQuest(BaseObject* creator) : Quest(creator)
     {
         RegisterObject(GlobalQuest);
-
-        this->initialize();
     }
 
@@ -56,20 +63,79 @@
 
     }
-
+    
+    /**
+    @brief
+        Method for creating a GlobalQuest object through XML.
+    */
     void GlobalQuest::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
         SUPER(GlobalQuest, XMLPort, xmlelement, mode);
+        
+        XMLPortObject(GlobalQuest, QuestEffect, "reward-effects", addRewardEffect, getRewardEffects, xmlelement, mode);
 
         COUT(3) << "New GlobalQuest {" << this->getId() << "} created." << std::endl;
     }
-
-    void GlobalQuest::initialize(void)
-    {
-        RegisterObject(GlobalQuest);
-    }
-
-    /**
-    @brief
-        Checks whether the quest can be started.
+    
+    /**
+    @brief
+        Fails the Quest for all players.
+        Invokes the fail QuestEffects on all the players possessing this Quest.
+    @param player
+        The player failing it.
+    @return
+        Returns true if the Quest could be failed, false if not.
+    */
+    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;
+    }
+
+    /**
+    @brief
+        Completes the Quest for all players.
+        Invokes the complete QuestEffects on all the players possessing this Quest.
+        Invokes the reward QuestEffects on the player completing the Quest.
+    @param player
+        The player completing it.
+    @return
+        Returns true if the Quest could be completed, false if not.
+    */
+    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;
+    }
+
+    /**
+    @brief
+        Checks whether the Quest can be started.
     @param player
         The player for whom is to be checked.
@@ -79,20 +145,24 @@
         Throws an exception if either isInactive() of isActive() throws one.
     */
-    bool GlobalQuest::isStartable(const Player* player) const
-    {
-        return this->isInactive(player) ||  this->isActive(player);
-    }
-
-    /**
-    @brief
-        Checks whether the quest can be failed.
+    bool GlobalQuest::isStartable(const PlayerInfo* player) const
+    {
+        if(!(this->getParentQuest() == NULL || this->getParentQuest()->isActive(player)))
+        {
+            return false;
+        }
+        return (this->isInactive(player) && !(this->status_ == questStatus::completed || this->status_ == questStatus::failed));
+    }
+
+    /**
+    @brief
+        Checks whether the Quest can be failed.
     @param player
         The player for whom is to be checked.
     @return
-        Returns true if the quest can be failed, false if not.
+        Returns true if the Quest can be failed, false if not.
     @throws
         Throws an Exception if isActive() throws one.
     */
-    bool GlobalQuest::isFailable(const Player* player) const
+    bool GlobalQuest::isFailable(const PlayerInfo* player) const
     {
         return this->isActive(player);
@@ -102,13 +172,13 @@
     /**
     @brief
-        Checks whether the quest can be completed.
+        Checks whether the Quest can be completed.
     @param player
         The player for whom is to be checked.
     @return
-        Returns true if the quest can be completed, false if not.
+        Returns true if the Quest can be completed, false if not.
     @throws
         Throws an Exception if isActive() throws one.
     */
-    bool GlobalQuest::isCompletable(const Player* player) const
+    bool GlobalQuest::isCompletable(const PlayerInfo* player) const
     {
         return this->isActive(player);
@@ -117,5 +187,5 @@
     /**
     @brief
-        Returns the status of the quest for a specific player.
+        Returns the status of the Quest for a specific player.
     @param player
         The player.
@@ -123,22 +193,19 @@
         Throws an Exception if player is NULL.
     */
-    questStatus::Enum GlobalQuest::getStatus(const Player* player) const
-    {
-        if(player == NULL)
-        {
-            ThrowException(Argument, "The input Player* is NULL.");
-        }
-
-        //TDO: Does this really work???
-        std::set<Player*>::const_iterator it = this->players_.find((Player*)(void*)player);
-        if (it != this->players_.end())
+    questStatus::Enum GlobalQuest::getStatus(const PlayerInfo* player) const
+    {
+        if(player == NULL) //!< We don't want NULL-Pointers!
+        {
+            ThrowException(Argument, "The input PlayerInfo* is NULL.");
+        }
+
+        //! Find the player.
+        std::set<PlayerInfo*>::const_iterator it = this->players_.find((PlayerInfo*)(void*)player);
+        if (it != this->players_.end()) //!< If the player was found.
         {
             return this->status_;
         }
-        else
-        {
-           return questStatus::inactive;
-        }
-
+
+    return questStatus::inactive;
     }
 
@@ -154,19 +221,65 @@
         Returns false if player is NULL.
     */
-    bool GlobalQuest::setStatus(Player* player, const questStatus::Enum & status)
-    {
-        if(player == NULL)
+    bool GlobalQuest::setStatus(PlayerInfo* player, const questStatus::Enum & status)
+    {
+        if(player == NULL) //!< We don't want NULL-Pointers!
         {
             return false;
         }
 
-        std::set<Player*>::const_iterator it = this->players_.find(player);
+        //! Find the player.
+        std::set<PlayerInfo*>::const_iterator it = this->players_.find(player);
         if (it == this->players_.end()) //!< Player is not yet in the list.
         {
-            this->players_.insert(player);
-        }
-        this->status_ = status;
+            this->players_.insert(player); //!< Add the player to the set.
+        }
+        
+        this->status_ = status; //!< Set the status, which is global, remember...?
         return true;
     }
+    
+    /**
+    @brief
+        Adds a reward QuestEffect to the list of reward QuestEffects.
+    @param effect
+        The QuestEffect to be added.
+    @return
+        Returns true if successful.
+    */
+    bool GlobalQuest::addRewardEffect(QuestEffect* effect)
+    {
+        if(effect == NULL) //!< We don't want NULL-Pointers!
+        {
+            COUT(2) << "The reward effect to be added to quest {" << this->getId() << "} was NULL." << std::endl;
+            return false;
+        }
+
+        this->rewards_.push_back(effect); //!< Add the QuestEffect to the list.
+
+        COUT(3) << "Reward effect was added to Quest {" << this->getId() << "}." << std::endl;
+        return true;
+    }
+    
+    /**
+    @brief
+        Returns the reward QuestEffect at the given index.
+    @param index
+        The index.
+    @return
+        Returns the QuestEffect at the given index.
+    */
+    const QuestEffect* GlobalQuest::getRewardEffects(unsigned int index) const
+    {
+        int i = index;
+        for (std::list<QuestEffect*>::const_iterator effect = this->rewards_.begin(); effect != this->rewards_.end(); ++effect)
+        {
+            if(i == 0)
+            {
+               return *effect;
+            }
+            i--;
+        }
+        return NULL;
+    }
 
 
Index: code/trunk/src/orxonox/objects/quest/GlobalQuest.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/GlobalQuest.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/GlobalQuest.h	(revision 2261)
@@ -26,4 +26,10 @@
  *
  */
+ 
+/**
+    @file GlobalQuest.h
+    @brief
+    Definition of the GlobalQuest class.
+*/
 
 #ifndef _GlobalQuest_H__
@@ -33,4 +39,5 @@
 
 #include <set>
+#include <list>
 
 #include "core/XMLPort.h"
@@ -39,10 +46,39 @@
 namespace orxonox {
 
-    class Player; //Forward declaration, remove when fully integrated into the objecthirarchy.
-
     /**
     @brief
-        Global quests are quests, that have the same status for all players.
-        This means, that when a player successfully completes this quest, it is completed for all players that have it.
+        GlobalQuests are Quests, that have the same status for all players.
+        This means, that when a player successfully completes a GlobalQuest, it is completed for all players that have it.
+        
+        Creating a GlobalQuest through XML goes as follows:
+        
+        <GlobalQuest id="questId"> //Where questId is a GUID, see http://en.wikipedia.org/wiki/Globally_Unique_Identifier#Basic_structure for more information
+            <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>
+            <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.
+                ...
+                <QuestEffect />
+            </fail-effects>
+            <complete-effects>
+                <QuestEffect /> //A list of QuestEffects, invoked on all players possessing this quest, when the Quest is completed, see QuestEffect for the full XML representation.
+                ...
+                <QuestEffect />
+            </complete-effects>
+            <reward-effects>
+                <QuestEffect /> //A list of QuestEffects, invoked on the player completing this quest. See QuestEffect for the full XML representation.
+                ...
+                <QuestEffect />
+            </reward-effects>
+        </GlobalQuest>
     @author
         Damian 'Mozork' Frick
@@ -54,19 +90,25 @@
             virtual ~GlobalQuest();
 
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a GlobalQuest object through XML.
+            
+            virtual bool fail(PlayerInfo* player); //!< Fails the Quest.
+            virtual bool complete(PlayerInfo* player); //!< Completes the Quest.
 
         protected:
-            virtual bool isStartable(const Player* player) const; //!< Checks whether the quest can be started.
-            virtual bool isFailable(const Player* player) const; //!< Checks whether the quest can be failed.
-            virtual bool isCompletable(const Player* player) const; //!< Checks whether the quest can be completed.
+            virtual bool isStartable(const PlayerInfo* player) const; //!< Checks whether the Quest can be started.
+            virtual bool isFailable(const PlayerInfo* player) const; //!< Checks whether the Quest can be failed.
+            virtual bool isCompletable(const PlayerInfo* player) const; //!< Checks whether the Quest can be completed.
 
-            virtual questStatus::Enum getStatus(const Player* player) const; //!< Returns the status of the quest for a specific player.
-            virtual bool setStatus(Player* player, const questStatus::Enum & status); //!< Sets the status for a specific player.
+            virtual questStatus::Enum getStatus(const PlayerInfo* player) const; //!< Returns the status of the Quest for a specific player.
+            
+            virtual bool setStatus(PlayerInfo* player, const questStatus::Enum & status); //!< Sets the status for a specific player.
 
         private:
-            std::set<Player*> players_; //!< The set of players which possess this quest.
-            questStatus::Enum status_; //!< The status of this quest.
-
-            void initialize(void);
+            std::set<PlayerInfo*> players_; //!< The set of players which possess this Quest.
+            questStatus::Enum status_; //!< The status of this Quest.
+            std::list<QuestEffect*> rewards_; //!< Reward QuestEffects only invoked on the player completing the Quest.
+            
+            bool addRewardEffect(QuestEffect* effect); //!< Adds a reward QuestEffect to the list of reward QuestEffects.
+            const QuestEffect* getRewardEffects(unsigned int index) const; //!< Returns the reward QuestEffect at the given index.
 
     };
Index: code/trunk/src/orxonox/objects/quest/LocalQuest.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/LocalQuest.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/LocalQuest.cc	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file LocalQuest.cc
+    @brief
+    Implementation of the LocalQuest class.
+*/
+
 #include "OrxonoxStableHeaders.h"
 #include "LocalQuest.h"
@@ -33,13 +39,18 @@
 #include "util/Exception.h"
 
+#include "orxonox/objects/infos/PlayerInfo.h"
+#include "QuestEffect.h"
+
 namespace orxonox {
 
     CreateFactory(LocalQuest);
 
+    /**
+    @brief
+        Constructor. Registers and initializes the object.
+    */
     LocalQuest::LocalQuest(BaseObject* creator) : Quest(creator)
     {
         RegisterObject(LocalQuest);
-
-        this->initialize();
     }
 
@@ -53,4 +64,8 @@
     }
 
+    /**
+    @brief
+        Method for creating a LocalQuest object through XML.
+    */
     void LocalQuest::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
@@ -60,21 +75,64 @@
     }
 
-    void LocalQuest::initialize(void)
-    {
-        RegisterObject(LocalQuest);
-    }
-
-    /**
-    @brief
-        Checks whether the quest can be started.
+    /**
+    @brief
+        Fails the Quest for a given player.
+        Invokes all the failEffects on the player.
+    @param player
+        The player.
+    @return
+        Returns true if the Quest could be failed, false if not.
+    */
+    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;
+    }
+
+    /**
+    @brief
+        Completes the Quest for a given player.
+    Invokes all the complete QuestEffects on the player.
+    @param player
+        The player.
+    @return
+        Returns true if the Quest could be completed, false if not.
+    */
+    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;
+    }
+
+    /**
+    @brief
+        Checks whether the Quest can be started.
     @param player
         The player for whom is to be checked.
     @return
-        Returns true if the quest can be started, false if not.
-    @throws
-        Throws an exception if isInactive(Player*) throws one.
-    */
-    bool LocalQuest::isStartable(const Player* player) const
-    {
+        Returns true if the Quest can be started, false if not.
+    @throws
+        Throws an exception if isInactive(PlayerInfo*) throws one.
+    */
+    bool LocalQuest::isStartable(const PlayerInfo* player) const
+    {
+        if(!(this->getParentQuest() == NULL || this->getParentQuest()->isActive(player)))
+        {
+            return false;
+        }
         return this->isInactive(player);
     }
@@ -82,13 +140,13 @@
     /**
     @brief
-        Checks whether the quest can be failed.
+        Checks whether the Quest can be failed.
     @param player
         The player for whom is to be checked.
     @return
-        Returns true if the quest can be failed, false if not.
-    @throws
-        Throws an exception if isActive(Player*) throws one.
-    */
-    bool LocalQuest::isFailable(const Player* player) const
+        Returns true if the Quest can be failed, false if not.
+    @throws
+        Throws an exception if isActive(PlayerInfo*) throws one.
+    */
+    bool LocalQuest::isFailable(const PlayerInfo* player) const
     {
         return this->isActive(player);
@@ -97,13 +155,13 @@
     /**
     @brief
-        Checks whether the quest can be completed.
+        Checks whether the Quest can be completed.
     @param player
         The player for whom is to be checked.
     @return
-        Returns true if the quest can be completed, false if not.
-    @throws
-        Throws an exception if isInactive(Player*) throws one.
-    */
-    bool LocalQuest::isCompletable(const Player* player) const
+        Returns true if the Quest can be completed, false if not.
+    @throws
+        Throws an exception if isInactive(PlayerInfo*) throws one.
+    */
+    bool LocalQuest::isCompletable(const PlayerInfo* player) const
     {
         return this->isActive(player);
@@ -112,25 +170,26 @@
     /**
     @brief
-        Returns the status of the quest for a specific player.
+        Returns the status of the Quest for a specific player.
     @param player
         The player.
     @return
-        Returns the status of the quest for the input player.
+        Returns the status of the Quest for the input player.
     @throws
         Throws an Exception if player is NULL.
     */
-    questStatus::Enum LocalQuest::getStatus(const Player* player) const
-    {
-        if(player == NULL)
-        {
-            ThrowException(Argument, "The input Player* is NULL.");
-        }
-
-        std::map<Player*, questStatus::Enum>::const_iterator it = this->playerStatus_.find((Player*)(void*)player); //Thx. to x3n for the (Player*)(void*) 'hack'.
-        if (it != this->playerStatus_.end())
+    questStatus::Enum LocalQuest::getStatus(const PlayerInfo* player) const
+    {
+        if(player == NULL) //!< No player has no defined status.
+        {
+            ThrowException(Argument, "The input PlayerInfo* is NULL.");
+        }
+
+        std::map<const PlayerInfo*, questStatus::Enum>::const_iterator it = this->playerStatus_.find(player);
+        if (it != this->playerStatus_.end()) //!< If there is a player in the map.
         {
             return it->second;
         }
-        return questStatus::inactive;
+        
+        return questStatus::inactive; //!< If the player is not yet in the map, that means the status of the quest form him is 'inactive'.
     }
 
@@ -138,18 +197,19 @@
     @brief
         Sets the status for a specific player.
-        But be careful wit this one, the status will just be set without checking for its validity. You have to know what you're doing.
-    @param player
-        The player.
+        But be careful wit this one, the status will just be set without checking for its validity. You have to know what you're doing. Really!
+    @param player
+        The player the status should be set for.
     @param status
-        The status.
+        The status to be set.
     @return
         Returns false if player is NULL.
     */
-    bool LocalQuest::setStatus(Player* player, const questStatus::Enum & status)
-    {
-        if(player == NULL)
+    bool LocalQuest::setStatus(PlayerInfo* player, const questStatus::Enum & status)
+    {
+        if(player == NULL) //!< We can't set a status for no player.
         {
             return false;
         }
+        
         this->playerStatus_[player] = status;
         return true;
Index: code/trunk/src/orxonox/objects/quest/LocalQuest.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/LocalQuest.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/LocalQuest.h	(revision 2261)
@@ -26,4 +26,10 @@
  *
  */
+ 
+/**
+    @file LocalQuest.h
+    @brief
+    Definition of the LocalQuest class.
+*/
 
 #ifndef _LocalQuest_H__
@@ -40,9 +46,34 @@
 namespace orxonox {
 
-    class Player; //Forward declaration, remove when fully integrated into the objecthirarchy.
-
     /**
     @brief
-        Handles quests which have different states for different players.
+        Handles Quests which have different states for different players.
+        LocalQuests have (as opposed to GlobalQuests) a different state for each player, that means if for one player the status of the Quest changes it does not for all the other players which also possess this quest.
+        
+        Creating a LocalQuest through XML goes as follows:
+        
+        <LocalQuest id="questId"> //Where questId is a GUID, see http://en.wikipedia.org/wiki/Globally_Unique_Identifier#Basic_structure for more information
+            <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>
+            <fail-effects>
+                <QuestEffect /> //A list of QuestEffects, invoked when the Quest is failed, see QuestEffect for the full XML representation.
+                ...
+                <QuestEffect />
+            </fail-effects>
+            <complete-effects>
+                <QuestEffect /> //A list of QuestEffects, invoked when the Quest is completed, see QuestEffect for the full XML representation.
+                ...
+                <QuestEffect />
+            </complete-effects>
+        </LocalQuest>
     @author
         Damian 'Mozork' Frick
@@ -54,21 +85,21 @@
             virtual ~LocalQuest();
 
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a LocalQuest object through XML.
+            
+            virtual bool fail(PlayerInfo* player); //!< Fails the Quest.
+            virtual bool complete(PlayerInfo* player); //!< Completes the Quest.
 
         protected:
-            virtual bool isStartable(const Player* player) const; //!< Checks whether the quest can be started.
-            virtual bool isFailable(const Player* player) const; //!< Checks whether the quest can be failed.
-            virtual bool isCompletable(const Player* player) const; //!< Checks whether the quest can be completed.
+            virtual bool isStartable(const PlayerInfo* player) const; //!< Checks whether the Quest can be started.
+            virtual bool isFailable(const PlayerInfo* player) const; //!< Checks whether the Quest can be failed.
+            virtual bool isCompletable(const PlayerInfo* player) const; //!< Checks whether the Quest can be completed.
 
-            virtual questStatus::Enum getStatus(const Player* player) const; //!< Returns the status of the quest for a specific player.
-            virtual bool setStatus(Player* player, const questStatus::Enum & status); //!< Sets the status for a specific player.
+            virtual questStatus::Enum getStatus(const PlayerInfo* player) const; //!< Returns the status of the Quest for a specific player.
+            virtual bool setStatus(PlayerInfo* player, const questStatus::Enum & status); //!< Sets the status for a specific player.
 
         private:
-            std::map<Player*, questStatus::Enum> playerStatus_; //!< List of the status for each player, with the Player-pointer as key.
-
-            void initialize(void);
+            std::map<const PlayerInfo*, questStatus::Enum> playerStatus_; //!< List of the status for each player, with the Player-pointer as key.
 
     };
-
 
 }
Index: code/trunk/src/orxonox/objects/quest/Quest.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/Quest.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/Quest.cc	(revision 2261)
@@ -26,4 +26,10 @@
  *
  */
+ 
+/**
+    @file Quest.cc
+    @brief
+    Implementation of the Quest class.
+*/
 
 #include "OrxonoxStableHeaders.h"
@@ -32,4 +38,5 @@
 #include "core/CoreIncludes.h"
 
+#include "orxonox/objects/infos/PlayerInfo.h"
 #include "QuestManager.h"
 #include "QuestDescription.h"
@@ -39,9 +46,13 @@
 namespace orxonox {
 
+    /**
+    @brief
+        Constructor. Registers and initializes object.
+    */
     Quest::Quest(BaseObject* creator) : QuestItem(creator)
     {
         RegisterObject(Quest);
 
-        this->initialize();
+        this->parentQuest_ = NULL;
     }
 
@@ -55,38 +66,31 @@
     }
 
+    /**
+    @brief
+        Method for creating a Quest object through XML.
+    */
     void Quest::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
         SUPER(Quest, XMLPort, xmlelement, mode);
 
-        XMLPortObject(Quest, Quest, "", addSubQuest, getSubQuests, xmlelement, mode);
-        XMLPortObject(Quest, QuestHint, "", addHint, getHints, xmlelement, mode);
-        XMLPortObject(Quest, QuestEffect, "fail-effects", addFailEffect, getFailEffects, xmlelement, mode);
-        XMLPortObject(Quest, QuestEffect, "complete-effects", addCompleteEffect, getCompleteEffects, xmlelement, mode);
-
-        QuestManager::registerQuest(this); //Registers the quest with the QuestManager.
-    }
-
-    /**
-    @brief
-        Initializes the object. Needs to be called first in every constructor of this class.
-    */
-    void Quest::initialize(void)
-    {
-        RegisterObject(Quest);
-
-        this->parentQuest_ = NULL;
-    }
-
-    /**
-    @brief
-        Sets the parent quest of the quest.
+        XMLPortObject(Quest, Quest, "subquests", addSubQuest, getSubQuest, xmlelement, mode);
+        XMLPortObject(Quest, QuestHint, "hints", addHint, getHint, xmlelement, mode);
+        XMLPortObject(Quest, QuestEffect, "fail-effects", addFailEffect, getFailEffect, xmlelement, mode);
+        XMLPortObject(Quest, QuestEffect, "complete-effects", addCompleteEffect, getCompleteEffect, xmlelement, mode);
+
+        QuestManager::registerQuest(this); //!<Registers the Quest with the QuestManager.
+    }
+
+    /**
+    @brief
+        Sets the parentquest of the Quest.
     @param quest
-        A pointer to the quest to be set as parent quest.
-    @return
-        Returns true if the parentQuest could be set.
+        A pointer to the Quest to be set as parentquest.
+    @return
+        Returns true if the parentquest could be set.
     */
     bool Quest::setParentQuest(Quest* quest)
     {
-        if(quest == NULL)
+        if(quest == NULL) //!< We don't want to set NULL-Pointers.
         {
             COUT(2) << "The parentquest to be added to quest {" << this->getId() << "} was NULL." << std::endl;
@@ -102,13 +106,13 @@
     /**
     @brief
-        Adds a sub quest to the quest.
+        Adds a subquest to the Quest.
     @param quest
-        A pointer to the quest to be set as sub quest.
-    @return
-        Returns true if the subQuest vould be set.
+        A pointer to the Quest to be set as subquest.
+    @return
+        Returns true if the subquest could be set.
     */
     bool Quest::addSubQuest(Quest* quest)
     {
-        if(quest == NULL)
+        if(quest == NULL) //!< We don't want to set NULL-Pointers.
         {
             COUT(2) << "The subquest to be added to quest {" << this->getId() << "} was NULL." << std::endl;
@@ -116,6 +120,6 @@
         }
 
-        quest->setParentQuest(this);
-        this->subQuests_.push_back(quest);
+        quest->setParentQuest(this); //!< Sets the currentQuest (this) as parentquest for the added subquest.
+        this->subQuests_.push_back(quest); //!< Adds the Quest to the end of the list of subquests.
 
         COUT(3) << "Sub Quest {" << quest->getId() << "} was added to Quest {" << this->getId() << "}." << std::endl;
@@ -126,7 +130,7 @@
     /**
     @brief
-        Adds a Hint to the list of hints
+        Adds a QuestHint to the list of QuestHints
     @param hint
-        The hint that should be added to the list of hints.
+        The QuestHint that should be added to the list of QuestHints.
     @return
         Returns true if the hint was successfully added.
@@ -134,5 +138,5 @@
     bool Quest::addHint(QuestHint* hint)
     {
-        if(hint == NULL)
+        if(hint == NULL) //!< We don't want to set NULL-Pointers. Seriously!
         {
             COUT(2) << "A NULL-QuestHint was trying to be added." << std::endl;
@@ -140,6 +144,6 @@
         }
 
-        this->hints_.push_back(hint);
-        hint->setQuest(this);
+        hint->setQuest(this); //!< Sets the current Quest (this) as Quest for the added QuestHint.
+        this->hints_.push_back(hint); //!< Adds the QuestHint to the end of the list of QuestHints.
 
         COUT(3) << "QuestHint {" << hint->getId() << "} was added to Quest {" << this->getId() << "}." << std::endl;
@@ -149,9 +153,13 @@
     /**
     @brief
-
+        Adds an QuestEffect to the list of fail QuestEffects.
+    @param effect
+        The QuestEffect to be added.
+    @return
+        Returns true if successful.
     */
     bool Quest::addFailEffect(QuestEffect* effect)
     {
-        if(effect == NULL)
+        if(effect == NULL) //!< We don't want to set NULL-Pointers.
         {
             COUT(2) << "A NULL-QuestEffect was trying to be added" << std::endl;
@@ -159,5 +167,5 @@
         }
 
-        this->failEffects_.push_back(effect);
+        this->failEffects_.push_back(effect); //!< Adds the QuestEffect to the end of the list of fail QuestEffects.
 
         COUT(3) << "A FailEffect was added to Quest {" << this->getId() << "}." << std::endl;
@@ -167,9 +175,13 @@
     /**
     @brief
-
+        Adds an QuestEffect to the list of complete QuestEffects.
+    @param effect
+        The QuestEffect to be added.
+    @return
+        Returns true if successful.
     */
     bool Quest::addCompleteEffect(QuestEffect* effect)
     {
-        if(effect == NULL)
+        if(effect == NULL) //!< We don't want to set NULL-Pointers.
         {
             COUT(2) << "A NULL-QuestEffect was trying to be added" << std::endl;
@@ -177,5 +189,5 @@
         }
 
-        this->completeEffects_.push_back(effect);
+        this->completeEffects_.push_back(effect); //!< Adds the QuestEffect to the end of the list of complete QuestEffects.
 
         COUT(3) << "A CompleteEffect was added to Quest {" << this->getId() << "}." << std::endl;
@@ -185,5 +197,7 @@
     /**
     @brief
-
+        Returns the parentquest of the Quest.
+    @return
+        Returns a pointer to the parentquest of the Quest.
     */
     const Quest* Quest::getParentQuest(void)
@@ -194,12 +208,18 @@
     /**
     @brief
-
-    */
-    const Quest* Quest::getSubQuests(unsigned int index) const
+        Returns the subquest at the given index.
+    @param
+        The index.
+    @return
+        Returns a pointer to the subquest at the given index. NULL if there is no element at the given index.
+    */
+    const Quest* Quest::getSubQuest(unsigned int index) const
     {
         int i = index;
+        
+        //! Iterate through all subquests.
         for (std::list<Quest*>::const_iterator subQuest = this->subQuests_.begin(); subQuest != this->subQuests_.end(); ++subQuest)
         {
-            if(i == 0)
+            if(i == 0) //!< We're counting down...
             {
                return *subQuest;
@@ -207,17 +227,24 @@
             i--;
         }
-        return NULL;
-    }
-
-    /**
-    @brief
-
-    */
-    const QuestHint* Quest::getHints(unsigned int index) const
+        
+        return NULL; //!< If the index is greater than the number of elements in the list.
+    }
+
+    /**
+    @brief
+        Returns the QuestHint at the given index.
+    @param
+        The index.
+    @return
+        Returns a pointer to the QuestHint at the given index. NULL if there is no element at the given index.
+    */
+    const QuestHint* Quest::getHint(unsigned int index) const
     {
         int i = index;
+        
+        //! Iterate through all QuestHints.
         for (std::list<QuestHint*>::const_iterator hint = this->hints_.begin(); hint != this->hints_.end(); ++hint)
         {
-            if(i == 0)
+            if(i == 0) //!< We're counting down...
             {
                return *hint;
@@ -225,17 +252,23 @@
             i--;
         }
-        return NULL;
-    }
-
-    /**
-    @brief
-
-    */
-    const QuestEffect* Quest::getFailEffects(unsigned int index) const
+        return NULL; //!< If the index is greater than the number of elements in the list.
+    }
+
+    /**
+    @brief
+        Returns the fail QuestEffect at the given index.
+    @param
+        The index.
+    @return
+        Returns a pointer to the fail QuestEffect at the given index. NULL if there is no element at the given index.
+    */
+    const QuestEffect* Quest::getFailEffect(unsigned int index) const
     {
         int i = index;
+        
+        //! Iterate through all fail QuestEffects.
         for (std::list<QuestEffect*>::const_iterator effect = this->failEffects_.begin(); effect != this->failEffects_.end(); ++effect)
         {
-            if(i == 0)
+            if(i == 0) //!< We're counting down...
             {
                return *effect;
@@ -243,17 +276,23 @@
             i--;
         }
-        return NULL;
-    }
-
-    /**
-    @brief
-
-    */
-    const QuestEffect* Quest::getCompleteEffects(unsigned int index) const
+        return NULL; //!< If the index is greater than the number of elements in the list.
+    }
+
+    /**
+    @brief
+        Returns the complete QuestEffect at the given index.
+    @param
+        The index.
+    @return
+        Returns a pointer to the complete QuestEffect at the given index. NULL if there is no element at the given index.
+    */
+    const QuestEffect* Quest::getCompleteEffect(unsigned int index) const
     {
         int i = index;
+        
+        //! Iterate through all complete QuestEffects.
         for (std::list<QuestEffect*>::const_iterator effect = this->completeEffects_.begin(); effect != this->completeEffects_.end(); ++effect)
         {
-            if(i == 0)
+            if(i == 0) //!< We're counting down...
             {
                return *effect;
@@ -261,5 +300,5 @@
             i--;
         }
-        return NULL;
+        return NULL; //!< If the index is greater than the number of elements in the list.
     }
 
@@ -274,5 +313,5 @@
         Throws an exception if getStatus throws one.
     */
-    bool Quest::isInactive(const Player* player) const
+    bool Quest::isInactive(const PlayerInfo* player) const
     {
         return this->getStatus(player) == questStatus::inactive;
@@ -289,5 +328,5 @@
         Throws an exception if getStatus throws one.
     */
-    bool Quest::isActive(const Player* player) const
+    bool Quest::isActive(const PlayerInfo* player) const
     {
 
@@ -305,5 +344,5 @@
         Throws an exception if getStatus throws one.
     */
-    bool Quest::isFailed(const Player* player) const
+    bool Quest::isFailed(const PlayerInfo* player) const
     {
         return this->getStatus(player) == questStatus::failed;
@@ -320,5 +359,5 @@
         Throws an exception if getStatus throws one.
     */
-    bool Quest::isCompleted(const Player* player) const
+    bool Quest::isCompleted(const PlayerInfo* player) const
     {
         return this->getStatus(player) == questStatus::completed;
@@ -327,60 +366,21 @@
     /**
     @brief
-        Starts the quest.
-    @param player
-        The player.
-    @return
-        Returns true if the quest could be started, false if not.
-    */
-    bool Quest::start(Player* player)
-    {
-        if(this->isStartable(player))
+        Starts the Quest for an input player.
+    @param player
+        The player.
+    @return
+        Returns true if the Quest could be started, false if not.
+    */
+    bool Quest::start(PlayerInfo* player)
+    {
+        if(this->isStartable(player)) //!< Checks whether the quest can be started.
         {
             this->setStatus(player, questStatus::active);
             return true;
         }
-        COUT(2) << "A non-startable quest was trying to be started." << std::endl;
+        
+        COUT(4) << "A non-startable quest was trying to be started." << std::endl;
         return false;
     }
 
-    /**
-    @brief
-        Fails the quest.
-    @param player
-        The player.
-    @return
-        Returns true if the quest could be failed, false if not.
-    */
-    bool Quest::fail(Player* player)
-    {
-        if(this->isFailable(player))
-        {
-            this->setStatus(player, questStatus::failed);
-            QuestEffect::invokeEffects(player, this->failEffects_);
-            return true;
-        }
-        COUT(2) << "A non-failable quest was trying to be failed." << std::endl;
-        return false;
-    }
-
-    /**
-    @brief
-        Completes the quest.
-    @param player
-        The player.
-    @return
-        Returns true if the quest could be completed, false if not.
-    */
-    bool Quest::complete(Player* player)
-    {
-        if(this->isCompletable(player))
-        {
-            this->setStatus(player, questStatus::completed);
-            QuestEffect::invokeEffects(player, this->completeEffects_);
-            return true;
-        }
-        COUT(2) << "A non-completable quest was trying to be completed." << std::endl;
-        return false;
-    }
-
 }
Index: code/trunk/src/orxonox/objects/quest/Quest.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/Quest.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/Quest.h	(revision 2261)
@@ -26,5 +26,13 @@
  *
  */
-
+ 
+/**
+    @file Quest.h
+    @brief
+    Definition of the Quest class.
+    
+    The Quest is the parent class of LocalQuest and GlobalQuest.
+*/
+ 
 #ifndef _Quest_H__
 #define _Quest_H__
@@ -36,4 +44,5 @@
 
 #include "core/XMLPort.h"
+
 #include "QuestItem.h"
 
@@ -41,4 +50,5 @@
 {
 
+    //!Different states of a Quest.
     enum Enum
     {
@@ -53,11 +63,13 @@
 namespace orxonox {
 
-    class Player; //Forward declaration, remove when fully integrated into the objecthirarchy.
-
     /**
     @brief
-        Represents a quest in the game.
-        A quest has a list of subquests and a parentquest (if it is not a rootquest).
-        Each quest exists only once but it has a different status (inactive, active, failed or completed) for each player.
+        Represents a Quest in the game.
+        A Quest has a list of subquests and a parentquest (if it is not a rootquest).
+        Each Quest exists only once but it has a different status (inactive, active, failed or completed) for each player.
+        A Quest has several hints (QuestHint) that can be unlocked through QuestEffects and then display aid in solving the Quest.
+        A Quest has a list of QuestEffects that are invoked when the quest is failed and also a list of QuestEffects that are invoked, when the Quest is completed.
+        
+        Quest itself should not be instantiated, if you want to create a quest either go for LocalQuest or GlobalQuest, whichever suits you needs better.
     @author
         Damian 'Mozork' Frick
@@ -69,49 +81,78 @@
             virtual ~Quest();
 
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a Quest object through XML.
 
-            inline Quest* getParentQuest(void) const //!< Returns the parent quest of the quest.
+            /**
+            @brief Returns the parentquest of the Quest.
+            @return Returns a pointer to the parentquest of the Quest.
+            */
+            inline Quest* getParentQuest(void) const
                 { return this->parentQuest_; }
-            inline const std::list<Quest*> & getSubQuestList(void) const //!< Returns the list of sub quests.
-                { return this->subQuests_; }
-
-            bool isInactive(const Player* player) const; //!< Returns true if the quest status for the specific player is 'inactive'.
-            bool isActive(const Player* player) const; //!< Returns true if the quest status for the specific player is 'active'.
-            bool isFailed(const Player* player) const; //!< Returns true if the quest status for the specific player is 'failed'.
-            bool isCompleted(const Player* player) const; //!< Returns true if the quest status for the specific player is 'completed'.
-
-            bool start(Player* player); //!< Sets a quest to active.
-            bool fail(Player* player); //!< Fails the quest.
-            bool complete(Player* player); //!< 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) = 0; //!< Fails the Quest.
+	    virtual bool complete(PlayerInfo* player) = 0; //!< Completes the Quest.
 
         protected:
-            void initialize(void); //!< Initialized the object.
+            virtual bool isStartable(const PlayerInfo* player) const = 0; //!< Checks whether the Quest can be started.
+            virtual bool isFailable(const PlayerInfo* player) const = 0; //!< Checks whether the Quest can be failed.
+            virtual bool isCompletable(const PlayerInfo* player) const = 0; //!< Checks whether the Quest can be completed.
 
-            virtual bool isStartable(const Player* player) const = 0; //!< Checks whether the quest can be started.
-            virtual bool isFailable(const Player* player) const = 0; //!< Checks whether the quest can be failed.
-            virtual bool isCompletable(const Player* player) const = 0; //!< Checks whether the quest can be completed.
+            const Quest* getParentQuest(void); //!< Returns the parentquest of the Quest.
+            const Quest* getSubQuest(unsigned int index) const; //!<Returns the subquest at the given index.
+            const QuestHint* getHint(unsigned int index) const; //!< Returns the QuestHint at the given index.
+            const QuestEffect* getFailEffect(unsigned int index) const; //!< Returns the fail QuestEffect at the given index.
+            const QuestEffect* getCompleteEffect(unsigned int index) const; //!< Returns the complete QuestEffect at the given index.
+            
+            /**
+            @brief Returns the list of fail QuestEffects.
+            @return Returns a reference to the list of fail QuestEffects.
+            */
+            inline std::list<QuestEffect*> & getFailEffectList(void)
+                { 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)
+                { return this->completeEffects_; }
 
-            bool setParentQuest(Quest* quest); //!< Sets the parent quest of the quest.
-            bool addSubQuest(Quest* quest); //!< Adds a sub quest to the quest.
-            bool addHint(QuestHint* hint); //!< Add a hint to the list of hints.
-            bool addFailEffect(QuestEffect* effect);
-            bool addCompleteEffect(QuestEffect* effect);
+            virtual questStatus::Enum getStatus(const PlayerInfo* player) const = 0; //!< Returns the status of the Quest for a specific player.
+            virtual bool setStatus(PlayerInfo* player, const questStatus::Enum & status) = 0; //!< Changes the status for a specific player.
+            
+    private:
+            Quest* parentQuest_; //!< Pointer to the parentquest.
+            std::list<Quest*> subQuests_; //!< List of all the subquests.
 
-            const Quest* getParentQuest(void);
-            const Quest* getSubQuests(unsigned int index) const;
-            const QuestHint* getHints(unsigned int index) const;
-            const QuestEffect* getFailEffects(unsigned int index) const;
-            const QuestEffect* getCompleteEffects(unsigned int index) const;
+            std::list<QuestHint*> hints_; //!< A list of all the QuestHints tied to this Quest.
 
-            virtual questStatus::Enum getStatus(const Player* player) const = 0; //!< Returns the status of the quest for a specific player.
-            virtual bool setStatus(Player* player, const questStatus::Enum & status) = 0; //!< Changes the status for a specific player.
-
-            Quest* parentQuest_; //!< Pointer to the parent quest.
-            std::list<Quest*> subQuests_; //!< List of all the sub quests.
-
-            std::list<QuestHint*> hints_; //!< A list of all the hints tied to this quest.
-
-            std::list<QuestEffect*> failEffects_; //!< A list of all effects to be invoked, when the quest has been failed.
-            std::list<QuestEffect*> completeEffects_; //!< A list of effects to be invoked, when the quest has been completed.
+            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.
+            
+            bool setParentQuest(Quest* quest); //!< Sets the parentquest of the Quest.
+            bool addSubQuest(Quest* quest); //!< Adds a subquest to the Quest.
+            bool addHint(QuestHint* hint); //!< Add a QuestHint to the list of QuestHints.
+            bool addFailEffect(QuestEffect* effect); //!< Adds an QuestEffect to the list of fail QuestEffects.
+            bool addCompleteEffect(QuestEffect* effect); //!< Adds an QuestEffect to the list of complete QuestEffects.
 
     };
Index: code/trunk/src/orxonox/objects/quest/QuestDescription.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestDescription.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/QuestDescription.cc	(revision 2261)
@@ -27,5 +27,12 @@
  */
 
+/**
+    @file QuestDescription.cc
+    @brief
+    Implementation of the QuestDescription class.
+*/
+
 #include "OrxonoxStableHeaders.h"
+
 #include "QuestDescription.h"
 
@@ -36,11 +43,20 @@
     CreateFactory(QuestDescription);
 
+    /**
+    @brief
+        Constructor. Registers and initializes the object.
+    */
     QuestDescription::QuestDescription(BaseObject* creator) : BaseObject(creator)
     {
         RegisterObject(QuestDescription);
-
-        this->initialize();
+        
+        this->title_ = "";
+        this->description_ = "";
     }
 
+    /**
+    @brief
+        Destructor.
+    */
     QuestDescription::~QuestDescription()
     {
@@ -48,4 +64,8 @@
     }
 
+    /**
+    @brief
+        Method for creating a QuestDescription object through XML.
+    */
     void QuestDescription::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
@@ -58,13 +78,4 @@
     }
 
-    /**
-    @brief
-        Initializes the object. Has to be called first in every constructor of this class.
-    */
-    void QuestDescription::initialize(void)
-    {
-        RegisterObject(QuestDescription);
-    }
-
 
 }
Index: code/trunk/src/orxonox/objects/quest/QuestDescription.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestDescription.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/QuestDescription.h	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file QuestDescription.h
+    @brief
+    Definition of the QuestDescription class.
+*/
+
 #ifndef _QuestDescription_H__
 #define _QuestDescription_H__
@@ -43,4 +49,8 @@
         This class is a description of a QuestItem.
         It holds a title and a description.
+        
+        Creating a QuestDescription through XML goes as follows:
+        
+        <QuestDescription title="Title" description="Description Text" />
     @author
         Damian 'Mozork' Frick
@@ -52,21 +62,37 @@
             virtual ~QuestDescription();
 
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a QuestDescription object through XML.
 
-            inline const std::string & getTitle(void) const //!< Returns the title.
+        /**
+        @brief Returns the title.
+        @return Returns a string containing the title of the QuestDescription.
+        */
+            inline const std::string & getTitle(void) const
                 { return this->title_; }
-            inline const std::string & getDescription(void) const //!< Returns the description text.
+        
+        /**
+        @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_; }
 
         private:
-            void initialize(void);
-
-            inline void setTitle(const std::string & title) //!< Sets the title.
-                { this->title_ = title; }
-            inline void setDescription(const std::string & description) //!< Sets the description text.
-                { this->description_ = description; }
-
             std::string title_; //!< The title.
             std::string description_; //!< The description.
+
+            /**
+            @brief Sets the title.
+            @param title The title to be set.
+            */
+            inline void setTitle(const std::string & title)
+                { this->title_ = title; }
+                
+        /**
+            @brief Sets the description text.
+            @param description The description text to be set.
+            */
+            inline void setDescription(const std::string & description)
+                { this->description_ = description; }
 
     };
Index: code/trunk/src/orxonox/objects/quest/QuestEffect.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestEffect.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/QuestEffect.cc	(revision 2261)
@@ -27,8 +27,16 @@
  */
 
+/**
+    @file QuestEffect.cc
+    @brief
+    Implementation of the QuestEffect class.
+*/
+
 #include "OrxonoxStableHeaders.h"
 #include "QuestEffect.h"
 
 #include "core/CoreIncludes.h"
+
+#include "orxonox/objects/infos/PlayerInfo.h"
 
 namespace orxonox {
@@ -55,13 +63,13 @@
     /**
     @brief
-        Static method. Invoke all effects of an effect list.
+        Static method. Invoke all QuestEffects in an QuestEffect-list on a given player.
     @param player
-        The player the effects are invoked on.
+        The player the QuestEffects are invoked on.
     @param effects
-        A list of all the effects to be invoked.
+        A list of all the QuestEffects to be invoked.
     @return
         Returns false if there was an error, view console of log for further detail.
     */
-    bool QuestEffect::invokeEffects(Player* player, std::list<QuestEffect*> & effects)
+    bool QuestEffect::invokeEffects(PlayerInfo* player, std::list<QuestEffect*> & effects)
     {
         bool check = true;
Index: code/trunk/src/orxonox/objects/quest/QuestEffect.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestEffect.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/QuestEffect.h	(revision 2261)
@@ -26,4 +26,10 @@
  *
  */
+ 
+/**
+    @file QuestEffect.h
+    @brief
+    Definition of the QuestEffect class.
+*/
 
 #ifndef _QuestEffect_H__
@@ -38,9 +44,8 @@
 namespace orxonox {
 
-    class Player; //Forward declaration, remove when fully integrated into the objecthirarchy.
-
     /**
     @brief
-        Handles effects for quests.
+        Handles QuestEffects for Quests.
+        QuestEffects are the only way for Quests to have any sideeffects in the game world. They are also the only way for a player to gain, complete or fail Quests.
     @author
         Damian 'Mozork' Frick
@@ -52,6 +57,6 @@
             virtual ~QuestEffect();
 
-            virtual bool invoke(Player* player) = 0; //!< Invokes the effect.
-            static bool invokeEffects(Player* player, std::list<QuestEffect*> & effects); //!< Invokes all effects in the list.
+            virtual bool invoke(PlayerInfo* player) = 0; //!< Invokes the QuestEffect.
+            static bool invokeEffects(PlayerInfo* player, std::list<QuestEffect*> & effects); //!< Invokes all QuestEffects in the list.
 
 
Index: code/trunk/src/orxonox/objects/quest/QuestEffectBeacon.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestEffectBeacon.cc	(revision 2261)
+++ code/trunk/src/orxonox/objects/quest/QuestEffectBeacon.cc	(revision 2261)
@@ -0,0 +1,268 @@
+/*
+ *   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 QuestEffectBeacon.cc
+    @brief
+    Implementation of the QuestEffectBeacon class.
+*/
+
+#include "OrxonoxStableHeaders.h"
+#include "QuestEffectBeacon.h"
+
+#include "core/CoreIncludes.h"
+#include "core/XMLPort.h"
+#include "core/Event.h"
+#include "core/EventIncludes.h"
+
+#include "orxonox/objects/infos/PlayerInfo.h"
+#include "orxonox/objects/worldentities/ControllableEntity.h"
+#include "orxonox/objects/worldentities/triggers/PlayerTrigger.h"
+#include "QuestEffect.h"
+
+namespace orxonox {
+
+    CreateFactory(QuestEffectBeacon);
+
+    /**
+    @brief
+        Constructor. Registers the object and initializes defaults.
+    */
+    QuestEffectBeacon::QuestEffectBeacon(BaseObject* creator) : PositionableEntity(creator)
+    {
+        RegisterObject(QuestEffectBeacon);
+        
+        this->status_ = QuestEffectBeaconStatus::active;
+        this->times_ = INFINITE;
+    }
+
+    /**
+        Destructor.
+    */
+    QuestEffectBeacon::~QuestEffectBeacon()
+    {
+    }
+    
+    /**
+    @brief
+        Method for creating a QuestEffectBeacon object through XML.
+    */
+    void QuestEffectBeacon::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(QuestEffectBeacon, XMLPort, xmlelement, mode);
+
+        XMLPortParam(QuestEffectBeacon, "times", setTimes, getTimes, xmlelement, mode);
+        XMLPortObject(QuestEffectBeacon, QuestEffect, "effects", addEffect, getEffect, xmlelement, mode);
+        
+        COUT(3) << "New QuestEffectBeacon created." << std::endl;
+    }
+    
+    /**
+    @brief
+        Processes an event for this QuestEffectBeacon.
+    */
+    void QuestEffectBeacon::processEvent(Event& event)
+    {
+        SUPER(QuestEffectBeacon, processEvent, event);
+    
+    SetSubclassEvent(QuestEffectBeacon, "execute", execute, event, PlayerTrigger);
+    }
+    
+    /**
+    @brief
+        Executes the QuestEffectBeacon.
+        This means extracting the ControllableEntity from the PlayerTrigger, provided by the Event causing the execution, and the extracting the PlayerInfo from the received ControllableEntity and invoking the QuestEffectbeacon's QuestEffects on the received PlayerInfo.
+    @param trigger
+        Apointer to the PlayerTrigger that threw the Event.
+    @return
+        Returns true if successfully executed, false if not.
+    */
+    bool QuestEffectBeacon::execute(bool b, PlayerTrigger* trigger)
+    {
+        if(!b)
+        {
+            return false;
+        }
+        if(!(this->isActive())) //!< If the QuestEffectBeacon is inactive it cannot be executed.
+        {
+            COUT(3) << "The QuestEffectBeacon is inactive." << std::endl;
+            return false;
+        }
+        
+        if(!trigger->isForPlayer()) //!< The PlayerTrigger is not exclusively for ControllableEntities which means we cannot extract one.
+        {
+            return false;
+        }
+
+        //! Extracting the ControllableEntity form the PlayerTrigger.
+        ControllableEntity* entity = trigger->getTriggeringPlayer();
+
+        if(entity == NULL)
+        {
+            COUT(2) << "The QuestEffectBeacon was triggered by an entity other than a ControllableEntity." << std::endl;
+            return false;
+        }
+        
+        //! Extract the PlayerInfo from the ControllableEntity.
+        PlayerInfo* player = entity->getPlayer();
+        
+        if(player == NULL)
+        {
+            COUT(3) << "The PlayerInfo* is NULL." << std::endl;
+            return false;
+        }
+
+        COUT(3) << "QuestEffectBeacon executed on player: " << player << " ." << std::endl;
+
+        bool check = QuestEffect::invokeEffects(player, this->effects_); //!< Invoke the QuestEffects on the PlayerInfo.
+        if(check)
+        {
+            this->decrementTimes(); //!< Decrement the number of times the beacon can be used.
+            return true;
+    }
+
+    return false;
+    }
+    
+    /**
+    @brief
+        Set the status of the QuestEffectBeacon.
+    @param activate
+        If true the QuestEffectBeacon is activated, if false it is deactivated.
+    @return
+        Returns whether the activation/deactivation was successful.
+    */
+    bool QuestEffectBeacon::setActive(bool activate)
+    {
+        if(this->getTimes() == 0 && activate) //!< A QuestEffectBeacon that can be executed only 0 times is always inactive.
+        {
+            return false;
+        }
+        
+        if(activate)
+        {
+        this->status_ = QuestEffectBeaconStatus::active;
+        return true;
+        }
+        
+        this->status_ = QuestEffectBeaconStatus::inactive;
+        return true;
+    }
+    
+    /**
+    @brief
+        Decrement the number of times the QuestEffectBeacon can be executed.
+    @return
+        Returns true if successful.
+    */
+    bool QuestEffectBeacon::decrementTimes(void)
+    {
+        if(!(this->isActive())) //!< The QuestEffectBeacon mus be active to decrement the number of times it can be executed.
+        {
+            return false;
+        }
+        if(this->getTimes() == INFINITE) //!< If times is infinity the QuestEffectBeacon can be executed an infinite number fo times.
+        {
+            return true;
+        }
+        
+        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.
+    {
+            this->status_ = QuestEffectBeaconStatus::inactive;
+    }
+        
+        return true;
+    }
+    
+    /**
+    @brief
+        Set the number of times the QuestEffectBeacon can be executed.
+        The number must be eighter <= 0, or INFINITY which is '-1'.
+    @param n
+        The number of times the QuestEffectBeacon can be executed.
+        The number must be eighter <= 0, or INFINITY which is '-1'.
+    @return
+        Returns true if successful.
+    */
+    bool QuestEffectBeacon::setTimes(const int & n)
+    {
+        if(n < 0 && n != INFINITE)
+        {
+            return false;
+        }
+        
+        this->times_ = n;
+        return true;
+    }
+    
+    /**
+    @brief
+        Adds a QuestEffect to the QuestEffectBeacon.
+    @param effect
+        A pointer to the QuestEffect to be added.
+    @return
+        Returns true if successful.
+    */
+    bool QuestEffectBeacon::addEffect(QuestEffect* effect)
+    {
+        if(effect == NULL) //!< NULL-pointers are not well liked here...
+        {
+            COUT(2) << "A NULL-QuestEffect was trying to be added" << std::endl;
+            return false;
+        }
+
+        this->effects_.push_back(effect);
+
+        COUT(3) << "A QuestEffect was added to a QuestEffectBeacon." << std::endl;
+        return true;
+    }
+    
+    /**
+    @brief
+        Returns the QuestEffect at the given index.
+    @param index
+        The index.
+    @return
+        Returns a pointer to the QuestEffect at the given index.
+    */
+    const QuestEffect* QuestEffectBeacon::getEffect(unsigned int index) const
+    {
+        int i = index;
+        for (std::list<QuestEffect*>::const_iterator effect = this->effects_.begin(); effect != this->effects_.end(); ++effect)
+        {
+            if(i == 0)
+            {
+               return *effect;
+            }
+            i--;
+        }
+        return NULL;
+    }
+
+}
Index: code/trunk/src/orxonox/objects/quest/QuestEffectBeacon.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestEffectBeacon.h	(revision 2261)
+++ code/trunk/src/orxonox/objects/quest/QuestEffectBeacon.h	(revision 2261)
@@ -0,0 +1,130 @@
+/*
+ *   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 QuestEffectBeacon.h
+    @brief
+    Definition of the QuestEffectBeacon class.
+*/
+
+#ifndef _QuestEffectBeacon_H__
+#define _QuestEffectBeacon_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "orxonox/objects/worldentities/PositionableEntity.h"
+
+namespace QuestEffectBeaconStatus
+{
+
+    //! The status of the beacon, can be either active or inactive.
+    enum Enum
+    {
+        inactive,
+        active
+    };
+
+}
+
+namespace orxonox {
+
+    /**
+    @brief
+        A QuestEffectBeacon is a physical entity in the game which can (under some condition(s)) invoke a number QuestEffects on players meeting the condition(s).
+        The conditions under which the QuestEffects are invoked on the player are defined by Triggers.
+        A QuestEffectBeacon can be executed a defined number of times.
+        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.
+            <effects>
+                <QuestEffect /> //A list of QuestEffects, invoked when the QuestEffectBeacon is executed, see QuestEffect for the full XML representation.
+                ...
+                <QuestEffect />
+            </effects>
+            <events>
+        <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
+    {
+    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.
+            
+            /**
+            @brief Returns the number of times the QUestEffectBeacon can still be executed.
+            @return Returns the number of times the QUestEffectBeacon can still be executed.
+            */
+            inline const int & getTimes(void) const
+                { return this->times_; }
+
+        private:
+            static const int INFINITE = -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.
+            QuestEffectBeaconStatus::Enum status_; //!< The status of the QUestEffectBeacon, Can be eighter active or inactive.
+            
+            bool setTimes(const int & n); //!< Set the number of times the QuestEffectBeacon can be executed.
+            bool addEffect(QuestEffect* effect); //!< Add a QuestEffect to the QuestEffectBeacon.
+            
+            const QuestEffect* getEffect(unsigned int index) const; //!< Get the QuestEffect at a given index.
+    
+    };
+
+}
+
+#endif /* _QuestEffectBeacon_H__ */
Index: code/trunk/src/orxonox/objects/quest/QuestHint.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestHint.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/QuestHint.cc	(revision 2261)
@@ -26,4 +26,10 @@
  *
  */
+ 
+/**
+    @file QuestHint.cc
+    @brief
+    Implementation of the QuestHint class.
+*/
 
 #include "OrxonoxStableHeaders.h"
@@ -33,4 +39,6 @@
 #include "util/Exception.h"
 
+#include "orxonox/objects/infos/PlayerInfo.h"
+#include "QuestManager.h"
 #include "Quest.h"
 
@@ -41,11 +49,9 @@
     /**
     @brief
-        Constructor.
+        Constructor. Registers the object.
     */
     QuestHint::QuestHint(BaseObject* creator) : QuestItem(creator)
     {
         RegisterObject(QuestHint);
-
-        this->initialize();
     }
 
@@ -59,13 +65,14 @@
     }
 
-    void QuestHint::initialize(void)
-    {
-        RegisterObject(QuestHint);
-    }
-
+    /**
+    @brief
+        Method for creating a QuestHint object through XML.
+    */
     void QuestHint::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
         SUPER(QuestHint, XMLPort, xmlelement, mode);
 
+        QuestManager::registerHint(this); //!< Registers the QuestHint with the QuestManager.
+        
         COUT(3) << "New QuestHint {" << this->getId() << "} created." << std::endl;
     }
@@ -74,5 +81,5 @@
     /**
     @brief
-        Checks whether the hint is active for a specific player.
+        Checks whether the QuestHint is active for a specific player.
     @param player
         The player.
@@ -80,19 +87,21 @@
         Throws an Argument Exception if the input Player-pointer is NULL.
     @return
-        Returns true if the hint is active for the specified player.
+        Returns true if the QuestHint is active for the specified player.
     */
-    bool QuestHint::isActive(Player* player)
+    bool QuestHint::isActive(const PlayerInfo* player) const
     {
-        if(player == NULL)
+        if(player == NULL) //!< NULL-Pointers are ugly!
         {
-            ThrowException(Argument, "The input Player* is NULL.");
+            ThrowException(Argument, "The input PlayerInfo* is NULL.");
             return false;
         }
 
-        std::map<Player*, questHintStatus::Enum>::iterator it = this->playerStatus_.find(player);
-        if (it != this->playerStatus_.end())
+        //! Find the player.
+        std::map<const PlayerInfo*, questHintStatus::Enum>::const_iterator it = this->playerStatus_.find(player);
+        if (it != this->playerStatus_.end()) //!< If the player is in the map.
         {
             return it->second;
         }
+        
         return questStatus::inactive;
     }
@@ -106,9 +115,9 @@
         Returns true if the activation was successful, false if there were problems.
     */
-    bool QuestHint::activate(Player* player)
+    bool QuestHint::setActive(PlayerInfo* player)
     {
-        if(this->quest_->isActive(player))
+        if(this->quest_->isActive(player)) //!< For a hint to get activated the quest must be active.
         {
-            if(!(this->isActive(player)))
+            if(!(this->isActive(player)))  //!< If the hint is already active, activation is pointless.
             {
                 this->playerStatus_[player] = questHintStatus::active;
@@ -121,4 +130,5 @@
             }
         }
+        
         COUT(2) << "A hint of a non-active quest was trying to get activated." << std::endl;
         return false;
@@ -127,11 +137,13 @@
     /**
     @brief
-        Sets the quest the QuestHitn belongs to.
+        Sets the Quest the QuestHint belongs to.
     @param quest
+        The Quest to be set as Quest the QuestHint is attached to.
     @return
+        Returns true if successful.
     */
     bool QuestHint::setQuest(Quest* quest)
     {
-        if(quest == NULL)
+        if(quest == NULL) //!< NULL-Pointer. Again..?
         {
             COUT(2) << "The input Quest* is NULL." << std::endl;
Index: code/trunk/src/orxonox/objects/quest/QuestHint.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestHint.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/QuestHint.h	(revision 2261)
@@ -26,4 +26,10 @@
  *
  */
+ 
+/**
+    @file QuestHint.h
+    @brief
+    Definition of the QuestHint class.
+*/
 
 #ifndef _QuestHint_H__
@@ -41,4 +47,5 @@
 {
 
+    //! The status of the hint.
     enum Enum
     {
@@ -52,11 +59,15 @@
 {
 
-    class Player; //Forward declaration, remove when fully integrated into the objecthirarchy.
-
     /**
     @brief
         Represents a hint in the game towards completing a Quest.
-        Consists of title and description in textual form and must belong to a quest.
-        A QuestHit has a defined status (inactive or active, where inactive is default) for each player, which means each QuestHint exists only once for all players, it doesn't belong to a player, it just has different stati for each of them.
+        Consists of title and description (which is stored in a QuestDescription object) in textual form and must belong to a quest.
+        A QuestHint has a defined status (inactive or active, where inactive is default) for each player, which means each a QuestHint exists only once for all players, it doesn't belong to a player, it just has different states for each of them.
+        
+        Creating a QuestHint through XML goes as follows:
+        
+        <QuestHint id="hintId">  //Where hintId is a GUID, see http://en.wikipedia.org/wiki/Globally_Unique_Identifier#Basic_structure for more information
+            <QuestDesctription title="" description="" />
+        </QuestHint>
     @author
         Damian 'Mozork' Frick
@@ -69,21 +80,21 @@
             virtual ~QuestHint();
 
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a QuestHint object through XML.
 
-            bool isActive(Player* player); //!< Returns true if the hint is active for the input player.
+            bool isActive(const PlayerInfo* player) const; //!< Returns true if the QuestHint is active for the input player.
 
-            bool activate(Player* player); //!< Activates the hint for the input player.
+            bool setActive(PlayerInfo* player); //!< Activates the QuestHint for the input player.
+            bool setQuest(Quest* quest); //!< Sets the Quest the QuestHint belongs to.
 
-            bool setQuest(Quest* quest); //!< Sets the quest the hint belongs to.
-
+            /**
+            @brief Returns the Quest the QuestHint is attached to.
+            @return  Returns a pointer to the Quest the QuestHint is attached to.
+            */
             inline Quest* getQuest(void)
                { return this->quest_; }
 
         private:
-
-            void initialize(void);
-
-            Quest* quest_; //!< The quest the hint belongs to.
-            std::map<Player*, questHintStatus::Enum> playerStatus_; //!< List of the status for each player, with the Player-pointer as key.
+            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.
 
     };
Index: code/trunk/src/orxonox/objects/quest/QuestItem.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestItem.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/QuestItem.cc	(revision 2261)
@@ -26,4 +26,10 @@
  *
  */
+ 
+/**
+    @file QuestItem.cc
+    @brief
+    Implementation of the QuestItem class.
+*/
 
 #include "OrxonoxStableHeaders.h"
@@ -36,9 +42,13 @@
 namespace orxonox {
 
+    /**
+    @brief
+        Constructor. Registers and initializes the object.
+    */
     QuestItem::QuestItem(BaseObject* creator) : BaseObject(creator)
     {
         RegisterObject(QuestItem);
 
-        this->initialize();
+        this->id_ = "";
     }
 
@@ -52,4 +62,8 @@
     }
 
+    /**
+    @brief
+        Method for creating a QuestItem object through XML.
+    */
     void QuestItem::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
@@ -57,39 +71,24 @@
 
         XMLPortParam(QuestItem, "id", setId, getId, xmlelement, mode);
-        //Doesn't getDescription have to be of type getDescription(unsigned int) ?
-        //XMLPortObjectTemplate(QuestItem, QuestDescription, "", setDescription, getDescription, xmlelement, mode, unsigned int);
         XMLPortObject(QuestItem, QuestDescription, "", setDescription, getDescription, xmlelement, mode);
-
     }
-
 
     /**
     @brief
-        Initializes the object.
-        Should be called first in every constructor of this class.
+        Sets the id of the QuestItem.
+    The id must be of GUID form. See 'http://en.wikipedia.org/wiki/Globally_Unique_Identifier#Basic_structure' for more information.
+    @param id
+        The id to be set.
     */
-    void QuestItem::initialize(void)
-    {
-        RegisterObject(QuestItem);
-
-        this->id_ = "";
-    }
-
     void QuestItem::setId(const std::string & id)
     {
-        if(!isId(id))
+        if(!isId(id)) //!< Checks whether the id is a valid id.
         {
             COUT(2) << "Invalid id. QuestItem id {" << id << "} could not be set." << std::endl;
             return;
         }
+        
         this->id_ = id;
     }
-
-    //const QuestDescription* QuestItem::getDescription(unsigned int index) const //!< Returns the description of the QuestItem.
-    //{
-    //    if(index != 0)
-    //        return NULL;
-    //    return this->description_;
-    //}
 
     /**
Index: code/trunk/src/orxonox/objects/quest/QuestItem.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestItem.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/QuestItem.h	(revision 2261)
@@ -26,4 +26,13 @@
  *
  */
+ 
+/**
+    @file QuestItem.h
+    @brief
+    Definition of the QuestItem class.
+    
+    The QuestItem is the parent class of Quest and QuestHint.
+*/
+
 
 #ifndef _QuestItem_H__
@@ -42,5 +51,5 @@
     /**
     @brief
-        Functions as a base class for Quest classes such as Quest or QuestHint.
+        Functions as a base class for quest classes such as Quest or QuestHint.
         Has a unique identifier and a description.
     @author
@@ -54,16 +63,28 @@
             virtual ~QuestItem();
 
-            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a QuestItem object through XML.
 
-            inline const std::string & getId(void) const //!< Returns the id of this quest.
+            /**
+            @brief Returns the id of this QuestItem.
+        @return Returns the id of the QuestItem.
+            */
+            inline const std::string & getId(void) const
                 { return this->id_; }
-            inline const QuestDescription* getDescription(void) const //!< Returns the description 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_; }
-            //const QuestDescription* getDescription(unsigned int index) const; //!< Returns the description of the QuestItem.
 
             static bool isId(const std::string & id); //!< Checks whether a given id is valid.
 
         protected:
-            void setId(const std::string & id);
+            void setId(const std::string & id); //!< Sets the id of the QuestItem.
+            
+            /**
+            @brief Sets the description of the QuestItem.
+            @param description The QuestDescription to be set.
+            */
             inline void setDescription(QuestDescription* description)
                 { this->description_ = description; }
@@ -71,7 +92,5 @@
         private:
             std::string id_; //!< Identifier. Should be of GUID form: http://en.wikipedia.org/wiki/Globally_Unique_Identifier#Basic_structure
-            QuestDescription* description_; //!< The description of the QuestItem.
-
-            void initialize(void); //!< Initializes the object.
+            QuestDescription* description_; //!< The QuestDescription of the QuestItem.
 
     };
Index: code/trunk/src/orxonox/objects/quest/QuestManager.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestManager.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/QuestManager.cc	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file QuestManager.cc
+    @brief
+    Implementation of the QuestManager class.
+*/
+
 #include "OrxonoxStableHeaders.h"
 #include "QuestManager.h"
@@ -38,7 +44,13 @@
 namespace orxonox {
 
-    std::map<std::string, Quest*> QuestManager::questMap_;
-    std::map<std::string, QuestHint*> QuestManager::hintMap_;
-
+    //! All Quests registered by their id's.
+    std::map<std::string, Quest*> QuestManager::questMap_s;
+    //! All QuestHints registered by their id's.
+    std::map<std::string, QuestHint*> QuestManager::hintMap_s;
+
+    /**
+    @brief
+        Constructor. Registers the object.
+    */
     QuestManager::QuestManager(BaseObject* creator) : BaseObject(creator)
     {
@@ -46,5 +58,8 @@
     }
 
-
+    /**
+    @brief
+        Destructor.
+    */
     QuestManager::~QuestManager()
     {
@@ -54,7 +69,8 @@
     /**
     @brief
-        Registers a quest with the QuestManager to make it globally accessable.
+        Registers a Quest with the QuestManager to make it globally accessable.
+        Uses it's id to make sure to be able to be identify and retrieve it later.
     @param quest
-        The quest that is to be registered.
+        The Quest that is to be registered.
     @return
         Returns true if successful, false if not.
@@ -62,5 +78,5 @@
     bool QuestManager::registerQuest(Quest* quest)
     {
-        if(quest == NULL)
+        if(quest == NULL) //!< Doh! Just as if there were actual quests behind NULL-pointers.
         {
             COUT(2) << "Registration of Quest in QuestManager failed, because inserted Quest-pointer was NULL." << std::endl;
@@ -68,8 +84,8 @@
         }
 
-        std::pair<std::map<std::string, Quest*>::iterator,bool> ret;
-        ret = questMap_.insert( std::pair<std::string,Quest*>(quest->getId(),quest) );
-
-        if(ret.second)
+        std::pair<std::map<std::string, Quest*>::iterator,bool> result;
+        result = questMap_s.insert( std::pair<std::string,Quest*>(quest->getId(),quest) ); //!< Inserting the Quest.
+
+        if(result.second) //!< If inserting was a success.
         {
             COUT(3) << "Quest with questId {" << quest->getId() << "} successfully inserted." << std::endl;
@@ -86,4 +102,5 @@
     @brief
         Registers a QuestHint with the QuestManager to make it globally accessable.
+        Uses it's id to make sure to be able to be identify and retrieve it later.
     @param hint
         The QuestHint to be registered.
@@ -93,5 +110,5 @@
     bool QuestManager::registerHint(QuestHint* hint)
     {
-        if(hint == NULL)
+        if(hint == NULL) //!< Still not liking NULL-pointers.
         {
             COUT(2) << "Registration of QuestHint in QuestManager failed, because inserted QuestHint-pointer was NULL." << std::endl;
@@ -99,8 +116,8 @@
         }
 
-        std::pair<std::map<std::string, QuestHint*>::iterator,bool> ret;
-        ret = hintMap_.insert ( std::pair<std::string,QuestHint*>(hint->getId(),hint) );
-
-        if(ret.second)
+        std::pair<std::map<std::string, QuestHint*>::iterator,bool> result;
+        result = hintMap_s.insert ( std::pair<std::string,QuestHint*>(hint->getId(),hint) ); //!< Inserting the QuestHSint.
+
+        if(result.second) //!< If inserting was a success.
         {
             COUT(3) << "QuestHint with hintId {" << hint->getId() << "} successfully inserted." << std::endl;
@@ -116,10 +133,10 @@
     /**
     @brief
-        Finds a quest with the given id.
+        Finds a Quest with the given id.
     @param questId
-        The id of the quest sought for.
-    @return
-        Returns a reference to the quest with the input id.
-        Returns NULL if there is no quest with the given questId.
+        The id of the Quest sought for.
+    @return
+        Returns a pointer to the Quest with the input id.
+        Returns NULL if there is no Quest with the given questId.
     @throws
         Throws an exception if the given questId is invalid.
@@ -127,5 +144,5 @@
     Quest* QuestManager::findQuest(const std::string & questId)
     {
-        if(!QuestItem::isId(questId))
+        if(!QuestItem::isId(questId)) //!< Check vor validity of the given id.
         {
             ThrowException(Argument, "Invalid questId.");
@@ -133,6 +150,6 @@
 
         Quest* quest;
-        std::map<std::string, Quest*>::iterator it = questMap_.find(questId);
-        if (it != questMap_.end())
+        std::map<std::string, Quest*>::iterator it = questMap_s.find(questId);
+        if (it != questMap_s.end()) //!< If the Quest is registered.
         {
             quest = it->second;
@@ -150,10 +167,10 @@
     /**
     @brief
-        Finds a hint with the given id.
+        Finds a QuestHint with the given id.
     @param hintId
-        The id of the hint sought for.
-    @return
-        Returns a reference to the hint with the input id.
-        Returns NULL if there is no hint with the given hintId.
+        The id of the QuestHint sought for.
+    @return
+        Returns a pointer to the QuestHint with the input id.
+        Returns NULL if there is no QuestHint with the given hintId.
     @throws
         Throws an exception if the given hintId is invalid.
@@ -161,5 +178,5 @@
     QuestHint* QuestManager::findHint(const std::string & hintId)
     {
-        if(!QuestItem::isId(hintId))
+        if(!QuestItem::isId(hintId)) //!< Check vor validity of the given id.
         {
             ThrowException(Argument, "Invalid hintId.");
@@ -167,6 +184,6 @@
 
         QuestHint* hint;
-        std::map<std::string, QuestHint*>::iterator it = hintMap_.find(hintId);
-        if (it != hintMap_.end())
+        std::map<std::string, QuestHint*>::iterator it = hintMap_s.find(hintId);
+        if (it != hintMap_s.end()) //!< If the QuestHint is registered.
         {
             hint = it->second;
Index: code/trunk/src/orxonox/objects/quest/QuestManager.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/QuestManager.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/QuestManager.h	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file QuestManager.h
+    @brief
+    Definition of the QuestManager class.
+*/
+
 #ifndef _QuestManager_H__
 #define _QuestManager_H__
@@ -41,6 +47,6 @@
     /**
     @brief
-        Manages quests, by making them globally accessable.
-        Quests (and Hints) are registered in the QuestManager trough their id, and can be accessed in the same way.
+        Is a static class and manages Quests, by registering every Quest/QuestHint (through registerX()) and making them globally accessable (through findX()).
+        Quests (and QuestHints) are registered in the QuestManager with their id, and can be accessed in the same way.
     @author
         Damian 'Mozork' Frick
@@ -53,13 +59,13 @@
             virtual ~QuestManager();
 
-            static bool registerQuest(Quest* quest); //!< Registers a quest in the QuestManager.
+            static bool registerQuest(Quest* quest); //!< Registers a Quest in the QuestManager.
             static bool registerHint(QuestHint* quest); //!< Registers a QuestHint in the QuestManager.
 
-            static Quest* findQuest(const std::string & questId); //!< Returns the quest with the input id.
+            static Quest* findQuest(const std::string & questId); //!< Returns the Quest with the input id.
             static QuestHint* findHint(const std::string & hintId); //!< Returns the QuestHint with the input id.
 
         private:
-            static std::map<std::string, Quest*> questMap_; //!< All quests registered by their id's.
-            static std::map<std::string, QuestHint*> hintMap_; //!< All hints registered by their id's.
+            static std::map<std::string, Quest*> questMap_s; //!< All Quests registered by their id's.
+            static std::map<std::string, QuestHint*> hintMap_s; //!< All QuestHints registered by their id's.
 
     };
Index: code/trunk/src/orxonox/objects/quest/Rewardable.cc
===================================================================
--- code/trunk/src/orxonox/objects/quest/Rewardable.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/Rewardable.cc	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file Rewardable.cc
+    @brief
+    Implementation of the Rewardable class.
+*/
+
 #include "OrxonoxStableHeaders.h"
 #include "Rewardable.h"
@@ -34,5 +40,8 @@
 namespace orxonox {
 
-
+    /**
+    @brief
+        Constructor. Registers the object.
+    */
     Rewardable::Rewardable(BaseObject* creator) : BaseObject(creator)
     {
@@ -40,5 +49,8 @@
     }
 
-
+    /**
+    @brief
+        Destructor,
+    */
     Rewardable::~Rewardable()
     {
Index: code/trunk/src/orxonox/objects/quest/Rewardable.h
===================================================================
--- code/trunk/src/orxonox/objects/quest/Rewardable.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/quest/Rewardable.h	(revision 2261)
@@ -27,4 +27,10 @@
  */
 
+/**
+    @file Rewardable.h
+    @brief
+    Definition of the Rewardable class.
+*/
+
 #ifndef _Rewardable_H__
 #define _Rewardable_H__
@@ -36,9 +42,9 @@
 namespace orxonox {
 
-    class Player; //Forward declaration, remove when fully integrated in objecthirarchy.
-
     /**
     @brief
-        Rewardable is an Interface, that can be implemented by any object to enable it to be given as reward to a player through QuestEffects.
+        Rewardable is an Interface, that can be implemented by any object to enable it to be given as reward to a player through QuestEffects. (With the AddReward effect.)
+        
+        It just needs to inherit form Rewardable, and implement the reward() method.
     @author
         Damian 'Mozork' Frick
@@ -51,5 +57,14 @@
             virtual ~Rewardable();
 
-            virtual bool reward(Player* player) = 0; //!<Method to transcribe a rewardable object to the player.
+            /**
+            @brief
+                Method to transcribe a rewardable object to the player.
+                Must be implemented by every class inheriting from Rewardable.
+        @param player
+                A pointer to the ControllableEntity, do whatever you want with it.
+        @return
+                Return true if successful.
+            */
+            virtual bool reward(PlayerInfo* player) = 0; //!<
 
     };
Index: code/trunk/src/orxonox/objects/worldentities/triggers/CMakeLists.txt
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/triggers/CMakeLists.txt	(revision 2171)
+++ code/trunk/src/orxonox/objects/worldentities/triggers/CMakeLists.txt	(revision 2261)
@@ -3,4 +3,5 @@
   DistanceTrigger.cc
   EventTrigger.cc
+  PlayerTrigger.cc
 )
 
Index: code/trunk/src/orxonox/objects/worldentities/triggers/DistanceTrigger.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/triggers/DistanceTrigger.cc	(revision 2171)
+++ code/trunk/src/orxonox/objects/worldentities/triggers/DistanceTrigger.cc	(revision 2261)
@@ -35,9 +35,11 @@
 #include "core/XMLPort.h"
 
+#include "orxonox/objects/worldentities/ControllableEntity.h"
+
 namespace orxonox
 {
   CreateFactory(DistanceTrigger);
 
-  DistanceTrigger::DistanceTrigger(BaseObject* creator) : Trigger(creator)
+  DistanceTrigger::DistanceTrigger(BaseObject* creator) : PlayerTrigger(creator)
   {
     RegisterObject(DistanceTrigger);
@@ -45,4 +47,5 @@
     this->distance_ = 100;
     this->targetMask_.exclude(Class(BaseObject));
+    this->setForPlayer(false); //!< Normally hasn't just ControllableEntities as targets.
   }
 
@@ -83,4 +86,12 @@
   {
     Identifier* targetId = ClassByString(targets);
+    
+    //! Checks whether the target is (or is derived from) a ControllableEntity.
+    Identifier* controllableEntityId = Class(ControllableEntity);
+    if(targetId->isA(controllableEntityId))
+    {
+      this->setForPlayer(true);
+    }
+    
     if (!targetId)
     {
@@ -117,8 +128,17 @@
       Vector3 distanceVec = entity->getWorldPosition() - this->getWorldPosition();
       if (distanceVec.length() < this->distance_)
+      {
+        
+        //! If the target is a player (resp. is a, or is derived from a, ControllableEntity) the triggeringPlayer is set to the target entity.
+        if(this->isForPlayer())
+	{
+          ControllableEntity* player = dynamic_cast<ControllableEntity*>(entity);
+	  this->setTriggeringPlayer(player);
+	}
+        
         return true;
+      }
     }
     return false;
-
   }
 
@@ -126,5 +146,7 @@
   {
     if (Trigger::isTriggered(mode))
+    {
       return checkDistance();
+    }
     else
       return false;
Index: code/trunk/src/orxonox/objects/worldentities/triggers/DistanceTrigger.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/triggers/DistanceTrigger.h	(revision 2171)
+++ code/trunk/src/orxonox/objects/worldentities/triggers/DistanceTrigger.h	(revision 2261)
@@ -30,5 +30,5 @@
 #define _DistanceTrigger_H__
 
-#include "Trigger.h"
+#include "PlayerTrigger.h"
 
 #include <set>
@@ -37,7 +37,9 @@
 #include "core/BaseObject.h"
 
+#include "orxonox/objects/worldentities/ControllableEntity.h"
+
 namespace orxonox
 {
-  class _OrxonoxExport DistanceTrigger : public Trigger
+  class _OrxonoxExport DistanceTrigger : public PlayerTrigger
   {
     public:
@@ -66,4 +68,5 @@
       std::set<Ogre::Node*> targetSet_;
       float distance_;
+      
   };
 }
Index: code/trunk/src/orxonox/objects/worldentities/triggers/PlayerTrigger.cc
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/triggers/PlayerTrigger.cc	(revision 2261)
+++ code/trunk/src/orxonox/objects/worldentities/triggers/PlayerTrigger.cc	(revision 2261)
@@ -0,0 +1,71 @@
+/*
+ *   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 PlayerTrigger.cc
+    @brief
+	Implementation of the PlayerTrigger class.
+*/
+
+#include "OrxonoxStableHeaders.h"
+#include "PlayerTrigger.h"
+
+#include "core/CoreIncludes.h"
+
+namespace orxonox {
+
+    /**
+    @brief
+        Constructor. Registers the object and initializes defaults.
+    */
+    PlayerTrigger::PlayerTrigger(BaseObject* creator) : Trigger(creator)
+    {
+        RegisterObject(PlayerTrigger);
+        
+        this->player_ = NULL;
+        this->isForPlayer_ = true;
+    }
+    
+    /**
+    @brief
+        Destructor.
+    */
+    PlayerTrigger::~PlayerTrigger()
+    {
+    }
+
+    /**
+    @brief
+        Method for creating a QuestEffectBeacon object through XML.
+    */
+    void PlayerTrigger::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+	SUPER(PlayerTrigger, XMLPort, xmlelement, mode);
+    }
+
+}
Index: code/trunk/src/orxonox/objects/worldentities/triggers/PlayerTrigger.h
===================================================================
--- code/trunk/src/orxonox/objects/worldentities/triggers/PlayerTrigger.h	(revision 2261)
+++ code/trunk/src/orxonox/objects/worldentities/triggers/PlayerTrigger.h	(revision 2261)
@@ -0,0 +1,97 @@
+/*
+ *   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 PlayerTrigger.h
+    @brief
+	Definition of the PlayerTrigger class.
+*/
+
+#ifndef _PlayerTrigger_H__
+#define _PlayerTrigger_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "Trigger.h"
+
+namespace orxonox {
+    
+    /**
+    @brief
+        A PlayerTrigger is a trigger which is normally triggered by ControllableEntities and can as such return a pointer to the ControllableEntity which triggered it.
+    @author
+        Damian 'Mozork' Frick
+    */
+    class _OrxonoxExport PlayerTrigger : public Trigger
+    {
+	public:
+	    PlayerTrigger(BaseObject* creator);
+	    virtual ~PlayerTrigger();
+	    
+            virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a PlayerTrigger object through XML.
+            
+            /**
+            @brief Returns the player that triggered the PlayerTrigger.
+            @return Returns a pointer to the ControllableEntity that triggered the PlayerTrigger.
+            */
+            inline ControllableEntity* getTriggeringPlayer(void) const
+                { return this->player_; }
+	    
+	    /**
+	    @brief Checks whether the PlayerTrigger normally returns a ControllableEntity.
+	    @return Returns true if the PlayerTrigger normally returns a ControllableEntity.
+	    */
+	    inline bool isForPlayer(void) const
+	       { return this->isForPlayer_; }
+            
+	protected:
+	    virtual bool isTriggered(TriggerMode mode) = 0;
+	    
+	    /**
+	    @brief Set the player that triggered the PlayerTrigger. This is normally done by classes inheriting vom PlayerTrigger.
+	    @param player A pointer to the ControllableEntity that triggered the PlayerTrigger.
+	    */
+	    inline void setTriggeringPlayer(ControllableEntity* player)
+	       { this->player_ = player; }
+
+            /**
+            @brief Set whether the PlayerTrigger normally is triggered by ControllableEntities.
+            @param isForPlayer Should be true when the PlayerTrigger schould be set to normally be triggered by ControllableEntities, false if not.
+            */
+	    inline void setForPlayer(bool isForPlayer)
+	       { this->isForPlayer_ = isForPlayer; }
+	    
+	private:
+	    ControllableEntity* player_; //!< The player that triggered the PlayerTrigger.
+	    bool isForPlayer_; //!< Is true when the PlayerTrigger schould be set to normally be triggered by ControllableEntities.
+	
+    };
+
+}
+
+#endif /* _PlayerTrigger_H__ */
