Index: /code/branches/questsystem3/src/orxonox/OrxonoxPrereqs.h
===================================================================
--- /code/branches/questsystem3/src/orxonox/OrxonoxPrereqs.h	(revision 2327)
+++ /code/branches/questsystem3/src/orxonox/OrxonoxPrereqs.h	(revision 2328)
@@ -102,4 +102,5 @@
     class QuestHint;
     class QuestItem;
+    class QuestListener;
     class QuestManager;
     class Rewardable;
Index: /code/branches/questsystem3/src/orxonox/objects/quest/AddQuest.cc
===================================================================
--- /code/branches/questsystem3/src/orxonox/objects/quest/AddQuest.cc	(revision 2327)
+++ /code/branches/questsystem3/src/orxonox/objects/quest/AddQuest.cc	(revision 2328)
@@ -42,4 +42,5 @@
 
 #include "orxonox/objects/infos/PlayerInfo.h"
+#include "orxonox/overlays/notifications/Notification.h"
 #include "QuestManager.h"
 #include "Quest.h"
@@ -110,4 +111,6 @@
 
         COUT(3) << "Quest {" << this->getQuestId() << "} successfully added to player." << std::endl;
+        Notification* notification = new Notification("Crazy Message...", "Title", 30);
+        notification->send();
         return true;
     }
Index: /code/branches/questsystem3/src/orxonox/objects/quest/CMakeLists.txt
===================================================================
--- /code/branches/questsystem3/src/orxonox/objects/quest/CMakeLists.txt	(revision 2327)
+++ /code/branches/questsystem3/src/orxonox/objects/quest/CMakeLists.txt	(revision 2328)
@@ -14,4 +14,5 @@
   QuestHint.cc
   QuestItem.cc
+  QuestListener.cc
   QuestManager.cc
   Rewardable.cc
Index: /code/branches/questsystem3/src/orxonox/objects/quest/FailQuest.cc
===================================================================
--- /code/branches/questsystem3/src/orxonox/objects/quest/FailQuest.cc	(revision 2327)
+++ /code/branches/questsystem3/src/orxonox/objects/quest/FailQuest.cc	(revision 2328)
@@ -40,4 +40,5 @@
 
 #include "orxonox/objects/infos/PlayerInfo.h"
+#include "orxonox/overlays/notifications/Notification.h"
 #include "QuestManager.h"
 #include "Quest.h"
Index: /code/branches/questsystem3/src/orxonox/objects/quest/GlobalQuest.cc
===================================================================
--- /code/branches/questsystem3/src/orxonox/objects/quest/GlobalQuest.cc	(revision 2327)
+++ /code/branches/questsystem3/src/orxonox/objects/quest/GlobalQuest.cc	(revision 2328)
@@ -38,4 +38,5 @@
 #include "orxonox/objects/infos/PlayerInfo.h"
 #include "core/CoreIncludes.h"
+#include "core/Super.h"
 #include "util/Exception.h"
 
@@ -88,19 +89,19 @@
     bool GlobalQuest::fail(PlayerInfo* player)
     {
-        if(this->isFailable(player)) //!< Check whether the Quest can be failed.
-        {
-            this->setStatus(player, questStatus::failed);
-            
-            //! Iterate through all players possessing this Quest.
-            for(std::set<PlayerInfo*>::const_iterator it = players_.begin(); it != players_.end(); it++)
-            {
-                QuestEffect::invokeEffects(*it, this->getFailEffectList());
-            }
-
-            return true;
-        }
-        
-        COUT(4) << "A non-completable quest was trying to be failed." << std::endl;
-        return false;
+        if(!this->isFailable(player)) //!< Check whether the Quest can be failed.
+        {
+            COUT(4) << "A non-completable quest was trying to be failed." << std::endl;
+            return false;
+        }
+        
+        Quest::fail(player);
+	
+	//! Iterate through all players possessing this Quest.
+	for(std::set<PlayerInfo*>::const_iterator it = players_.begin(); it != players_.end(); it++)
+	{
+	    QuestEffect::invokeEffects(*it, this->getFailEffectList());
+	}
+
+	return true;
     }
 
@@ -117,20 +118,20 @@
     bool GlobalQuest::complete(PlayerInfo* player)
     {
-        if(this->isCompletable(player)) //!< Check whether the Quest can be completed.
-        {
-            this->setStatus(player, questStatus::completed);
-            
-            //! Iterate through all players possessing the Quest.
-            for(std::set<PlayerInfo*>::const_iterator it = players_.begin(); it != players_.end(); it++)
-            {
-                QuestEffect::invokeEffects(*it, this->getCompleteEffectList());
-            }
-            
-            QuestEffect::invokeEffects(player, this->rewards_); //!< Invoke reward QuestEffects on the player completing the Quest.
-            return true;
-        }
-        
-        COUT(4) << "A non-completable quest was trying to be completed." << std::endl;
-        return false;
+        if(!this->isCompletable(player)) //!< Check whether the Quest can be completed.
+        {
+            COUT(4) << "A non-completable quest was trying to be completed." << std::endl;
+            return false;
+        }
+        
+        //! Iterate through all players possessing the Quest.
+	for(std::set<PlayerInfo*>::const_iterator it = players_.begin(); it != players_.end(); it++)
+	{
+	    QuestEffect::invokeEffects(*it, this->getCompleteEffectList());
+	}
+	
+	Quest::complete(player);
+	
+	QuestEffect::invokeEffects(player, this->rewards_); //!< Invoke reward QuestEffects on the player completing the Quest.
+	return true;
     }
 
Index: /code/branches/questsystem3/src/orxonox/objects/quest/LocalQuest.cc
===================================================================
--- /code/branches/questsystem3/src/orxonox/objects/quest/LocalQuest.cc	(revision 2327)
+++ /code/branches/questsystem3/src/orxonox/objects/quest/LocalQuest.cc	(revision 2328)
@@ -37,4 +37,5 @@
 
 #include "core/CoreIncludes.h"
+#include "core/Super.h"
 #include "util/Exception.h"
 
@@ -86,13 +87,14 @@
     bool LocalQuest::fail(PlayerInfo* player)
     {
-        if(this->isFailable(player)) //!< Checks whether the quest can be failed.
-        {
-            this->setStatus(player, questStatus::failed);
-            QuestEffect::invokeEffects(player, this->getFailEffectList()); //!< Invoke the failEffects.
-            return true;
-        }
-        
-        COUT(4) << "A non-failable quest was trying to be failed." << std::endl;
-        return false;
+        if(!this->isFailable(player)) //!< Checks whether the quest can be failed.
+        {
+            COUT(4) << "A non-failable quest was trying to be failed." << std::endl;
+            return false;
+        }
+        
+        Quest::fail(player);
+        
+	QuestEffect::invokeEffects(player, this->getFailEffectList()); //!< Invoke the failEffects.
+	return true;
     }
 
@@ -108,13 +110,14 @@
     bool LocalQuest::complete(PlayerInfo* player)
     {
-        if(this->isCompletable(player)) //!< Checks whether the Quest can be completed.
-        {
-            this->setStatus(player, questStatus::completed);
-            QuestEffect::invokeEffects(player, this->getCompleteEffectList()); //!< Invoke the complete QuestEffects.
-            return true;
-        }
-        
-        COUT(4) << "A non-completable quest was trying to be completed." << std::endl;
-        return false;
+        if(!this->isCompletable(player)) //!< Checks whether the Quest can be completed.
+        {
+            COUT(4) << "A non-completable quest was trying to be completed." << std::endl;
+            return false;
+        }
+        
+        Quest::complete(player);
+        
+	QuestEffect::invokeEffects(player, this->getCompleteEffectList()); //!< Invoke the complete QuestEffects.
+	return true;
     }
 
Index: /code/branches/questsystem3/src/orxonox/objects/quest/Quest.cc
===================================================================
--- /code/branches/questsystem3/src/orxonox/objects/quest/Quest.cc	(revision 2327)
+++ /code/branches/questsystem3/src/orxonox/objects/quest/Quest.cc	(revision 2328)
@@ -43,4 +43,5 @@
 #include "QuestHint.h"
 #include "QuestEffect.h"
+#include "QuestListener.h"
 
 namespace orxonox {
@@ -363,4 +364,34 @@
         return this->getStatus(player) == questStatus::completed;
     }
+    
+    /**
+    @brief
+        Fails the Quest for an input player.
+    @param player
+        The player.
+    @return
+        Returns true if the Quest could be failed, false if not.
+    */
+    bool Quest::fail(PlayerInfo* player)
+    {
+        QuestListener::advertiseStatusChange(this->listeners_, "fail"); //!< Tells the QuestListeners, that the status has changed to failed.
+        this->setStatus(player, questStatus::failed);
+        return true;
+    }
+    
+    /**
+    @brief
+        Completes the Quest for an input player.
+    @param player
+        The player.
+    @return
+        Returns true if the Quest could be completed, false if not.
+    */
+    bool Quest::complete(PlayerInfo* player)
+    {
+        QuestListener::advertiseStatusChange(this->listeners_, "complete"); //!< Tells the QuestListeners, that the status has changed to completed.
+        this->setStatus(player, questStatus::completed);
+        return true;
+    }
 
     /**
@@ -374,12 +405,34 @@
     bool Quest::start(PlayerInfo* player)
     {
-        if(this->isStartable(player)) //!< Checks whether the quest can be started.
-        {
-            this->setStatus(player, questStatus::active);
-            return true;
-        }
-        
-        COUT(4) << "A non-startable quest was trying to be started." << std::endl;
-        return false;
+        if(!this->isStartable(player)) //!< Checks whether the quest can be started.
+        {
+            COUT(4) << "A non-startable quest was trying to be started." << std::endl;
+            return false;
+        }
+        
+        QuestListener::advertiseStatusChange(this->listeners_, "start"); //!< Tells the QuestListeners, that the status has changed to active.
+        
+        this->setStatus(player, questStatus::active);
+	return true;
+    }
+    
+    /**
+    @brief
+        Adds a QuestListener to the list of QuestListeners listening to this Quest.
+    @param listener
+        The QuestListener to be added.
+    @return
+        Returns true if successful, false if not.
+    */
+    bool Quest::addListener(QuestListener* listener)
+    {
+        if(listener == NULL)
+        {
+            COUT(2) << "A NULL-QuestListener was trying to be added to a Quests listeners." << std::endl;
+            return false;
+        }
+        
+        this->listeners_.push_back(listener);
+        return true;
     }
 
Index: /code/branches/questsystem3/src/orxonox/objects/quest/Quest.h
===================================================================
--- /code/branches/questsystem3/src/orxonox/objects/quest/Quest.h	(revision 2327)
+++ /code/branches/questsystem3/src/orxonox/objects/quest/Quest.h	(revision 2328)
@@ -110,6 +110,8 @@
 	    
 	    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.
+	    virtual bool fail(PlayerInfo* player); //!< Fails the Quest.
+	    virtual bool complete(PlayerInfo* player); //!< Completes the Quest.
+	    
+	    bool addListener(QuestListener* listener); //!< Adds a QuestListener to the list of QuestListeners listening to this Quest.
 
         protected:
@@ -150,4 +152,6 @@
             std::list<QuestEffect*> completeEffects_; //!< A list of QuestEffects to be invoked, when the Quest has been completed.
             
+            std::list<QuestListener*> listeners_; //!< A list of QuestListeners, that listen to what exactly happens with this Quest.
+            
             bool setParentQuest(Quest* quest); //!< Sets the parentquest of the Quest.
             bool addSubQuest(Quest* quest); //!< Adds a subquest to the Quest.
Index: /code/branches/questsystem3/src/orxonox/objects/quest/QuestDescription.cc
===================================================================
--- /code/branches/questsystem3/src/orxonox/objects/quest/QuestDescription.cc	(revision 2327)
+++ /code/branches/questsystem3/src/orxonox/objects/quest/QuestDescription.cc	(revision 2328)
@@ -74,4 +74,6 @@
         XMLPortParam(QuestDescription, "title", setTitle, getTitle, xmlelement, mode);
         XMLPortParam(QuestDescription, "description", setDescription, getDescription, xmlelement, mode);
+        XMLPortParam(QuestDescription, "failMessage", setFailMessage, getFailMessage, xmlelement, mode);
+        XMLPortParam(QuestDescription, "failMessage", setCompleteMessage, getCompleteMessage, xmlelement, mode);
 
         COUT(3) << "New QuestDescription with title '" << this->getTitle() << "' created." << std::endl;
Index: /code/branches/questsystem3/src/orxonox/objects/quest/QuestDescription.h
===================================================================
--- /code/branches/questsystem3/src/orxonox/objects/quest/QuestDescription.h	(revision 2327)
+++ /code/branches/questsystem3/src/orxonox/objects/quest/QuestDescription.h	(revision 2328)
@@ -52,5 +52,5 @@
         Creating a QuestDescription through XML goes as follows:
         
-        <QuestDescription title="Title" description="Description Text" />
+        <QuestDescription title="Title" description="Description Text" failMessage="You fail." completeMessage="You win!" />
     @author
         Damian 'Mozork' Frick
@@ -64,21 +64,37 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode); //!< Method for creating a QuestDescription object through XML.
 
-        /**
-        @brief Returns the title.
-        @return Returns a string containing the title of the QuestDescription.
-        */
-            inline const std::string & getTitle(void) const
-                { return this->title_; }
-        
-        /**
-        @brief Returns the description text.
-        @return Returns a string containing the description text of the QuestDescription.
-        */
-            inline const std::string & getDescription(void) const
-                { return this->description_; }
+	    /**
+	    @brief Returns the title.
+	    @return Returns a string containing the title of the QuestDescription.
+	    */
+	    inline const std::string & getTitle(void) const
+		{ return this->title_; }
+	    
+	    /**
+	    @brief Returns the description text.
+	    @return Returns a string containing the description text of the QuestDescription.
+	    */
+	    inline const std::string & getDescription(void) const
+		{ return this->description_; }
+		
+	    /**
+	    @brief Returns the fail message.
+	    @return Returns a string containing the fail message of the QuestDescription.
+	    */
+	    inline const std::string & getFailMessage(void) const
+		{ return this->failMessage_; }
+		
+	    /**
+	    @brief Returns the complete message.
+	    @return Returns a string containing the complete message of the QuestDescription.
+	    */
+	    inline const std::string & getCompleteMessage(void) const
+		{ return this->completeMessage_; }
 
         private:
             std::string title_; //!< The title.
             std::string description_; //!< The description.
+            std::string failMessage_; //!< The message displayed when the Quest is failed.
+            std::string completeMessage_; //!< The message displayed when the Quest is completed.
 
             /**
@@ -89,5 +105,5 @@
                 { this->title_ = title; }
                 
-        /**
+            /**
             @brief Sets the description text.
             @param description The description text to be set.
@@ -96,4 +112,18 @@
                 { this->description_ = description; }
 
+            /**
+            @brief Sets the fail message.
+            @param message The fail message to be set.
+            */
+            inline void setFailMessage(const std::string & message)
+                { this->failMessage_ = message; }
+                
+	    /**
+            @brief Sets the complete message.
+            @param message The complete message to be set.
+            */
+            inline void setCompleteMessage(const std::string & message)
+                { this->completeMessage_ = message; }
+
     };
 
Index: /code/branches/questsystem3/src/orxonox/overlays/notifications/NotificationManager.cc
===================================================================
--- /code/branches/questsystem3/src/orxonox/overlays/notifications/NotificationManager.cc	(revision 2327)
+++ /code/branches/questsystem3/src/orxonox/overlays/notifications/NotificationManager.cc	(revision 2328)
@@ -97,14 +97,14 @@
         
         int i = NotificationQueue::queue_s->getLength();
-        for (std::list<NotificationContainer*>::iterator notification = notifications_s.begin(); notification != notifications_s.end() || i <= 0; ++notification)
+        for (std::list<NotificationContainer*>::iterator notification = notifications_s.begin(); notification != notifications_s.end() && i > 0; ++notification)
         {
             i--;
             NotificationContainer* container = *notification;
-            if(container->remainingTime == 0)
+            if(container->remainingTime == 0.0)
                 continue;
             
             COUT(3) << "Update, title: " << container->notification->getTitle() << ", message: " << container->notification->getMessage() << std::endl;
             
-	    text = text + "\n\n\n------------" + container->notification->getTitle(); + "\n\n" + container->notification->getMessage();
+	    text = text + "\n\n\n------------" + container->notification->getTitle() + "\n\n" + container->notification->getMessage();
         }
 
