Index: code/branches/questsystem/src/orxonox/objects/AddQuest.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/AddQuest.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/AddQuest.cc	(revision 2068)
@@ -30,4 +30,5 @@
 
 #include "core/CoreIncludes.h"
+#include "util/Exception.h"
 
 #include "QuestManager.h"
@@ -69,9 +70,30 @@
     @param player
         The player the effect is invoked on.
+    @return
+        Returns true if the effect was successfully invoked.
     */
-    void AddQuest::invoke(Player* player)
+    bool AddQuest::invoke(Player* player)
     {
-        Quest* quest = QuestManager::findQuest(this->getQuestId());
-        quest->start(player);
+        if(player == NULL)
+        {
+            COUT(2) << "Input player is NULL." << std::endl;
+            return false;
+        }
+    
+        try
+        {
+	    Quest* quest = QuestManager::findQuest(this->getQuestId());
+	    if(!quest->start(player))
+	    {
+	       return false;
+	    }
+	}
+	catch(const orxonox::Exception& ex)
+	{
+            COUT(2) << ex.getFullDescription() << std::endl;
+            return false;
+	}
+	
+	return true;
     }
 
Index: code/branches/questsystem/src/orxonox/objects/AddQuest.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/AddQuest.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/AddQuest.h	(revision 2068)
@@ -51,5 +51,5 @@
 	    ~AddQuest();
 	    
-	    virtual void invoke(Player* player); //!< Invokes the effect.
+	    virtual bool invoke(Player* player); //!< Invokes the effect.
     
     };
Index: code/branches/questsystem/src/orxonox/objects/AddQuestHint.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/AddQuestHint.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/AddQuestHint.cc	(revision 2068)
@@ -28,4 +28,5 @@
 
 #include "core/CoreIncludes.h"
+#include "util/Exception.h"
 
 #include "QuestManager.h"
@@ -66,9 +67,31 @@
     @param player
         The player.
+    @return
+        Returns true if the effect was successfully invoked.
     */
-    void AddQuestHint::invoke(Player* player)
+    bool AddQuestHint::invoke(Player* player)
     {
-        QuestHint* hint = QuestManager::findHint(this->hintId_);
-        hint->activate(player);
+        if(player == NULL)
+        {
+            COUT(2) << "The input player is NULL." << std::endl;
+            return false;
+        }
+
+        try
+        {
+            QuestHint* hint = QuestManager::findHint(this->hintId_);
+	    if(!hint->activate(player))
+	    {
+		return false;
+	    }
+	}
+	catch(const Exception& e)
+	{
+	   COUT(2) << e.getFullDescription() << std::endl;
+	   return false;
+	}
+	
+	return true;
+	
     }
 }
Index: code/branches/questsystem/src/orxonox/objects/AddQuestHint.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/AddQuestHint.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/AddQuestHint.h	(revision 2068)
@@ -51,5 +51,5 @@
 	    ~AddQuestHint();
 	    
-	    virtual void invoke(Player* player); //!< Invokes the effect.
+	    virtual bool invoke(Player* player); //!< Invokes the effect.
 	    
 	private:
Index: code/branches/questsystem/src/orxonox/objects/AddReward.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/AddReward.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/AddReward.cc	(revision 2068)
@@ -86,16 +86,22 @@
     @param player
         The player.
+    @return
+        Returns true if the effect was invoked successfully.
     */
-    void AddReward::invoke(Player* player)
+    bool AddReward::invoke(Player* player)
     {
         if ( this->rewards_ == NULL )
         {
             COUT(2) << "NULL-Rewards list encountered." << std::endl;
-            return;
+            return false;
 	}
+	
+	bool check = true;
         for ( std::list<Rewardable*>::iterator reward = this->rewards_->begin(); reward != this->rewards_->end(); ++reward )
 	{
-	    (*reward)->reward(player);
+	    check = check && (*reward)->reward(player);
 	}
+	
+	return check;
     }
 
Index: code/branches/questsystem/src/orxonox/objects/AddReward.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/AddReward.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/AddReward.h	(revision 2068)
@@ -53,5 +53,5 @@
 	    ~AddReward();
 	    
-	    virtual void invoke(Player* player); //!< Invokes the effect.
+	    virtual bool invoke(Player* player); //!< Invokes the effect.
 	    
 	private:
Index: code/branches/questsystem/src/orxonox/objects/ChangeQuestStatus.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/ChangeQuestStatus.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/ChangeQuestStatus.h	(revision 2068)
@@ -51,5 +51,5 @@
 	    virtual ~ChangeQuestStatus();
 	    
-	    virtual void invoke(Player* player) = 0; //!< Invokes the effect.
+	    virtual bool invoke(Player* player) = 0; //!< Invokes the effect.
 	    
 	protected:
Index: code/branches/questsystem/src/orxonox/objects/CompleteQuest.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/CompleteQuest.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/CompleteQuest.cc	(revision 2068)
@@ -28,4 +28,5 @@
 
 #include "core/CoreIncludes.h"
+#include "util/Exception.h"
 
 #include "QuestManager.h"
@@ -66,9 +67,30 @@
     @param player
         The player the effect is invoked on.
+    @return
+        Returns true if the effect was invoked successfully.
     */
-    void CompleteQuest::invoke(Player* player)
+    bool CompleteQuest::invoke(Player* player)
     {
-        Quest* quest = QuestManager::findQuest(this->getQuestId());
-        quest->complete(player);
+        if(player == NULL)
+        {
+            COUT(2) << "Input player is NULL." << std::endl;
+            return false;
+        }
+    
+        try
+        {
+	    Quest* quest = QuestManager::findQuest(this->getQuestId());
+	    if(!quest->complete(player))
+	    {
+	       return false;
+	    }
+	}
+	catch(const Exception& e)
+	{
+            COUT(2) << e.getFullDescription() << std::endl;
+            return false;
+	}
+	
+	return true;
     }
 
Index: code/branches/questsystem/src/orxonox/objects/CompleteQuest.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/CompleteQuest.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/CompleteQuest.h	(revision 2068)
@@ -51,5 +51,5 @@
 	    ~CompleteQuest();
 	    
-	    virtual void invoke(Player* player); //!< Invokes the effect.
+	    virtual bool invoke(Player* player); //!< Invokes the effect.
     
     };
Index: code/branches/questsystem/src/orxonox/objects/FailQuest.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/FailQuest.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/FailQuest.cc	(revision 2068)
@@ -28,4 +28,5 @@
 
 #include "core/CoreIncludes.h"
+#include "util/Exception.h"
 
 #include "QuestManager.h"
@@ -66,9 +67,30 @@
     @param player
         The player the effect is invoked on.
+    @return
+        Returns true if the effect was invoked successfully.
     */
-    void FailQuest::invoke(Player* player)
+    bool FailQuest::invoke(Player* player)
     {
-        Quest* quest = QuestManager::findQuest(this->getQuestId());
-        quest->fail(player);
+        if(player == NULL)
+        {
+            COUT(2) << "Input player is NULL." << std::endl;
+            return false;
+        }
+    
+        try
+        {
+	    Quest* quest = QuestManager::findQuest(this->getQuestId());
+	    if(!quest->fail(player))
+	    {
+	       return false;
+	    }
+	}
+	catch(const Exception& e)
+	{
+            COUT(2) << e.getFullDescription() << std::endl;
+            return false;
+	}
+	
+	return true;
     }
 
Index: code/branches/questsystem/src/orxonox/objects/FailQuest.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/FailQuest.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/FailQuest.h	(revision 2068)
@@ -51,5 +51,5 @@
 	    ~FailQuest();
 	    
-	    virtual void invoke(Player* player); //!< Invokes the effect.
+	    virtual bool invoke(Player* player); //!< Invokes the effect.
     
     };
Index: code/branches/questsystem/src/orxonox/objects/GlobalQuest.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/GlobalQuest.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/GlobalQuest.cc	(revision 2068)
@@ -28,4 +28,5 @@
 
 #include "core/CoreIncludes.h"
+#include "util/Exception.h"
 
 #include "GlobalQuest.h"
@@ -35,7 +36,11 @@
     CreateFactory(GlobalQuest);
 
+    /**
+    @brief
+        Constructor.
+    */
     GlobalQuest::GlobalQuest() : Quest()
     {
-        
+        this->initialize();
     }
 
@@ -50,7 +55,7 @@
         The description of the quest.
     */
-    GlobalQuest::GlobalQuest(std::string id, std::string title, std::string description) : Quest(id, title, description)
+    GlobalQuest::GlobalQuest(std::string id) : Quest(id)
     {
-        RegisterObject(GlobalQuest);
+        this->initialize();
     }
     
@@ -64,4 +69,9 @@
     }
     
+    void GlobalQuest::initialize(void)
+    {
+        RegisterObject(GlobalQuest);
+    }
+    
     /**
     @brief
@@ -71,8 +81,10 @@
     @return
         Returns true if the quest can be started, false if not.
+    @throws
+        Throws an exception if either isInactive() of isActive() throws one.
     */
     bool GlobalQuest::isStartable(const Player* player) const
     {
-        return this->isInactive(player) || this->isActive(player);
+        return this->isInactive(player) ||  this->isActive(player);
     }
     
@@ -84,8 +96,11 @@
     @return
         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
     {
         return this->isActive(player);
+
     }
     
@@ -97,4 +112,6 @@
     @return
         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
@@ -108,7 +125,14 @@
     @param player
         The player.
+    @throws
+        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);
@@ -127,11 +151,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.
     @param status
         The status to be set.
+    @return
+        Returns false if player is NULL.
     */
     bool GlobalQuest::setStatus(Player* player, const questStatus::Enum & status)
     {
+        if(player == NULL)
+        {
+            return false;
+	}
+        
         std::set<Player*>::const_iterator it = this->players_.find(player);
         if (it == this->players_.end()) //!< Player is not yet in the list.
Index: code/branches/questsystem/src/orxonox/objects/GlobalQuest.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/GlobalQuest.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/GlobalQuest.h	(revision 2068)
@@ -49,5 +49,5 @@
 	public:
             GlobalQuest();
-	    GlobalQuest(std::string id, std::string title = "", std::string description = "");
+	    GlobalQuest(std::string id);
 	    ~GlobalQuest();
 	    
@@ -63,4 +63,6 @@
             std::set<Player*> players_; //!< The set of players which possess this quest.
             questStatus::Enum status_; //!< The status of this quest.
+            
+            void initialize(void);
     
     };
Index: code/branches/questsystem/src/orxonox/objects/LocalQuest.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/LocalQuest.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/LocalQuest.cc	(revision 2068)
@@ -28,4 +28,5 @@
 
 #include "core/CoreIncludes.h"
+#include "util/Exception.h"
 
 #include "LocalQuest.h"
@@ -37,5 +38,5 @@
     LocalQuest::LocalQuest() : Quest()
     {
-        
+        this->initialize();
     }
 
@@ -45,12 +46,8 @@
     @param id
         The unique identifier.
-    @param title
-        The title of the quest.
-    @param description
-        The description of the quest.
     */
-    LocalQuest::LocalQuest(std::string id, std::string title, std::string description) : Quest(id, title, description)
+    LocalQuest::LocalQuest(std::string id) : Quest(id)
     {
-        RegisterObject(LocalQuest);
+        this->initialize();
     }
     
@@ -64,4 +61,9 @@
     }
     
+    void LocalQuest::initialize(void)
+    {
+        RegisterObject(LocalQuest);
+    }
+    
     /**
     @brief
@@ -71,4 +73,6 @@
     @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
@@ -84,4 +88,6 @@
     @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
@@ -97,4 +103,6 @@
     @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
@@ -110,7 +118,14 @@
     @return
         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())
@@ -124,11 +139,18 @@
     @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.
     @param status
         The status.
+    @return
+        Returns false if player is NULL.
     */
     bool LocalQuest::setStatus(Player* player, const questStatus::Enum & status)
     {
+        if(player == NULL)
+        {
+            return false;
+	}
         this->playerStatus_[player] = status;
         return true;
Index: code/branches/questsystem/src/orxonox/objects/LocalQuest.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/LocalQuest.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/LocalQuest.h	(revision 2068)
@@ -49,5 +49,5 @@
 	public:
             LocalQuest();
-	    LocalQuest(std::string id, std::string title = "", std::string description = "");
+	    LocalQuest(std::string id);
 	    ~LocalQuest();
 	    
@@ -61,5 +61,7 @@
                 
 	private:
-            std::map<Player*, questStatus::Enum> playerStatus_;
+            std::map<Player*, questStatus::Enum> playerStatus_; //!< List of the status for each player, with the Player-pointer as key.
+            
+            void initialize(void);
     
     };
Index: code/branches/questsystem/src/orxonox/objects/Quest.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/Quest.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/Quest.cc	(revision 2068)
@@ -30,4 +30,5 @@
 
 #include "Quest.h"
+#include "QuestManager.h"
 
 namespace orxonox {
@@ -35,5 +36,5 @@
     Quest::Quest() : QuestItem()
     {
-        
+        this->initialize();
     }
 
@@ -48,7 +49,7 @@
         The description of the quest.
     */
-    Quest::Quest(std::string id, std::string title, std::string description) : QuestItem(id, title, description)
-    {
-        initialize();
+    Quest::Quest(std::string id) : QuestItem(id)
+    {
+        this->initialize();
     }
     
@@ -59,5 +60,5 @@
     Quest::~Quest()
     {
-        //TDO: Unload lists...
+        
     }
     
@@ -70,5 +71,6 @@
         RegisterObject(Quest);
         
-        this->parentQuest_ = 0;
+        this->parentQuest_ = NULL;
+        QuestManager::registerQuest(this); //Registers the quest with the QuestManager.
     }
 
@@ -78,7 +80,15 @@
     @param quest
         A pointer to the quest to be set as parent quest.
+    @return
+        Returns true if the parentQuest could be set.
     */
     bool Quest::setParentQuest(Quest* quest)
     {
+        if(quest == NULL)
+        {
+            COUT(2) << "The parentquest to be added to quest {" << this->getId() << "} was NULL." << std::endl;
+            return false;
+        }
+        
         this->parentQuest_ = quest;
         return true;
@@ -90,9 +100,78 @@
     @param quest
         A pointer to the quest to be set as sub quest.
+    @return
+        Returns true if the subQuest vould be set.
     */
     bool Quest::addSubQuest(Quest* quest)
     {
+        if(quest == NULL)
+        {
+            COUT(2) << "The subquest to be added to quest {" << this->getId() << "} was NULL." << std::endl;
+            return false;
+        }
+        
         this->subQuests_.push_back(quest);
         return true;
+    }
+    
+    /**
+    @brief
+        Returns true if the quest status for the specific player is 'inactive'.
+    @param player
+        The player.
+    @return
+        Returns true if the quest status for the specific player is 'inactive'.
+    @throws
+        Throws an exception if getStatus throws one.
+    */
+    bool Quest::isInactive(const Player* player) const
+    {
+        return this->getStatus(player) == questStatus::inactive;
+    }
+    
+    /**
+    @brief
+        Returns true if the quest status for the specific player is 'active'.
+    @param player
+        The player.
+    @return
+        Returns true if the quest status for the specific player is 'active'.
+    @throws
+        Throws an exception if getStatus throws one.
+    */
+    bool Quest::isActive(const Player* player) const
+    {
+
+        return this->getStatus(player) == questStatus::active;
+    }
+    
+    /**
+    @brief
+        Returns true if the quest status for the specific player is 'failed'.
+    @param player
+        The player.
+    @return
+        Returns true if the quest status for the specific player is 'failed'.
+    @throws
+        Throws an exception if getStatus throws one.
+    */
+    bool Quest::isFailed(const Player* player) const
+    {
+        return this->getStatus(player) == questStatus::failed;
+    }
+    
+    /**
+    @brief
+        Returns true if the quest status for the specific player is 'completed'.
+    @param player
+        The player.
+    @return
+        Returns true if the quest status for the specific player is 'completed'.
+    @throws
+        Throws an exception if getStatus throws one.
+    */
+    bool Quest::isCompleted(const Player* player) const
+    {
+        return this->getStatus(player) == questStatus::completed;
     }
 
@@ -102,16 +181,18 @@
     @param hint
         The hint that should be added to the list of hints.
-    */
-    void Quest::addHint(QuestHint* hint)
-    {
-        if ( hint != NULL )
-        {
-            this->hints_.push_back(hint);
-            hint->setQuest(this);
-	}
-        else
+    @return
+        Returns true if the hint was successfully added.
+    */
+    bool Quest::addHint(QuestHint* hint)
+    {
+        if(hint == NULL)
         {
             COUT(2) << "A NULL-QuestHint was trying to be added." << std::endl;
-	}
+            return false;
+        }
+        
+	this->hints_.push_back(hint);
+	hint->setQuest(this);
+	return true;
     }
     
Index: code/branches/questsystem/src/orxonox/objects/Quest.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/Quest.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/Quest.h	(revision 2068)
@@ -58,6 +58,6 @@
     @brief
         Represents a quest in the game.
-        A quest has a sub
-        
+        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.
     @author
         Damian 'Mozork' Frick
@@ -67,5 +67,5 @@
 	public:
             Quest();
-            Quest(std::string id, std::string title = "", std::string description = "");
+            Quest(std::string id);
 	    virtual ~Quest();
     
@@ -75,17 +75,8 @@
                 { return this->subQuests_; }
 	    
-	    //TDO: Necessary? Shouldn't this be decided whilest creating the object?
-	    //     Yes it absolutely should and will. Add these methods to protected then?
-	    bool setParentQuest(Quest* quest); //!< Sets the parent quest of the quest.
-	    bool addSubQuest(Quest* quest); //!< Adds a sub quest to the quest.
-	    
-	    inline bool isInactive(const Player* player) const //!< Returns true if the quest status for the specific player is 'inactive'.
-	       { return this->getStatus(player) == questStatus::inactive; }
-	    inline bool isActive(const Player* player) const //!< Returns true if the quest status for the specific player is 'active'.
-	       { return this->getStatus(player) == questStatus::active; }
-	    inline bool isFailed(const Player* player) const //!< Returns true if the quest status for the specific player is 'failed'.
-	       { return this->getStatus(player) == questStatus::failed; }
-	    inline bool isCompleted(const Player* player) const //!< Returns true if the quest status for the specific player is 'completed'.
-	       { return this->getStatus(player) == questStatus::completed; }
+	    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.
@@ -93,5 +84,5 @@
 	    bool complete(Player* player); //!< Completes the quest.
                 
-            void addHint(QuestHint* hint); //!< Add a hint to the list of hints.
+            bool addHint(QuestHint* hint); //!< Add a hint to the list of hints.
 	    
         protected:
@@ -102,5 +93,7 @@
             virtual bool isCompletable(const Player* player) const = 0; //!< Checks whether the quest can be completed.
             
-            //TDO: Get the parameter const...
+            bool setParentQuest(Quest* quest); //!< Sets the parent quest of the quest.
+	    bool addSubQuest(Quest* quest); //!< Adds a sub quest to the 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.
Index: code/branches/questsystem/src/orxonox/objects/QuestDescription.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/QuestDescription.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/QuestDescription.cc	(revision 2068)
@@ -37,10 +37,16 @@
     QuestDescription::QuestDescription() : BaseObject()
     {
-        
+        this->initialize();
     }
         
+    /**
+    @brief
+        Constructor. Creates a new QuestDescription object and adds a title and description.
+    @param title
+    @param description
+    */
     QuestDescription::QuestDescription(std::string title, std::string description) : BaseObject()
     {
-        initialize();
+        this->initialize();
         this->title_ = title;
         this->description_ = description;
@@ -50,4 +56,14 @@
     {
         
+    }
+    
+    void QuestDescription::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(QuestDescription, XMLPort, xmlelement, mode);
+    
+        XMLPortParam(QuestDescription, "title", setTitle, getTitle, xmlelement, mode);
+        XMLPortParam(QuestDescription, "description", setDescription, getDescription, xmlelement, mode);
+        
+        COUT(1) << "QuestDescription created!" << std::endl;
     }
     
Index: code/branches/questsystem/src/orxonox/objects/QuestDescription.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/QuestDescription.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/QuestDescription.h	(revision 2068)
@@ -33,4 +33,5 @@
 
 #include "core/BaseObject.h"
+#include "core/XMLPort.h"
 
 namespace orxonox {
@@ -50,4 +51,6 @@
 	    ~QuestDescription();
 	    
+	    virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+	    
 	    inline const std::string & getTitle(void) const //!< Returns the title.
                 { return this->title_; }
@@ -57,7 +60,12 @@
 	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_;
-            std::string description_;
+            std::string title_; //!< The title.
+            std::string description_; //!< The description.
     
     };
Index: code/branches/questsystem/src/orxonox/objects/QuestEffect.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/QuestEffect.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/QuestEffect.cc	(revision 2068)
@@ -59,11 +59,16 @@
     @param effects
         A list of all the effects to be invoked.
+    @return
+        Returns false if there was an error, view console of log for further detail.
     */
-    void QuestEffect::invokeEffects(Player* player, std::list<QuestEffect*> & effects)
+    bool QuestEffect::invokeEffects(Player* player, std::list<QuestEffect*> & effects)
     {
+        bool check = true;
+        
         for (std::list<QuestEffect*>::iterator effect = effects.begin(); effect != effects.end(); effect++)
 	{
-	    (*effect)->invoke(player);
+	    check = check && (*effect)->invoke(player);
 	}
+	return check;
     }
 
Index: code/branches/questsystem/src/orxonox/objects/QuestEffect.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/QuestEffect.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/QuestEffect.h	(revision 2068)
@@ -50,6 +50,6 @@
 	    virtual ~QuestEffect();
 	    
-	    virtual void invoke(Player* player) = 0; //!< Invokes the effect.
-	    static void invokeEffects(Player* player, std::list<QuestEffect*> & effects); //!< Invokes all effects in the list.
+	    virtual bool invoke(Player* player) = 0; //!< Invokes the effect.
+	    static bool invokeEffects(Player* player, std::list<QuestEffect*> & effects); //!< Invokes all effects in the list.
 	    
 	
Index: code/branches/questsystem/src/orxonox/objects/QuestHint.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/QuestHint.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/QuestHint.cc	(revision 2068)
@@ -28,4 +28,5 @@
 
 #include "core/CoreIncludes.h"
+#include "util/Exception.h"
 
 #include "Quest.h"
@@ -36,7 +37,11 @@
     CreateFactory(QuestHint);
 
+    /**
+    @brief
+        Constructor.
+    */
     QuestHint::QuestHint() : QuestItem()
     {
-        
+        this->initialize();
     }
 
@@ -51,7 +56,7 @@
         The description of the hint, resp. the hint itself.
     */
-    QuestHint::QuestHint(std::string id, std::string title, std::string description) : QuestItem(id, title, description)
+    QuestHint::QuestHint(std::string id) : QuestItem(id)
     {
-        RegisterObject(QuestHint);
+        this->initialize();
     }
     
@@ -65,4 +70,15 @@
     }
     
+    void QuestHint::initialize(void)
+    {
+        RegisterObject(QuestHint);
+    }
+    
+    void QuestHint::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+	SUPER(QuestHint, XMLPort, xmlelement, mode);
+    }
+
+    
     /**
     @brief
@@ -70,9 +86,17 @@
     @param player
         The player.
+    @throws
+        Throws an Argument Exception if the input Player-pointer is NULL.
     @return
-        Returns 
+        Returns true if the hint is active for the specified player.
     */
     bool QuestHint::isActive(Player* player)
     {
+        if(player == NULL)
+        {
+            ThrowException(Argument, "The input Player* is NULL.");
+            return false;
+        }
+        
         std::map<Player*, questHintStatus::Enum>::iterator it = this->playerStatus_.find(player);
 	if (it != this->playerStatus_.end())
@@ -85,13 +109,24 @@
     /**
     @brief
+        Activates a QuestHint for a given player.
     @param player
+        The player.
     @return
+        Returns true if the activation was successful, false if there were problems.
     */
     bool QuestHint::activate(Player* player)
     {
-        if(this->quest_->isActive(player) && !(this->isActive(player)))
+        if(this->quest_->isActive(player))
         {
-            this->playerStatus_[player] = questHintStatus::active;
-            return true;
+	    if(!(this->isActive(player)))
+	    {
+		this->playerStatus_[player] = questHintStatus::active;
+		return true;
+	    }
+	    else
+	    {
+                COUT(2) << "An already active questHint was trying to get activated." << std::endl;
+                return false;
+	    }
         }
 	COUT(2) << "A hint of a non-active quest was trying to get activated." << std::endl;
@@ -101,10 +136,18 @@
     /**
     @brief
+        Sets the quest the QuestHitn belongs to.
     @param quest
     @return
     */
-    void QuestHint::setQuest(Quest* quest)
+    bool QuestHint::setQuest(Quest* quest)
     {
+        if(quest == NULL)
+        {
+            COUT(2) << "The input Quest* is NULL." << std::endl;
+            return false;
+        }
+        
         this->quest_ = quest;
+        return true;
     }
 
Index: code/branches/questsystem/src/orxonox/objects/QuestHint.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/QuestHint.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/QuestHint.h	(revision 2068)
@@ -33,4 +33,5 @@
 #include <string>
 
+#include "core/XMLPort.h"
 #include "QuestDescription.h"
 #include "QuestItem.h"
@@ -56,5 +57,6 @@
     @brief
         Represents a hint in the game towards completing a Quest.
-        Consists of title and description in textual form.
+        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.
     @author
         Damian 'Mozork' Frick
@@ -65,6 +67,8 @@
 	public:
             QuestHint();
-	    QuestHint(std::string id, std::string title = "", std::string description = "");
+	    QuestHint(std::string id);
 	    ~QuestHint();
+	    
+	    virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
 	    
 	    bool isActive(Player* player); //!< Returns true if the hint is active for the input player.
@@ -72,10 +76,15 @@
 	    bool activate(Player* player); //!< Activates the hint for the input player.
 	    
-	    void setQuest(Quest* quest); //!< Sets the quest the hint belongs to.
+	    bool setQuest(Quest* quest); //!< Sets the quest the hint belongs to.
+	    
+	    inline Quest* getQuest(void)
+	       { return this->quest_; }
 	    
         private:
             
-            Quest* quest_;
-            std::map<Player*, questHintStatus::Enum> playerStatus_;
+            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.
     
     };
Index: code/branches/questsystem/src/orxonox/objects/QuestItem.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/QuestItem.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/QuestItem.cc	(revision 2068)
@@ -37,5 +37,5 @@
     QuestItem::QuestItem() : BaseObject()
     {
-        
+        this->initialize();
     }
     
@@ -45,15 +45,10 @@
     @param id
         The unique identifier. Should be of GUID form: http://en.wikipedia.org/wiki/Globally_Unique_Identifier#Basic_structure
-    @param title
-        The title of this QuestItem. Has an empty string as default.
-    @param description
-        The description of this QuestItem. Has an empty string as default.
     */
-    QuestItem::QuestItem(std::string id, std::string title, std::string description) : BaseObject()
+    QuestItem::QuestItem(std::string id) : BaseObject()
     {
         this->initialize();
         
         this->id_ = id;
-        this->description_ = QuestDescription(title, description);
     }
     
@@ -66,4 +61,16 @@
         
     }
+    
+    void QuestItem::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(QuestItem, XMLPort, xmlelement, mode);
+        
+        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);
+
+    }
+
     
     /**
@@ -78,4 +85,26 @@
         this->id_ = "";
     }
+    
+    //const QuestDescription* QuestItem::getDescription(unsigned int index) const //!< Returns the description of the QuestItem.
+    //{
+    //    if(index != 0)
+    //        return NULL;
+    //    return this->description_;
+    //}
+    
+    /**
+    @brief
+        Checks whether an input id is of the required form.
+    @param id
+	The id to be checked.
+    @return
+        Returns true if the string is likely to be of the required form.
+    @todo
+        Clarify form, more vigorous checks.
+    */
+    bool QuestItem::isId(const std::string & id)
+    {
+        return id.size() >= 32;
+    }
 
 }
Index: code/branches/questsystem/src/orxonox/objects/QuestItem.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/QuestItem.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/QuestItem.h	(revision 2068)
@@ -32,6 +32,7 @@
 #include <string>
 
+#include "core/BaseObject.h"
+#include "core/XMLPort.h"
 #include "QuestDescription.h"
-#include "core/BaseObject.h"
 
 namespace orxonox {
@@ -50,15 +51,26 @@
 	public:
             QuestItem();
-	    QuestItem(std::string id, std::string title = "", std::string description = "");
+	    QuestItem(std::string id);
 	    virtual ~QuestItem();
 	    
-	    inline std::string getId(void) const //!< Returns the id of this quest.
+	    virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+	    
+	    inline const std::string & getId(void) const //!< Returns the id of this quest.
                 { return this->id_; }
-	    inline const QuestDescription & getDescription(void) const //!< Returns the description of the QuestItem.
+	    inline const QuestDescription* getDescription(void) const //!< Returns the description of the QuestItem.
                 { 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:
+            inline void setId(const std::string & id)
+                { id_ = id; }
+	    inline void setDescription(QuestDescription* description)
+                { this->description_ = description; }
 	    
 	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.
+	    QuestDescription* description_; //!< The description of the QuestItem.
 	    
 	    void initialize(void); //!< Initializes the object.
Index: code/branches/questsystem/src/orxonox/objects/QuestManager.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/QuestManager.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/QuestManager.cc	(revision 2068)
@@ -28,4 +28,5 @@
 
 #include "core/CoreIncludes.h"
+#include "util/Exception.h"
 
 #include "QuestManager.h"
@@ -57,6 +58,23 @@
     bool QuestManager::registerQuest(Quest* quest)
     {
-        questMap_.insert( std::pair<std::string,Quest*>(quest->getId(),quest) );
-        return true;
+        if(quest == NULL)
+        {
+            COUT(2) << "Registration of Quest in QuestManager failed, because inserted Quest-pointer was NULL." << std::endl;
+            return false;
+	}
+	
+        std::pair<std::map<std::string, Quest*>::iterator,bool> ret;
+        ret = questMap_.insert( std::pair<std::string,Quest*>(quest->getId(),quest) );
+        
+        if(ret.second)
+        {
+            COUT(3) << "Quest with questId {" << quest->getId() << "} successfully inserted." << std::endl;
+            return true;
+	}
+	else
+	{
+	   COUT(2) << "Quest with the same id was already present." << std::endl;
+	   return false;
+	}
     }
     
@@ -71,6 +89,23 @@
     bool QuestManager::registerHint(QuestHint* hint)
     {
-        hintMap_.insert ( std::pair<std::string,QuestHint*>(hint->getId(),hint) );
-        return true;
+        if(hint == NULL)
+        {
+            COUT(2) << "Registration of QuestHint in QuestManager failed, because inserted QuestHint-pointer was NULL." << std::endl;
+            return false;
+        }
+        
+        std::pair<std::map<std::string, QuestHint*>::iterator,bool> ret;
+        ret = hintMap_.insert ( std::pair<std::string,QuestHint*>(hint->getId(),hint) );
+        
+        if(ret.second)
+        {
+            COUT(3) << "QuestHint with hintId {" << hint->getId() << "} successfully inserted." << std::endl;
+            return true;
+	}
+	else
+	{
+	   COUT(2) << "QuestHint with the same id was already present." << std::endl;
+	   return false;
+	}
     }
     
@@ -82,9 +117,15 @@
     @return
         Returns a reference to the quest with the input id.
-    @todo
-        Throw exceptions in case of errors.
+        Returns NULL if there is no quest with the given questId.
+    @throws
+        Throws an exception if the given questId is invalid.
     */
     Quest* QuestManager::findQuest(const std::string & questId)
     {
+        if(!QuestItem::isId(questId))
+	{
+            ThrowException(Argument, "Invalid questId.");
+	}
+	
         Quest* quest;
         std::map<std::string, Quest*>::iterator it = questMap_.find(questId);
@@ -110,9 +151,15 @@
     @return
         Returns a reference to the hint with the input id.
-    @todo
-        Throw exceptopns in case of errors.
+        Returns NULL if there is no hint with the given hintId.
+    @throws
+        Throws an exception if the given hintId is invalid.
     */
     QuestHint* QuestManager::findHint(const std::string & hintId)
     {
+        if(!QuestItem::isId(hintId))
+	{
+            ThrowException(Argument, "Invalid hintId.");
+	}
+	
         QuestHint* hint;
         std::map<std::string, QuestHint*>::iterator it = hintMap_.find(hintId);
Index: code/branches/questsystem/src/orxonox/objects/QuestManager.h
===================================================================
--- code/branches/questsystem/src/orxonox/objects/QuestManager.h	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/QuestManager.h	(revision 2068)
@@ -42,4 +42,5 @@
     @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.
     @author
         Damian 'Mozork' Frick
@@ -59,6 +60,6 @@
 	    	    
 	private:
-	    static std::map<std::string, Quest*> questMap_;
-	    static std::map<std::string, QuestHint*> hintMap_;
+	    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.
     
     };
Index: code/branches/questsystem/src/orxonox/objects/Rewardable.cc
===================================================================
--- code/branches/questsystem/src/orxonox/objects/Rewardable.cc	(revision 2043)
+++ code/branches/questsystem/src/orxonox/objects/Rewardable.cc	(revision 2068)
@@ -33,4 +33,5 @@
 namespace orxonox {
 
+    
     Rewardable::Rewardable() : BaseObject()
     {
