Index: code/branches/tutoriallevel2/src/libraries/core/GUIManager.cc
===================================================================
--- code/branches/tutoriallevel2/src/libraries/core/GUIManager.cc	(revision 8369)
+++ code/branches/tutoriallevel2/src/libraries/core/GUIManager.cc	(revision 8371)
@@ -37,4 +37,5 @@
 #include <CEGUIDefaultLogger.h>
 #include <CEGUIExceptions.h>
+#include <CEGUIFontManager.h>
 #include <CEGUIInputEvent.h>
 #include <CEGUIMouseCursor.h>
@@ -43,4 +44,5 @@
 #include <CEGUIWindow.h>
 #include <CEGUIWindowManager.h>
+#include <CEGUIXMLAttributes.h>
 #include <elements/CEGUIListbox.h>
 #include <elements/CEGUIListboxItem.h>
@@ -649,3 +651,38 @@
     }
 
+    /**
+    @brief
+        Adds a new freetype font to the CEGUI system.
+    @param name
+        The name of the new font.
+    @param size
+        The font size of the new font in pixels.
+        @param fontName
+        The filename of the font.
+    */
+    /*static*/ void GUIManager::addFontHelper(const std::string& name, int size, const std::string& fontName)
+    {
+        if(CEGUI::FontManager::getSingleton().isFontPresent(name)) // If a font with that name already exists.
+            return;
+
+        CEGUI::Font* font = NULL;
+        CEGUI::XMLAttributes xmlAttributes;
+
+        // Attributes specified within CEGUIFont
+        xmlAttributes.add("Name", name);
+        xmlAttributes.add("Filename", fontName);
+        xmlAttributes.add("ResourceGroup", "");
+        xmlAttributes.add("AutoScaled", "true");
+        xmlAttributes.add("NativeHorzRes", "800");
+        xmlAttributes.add("NativeVertRes", "600");
+
+        // Attributes specified within CEGUIXMLAttributes
+        xmlAttributes.add("Size", multi_cast<std::string>(size));
+        xmlAttributes.add("AntiAlias", "true");
+
+        font = CEGUI::FontManager::getSingleton().createFont("FreeType", xmlAttributes);
+        if(font != NULL)
+            font->load();
+    }
+
 }
Index: code/branches/tutoriallevel2/src/libraries/core/GUIManager.h
===================================================================
--- code/branches/tutoriallevel2/src/libraries/core/GUIManager.h	(revision 8369)
+++ code/branches/tutoriallevel2/src/libraries/core/GUIManager.h	(revision 8371)
@@ -125,7 +125,8 @@
 
         // TODO: Temporary hack because the tolua exported CEGUI method does not seem to work
-        static void subscribeEventHelper(CEGUI::Window* window, const std::string& event, const std::string& function); //tolua_export
-        static void setTooltipTextHelper(CEGUI::ListboxItem* item, const std::string& toooltip); //tolua_export
-        static void setItemTooltipsEnabledHelper(CEGUI::Listbox* listbox, bool enabled); //tolua_export
+        static void subscribeEventHelper(CEGUI::Window* window, const std::string& event, const std::string& function); // tolua_export
+        static void setTooltipTextHelper(CEGUI::ListboxItem* item, const std::string& toooltip); // tolua_export
+        static void setItemTooltipsEnabledHelper(CEGUI::Listbox* listbox, bool enabled); // tolua_export
+        static void addFontHelper(const std::string& name, int size, const std::string& fontName); // tolua_export
 
         static GUIManager& getInstance() { return Singleton<GUIManager>::getInstance(); } // tolua_export
Index: code/branches/tutoriallevel2/src/modules/notifications/NotificationManager.cc
===================================================================
--- code/branches/tutoriallevel2/src/modules/notifications/NotificationManager.cc	(revision 8369)
+++ code/branches/tutoriallevel2/src/modules/notifications/NotificationManager.cc	(revision 8371)
@@ -40,4 +40,5 @@
 #include "network/Host.h"
 #include "network/NetworkFunction.h"
+#include "util/Convert.h"
 #include "util/ScopedSingletonManager.h"
 
@@ -342,4 +343,36 @@
     /**
     @brief
+        Fetches the newest Notifications for a specific NotificationListener and stores them in the input map.
+    @param listener
+        The NotificationListener the Notifications are fetched for.
+    @param map
+        A pointer to a multimap, in which the notifications are stored. The map needs to have been allocated.
+    @param numberOfNotifications
+        The number of newest Notifications to be got.
+    @return
+        Returns true if successful.
+    */
+    void NotificationManager::getNewestNotifications(NotificationListener* listener, std::multimap<std::time_t, Notification*>* map, int numberOfNotifications)
+    {
+        assert(listener);
+        assert(map);
+
+        std::multimap<std::time_t, Notification*>* notifications = this->notificationLists_[this->listenerList_[listener]]; // All the Notifications for the input NotificationListener.
+
+        if(!notifications->empty()) // If the list of Notifications is not empty.
+        {
+            std::multimap<std::time_t,Notification*>::iterator it = notifications->end();
+            for(int i = 0; i < numberOfNotifications; i++) // Iterate through the Notifications from the newest until we have the specified number of notifications.
+            {
+                it--;
+                map->insert(std::pair<std::time_t, Notification*>(it->first, it->second)); // Add the found Notifications to the map.
+                if(it == notifications->begin())
+                    break;
+            }
+        }
+    }
+
+    /**
+    @brief
         Enters the edit mode of the NotificationLayer.
     */
@@ -387,5 +420,12 @@
     void NotificationManager::loadQueues(void)
     {
-        new NotificationQueue("all");
+        NotificationQueue* allQueue = new NotificationQueue("all");
+        GUIManager::getInstance().getLuaState()->doString("NotificationLayer.resizeQueue(\"all\", 0.5, 0, " + multi_cast<std::string>(allQueue->getMaxSize()) + ")");
+        GUIManager::getInstance().getLuaState()->doString("NotificationLayer.moveQueue(\"all\", 0, 10, 0.3, 0)");
+
+        NotificationQueue* infoQueue = new NotificationQueue("info", NotificationManager::ALL, 1, -1);
+        GUIManager::getInstance().getLuaState()->doString("NotificationLayer.changeQueueFont(\"info\", 24, \"FFFFFF00\")");
+        GUIManager::getInstance().getLuaState()->doString("NotificationLayer.resizeQueue(\"info\", 0.6, 0, " + multi_cast<std::string>(infoQueue->getMaxSize()) + ")");
+        GUIManager::getInstance().getLuaState()->doString("NotificationLayer.moveQueue(\"info\", 0.2, 0, 0.8, 0)");
     }
 
Index: code/branches/tutoriallevel2/src/modules/notifications/NotificationManager.h
===================================================================
--- code/branches/tutoriallevel2/src/modules/notifications/NotificationManager.h	(revision 8369)
+++ code/branches/tutoriallevel2/src/modules/notifications/NotificationManager.h	(revision 8371)
@@ -98,4 +98,6 @@
                 { this->getNotifications(listener, map, std::time(0)-timeDelay, std::time(0)); }
 
+            void getNewestNotifications(NotificationListener* listener, std::multimap<std::time_t, Notification*>* map, int numberOfNotifications); //!< Fetches the newest Notifications for a specific NotificationListener and stores them in the input map.
+
             void enterEditMode(void); //!< Enters the edit mode of the NotificationLayer.
 
Index: code/branches/tutoriallevel2/src/modules/notifications/NotificationQueue.cc
===================================================================
--- code/branches/tutoriallevel2/src/modules/notifications/NotificationQueue.cc	(revision 8369)
+++ code/branches/tutoriallevel2/src/modules/notifications/NotificationQueue.cc	(revision 8371)
@@ -161,5 +161,5 @@
     {
         this->tickTime_ += dt; // Add the time interval that has passed to the time counter.
-        if(this->tickTime_ >= 1.0) // If the time counter is greater than 1s all Notifications that have expired are removed, if it is smaller we wait to the next tick.
+        if(this->displayTime_ != INF && this->tickTime_ >= 1.0) // If the time counter is greater than 1s all Notifications that have expired are removed, if it is smaller we wait to the next tick.
         {
             this->timeLimit_.time = std::time(0)-this->displayTime_; // Container containig the current time.
@@ -188,5 +188,8 @@
         std::multimap<std::time_t, Notification*>* notifications = new std::multimap<std::time_t, Notification*>;
         // Get the Notifications sent in the interval from now to now minus the display time.
-        NotificationManager::getInstance().getNotifications(this, notifications, this->displayTime_);
+        if(this->displayTime_ == INF)
+            NotificationManager::getInstance().getNewestNotifications(this, notifications, this->getMaxSize());
+        else
+            NotificationManager::getInstance().getNotifications(this, notifications, this->displayTime_);
 
         if(!notifications->empty())
@@ -364,9 +367,7 @@
         Sets the maximum number of seconds a Notification is displayed.
     @param time
-        The number of seconds the Notifications is displayed.
-    @return
-        Returns true if successful.
-    */
-    void NotificationQueue::setDisplayTime(unsigned int time)
+        The number of seconds a Notification is displayed.
+    */
+    void NotificationQueue::setDisplayTime(int time)
     {
         if(this->displayTime_ == time)
Index: code/branches/tutoriallevel2/src/modules/notifications/NotificationQueue.h
===================================================================
--- code/branches/tutoriallevel2/src/modules/notifications/NotificationQueue.h	(revision 8369)
+++ code/branches/tutoriallevel2/src/modules/notifications/NotificationQueue.h	(revision 8371)
@@ -121,10 +121,10 @@
                 { return this->maxSize_; }
 
-            void setDisplayTime(unsigned int time); //!< Sets the maximum number of seconds a Notification is displayed.
+            void setDisplayTime(int time); //!< Sets the maximum number of seconds a Notification is displayed.
             /**
             @brief Returns the time interval the Notification is displayed.
             @return Returns the display time.
             */
-            inline unsigned int getDisplayTime() const
+            inline int getDisplayTime() const
                 { return this->displayTime_; }
             // tolua_end
@@ -152,4 +152,5 @@
             static const unsigned int DEFAULT_SIZE = 5; //!< The default maximum number of Notifications displayed.
             static const unsigned int DEFAULT_DISPLAY_TIME = 30; //!< The default display time.
+            static const int INF = -1; //!< Constant denoting infinity.
 
             std::string name_; //!< The name of the NotificationQueue.
@@ -157,5 +158,5 @@
             unsigned int maxSize_; //!< The maximal number of Notifications displayed.
             unsigned int size_; //!< The number of Notifications displayed.
-            unsigned int displayTime_; //!< The time a Notification is displayed.
+            int displayTime_; //!< The time a Notification is displayed.
 
             bool registered_; //!< Helper variable to remember whether the NotificationQueue is registered already.
Index: code/branches/tutoriallevel2/src/modules/objects/triggers/MultiTrigger.cc
===================================================================
--- code/branches/tutoriallevel2/src/modules/objects/triggers/MultiTrigger.cc	(revision 8369)
+++ code/branches/tutoriallevel2/src/modules/objects/triggers/MultiTrigger.cc	(revision 8371)
@@ -198,5 +198,4 @@
                         if(bActive ^ this->isActive(state->originator))
                         {
-
                             bool bFire = true;
 
Index: code/branches/tutoriallevel2/src/modules/objects/triggers/TriggerBase.h
===================================================================
--- code/branches/tutoriallevel2/src/modules/objects/triggers/TriggerBase.h	(revision 8369)
+++ code/branches/tutoriallevel2/src/modules/objects/triggers/TriggerBase.h	(revision 8371)
@@ -133,4 +133,10 @@
             inline int getActivations(void) const
                 { return this->remainingActivations_; }
+            /**
+            @brief Check whether the trigger has still at least one remaining activation.
+            @return Returns true if the trigger has remaining activations (i.e. the number of remaining activations is not zero).
+            */
+            inline bool hasRemainingActivations(void) const
+                { return this->remainingActivations_ > 0 || this->remainingActivations_ == INF_s; }
 
             /**
Index: code/branches/tutoriallevel2/src/modules/questsystem/QuestManager.cc
===================================================================
--- code/branches/tutoriallevel2/src/modules/questsystem/QuestManager.cc	(revision 8369)
+++ code/branches/tutoriallevel2/src/modules/questsystem/QuestManager.cc	(revision 8371)
@@ -274,4 +274,7 @@
     int QuestManager::getNumSubQuests(Quest* quest, PlayerInfo* player)
     {
+        if(quest == NULL)
+            return this->getNumRootQuests(player);
+
         std::list<Quest*> quests = quest->getSubQuestList();
         int numQuests = 0;
@@ -296,4 +299,7 @@
     Quest* QuestManager::getSubQuest(Quest* quest, PlayerInfo* player, int index)
     {
+        if(quest == NULL)
+            return this->getRootQuest(player, index);
+
         std::list<Quest*> quests = quest->getSubQuestList();
         for(std::list<Quest*>::iterator it = quests.begin(); it != quests.end(); it++)
@@ -349,4 +355,17 @@
     /**
     @brief
+        Get the parent-quest of the input Quest for the input player.
+    @param quest
+        The Quest to get the parent-quest of.
+    @param player
+        The player.
+    */
+    Quest* QuestManager::getParentQuest(Quest* quest)
+    {
+        return quest->getParentQuest();
+    }
+
+    /**
+    @brief
         Get the QuestDescription of the input Quest.
     @param item
@@ -375,4 +394,30 @@
     /**
     @brief
+        Get the id of the input Quest.
+    @param item
+        The Quest to get the id of.
+    @return
+        Returns the id of the input Quest.
+    */
+    const std::string QuestManager::getId(Quest* item) const
+    {
+        return item->getId();
+    }
+
+    /**
+    @brief
+        Get the id of the input QuestHint.
+    @param item
+        The QuestHint to get the id of.
+    @return
+        Returns the id of the input QuestHint.
+    */
+    const std::string QuestManager::getId(QuestHint* item) const
+    {
+        return item->getId();
+    }
+
+    /**
+    @brief
         Retrieve the player for a certain GUI.
     @param guiName
Index: code/branches/tutoriallevel2/src/modules/questsystem/QuestManager.h
===================================================================
--- code/branches/tutoriallevel2/src/modules/questsystem/QuestManager.h	(revision 8369)
+++ code/branches/tutoriallevel2/src/modules/questsystem/QuestManager.h	(revision 8371)
@@ -81,6 +81,11 @@
             QuestHint* getHints(Quest* quest, orxonox::PlayerInfo* player, int index); //!< Get the index-th QuestHint of the input Quest for the input player.
 
-            QuestDescription* getDescription(Quest* item);
-            QuestDescription* getDescription(QuestHint* item);
+            Quest* getParentQuest(Quest* quest); //!< Get the parent-quest of the input Quest.
+
+            QuestDescription* getDescription(Quest* item); //!< Get the QuestDescription of the input Quest.
+            QuestDescription* getDescription(QuestHint* item); //!< Get the QuestDescription of the input QuestHint.
+
+            const std::string getId(Quest* item) const; //!< Get the id of the input Quest.
+            const std::string getId(QuestHint* item) const; //!< Get the id of the input QuestHint.
             // tolua_end
 
Index: code/branches/tutoriallevel2/src/orxonox/LevelManager.cc
===================================================================
--- code/branches/tutoriallevel2/src/orxonox/LevelManager.cc	(revision 8369)
+++ code/branches/tutoriallevel2/src/orxonox/LevelManager.cc	(revision 8371)
@@ -222,4 +222,5 @@
                 this->nextLevel_ = this->availableLevels_.begin();
             }
+
             while(this->nextIndex_ != index)
             {
