Index: /code/branches/presentation2/data/levels/presentationHS09b.oxw
===================================================================
--- /code/branches/presentation2/data/levels/presentationHS09b.oxw	(revision 6381)
+++ /code/branches/presentation2/data/levels/presentationHS09b.oxw	(revision 6382)
@@ -25,5 +25,5 @@
 
 
-<AmbientSound ambientSource="Mars.ogg" loop="true" play="true" />
+<AmbientSound ambientSource="Mars.ogg" looping="true" playOnLoad="true" />
 
    <Light type=directional position="0,0,0" direction="0.253, 0.593, -0.765" diffuse="1.0, 0.9, 0.9, 1.0" specular="1.0, 0.9, 0.9, 1.0" />
@@ -258,5 +258,5 @@
 
 
-<AmbientSound ambientSource="Earth.ogg" loop="true" play="false">
+<AmbientSound ambientSource="Earth.ogg" looping="true" playOnLoad="false">
        <events>
           <activity>
Index: /code/branches/presentation2/data/levels/sound.oxw
===================================================================
--- /code/branches/presentation2/data/levels/sound.oxw	(revision 6381)
+++ /code/branches/presentation2/data/levels/sound.oxw	(revision 6382)
@@ -18,6 +18,6 @@
   >
 
-  <AmbientSound ambientSource="Earth.ogg" loop="true" play="true" />
-  <AmbientSound ambientSource="Mars.ogg" loop="true" play="false">
+  <AmbientSound ambientSource="Earth.ogg" looping="true" playOnLoad="true" />
+  <AmbientSound ambientSource="Mars.ogg" looping="true">
 	<events>
 		<activity>
@@ -30,5 +30,5 @@
 	</events>
   </AmbientSound>
-  <AmbientSound ambientSource="Jupiter.ogg" loop="true" play="false">
+  <AmbientSound ambientSource="Jupiter.ogg" looping="true">
 	<events>
 		<activity>
Index: /code/branches/presentation2/data/levels/templates/spaceship_HXY.oxt
===================================================================
--- /code/branches/presentation2/data/levels/templates/spaceship_HXY.oxt	(revision 6381)
+++ /code/branches/presentation2/data/levels/templates/spaceship_HXY.oxt	(revision 6382)
@@ -69,5 +69,5 @@
   >
     <EffectContainer condition="idle">
-      <WorldSound mainstate="activity" source="sounds/Engine_idle.ogg" loop=1 active=false/>
+      <WorldSound mainstate="activity" source="sounds/Engine_idle.ogg" looping=1 active=false/>
     </EffectContainer>
     <EffectContainer condition="not idle">
Index: /code/branches/presentation2/data/levels/templates/spaceship_Transporter.oxt
===================================================================
--- /code/branches/presentation2/data/levels/templates/spaceship_Transporter.oxt	(revision 6381)
+++ /code/branches/presentation2/data/levels/templates/spaceship_Transporter.oxt	(revision 6382)
@@ -69,5 +69,5 @@
   >
     <EffectContainer condition="idle">
-      <WorldSound mainstate="activity" source="sounds/Engine_idle.ogg" loop=1 active=false/>
+      <WorldSound mainstate="activity" source="sounds/Engine_idle.ogg" looping=1 active=false/>
     </EffectContainer>
     <EffectContainer condition="not idle">
Index: /code/branches/presentation2/src/orxonox/sound/AmbientSound.cc
===================================================================
--- /code/branches/presentation2/src/orxonox/sound/AmbientSound.cc	(revision 6381)
+++ /code/branches/presentation2/src/orxonox/sound/AmbientSound.cc	(revision 6382)
@@ -42,5 +42,7 @@
 
     AmbientSound::AmbientSound(BaseObject* creator)
-        : BaseObject(creator), Synchronisable(creator)
+        : BaseObject(creator)
+        , Synchronisable(creator)
+        , bPlayOnLoad_(false)
     {
         RegisterObject(AmbientSound);
@@ -49,8 +51,4 @@
         this->setVolume(0);
         this->registerVariables();
-    }
-
-    AmbientSound::~AmbientSound()
-    {
     }
 
@@ -67,7 +65,7 @@
     {
         registerVariable(ambientSource_, ObjectDirection::ToClient, new NetworkCallback<AmbientSound>(this, &AmbientSound::ambientSourceChanged));
-        registerVariable(bLooping_, ObjectDirection::ToClient, new NetworkCallback<AmbientSound>(this, &AmbientSound::loopingChanged));
-        registerVariable(pitch_, ObjectDirection::ToClient, new NetworkCallback<AmbientSound>(this, &AmbientSound::pitchChanged));
-        registerVariable((int&)(BaseSound::state_), ObjectDirection::ToClient, new NetworkCallback<AmbientSound>(this, &AmbientSound::stateChanged));
+        registerVariable(bLooping_,      ObjectDirection::ToClient, new NetworkCallback<AmbientSound>(this, &AmbientSound::loopingChanged));
+        registerVariable(pitch_,         ObjectDirection::ToClient, new NetworkCallback<AmbientSound>(this, &AmbientSound::pitchChanged));
+        registerVariable(bPlayOnLoad_,   ObjectDirection::ToClient, new NetworkCallback<AmbientSound>(this, &AmbientSound::playOnLoadChanged));
     }
 
@@ -76,5 +74,6 @@
         SUPER(AmbientSound, XMLPort, xmlelement, mode);
         BaseSound::XMLPortExtern(xmlelement, mode);
-        XMLPortParam(AmbientSound, "ambientsource", setAmbientSource, getAmbientSource, xmlelement, mode);
+        XMLPortParam(AmbientSound, "ambientSource", setAmbientSource, getAmbientSource, xmlelement, mode);
+        XMLPortParam(AmbientSound, "playOnLoad", setPlayOnLoad, getPlayOnLoad, xmlelement, mode);
     }
 
@@ -88,14 +87,5 @@
     {
         if (GameMode::playsSound())
-        {
             SoundManager::getInstance().registerAmbientSound(this);
-        }
-        else
-            BaseSound::play();
-    }
-
-    void AmbientSound::doPlay()
-    {
-        BaseSound::play();
     }
 
@@ -103,14 +93,5 @@
     {
         if (GameMode::playsSound())
-        {
             SoundManager::getInstance().unregisterAmbientSound(this);
-        }
-        else
-            BaseSound::stop();
-    }
-
-    void AmbientSound::doStop()
-    {
-        BaseSound::stop();
     }
 
@@ -118,9 +99,5 @@
     {
         if (GameMode::playsSound())
-        {
             SoundManager::getInstance().pauseAmbientSound(this);
-        }
-        else
-            BaseSound::pause();
     }
     
@@ -129,9 +106,4 @@
         assert(GameMode::playsSound());
         return SoundManager::getInstance().getRealVolume(SoundType::Music);
-    }
-
-    void AmbientSound::doPause()
-    {
-        BaseSound::pause();
     }
 
@@ -150,4 +122,11 @@
     }
 
+    void AmbientSound::setPlayOnLoad(bool val)
+    {
+        this->bPlayOnLoad_ = val;
+        if (val)
+            this->play();
+    }
+
     void AmbientSound::changedActivity()
     {
Index: /code/branches/presentation2/src/orxonox/sound/AmbientSound.h
===================================================================
--- /code/branches/presentation2/src/orxonox/sound/AmbientSound.h	(revision 6381)
+++ /code/branches/presentation2/src/orxonox/sound/AmbientSound.h	(revision 6382)
@@ -50,5 +50,4 @@
     public:
         AmbientSound(BaseObject* creator);
-        ~AmbientSound();
 
         void XMLPort(Element& xmlelement, XMLPort::Mode mode);
@@ -61,16 +60,25 @@
 
         void setAmbientSource(const std::string& source);
-        const std::string& getAmbientSource() const { return this->ambientSource_; }
-        inline void ambientSourceChanged(){ this->setAmbientSource(this->ambientSource_); }
+        inline const std::string& getAmbientSource() const
+            { return this->ambientSource_; }
+
+        void setPlayOnLoad(bool val);
+        bool getPlayOnLoad() const
+            { return this->bPlayOnLoad_; }
+
+    protected:
+        ~AmbientSound() { }
 
     private:
-        virtual void preDestroy();
-        void doPlay();
-        void doStop();
-        void doPause();
+        void preDestroy();
         void registerVariables();
         float getRealVolume();
+        inline void ambientSourceChanged()
+            { this->setAmbientSource(this->ambientSource_); }
+        inline void playOnLoadChanged()
+            { this->setPlayOnLoad(this->bPlayOnLoad_); }
 
         std::string ambientSource_; //!< Analogous to source_, but mood independent
+        bool        bPlayOnLoad_;   //!< Play the sound immediately when loaded
     };
 }
Index: /code/branches/presentation2/src/orxonox/sound/BaseSound.cc
===================================================================
--- /code/branches/presentation2/src/orxonox/sound/BaseSound.cc	(revision 6381)
+++ /code/branches/presentation2/src/orxonox/sound/BaseSound.cc	(revision 6382)
@@ -64,11 +64,11 @@
     void BaseSound::XMLPortExtern(Element& xmlelement, XMLPort::Mode mode)
     {
-        XMLPortParam(BaseSound, "volume", setVolume,  getVolume,  xmlelement, mode);
-        XMLPortParam(BaseSound, "loop",   setLooping, getLooping, xmlelement, mode);
-        XMLPortParam(BaseSound, "play",   setPlaying, isPlaying,  xmlelement, mode);
-        XMLPortParam(BaseSound, "source", setSource,  getSource,  xmlelement, mode);
-    }
-
-    void BaseSound::play()
+        XMLPortParam(BaseSound, "volume",  setVolume,  getVolume,  xmlelement, mode);
+        XMLPortParam(BaseSound, "looping", setLooping, getLooping, xmlelement, mode);
+        XMLPortParam(BaseSound, "pitch",   setPitch,   getPitch,   xmlelement, mode);
+        XMLPortParam(BaseSound, "source",  setSource,  getSource,  xmlelement, mode);
+    }
+
+    void BaseSound::doPlay()
     {
         this->state_ = Playing;
@@ -76,8 +76,10 @@
         {
             if (!alIsSource(this->audioSource_))
+            {
                 this->audioSource_ = SoundManager::getInstance().getSoundSource();
-            if (!alIsSource(this->audioSource_))
-                return;
-            this->initialiseSource();
+                if (!alIsSource(this->audioSource_))
+                    return;
+                this->initialiseSource();
+            }
 
             alSourcePlay(this->audioSource_);
@@ -87,5 +89,5 @@
     }
 
-    void BaseSound::stop()
+    void BaseSound::doStop()
     {
         this->state_ = Stopped;
@@ -103,5 +105,5 @@
     }
 
-    void BaseSound::pause()
+    void BaseSound::doPause()
     {
         if (this->isStopped())
@@ -242,9 +244,9 @@
             State state = this->state_; // save
             if (this->isPlaying() || this->isPaused())
-                BaseSound::play();
+                doPlay();
             if (state == Paused)
             {
                 this->state_ = Paused;
-                BaseSound::pause();
+                doPause();
             }
         }
Index: /code/branches/presentation2/src/orxonox/sound/BaseSound.h
===================================================================
--- /code/branches/presentation2/src/orxonox/sound/BaseSound.h	(revision 6381)
+++ /code/branches/presentation2/src/orxonox/sound/BaseSound.h	(revision 6382)
@@ -51,18 +51,14 @@
     public:
         BaseSound();
-        virtual ~BaseSound();
 
         void XMLPortExtern(Element& xmlelement, XMLPort::Mode mode);
 
-        virtual void play();
-        virtual void stop();
-        virtual void pause();
+        virtual void play()  { this->doPlay(); }
+        virtual void stop()  { this->doStop(); }
+        virtual void pause() { this->doPause(); }
 
         bool isPlaying() const { return this->state_ == Playing; }
         bool isPaused()  const { return this->state_ == Paused; }
         bool isStopped() const { return this->state_ == Stopped; }
-
-        void setPlaying(bool val)
-            { val ? this->play() : this->stop(); }
 
         virtual void setSource(const std::string& source);
@@ -90,4 +86,10 @@
             Paused
         };
+
+        virtual ~BaseSound();
+
+        void doPlay();
+        void doStop();
+        void doPause();
 
         // network callbacks
Index: /code/branches/presentation2/src/orxonox/sound/WorldSound.cc
===================================================================
--- /code/branches/presentation2/src/orxonox/sound/WorldSound.cc	(revision 6381)
+++ /code/branches/presentation2/src/orxonox/sound/WorldSound.cc	(revision 6382)
@@ -51,16 +51,12 @@
         this->registerVariables();
     }
-
-    WorldSound::~WorldSound()
-    {
-    }
     
     void WorldSound::registerVariables()
     {
-        registerVariable(volume_, ObjectDirection::ToClient, new NetworkCallback<WorldSound>(this, &WorldSound::volumeChanged));
-        registerVariable(source_, ObjectDirection::ToClient, new NetworkCallback<WorldSound>(this, &WorldSound::sourceChanged));
+        registerVariable(volume_,   ObjectDirection::ToClient, new NetworkCallback<WorldSound>(this, &WorldSound::volumeChanged));
+        registerVariable(source_,   ObjectDirection::ToClient, new NetworkCallback<WorldSound>(this, &WorldSound::sourceChanged));
         registerVariable(bLooping_, ObjectDirection::ToClient, new NetworkCallback<WorldSound>(this, &WorldSound::loopingChanged));
+        registerVariable(pitch_,    ObjectDirection::ToClient, new NetworkCallback<WorldSound>(this, &WorldSound::pitchChanged));
         registerVariable((int&)(BaseSound::state_), ObjectDirection::ToClient, new NetworkCallback<WorldSound>(this, &WorldSound::stateChanged));
-        registerVariable(pitch_, ObjectDirection::ToClient, new NetworkCallback<WorldSound>(this, &WorldSound::pitchChanged));
     }
 
@@ -125,4 +121,5 @@
     float WorldSound::getRealVolume()
     {
+        assert(GameMode::playsSound());
         return SoundManager::getInstance().getRealVolume(SoundType::Effects);
     }
Index: /code/branches/presentation2/src/orxonox/sound/WorldSound.h
===================================================================
--- /code/branches/presentation2/src/orxonox/sound/WorldSound.h	(revision 6381)
+++ /code/branches/presentation2/src/orxonox/sound/WorldSound.h	(revision 6382)
@@ -46,5 +46,4 @@
     public:
         WorldSound(BaseObject* creator);
-        ~WorldSound();
 
         void XMLPort(Element& xmlelement, XMLPort::Mode mode);
@@ -53,4 +52,7 @@
 
         void tick(float dt);
+
+    protected:
+        ~WorldSound() {}
 
     private:
