Index: code/trunk/src/modules/notifications/NotificationDispatcher.cc
===================================================================
--- code/trunk/src/modules/notifications/NotificationDispatcher.cc	(revision 8864)
+++ code/trunk/src/modules/notifications/NotificationDispatcher.cc	(revision 8891)
@@ -50,4 +50,5 @@
     CreateUnloadableFactory(NotificationDispatcher);
 
+    registerMemberNetworkFunction(NotificationDispatcher, broadcastHelper);
     registerMemberNetworkFunction(NotificationDispatcher, dispatch);
 
@@ -61,4 +62,5 @@
 
         this->sender_ = NotificationListener::NONE;
+        this->bBroadcast_ = false;
         this->registerVariables();
     }
@@ -81,7 +83,8 @@
         SUPER(NotificationDispatcher, XMLPort, xmlelement, mode);
 
-        XMLPortParam(NotificationDispatcher, "sender", getSender, setSender, xmlelement, mode);
-        
-        XMLPortEventSink(NotificationDispatcher, BaseObject, "trigger", trigger, xmlelement, mode); //TODO: Change BaseObject to MultiTrigger as soon as MultiTrigger is the base of all triggers.
+        XMLPortParam(NotificationDispatcher, "sender", setSender, getSender, xmlelement, mode);
+        XMLPortParam(NotificationDispatcher, "broadcast", setBroadcasting, isBroadcasting, xmlelement, mode);
+
+        XMLPortEventSink(NotificationDispatcher, BaseObject, "trigger", trigger, xmlelement, mode);
     }
 
@@ -100,4 +103,30 @@
     {
         registerVariable(this->sender_, VariableDirection::ToClient);
+    }
+
+    /**
+    @brief
+        Broadcasts a specific Notification.
+    */
+    void NotificationDispatcher::broadcast(void)
+    {
+        // TODO: Needed?
+        const std::string message = this->createNotificationMessage();
+        NotificationListener::sendNotification(message, this->getSender(), notificationMessageType::info, notificationSendMode::local);
+
+        // Broadcast
+        if(!GameMode::isStandalone())
+        {
+            callMemberNetworkFunction(NotificationDispatcher, broadcastHelper, this->getObjectID(), NETWORK_PEER_ID_BROADCAST);
+        }
+    }
+
+    /**
+    @brief
+        Helper function for broadcast.
+    */
+    void NotificationDispatcher::broadcastHelper(void)
+    {
+        this->dispatch(Host::getPlayerID());
     }
 
@@ -110,5 +139,6 @@
     void NotificationDispatcher::dispatch(unsigned int clientId)
     {
-        if(GameMode::isStandalone() || Host::getPlayerID() == clientId || this->getSyncMode() == 0x0)
+        // We don't call sendNotification() directly on the server, because if might be necessary that createNotificationMessage() is executed on the client as the message may be client-specific.
+        if(GameMode::isStandalone() || Host::getPlayerID() == clientId || this->getSyncMode() == ObjectDirection::None)
         {
             const std::string message = this->createNotificationMessage();
@@ -139,4 +169,11 @@
         orxout(verbose, context::notifications) << "NotificationDispatcher (&" << this << ") triggered." << endl;
 
+        // If the NotificationDispatcher is set to broadcast.
+        if(this->isBroadcasting())
+        {
+            this->broadcast();
+            return true;
+        }
+
         PlayerTrigger* pTrigger = orxonox_cast<PlayerTrigger*>(trigger);
         PlayerInfo* player = NULL;
Index: code/trunk/src/modules/notifications/NotificationDispatcher.h
===================================================================
--- code/trunk/src/modules/notifications/NotificationDispatcher.h	(revision 8864)
+++ code/trunk/src/modules/notifications/NotificationDispatcher.h	(revision 8891)
@@ -50,5 +50,7 @@
         A NotificationDispatcher is an entity that, upon being triggered, dispatches (or sends) a specified @ref orxonox::Notification "Notification".
 
-        There is one parameter to be set, the @b sender . The sender specifies the part of Orxonox the sent @ref orxonox::Notification "Notification" comes from. The default value is set by the classes implementing NotificationDispatcher.
+        There are two parameter to be set:
+        - The @b sender . The sender specifies the part of Orxonox the sent @ref orxonox::Notification "Notification" comes from. The default value is set by the classes implementing NotificationDispatcher.
+        - The @b broadcast . Specifies whether messages are broadcast (i.e. sent to all clients) or just sent to a specific player.
 
         Its standard usage is:
@@ -62,5 +64,7 @@
         </NotificationDispatcher>
         @endcode
-        But keep in mind, that NotificationDispatcher is an abstract class and in this example @ref orxonox::PlayerTrigger "PlayerTrigger" stands for any event that is caused by a @ref orxonox::PlayerTrigger "PlayerTrigger", so instead of @ref orxonox::PlayerTrigger "PlayerTrigger", there could be a @ref orxonox::DistanceTrigger "DistanceTrigger", or a @ref orxonox::DistanceMultiTrigger "DistanceMutliTrigger", or even an @ref orxonox::EventListener "EventListener" that waits for an event coming from any kind of @ref orxonox::PlayerTrigger "PlayerTrigger".
+        But keep in mind, that NotificationDispatcher is an abstract class.
+        Also in this example @ref orxonox::PlayerTrigger "PlayerTrigger" stands for any event that is caused by a @ref orxonox::PlayerTrigger "PlayerTrigger", so instead of @ref orxonox::PlayerTrigger "PlayerTrigger", there could be a @ref orxonox::DistanceTrigger "DistanceTrigger", or a @ref orxonox::DistanceMultiTrigger "DistanceMutliTrigger", or even an @ref orxonox::EventListener "EventListener" that waits for an event coming from any kind of @ref orxonox::PlayerTrigger "PlayerTrigger".
+        If the NotificationDispatcher is not set to broadcast only events caused by @ref orxonox::PlayerTrigger "PlayerTriggers" trigger a message since the information obtained by the @ref orxonox::PlayerTrigger "PlayerTrigger" is used to identify the client to which the message should be sent.
 
     @author
@@ -84,5 +88,5 @@
             const std::string& getSender(void) const
                 { return this->sender_; }
-                        /**
+            /**
             @brief Set the sender of the Notification dispatched by this NotificationDispatcher.
             @param sender The name of the sender.
@@ -91,9 +95,25 @@
                 { this->sender_ = sender; }
 
-            void dispatch(unsigned int clientId); //!< Dispatches a specific Notification.
+            /**
+            @brief Check whether the NotificationDispatcher is set to broadcast.
+            @return Returns true if the NotificationDispatcher is set to broadcast.
+            */
+            bool isBroadcasting(void) const
+                { return this->bBroadcast_; }
+            /**
+            @brief Set the NotificationDispatcher to broadcast.
+            @param broadcast Whether the NotificationDispatcher is set to broadcast or singlecast.
+            */
+            void setBroadcasting(bool v)
+                { this->bBroadcast_ = v; }
+
+            void broadcast(void); //!< Broadcasts a specific Notification.
+            void broadcastHelper(void); //!< Helper function for broadcast.
+            void dispatch(unsigned int clientId); //!< Dispatches a specific Notification to a given client.
             bool trigger(bool triggered, BaseObject* trigger); //!< Is called when the NotificationDispatcher is triggered.
 
         protected:
             std::string sender_; //!< The name of the sender of the Notification dispatched by this NotificationDispatcher.
+            bool bBroadcast_; //!< Whether the NotificationDispatcher is broadcasting.
 
             void registerVariables(void); //!< Register some variables for synchronisation.
@@ -105,5 +125,5 @@
             */
             virtual const std::string& createNotificationMessage(void)
-                { return *(new std::string("")); }
+                { return BLANKSTRING; }
 
     };
Index: code/trunk/src/modules/overlays/hud/HUDNavigation.cc
===================================================================
--- code/trunk/src/modules/overlays/hud/HUDNavigation.cc	(revision 8864)
+++ code/trunk/src/modules/overlays/hud/HUDNavigation.cc	(revision 8891)
@@ -63,4 +63,5 @@
 {
   SetConfigValue(markerLimit_, 3);
+
 }
 
@@ -77,4 +78,5 @@
     setTextSize ( 0.05f );
     setNavMarkerSize ( 0.05f );
+    setDetectionLimit( 10000.0f );
 }
 
@@ -95,7 +97,8 @@
     SUPER ( HUDNavigation, XMLPort, xmlelement, mode );
 
-    XMLPortParam ( HUDNavigation, "font",          setFont,          getFont,          xmlelement, mode );
-    XMLPortParam ( HUDNavigation, "textSize",      setTextSize,      getTextSize,      xmlelement, mode );
-    XMLPortParam ( HUDNavigation, "navMarkerSize", setNavMarkerSize, getNavMarkerSize, xmlelement, mode );
+    XMLPortParam ( HUDNavigation, "font",           setFont,           getFont,           xmlelement, mode );
+    XMLPortParam ( HUDNavigation, "textSize",       setTextSize,       getTextSize,       xmlelement, mode );
+    XMLPortParam ( HUDNavigation, "navMarkerSize",  setNavMarkerSize,  getNavMarkerSize,  xmlelement, mode );
+    XMLPortParam ( HUDNavigation, "detectionLimit", setDetectionLimit, getDetectionLimit, xmlelement, mode );
 }
 
@@ -161,11 +164,11 @@
 
     unsigned int markerCount_ = 0;
-
+    bool closeEnough_ = false; //only display objects that are close enough to be relevant for the player
 //         for (ObjectMap::iterator it = activeObjectList_.begin(); it != activeObjectList_.end(); ++it)
     for ( sortedList::iterator listIt = sortedObjectList_.begin(); listIt != sortedObjectList_.end(); ++markerCount_, ++listIt )
     {
         ObjectMap::iterator it = activeObjectList_.find ( listIt->first );
-
-        if ( markerCount_ < markerLimit_ )
+        closeEnough_ = listIt->second < detectionLimit_ ;
+        if ( markerCount_ < markerLimit_ && (closeEnough_ ||  detectionLimit_ < 0) ) // display on HUD if the statement is true
         {
 
@@ -277,5 +280,5 @@
             it->second.text_->show();
         }
-        else
+        else // do not display on HUD
         {
             it->second.panel_->hide();
@@ -309,5 +312,5 @@
 void HUDNavigation::addObject ( RadarViewable* object )
 {
-    if( showObject(object)==false )
+    if( showObject(object) == false )
         return;
 
@@ -396,5 +399,5 @@
         return false;
     assert( rv->getWorldEntity() );
-    if ( rv->getWorldEntity()->isVisible()==false || rv->getRadarVisibility()==false )
+    if ( rv->getWorldEntity()->isVisible() == false || rv->getRadarVisibility() == false )
         return false;
     return true;
Index: code/trunk/src/modules/overlays/hud/HUDNavigation.h
===================================================================
--- code/trunk/src/modules/overlays/hud/HUDNavigation.h	(revision 8864)
+++ code/trunk/src/modules/overlays/hud/HUDNavigation.h	(revision 8891)
@@ -85,4 +85,9 @@
     { return navMarkerSize_; }
 
+    void setDetectionLimit( float limit )
+    { this->detectionLimit_ = limit; }
+    float getDetectionLimit() const
+    { return this->detectionLimit_; }
+
     void setTextSize ( float size );
     float getTextSize() const;
@@ -102,7 +107,7 @@
     float textSize_;
 
-    unsigned int markerLimit_;; //TODO: is it possible to set this over the console and/or the IG-Setting
-
-
+    unsigned int markerLimit_; //TODO: is it possible to set this over the console and/or the IG-Setting
+    float detectionLimit_; //!< Objects that are more far away than detectionLimit_ are not displayed on the HUD. 10000.0f is the default value.
+                           //!< In order to bypass this behaviour, set a negative detectionLimit_. Then the detection range is "infinite".
 };
 }
Index: code/trunk/src/modules/overlays/hud/HUDRadar.cc
===================================================================
--- code/trunk/src/modules/overlays/hud/HUDRadar.cc	(revision 8864)
+++ code/trunk/src/modules/overlays/hud/HUDRadar.cc	(revision 8891)
@@ -64,5 +64,5 @@
         this->shapeMaterials_[RadarViewable::Triangle] = "RadarTriangle.png";
         this->shapeMaterials_[RadarViewable::Square]   = "RadarSquare.png";
-
+        this->setDetectionLimit( 10000.0f );
         this->owner_ = 0;
     }
@@ -93,4 +93,6 @@
     {
         if (object == dynamic_cast<RadarViewable*>(this->owner_))
+            return;
+        if( showObject(object) == false ) //do not show objects that are "invisible" or "radar invisible"
             return;
 
@@ -123,11 +125,7 @@
 
     void HUDRadar::objectChanged( RadarViewable* rv )
-    {
-        if (rv == dynamic_cast<RadarViewable*>(this->owner_))
-            return;
-        assert( this->radarObjects_.find(rv) != this->radarObjects_.end() );
-        Ogre::PanelOverlayElement* panel = this->radarObjects_[rv];
-        panel->setMaterialName(TextureGenerator::getMaterialName(
-            shapeMaterials_[rv->getRadarObjectShape()], rv->getRadarObjectColour()));
+    {// The new implementation behaves more precisely, since inactive RadarViewables are not displayed anymore.
+        this->removeObject(rv);
+        this->addObject(rv);
     }
 
@@ -174,5 +172,8 @@
             coord *= math::pi / 3.5f; // small adjustment to make it fit the texture
             it->second->setPosition((1.0f + coord.x - size) * 0.5f, (1.0f - coord.y - size) * 0.5f);
-            it->second->show();
+            if( distance < detectionLimit_ || detectionLimit_ < 0 )
+                it->second->show();
+            else
+                it->second->hide();
 
             // if this object is in focus, then set the focus marker
@@ -186,4 +187,15 @@
     }
 
+    bool HUDRadar::showObject(RadarViewable* rv)
+    {
+        if ( rv == dynamic_cast<RadarViewable*> ( this->getOwner() ) )
+            return false;
+        assert( rv->getWorldEntity() );
+        if ( rv->getWorldEntity()->isVisible()==false || rv->getRadarVisibility()==false )
+            return false;
+        return true;
+    }
+
+
     void HUDRadar::changedOwner()
     {
Index: code/trunk/src/modules/overlays/hud/HUDRadar.h
===================================================================
--- code/trunk/src/modules/overlays/hud/HUDRadar.h	(revision 8864)
+++ code/trunk/src/modules/overlays/hud/HUDRadar.h	(revision 8891)
@@ -57,4 +57,9 @@
         void setHalfDotSizeDistance(float distance) { this->halfDotSizeDistance_ = distance; }
 
+        void setDetectionLimit( float limit )
+        { this->detectionLimit_ = limit; }
+        float getDetectionLimit() const
+        { return this->detectionLimit_; }
+
         float getMaximumDotSize() const { return this->maximumDotSize_; }
         void setMaximumDotSize(float size) { this->maximumDotSize_ = size; }
@@ -69,4 +74,5 @@
         virtual void objectChanged( RadarViewable* rv );
         void radarTick(float dt);
+        bool showObject( RadarViewable* rv ); //!< Do not display an object on radar, if showObject(.) is false.
 
         void gatherObjects();
@@ -83,5 +89,5 @@
 
         float sensitivity_;
-
+        float detectionLimit_;
         ControllableEntity* owner_;
     };
Index: code/trunk/src/modules/pickup/PickupSpawner.cc
===================================================================
--- code/trunk/src/modules/pickup/PickupSpawner.cc	(revision 8864)
+++ code/trunk/src/modules/pickup/PickupSpawner.cc	(revision 8891)
@@ -181,5 +181,5 @@
         if(GameMode::isMaster() && this->isActive())
         {
-            SmartPtr<PickupSpawner> temp = this; //Create a smart pointer to keep the PickupSpawner alive until we iterated through all Pawns (in case a Pawn takes the last pickup)
+            WeakPtr<PickupSpawner> spawner = this; // Create a smart pointer to keep the PickupSpawner alive until we iterated through all Pawns (in case a Pawn takes the last pickup)
 
             // Remove PickupCarriers from the blocked list if they have exceeded their time.
@@ -195,7 +195,10 @@
             for(ObjectList<Pawn>::iterator it = ObjectList<Pawn>::begin(); it != ObjectList<Pawn>::end(); ++it)
             {
+                if(spawner == NULL) // Stop if the PickupSpawner has been deleted (e.g. because it has run out of pickups to distribute).
+                    break;
+
                 Vector3 distance = it->getWorldPosition() - this->getWorldPosition();
                 PickupCarrier* carrier = dynamic_cast<PickupCarrier*>(*it);
-                // If a PickupCarrier, that fits the target-range of the Pickupable spawned by this PickupSpawnder, is in trigger-distance and the carrier is not blocked.
+                // If a PickupCarrier, that fits the target-range of the Pickupable spawned by this PickupSpawner, is in trigger-distance and the carrier is not blocked.
                 if(distance.length() < this->triggerDistance_ && carrier != NULL && this->blocked_.find(carrier) == this->blocked_.end())
                 {
Index: code/trunk/src/modules/questsystem/QuestItem.h
===================================================================
--- code/trunk/src/modules/questsystem/QuestItem.h	(revision 8864)
+++ code/trunk/src/modules/questsystem/QuestItem.h	(revision 8891)
@@ -105,5 +105,5 @@
             QuestDescription* description_; //!< The QuestDescription of the QuestItem.
 
-            bool registered_;
+            bool registered_; //!< Whether the QuestItem is registered with the QuestManager.
 
     };
Index: code/trunk/src/modules/questsystem/QuestManager.cc
===================================================================
--- code/trunk/src/modules/questsystem/QuestManager.cc	(revision 8864)
+++ code/trunk/src/modules/questsystem/QuestManager.cc	(revision 8891)
@@ -35,4 +35,5 @@
 
 #include "util/Exception.h"
+#include "util/OrxAssert.h"
 #include "util/ScopedSingletonManager.h"
 #include "core/command/ConsoleCommand.h"
@@ -60,5 +61,4 @@
     {
         RegisterRootObject(QuestManager);
-
         orxout(internal_info, context::quests) << "QuestManager created." << endl;
     }
@@ -95,5 +95,9 @@
     bool QuestManager::registerQuest(Quest* quest)
     {
-        assert(quest);
+        if(quest == NULL)
+        {
+            COUT(1) << "Quest pointer is NULL." << endl;
+            return false;
+        }
 
         std::pair<std::map<std::string, Quest*>::iterator,bool> result;
@@ -133,5 +137,9 @@
     bool QuestManager::registerHint(QuestHint* hint)
     {
-        assert(hint);
+        if(hint == NULL)
+        {
+            COUT(1) << "Hint pointer is NULL." << endl;
+            return false;
+        }
 
         std::pair<std::map<std::string, QuestHint*>::iterator,bool> result;
@@ -361,4 +369,5 @@
     Quest* QuestManager::getParentQuest(Quest* quest)
     {
+        OrxAssert(quest, "The input Quest is NULL.");
         return quest->getParentQuest();
     }
@@ -374,4 +383,5 @@
     QuestDescription* QuestManager::getDescription(Quest* item)
     {
+        OrxAssert(item, "The input Quest is NULL.");
         return item->getDescription();
     }
@@ -387,4 +397,5 @@
     QuestDescription* QuestManager::getDescription(QuestHint* item)
     {
+        OrxAssert(item, "The input QuestHint is NULL.");
         return item->getDescription();
     }
@@ -400,4 +411,5 @@
     const std::string QuestManager::getId(Quest* item) const
     {
+        OrxAssert(item, "The input Quest is NULL.");
         return item->getId();
     }
@@ -413,4 +425,5 @@
     const std::string QuestManager::getId(QuestHint* item) const
     {
+        OrxAssert(item, "The input QuestHint is NULL.");
         return item->getId();
     }
Index: code/trunk/src/modules/weapons/projectiles/Rocket.cc
===================================================================
--- code/trunk/src/modules/weapons/projectiles/Rocket.cc	(revision 8864)
+++ code/trunk/src/modules/weapons/projectiles/Rocket.cc	(revision 8891)
@@ -66,4 +66,5 @@
         this->localAngularVelocity_ = 0;
         this->lifetime_ = 100.0f;
+        this->bIsRocket_= true;
 
         if (GameMode::isMaster())
@@ -134,4 +135,5 @@
         if(this->isInitialized())
         {
+            this->bIsRocket_= false;
             if (GameMode::isMaster())
             {
