Index: code/branches/sound3/data/levels/sound.oxw
===================================================================
--- code/branches/sound3/data/levels/sound.oxw	(revision 6025)
+++ code/branches/sound3/data/levels/sound.oxw	(revision 6031)
@@ -17,6 +17,6 @@
     skybox       = "Orxonox/Starbox"
   >
-  <AmbientSound source="ambient/mainmenu.wav" loop="true" playOnLoad="true" />
-  <AmbientSound source="ambient/CoreWave.wav" loop="true" playOnLoad="false">
+  <AmbientSound source="mainmenu.wav" loop="true" playOnLoad="true" />
+  <AmbientSound source="CoreWave.wav" loop="true" playOnLoad="false">
 	<events>
 		<activity>
Index: code/branches/sound3/src/orxonox/MoodManager.cc
===================================================================
--- code/branches/sound3/src/orxonox/MoodManager.cc	(revision 6025)
+++ code/branches/sound3/src/orxonox/MoodManager.cc	(revision 6031)
@@ -42,4 +42,5 @@
     {
         RegisterRootObject(MoodManager);
+        moodOld_ = "default";
         this->setConfigValues();
 		CommandExecutor::addConsoleCommandShortcut(createConsoleCommand(createFunctor(&MoodManager::setMood, this), "setMood"));
@@ -53,8 +54,12 @@
     {
         SetConfigValue(mood_, "default")
-            .description("Sets the mood for the current level.");
+            .description("Sets the mood for the current level.")
+            .callback(this, &MoodManager::checkMoodValidity);
     }
 
-	// sets a new mood
+	/**
+     *  Sets the mood
+     *  @note TODO: Inform dependent classes of mood change
+     */
 	void MoodManager::setMood(const std::string& mood) {
 		ModifyConfigValue(mood_, set, mood);
@@ -65,3 +70,13 @@
 		return mood_;
 	}
+
+    void MoodManager::checkMoodValidity()
+    {
+        if(mood_ != "default" && mood_ != "dnb")        // Insert new moods here
+        {
+            ResetConfigValue(mood_);
+        }
+        COUT(0) << "MoodManager: Mood now set to " << mood_ << std::endl;
+        return;
+    }
 }
Index: code/branches/sound3/src/orxonox/MoodManager.h
===================================================================
--- code/branches/sound3/src/orxonox/MoodManager.h	(revision 6025)
+++ code/branches/sound3/src/orxonox/MoodManager.h	(revision 6031)
@@ -62,4 +62,7 @@
             // config values
             std::string mood_;
+            std::string moodOld_;
+
+            void checkMoodValidity();
 
             static MoodManager* singletonPtr_s;
Index: code/branches/sound3/src/orxonox/gamestates/GSMainMenu.cc
===================================================================
--- code/branches/sound3/src/orxonox/gamestates/GSMainMenu.cc	(revision 6025)
+++ code/branches/sound3/src/orxonox/gamestates/GSMainMenu.cc	(revision 6031)
@@ -128,5 +128,5 @@
 	void GSMainMenu::setConfigValues()
     {
-        SetConfigValue(soundPathMain_, "ambient/mainmenu.wav")
+        SetConfigValue(soundPathMain_, "mainmenu.wav")
             .description("Contains the path to the main menu sound file.")
 			.callback(this, &GSMainMenu::reloadSound);
Index: code/branches/sound3/src/orxonox/sound/AmbientSound.cc
===================================================================
--- code/branches/sound3/src/orxonox/sound/AmbientSound.cc	(revision 6025)
+++ code/branches/sound3/src/orxonox/sound/AmbientSound.cc	(revision 6031)
@@ -85,4 +85,18 @@
     }
 
+    void AmbientSound::setSource(const std::string& source)
+    {
+        if(source.find('/') == std::string.npos)
+        {
+            std::string filePath = SoundManager::getInstance().getAmbientPath(source);
+            if(!(filePath.empty()))
+            {
+                BaseSound::setSource(filePath);
+                return;
+            }
+        }
+        COUT(3) << source << ": Not a valid name! Ambient sound will not change." << std::endl;       
+    }
+
     void AmbientSound::changedActivity() 
     {
Index: code/branches/sound3/src/orxonox/sound/AmbientSound.h
===================================================================
--- code/branches/sound3/src/orxonox/sound/AmbientSound.h	(revision 6025)
+++ code/branches/sound3/src/orxonox/sound/AmbientSound.h	(revision 6031)
@@ -52,4 +52,6 @@
         virtual void pause();
 
+        virtual void setSource(const std::string& source);
+
         virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
         virtual void XMLEventPort(Element& xmlelement, XMLPort::Mode mode);
Index: code/branches/sound3/src/orxonox/sound/BaseSound.h
===================================================================
--- code/branches/sound3/src/orxonox/sound/BaseSound.h	(revision 6025)
+++ code/branches/sound3/src/orxonox/sound/BaseSound.h	(revision 6031)
@@ -58,5 +58,5 @@
         bool isStopped();
 
-        void setSource(const std::string& source);
+        virtual void setSource(const std::string& source);
         const std::string& getSource() { return this->source_; }
 
Index: code/branches/sound3/src/orxonox/sound/SoundManager.cc
===================================================================
--- code/branches/sound3/src/orxonox/sound/SoundManager.cc	(revision 6025)
+++ code/branches/sound3/src/orxonox/sound/SoundManager.cc	(revision 6031)
@@ -34,7 +34,10 @@
 #include "util/Math.h"
 #include "util/ScopeGuard.h"
+#include "util/StringUtils.h"
 #include "core/GameMode.h"
 #include "core/ScopedSingletonManager.h"
+#include "core/Resource.h"
 #include "BaseSound.h"
+#include "MoodManager.h"
 
 namespace orxonox
@@ -127,8 +130,15 @@
     void SoundManager::unregisterAmbientSound(BaseSound* currentAmbient)
     {
+        if(currentAmbient == NULL || ambientSounds_.empty())
+        {
+            return;
+        }
         if(this->ambientSounds_.front() == currentAmbient) 
         {
             this->ambientSounds_.pop_front();
-            this->ambientSounds_.front()->replay();
+            if(!(this->ambientSounds_.empty()))
+            {
+                this->ambientSounds_.front()->replay();
+            }
         }
         else
@@ -144,3 +154,15 @@
         }
     }
+
+    // Get the current mood and return the full path string to the requested sound.
+    const std::string& SoundManager::getAmbientPath(const std::string& source)
+    {
+        lastReqPath = "ambient/" + MoodManager::getInstance().getMood() + "/" + source;
+        shared_ptr<ResourceInfo> fileInfo = Resource::getInfo(lastReqPath);
+        if(fileInfo == NULL)
+        {
+            return BLANKSTRING;
+        }
+        return lastReqPath;
+    }
 }
Index: code/branches/sound3/src/orxonox/sound/SoundManager.h
===================================================================
--- code/branches/sound3/src/orxonox/sound/SoundManager.h	(revision 6025)
+++ code/branches/sound3/src/orxonox/sound/SoundManager.h	(revision 6031)
@@ -53,4 +53,5 @@
         void registerAmbientSound(BaseSound* newAmbient);
         void unregisterAmbientSound(BaseSound* currentAmbient);
+        const std::string& getAmbientPath(const std::string& source);
 
     private:
@@ -58,4 +59,5 @@
         ALCcontext* context_;
         std::list<BaseSound*> ambientSounds_;
+        std::string lastReqPath;
 
         static SoundManager* singletonPtr_s;
