Index: code/trunk/src/orxonox/tools/BillboardSet.cc
===================================================================
--- code/trunk/src/orxonox/tools/BillboardSet.cc	(revision 1755)
+++ code/trunk/src/orxonox/tools/BillboardSet.cc	(revision 2087)
@@ -31,9 +31,11 @@
 
 #include <sstream>
+#include <cassert>
 
 #include <OgreSceneManager.h>
+#include <OgreBillboard.h>
 
-#include "GraphicsEngine.h"
-#include "util/Math.h"
+#include "util/Convert.h"
+#include "util/String.h"
 
 namespace orxonox
@@ -46,44 +48,116 @@
     }
 
-    void BillboardSet::setBillboardSet(const std::string& file, int count)
+    BillboardSet::~BillboardSet()
     {
-        std::ostringstream name;
-        name << (BillboardSet::billboardSetCounter_s++);
-        this->billboardSet_ = GraphicsEngine::getInstance().getLevelSceneManager()->createBillboardSet("Billboard" + name.str(), count);
-        this->billboardSet_->createBillboard(Vector3::ZERO);
-        this->billboardSet_->setMaterialName(file);
+        this->destroyBillboardSet();
     }
 
-    void BillboardSet::setBillboardSet(const std::string& file, const ColourValue& colour, int count)
+    void BillboardSet::setBillboardSet(Ogre::SceneManager* scenemanager, const std::string& file, int count)
     {
-        std::ostringstream name;
-        name << (BillboardSet::billboardSetCounter_s++);
-        this->billboardSet_ = GraphicsEngine::getInstance().getLevelSceneManager()->createBillboardSet("Billboard" + name.str(), count);
-        this->billboardSet_->createBillboard(Vector3::ZERO, colour);
-        this->billboardSet_->setMaterialName(file);
+        this->setBillboardSet(scenemanager, file, Vector3::ZERO, count);
     }
 
-    void BillboardSet::setBillboardSet(const std::string& file, const Vector3& position, int count)
+    void BillboardSet::setBillboardSet(Ogre::SceneManager* scenemanager, const std::string& file, const ColourValue& colour, int count)
     {
-        std::ostringstream name;
-        name << (BillboardSet::billboardSetCounter_s++);
-        this->billboardSet_ = GraphicsEngine::getInstance().getLevelSceneManager()->createBillboardSet("Billboard" + name.str(), count);
-        this->billboardSet_->createBillboard(position);
-        this->billboardSet_->setMaterialName(file);
+        this->setBillboardSet(scenemanager, file, colour, Vector3::ZERO, count);
     }
 
-    void BillboardSet::setBillboardSet(const std::string& file, const ColourValue& colour, const Vector3& position, int count)
+    void BillboardSet::setBillboardSet(Ogre::SceneManager* scenemanager, const std::string& file, const Vector3& position, int count)
     {
-        std::ostringstream name;
-        name << (BillboardSet::billboardSetCounter_s++);
-        this->billboardSet_ = GraphicsEngine::getInstance().getLevelSceneManager()->createBillboardSet("Billboard" + name.str(), count);
-        this->billboardSet_->createBillboard(position, colour);
-        this->billboardSet_->setMaterialName(file);
+        assert(scenemanager);
+        this->destroyBillboardSet();
+
+        try
+        {
+            this->billboardSet_ = scenemanager->createBillboardSet("Billboard" + convertToString(BillboardSet::billboardSetCounter_s++), count);
+            this->billboardSet_->createBillboard(position);
+            this->billboardSet_->setMaterialName(file);
+        }
+        catch (...)
+        {
+            COUT(1) << "Error: Couln't load billboard \"" << file << "\"" << std::endl;
+        }
+
+        this->scenemanager_ = scenemanager;
     }
 
-    BillboardSet::~BillboardSet()
+    void BillboardSet::setBillboardSet(Ogre::SceneManager* scenemanager, const std::string& file, const ColourValue& colour, const Vector3& position, int count)
+    {
+        assert(scenemanager);
+        this->destroyBillboardSet();
+
+        try
+        {
+            this->billboardSet_ = scenemanager->createBillboardSet("Billboard" + convertToString(BillboardSet::billboardSetCounter_s++), count);
+            this->billboardSet_->createBillboard(position, colour);
+            this->billboardSet_->setMaterialName(file);
+        }
+        catch (...)
+        {
+            COUT(1) << "Error: Couln't load billboard \"" << file << "\"" << std::endl;
+        }
+
+        this->scenemanager_ = scenemanager;
+    }
+
+    void BillboardSet::destroyBillboardSet()
+    {
+        if (this->billboardSet_ && this->scenemanager_)
+            this->scenemanager_->destroyBillboardSet(this->billboardSet_);
+    }
+
+    const std::string& BillboardSet::getName() const
     {
         if (this->billboardSet_)
-            GraphicsEngine::getInstance().getLevelSceneManager()->destroyBillboardSet(this->billboardSet_);
+            return this->billboardSet_->getName();
+        else
+            return BLANKSTRING;
+    }
+
+    void BillboardSet::setVisible(bool visible)
+    {
+        if (this->billboardSet_)
+            this->billboardSet_->setVisible(visible);
+    }
+
+    bool BillboardSet::getVisible() const
+    {
+        if (this->billboardSet_)
+            return this->billboardSet_->getVisible();
+        else
+            return false;
+    }
+
+    void BillboardSet::setColour(const ColourValue& colour)
+    {
+        if (this->billboardSet_)
+        {
+            for (int i = 0; i < this->billboardSet_->getNumBillboards(); ++i)
+                this->billboardSet_->getBillboard(i)->setColour(colour);
+        }
+    }
+
+    const ColourValue& BillboardSet::getColour() const
+    {
+        if (this->billboardSet_ && this->billboardSet_->getNumBillboards() > 0)
+        {
+            return this->billboardSet_->getBillboard(0)->getColour();
+        }
+        else
+            return ColourValue::White;
+    }
+
+    void BillboardSet::setMaterial(const std::string& material)
+    {
+        if (this->billboardSet_)
+            this->billboardSet_->setMaterialName(material);
+    }
+
+    const std::string& BillboardSet::getMaterial() const
+    {
+        if (this->billboardSet_)
+            return this->billboardSet_->getMaterialName();
+        else
+            return BLANKSTRING;
     }
 }
Index: code/trunk/src/orxonox/tools/BillboardSet.h
===================================================================
--- code/trunk/src/orxonox/tools/BillboardSet.h	(revision 1755)
+++ code/trunk/src/orxonox/tools/BillboardSet.h	(revision 2087)
@@ -44,23 +44,30 @@
             BillboardSet();
             ~BillboardSet();
-            void setBillboardSet(const std::string& file, int count = 1);
-            void setBillboardSet(const std::string& file, const ColourValue& colour, int count = 1);
-            void setBillboardSet(const std::string& file, const Vector3& position, int count = 1);
-            void setBillboardSet(const std::string& file, const ColourValue& colour, const Vector3& position, int count = 1);
+
+            void setBillboardSet(Ogre::SceneManager* scenemanager, const std::string& file, int count = 1);
+            void setBillboardSet(Ogre::SceneManager* scenemanager, const std::string& file, const ColourValue& colour, int count = 1);
+            void setBillboardSet(Ogre::SceneManager* scenemanager, const std::string& file, const Vector3& position, int count = 1);
+            void setBillboardSet(Ogre::SceneManager* scenemanager, const std::string& file, const ColourValue& colour, const Vector3& position, int count = 1);
 
             inline Ogre::BillboardSet* getBillboardSet()
                 { return this->billboardSet_; }
 
-            inline const std::string& getName() const
-                { return this->billboardSet_->getName(); }
+            const std::string& getName() const;
 
-            inline void setVisible(bool visible)
-                { this->billboardSet_->setVisible(visible); }
-            inline bool getVisible() const
-                { return this->billboardSet_->getVisible(); }
+            void setVisible(bool visible);
+            bool getVisible() const;
+
+            void setColour(const ColourValue& colour);
+            const ColourValue& getColour() const;
+
+            void setMaterial(const std::string& material);
+            const std::string& getMaterial() const;
 
         private:
+            void destroyBillboardSet();
+
             static unsigned int billboardSetCounter_s;
             Ogre::BillboardSet* billboardSet_;
+            Ogre::SceneManager* scenemanager_;
     };
 }
Index: code/trunk/src/orxonox/tools/Light.cc
===================================================================
--- code/trunk/src/orxonox/tools/Light.cc	(revision 1755)
+++ 	(revision )
@@ -1,62 +1,0 @@
-/*
- *   ORXONOX - the hottest 3D action shooter ever to exist
- *                    > www.orxonox.net <
- *
- *
- *   License notice:
- *
- *   This program is free software; you can redistribute it and/or
- *   modify it under the terms of the GNU General Public License
- *   as published by the Free Software Foundation; either version 2
- *   of the License, or (at your option) any later version.
- *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with this program; if not, write to the Free Software
- *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- *   Author:
- *      ...
- *   Co-authors:
- *      ...
- *
- */
-
-#include "OrxonoxStableHeaders.h"
-#include "Light.h"
-
-#include <sstream>
-
-#include <OgreSceneManager.h>
-
-#include "GraphicsEngine.h"
-
-namespace orxonox
-{
-    unsigned int Light::lightCounter_s = 0;
-
-    Light::Light()
-    {
-        this->light_ = 0;
-    }
-
-    void Light::setLight(Ogre::Light::LightTypes type, const ColourValue& diffuse, const ColourValue& specular)
-    {
-        std::ostringstream name;
-        name << (Light::lightCounter_s++);
-        this->light_ = GraphicsEngine::getInstance().getLevelSceneManager()->createLight("Light" + name.str());
-        this->light_->setType(type);
-        this->light_->setDiffuseColour(diffuse);
-        this->light_->setSpecularColour(specular);
-    }
-
-    Light::~Light()
-    {
-        if (this->light_)
-            GraphicsEngine::getInstance().getLevelSceneManager()->destroyLight(this->light_);
-    }
-}
Index: code/trunk/src/orxonox/tools/Light.h
===================================================================
--- code/trunk/src/orxonox/tools/Light.h	(revision 1755)
+++ 	(revision )
@@ -1,61 +1,0 @@
-/*
- *   ORXONOX - the hottest 3D action shooter ever to exist
- *                    > www.orxonox.net <
- *
- *
- *   License notice:
- *
- *   This program is free software; you can redistribute it and/or
- *   modify it under the terms of the GNU General Public License
- *   as published by the Free Software Foundation; either version 2
- *   of the License, or (at your option) any later version.
- *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with this program; if not, write to the Free Software
- *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- *   Author:
- *      ...
- *   Co-authors:
- *      ...
- *
- */
-
-#ifndef _Light_H__
-#define _Light_H__
-
-#include "OrxonoxPrereqs.h"
-
-#include <string>
-
-#include <OgreLight.h>
-
-#include "util/Math.h"
-
-namespace orxonox
-{
-    class _OrxonoxExport Light
-    {
-        public:
-            Light();
-            ~Light();
-            void setLight(Ogre::Light::LightTypes type = Ogre::Light::LT_POINT, const ColourValue& diffuse = ColourValue(1.0, 1.0, 1.0), const ColourValue& specular = ColourValue(1.0, 1.0, 1.0));
-
-            inline Ogre::Light* getLight()
-                { return this->light_; }
-
-            inline const std::string& getName() const
-                { return this->light_->getName(); }
-
-        private:
-            static unsigned int lightCounter_s;
-            Ogre::Light* light_;
-    };
-}
-
-#endif /* _Light_H__ */
Index: code/trunk/src/orxonox/tools/Mesh.cc
===================================================================
--- code/trunk/src/orxonox/tools/Mesh.cc	(revision 1755)
+++ code/trunk/src/orxonox/tools/Mesh.cc	(revision 2087)
@@ -32,6 +32,9 @@
 #include <sstream>
 #include <OgreSceneManager.h>
-#include "GraphicsEngine.h"
-#include "Settings.h"
+#include <cassert>
+
+#include "core/Core.h"
+#include "util/Convert.h"
+#include "util/String.h"
 
 namespace orxonox
@@ -39,21 +42,66 @@
     unsigned int Mesh::meshCounter_s = 0;
 
-    Mesh::Mesh() :
-      entity_(0)
+    Mesh::Mesh()
     {
-    }
-
-    void Mesh::setMesh(const std::string& file)
-    {
-        std::ostringstream name;
-        name << (Mesh::meshCounter_s++);
-        if (Settings::showsGraphics())
-            this->entity_ = GraphicsEngine::getInstance().getLevelSceneManager()->createEntity("Mesh" + name.str(), file);
+        this->entity_ = 0;
+        this->bCastShadows_ = true;
     }
 
     Mesh::~Mesh()
     {
-        if (this->entity_ && Settings::showsGraphics())
-            GraphicsEngine::getInstance().getLevelSceneManager()->destroyEntity(this->entity_);
+        if (this->entity_ && this->scenemanager_)
+            this->scenemanager_->destroyEntity(this->entity_);
+    }
+
+    void Mesh::setMeshSource(Ogre::SceneManager* scenemanager, const std::string& meshsource)
+    {
+        assert(scenemanager);
+
+        this->scenemanager_ = scenemanager;
+
+        if (this->entity_)
+            this->scenemanager_->destroyEntity(this->entity_);
+
+        if (Core::showsGraphics())
+        {
+            try
+            {
+                this->entity_ = this->scenemanager_->createEntity("Mesh" + convertToString(Mesh::meshCounter_s++), meshsource);
+                this->entity_->setCastShadows(this->bCastShadows_);
+            }
+            catch (...)
+            {
+                COUT(1) << "Error: Couln't load mesh \"" << meshsource << "\"" << std::endl;
+            }
+        }
+    }
+
+    void Mesh::setCastShadows(bool bCastShadows)
+    {
+        this->bCastShadows_ = bCastShadows;
+        if (this->entity_)
+            this->entity_->setCastShadows(this->bCastShadows_);
+    }
+
+    const std::string& Mesh::getName() const
+    {
+        if (this->entity_)
+            return this->entity_->getName();
+        else
+            return BLANKSTRING;
+    }
+
+    void Mesh::setVisible(bool bVisible)
+    {
+        if (this->entity_)
+            this->entity_->setVisible(bVisible);
+    }
+
+    bool Mesh::isVisible() const
+    {
+        if (this->entity_)
+            return this->entity_->getVisible();
+        else
+            return false;
     }
 }
Index: code/trunk/src/orxonox/tools/Mesh.h
===================================================================
--- code/trunk/src/orxonox/tools/Mesh.h	(revision 1755)
+++ code/trunk/src/orxonox/tools/Mesh.h	(revision 2087)
@@ -21,5 +21,5 @@
  *
  *   Author:
- *      ...
+ *      Fabian 'x3n' Landau
  *   Co-authors:
  *      ...
@@ -33,5 +33,4 @@
 
 #include <string>
-
 #include <OgreEntity.h>
 
@@ -43,20 +42,24 @@
             Mesh();
             ~Mesh();
-            void setMesh(const std::string& file);
+
+            void setMeshSource(Ogre::SceneManager* scenemanager, const std::string& file);
 
             inline Ogre::Entity* getEntity()
                 { return this->entity_; }
 
-            inline const std::string& getName() const
-                { return this->entity_->getName(); }
+            const std::string& getName() const;
 
-            inline void setVisible(bool visible)
-                { if (this->entity_) this->entity_->setVisible(visible); }
-            inline bool getVisible() const
-                { if (this->entity_) return this->entity_->getVisible(); else return false; }
+            void setVisible(bool bVisible);
+            bool isVisible() const;
+
+            void setCastShadows(bool bCastShadows);
+            inline bool getCastShadows() const
+                { return this->bCastShadows_; }
 
         private:
             static unsigned int meshCounter_s;
             Ogre::Entity* entity_;
+            bool bCastShadows_;
+            Ogre::SceneManager* scenemanager_;
     };
 }
Index: code/trunk/src/orxonox/tools/ParticleInterface.cc
===================================================================
--- code/trunk/src/orxonox/tools/ParticleInterface.cc	(revision 1755)
+++ code/trunk/src/orxonox/tools/ParticleInterface.cc	(revision 2087)
@@ -1,28 +1,29 @@
 /*
-*   ORXONOX - the hottest 3D action shooter ever to exist
-*
-*
-*   License notice:
-*
-*   This program is free software; you can redistribute it and/or
-*   modify it under the terms of the GNU General Public License
-*   as published by the Free Software Foundation; either version 2
-*   of the License, or (at your option) any later version.
-*
-*   This program is distributed in the hope that it will be useful,
-*   but WITHOUT ANY WARRANTY; without even the implied warranty of
-*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*   GNU General Public License for more details.
-*
-*   You should have received a copy of the GNU General Public License
-*   along with this program; if not, write to the Free Software
-*   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-*
-*   Author:
-*      ...
-*   Co-authors:
-*      ...
-*
-*/
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
 
 /**
@@ -37,4 +38,5 @@
 #include <OgreParticleEmitter.h>
 #include <OgreSceneManager.h>
+#include <cassert>
 
 #include "GraphicsEngine.h"
@@ -44,147 +46,164 @@
 namespace orxonox
 {
-  unsigned int ParticleInterface::counter_s = 0;
-  ParticleInterface* ParticleInterface::currentParticleInterface_s = 0;
-
-  ParticleInterface::ParticleInterface(const std::string& templateName, LODParticle::LOD detaillevel)
-  {
-    RegisterRootObject(ParticleInterface);
-
-    this->sceneNode_ = 0;
-    this->bEnabled_ = true;
-    this->detaillevel_ = (unsigned int)detaillevel;
-    this->particleSystem_ = GraphicsEngine::getInstance().getLevelSceneManager()->createParticleSystem("particles" + getConvertedValue<unsigned int, std::string>(ParticleInterface::counter_s++), templateName);
-    //this->particleSystem_->setSpeedFactor(Orxonox::getInstance().getTimeFactor());
-    this->particleSystem_->setSpeedFactor(1.0f);
-
-    if (GraphicsEngine::getInstance().getDetailLevelParticle() < (unsigned int)this->detaillevel_)
-    {
-      this->bVisible_ = false;
-      this->updateVisibility();
-    }
-    else
-    {
-      this->bVisible_ = true;
-    }
-  }
-
-  ParticleInterface::~ParticleInterface()
-  {
-    this->particleSystem_->removeAllEmitters();
-    GraphicsEngine::getInstance().getLevelSceneManager()->destroyParticleSystem(particleSystem_);
-  }
-
-  void ParticleInterface::addToSceneNode(Ogre::SceneNode* sceneNode)
-  {
-    this->sceneNode_ = sceneNode;
-    this->sceneNode_->attachObject(this->particleSystem_);
-  }
-
-  void ParticleInterface::detachFromSceneNode()
-  {
-    if (this->sceneNode_)
-    {
-      this->sceneNode_->detachObject(this->particleSystem_);
-      this->sceneNode_ = 0;
-    }
-  }
-
-  Ogre::ParticleEmitter* ParticleInterface::createNewEmitter()
-  {
-    if (this->particleSystem_->getNumEmitters() > 0)
-    {
-      Ogre::ParticleEmitter* newemitter = this->particleSystem_->addEmitter(this->particleSystem_->getEmitter(0)->getType());
-      this->particleSystem_->getEmitter(0)->copyParametersTo(newemitter);
-      return newemitter;
-    }
-    else
-      return 0;
-  }
-  Ogre::ParticleEmitter* ParticleInterface::getEmitter(unsigned int emitterNr) const
-  {
-    if (emitterNr < this->particleSystem_->getNumEmitters())
-      return this->particleSystem_->getEmitter(emitterNr);
-    else
-      return 0;
-  }
-  void ParticleInterface::removeEmitter(unsigned int emitterNr)
-  {
-    if (emitterNr < this->particleSystem_->getNumEmitters())
-      this->particleSystem_->removeEmitter(emitterNr);
-  }
-  void ParticleInterface::removeAllEmitters()
-  {
-    this->particleSystem_->removeAllEmitters();
-  }
-  unsigned int ParticleInterface::getNumEmitters() const
-  {
-    return this->particleSystem_->getNumEmitters();
-  }
-
-  Ogre::ParticleAffector* ParticleInterface::addAffector(const std::string& name)
-  {
-    return this->particleSystem_->addAffector(name);
-  }
-  Ogre::ParticleAffector* ParticleInterface::getAffector(unsigned int affectorNr) const
-  {
-    if (affectorNr < this->particleSystem_->getNumAffectors())
-      return this->particleSystem_->getAffector(affectorNr);
-    else
-      return 0;
-  }
-  void ParticleInterface::removeAffector(unsigned int affectorNr)
-  {
-    if (affectorNr < this->particleSystem_->getNumAffectors())
-      this->particleSystem_->removeAffector(affectorNr);
-  }
-  void ParticleInterface::removeAllAffectors()
-  {
-    this->particleSystem_->removeAllAffectors();
-  }
-  unsigned int ParticleInterface::getNumAffectors() const
-  {
-    return this->particleSystem_->getNumAffectors();
-  }
-
-  void ParticleInterface::setEnabled(bool enable)
-  {
-    this->bEnabled_ = enable;
-    this->updateVisibility();
-  }
-
-  void ParticleInterface::detailLevelChanged(unsigned int newlevel)
-  {
-    if (newlevel >= (unsigned int)this->detaillevel_)
-      this->bVisible_ = true;
-    else
-      this->bVisible_ = false;
-
-    this->updateVisibility();
-  }
-
-  void ParticleInterface::updateVisibility()
-  {
-    for (unsigned int i = 0; i < this->particleSystem_->getNumEmitters(); i++)
-      this->particleSystem_->getEmitter(i)->setEnabled(this->bEnabled_ && this->bVisible_);
-  }
-
-  void ParticleInterface::setSpeedFactor(float factor)
-  {
-    //this->particleSystem_->setSpeedFactor(Orxonox::getInstance().getTimeFactor() * factor);
-    this->particleSystem_->setSpeedFactor(1.0f * factor);
-  }
-  float ParticleInterface::getSpeedFactor() const
-  {
-    //return (this->particleSystem_->getSpeedFactor() / Orxonox::getInstance().getTimeFactor());
-    return (this->particleSystem_->getSpeedFactor() / 1.0f);
-  }
-
-  bool ParticleInterface::getKeepParticlesInLocalSpace() const
-  {
-    return this->particleSystem_->getKeepParticlesInLocalSpace();
-  }
-  void ParticleInterface::setKeepParticlesInLocalSpace(bool keep)
-  {
-    this->particleSystem_->setKeepParticlesInLocalSpace(keep);
-  }
+    unsigned int ParticleInterface::counter_s = 0;
+    ParticleInterface* ParticleInterface::currentParticleInterface_s = 0;
+
+    ParticleInterface::ParticleInterface(Ogre::SceneManager* scenemanager, const std::string& templateName, LODParticle::LOD detaillevel)
+    {
+        RegisterRootObject(ParticleInterface);
+
+        assert(scenemanager);
+
+        this->scenemanager_ = scenemanager;
+        this->sceneNode_ = 0;
+
+        this->bEnabled_ = true;
+        this->bVisible_ = true;
+        this->bAllowedByLOD_ = true;
+
+        this->particleSystem_ = this->scenemanager_->createParticleSystem("particles" + getConvertedValue<unsigned int, std::string>(ParticleInterface::counter_s++), templateName);
+        this->particleSystem_->setSpeedFactor(1.0f);
+        //this->particleSystem_->setSpeedFactor(Orxonox::getInstance().getTimeFactor());
+
+        this->setDetailLevel((unsigned int)detaillevel);
+    }
+
+    ParticleInterface::~ParticleInterface()
+    {
+        this->particleSystem_->removeAllEmitters();
+        this->detachFromSceneNode();
+        this->scenemanager_->destroyParticleSystem(particleSystem_);
+    }
+
+    void ParticleInterface::addToSceneNode(Ogre::SceneNode* sceneNode)
+    {
+        if (this->sceneNode_)
+            this->detachFromSceneNode();
+
+        this->sceneNode_ = sceneNode;
+        this->sceneNode_->attachObject(this->particleSystem_);
+    }
+
+    void ParticleInterface::detachFromSceneNode()
+    {
+        if (this->sceneNode_)
+        {
+            this->sceneNode_->detachObject(this->particleSystem_);
+            this->sceneNode_ = 0;
+        }
+    }
+
+    Ogre::ParticleEmitter* ParticleInterface::createNewEmitter()
+    {
+        if (this->particleSystem_->getNumEmitters() > 0)
+        {
+            Ogre::ParticleEmitter* newemitter = this->particleSystem_->addEmitter(this->particleSystem_->getEmitter(0)->getType());
+            this->particleSystem_->getEmitter(0)->copyParametersTo(newemitter);
+            return newemitter;
+        }
+        else
+            return 0;
+    }
+    Ogre::ParticleEmitter* ParticleInterface::getEmitter(unsigned int emitterNr) const
+    {
+        if (emitterNr < this->particleSystem_->getNumEmitters())
+            return this->particleSystem_->getEmitter(emitterNr);
+        else
+            return 0;
+    }
+    void ParticleInterface::removeEmitter(unsigned int emitterNr)
+    {
+        if (emitterNr < this->particleSystem_->getNumEmitters())
+            this->particleSystem_->removeEmitter(emitterNr);
+    }
+    void ParticleInterface::removeAllEmitters()
+    {
+        this->particleSystem_->removeAllEmitters();
+    }
+    unsigned int ParticleInterface::getNumEmitters() const
+    {
+        return this->particleSystem_->getNumEmitters();
+    }
+
+    Ogre::ParticleAffector* ParticleInterface::addAffector(const std::string& name)
+    {
+        return this->particleSystem_->addAffector(name);
+    }
+    Ogre::ParticleAffector* ParticleInterface::getAffector(unsigned int affectorNr) const
+    {
+        if (affectorNr < this->particleSystem_->getNumAffectors())
+            return this->particleSystem_->getAffector(affectorNr);
+        else
+            return 0;
+    }
+    void ParticleInterface::removeAffector(unsigned int affectorNr)
+    {
+        if (affectorNr < this->particleSystem_->getNumAffectors())
+            this->particleSystem_->removeAffector(affectorNr);
+    }
+    void ParticleInterface::removeAllAffectors()
+    {
+        this->particleSystem_->removeAllAffectors();
+    }
+    unsigned int ParticleInterface::getNumAffectors() const
+    {
+        return this->particleSystem_->getNumAffectors();
+    }
+
+    void ParticleInterface::setEnabled(bool enable)
+    {
+        this->bEnabled_ = enable;
+
+        for (unsigned int i = 0; i < this->particleSystem_->getNumEmitters(); i++)
+            this->particleSystem_->getEmitter(i)->setEnabled(this->bEnabled_ && this->bAllowedByLOD_);
+    }
+
+    void ParticleInterface::setVisible(bool visible)
+    {
+        this->bVisible_ = visible;
+
+        this->particleSystem_->setVisible(this->bVisible_ && this->bAllowedByLOD_);
+    }
+
+    void ParticleInterface::setDetailLevel(unsigned int level)
+    {
+        this->detaillevel_ = level;
+        this->detailLevelChanged(GraphicsEngine::getInstance().getDetailLevelParticle());
+    }
+
+    void ParticleInterface::detailLevelChanged(unsigned int newlevel)
+    {
+        if (newlevel >= (unsigned int)this->detaillevel_)
+            this->bAllowedByLOD_ = true;
+        else
+            this->bAllowedByLOD_ = false;
+
+        this->updateVisibility();
+    }
+
+    void ParticleInterface::updateVisibility()
+    {
+        this->setEnabled(this->isEnabled());
+        this->setVisible(this->isVisible());
+    }
+
+    void ParticleInterface::setSpeedFactor(float factor)
+    {
+        //this->particleSystem_->setSpeedFactor(Orxonox::getInstance().getTimeFactor() * factor);
+        this->particleSystem_->setSpeedFactor(1.0f * factor);
+    }
+    float ParticleInterface::getSpeedFactor() const
+    {
+        //return (this->particleSystem_->getSpeedFactor() / Orxonox::getInstance().getTimeFactor());
+        return (this->particleSystem_->getSpeedFactor() / 1.0f);
+    }
+
+    bool ParticleInterface::getKeepParticlesInLocalSpace() const
+    {
+        return this->particleSystem_->getKeepParticlesInLocalSpace();
+    }
+    void ParticleInterface::setKeepParticlesInLocalSpace(bool keep)
+    {
+        this->particleSystem_->setKeepParticlesInLocalSpace(keep);
+    }
 }
Index: code/trunk/src/orxonox/tools/ParticleInterface.h
===================================================================
--- code/trunk/src/orxonox/tools/ParticleInterface.h	(revision 1755)
+++ code/trunk/src/orxonox/tools/ParticleInterface.h	(revision 2087)
@@ -21,5 +21,5 @@
  *
  *   Author:
- *      ...
+ *      Fabian 'x3n' Landau
  *   Co-authors:
  *      ...
@@ -45,52 +45,63 @@
 namespace orxonox
 {
-  class _OrxonoxExport ParticleInterface : public OrxonoxClass
-  {
-    public:
-      ParticleInterface(const std::string& templateName, LODParticle::LOD detaillevel);
-      ~ParticleInterface();
+    class _OrxonoxExport ParticleInterface : public OrxonoxClass
+    {
+        public:
+            ParticleInterface(Ogre::SceneManager* scenemanager, const std::string& templateName, LODParticle::LOD detaillevel);
+            virtual ~ParticleInterface();
 
-      inline Ogre::ParticleSystem* getParticleSystem() const
-        { return this->particleSystem_; }
+            inline Ogre::ParticleSystem* getParticleSystem() const
+                { return this->particleSystem_; }
 
-      void addToSceneNode(Ogre::SceneNode* sceneNode);
-      void detachFromSceneNode();
+            void addToSceneNode(Ogre::SceneNode* sceneNode);
+            void detachFromSceneNode();
 
-      Ogre::ParticleEmitter* createNewEmitter();
-      Ogre::ParticleEmitter* getEmitter(unsigned int emitterNr) const;
-      void removeEmitter(unsigned int emitterNr);
-      void removeAllEmitters();
-      unsigned int getNumEmitters() const;
+            Ogre::ParticleEmitter* createNewEmitter();
+            Ogre::ParticleEmitter* getEmitter(unsigned int emitterNr) const;
+            void removeEmitter(unsigned int emitterNr);
+            void removeAllEmitters();
+            unsigned int getNumEmitters() const;
 
-      Ogre::ParticleAffector* addAffector(const std::string& name);
-      Ogre::ParticleAffector* getAffector(unsigned int affectorNr) const;
-      void removeAffector(unsigned int affectorNr);
-      void removeAllAffectors();
-      unsigned int getNumAffectors() const;
+            Ogre::ParticleAffector* addAffector(const std::string& name);
+            Ogre::ParticleAffector* getAffector(unsigned int affectorNr) const;
+            void removeAffector(unsigned int affectorNr);
+            void removeAllAffectors();
+            unsigned int getNumAffectors() const;
 
-      float getSpeedFactor() const;
-      void setSpeedFactor(float factor);
-      bool getKeepParticlesInLocalSpace() const;
-      void setKeepParticlesInLocalSpace(bool keep);
+            float getSpeedFactor() const;
+            void setSpeedFactor(float factor);
+            bool getKeepParticlesInLocalSpace() const;
+            void setKeepParticlesInLocalSpace(bool keep);
 
-      void setEnabled(bool enable);
-      void detailLevelChanged(unsigned int newlevel);
+            void setEnabled(bool enable);
+            inline bool isEnabled() const
+                { return this->bEnabled_; }
 
-      inline void storeThisAsCurrentParticleInterface()
-        { ParticleInterface::currentParticleInterface_s = this; }
-      inline static ParticleInterface* getCurrentParticleInterface()
-        { return ParticleInterface::currentParticleInterface_s; }
+            void setVisible(bool visible);
+            inline bool isVisible() const
+                { return this->bVisible_; }
 
-    private:
-      void updateVisibility();
+            void detailLevelChanged(unsigned int newlevel);
+            void setDetailLevel(unsigned int level);
 
-      static ParticleInterface* currentParticleInterface_s;
-      static unsigned int counter_s;
-      Ogre::SceneNode* sceneNode_;
-      Ogre::ParticleSystem* particleSystem_;
-      bool bVisible_;
-      bool bEnabled_;
-      unsigned int detaillevel_;                            //!< Detail level of this particle effect (0: off, 1: low, 2: normal, 3: high)
-  };
+            inline void storeThisAsCurrentParticleInterface()
+                { ParticleInterface::currentParticleInterface_s = this; }
+            inline static ParticleInterface* getCurrentParticleInterface()
+                { return ParticleInterface::currentParticleInterface_s; }
+
+        private:
+            void updateVisibility();
+
+            static ParticleInterface* currentParticleInterface_s;
+            static unsigned int       counter_s;
+
+            Ogre::SceneNode*          sceneNode_;
+            Ogre::ParticleSystem*     particleSystem_;
+            bool                      bVisible_;
+            bool                      bEnabled_;
+            bool                      bAllowedByLOD_;
+            unsigned int              detaillevel_;     //!< Detail level of this particle effect (0: off, 1: low, 2: normal, 3: high)
+            Ogre::SceneManager*       scenemanager_;
+    };
 }
 
Index: code/trunk/src/orxonox/tools/Timer.cc
===================================================================
--- code/trunk/src/orxonox/tools/Timer.cc	(revision 1755)
+++ code/trunk/src/orxonox/tools/Timer.cc	(revision 2087)
@@ -92,4 +92,5 @@
         this->bLoop_ = false;
         this->bActive_ = false;
+        this->bKillAfterCall_ = false;
 
         this->time_ = 0;
@@ -111,5 +112,10 @@
     void TimerBase::run() const
     {
+        bool temp = this->bKillAfterCall_; // to avoid errors with bKillAfterCall_=false and an exutors which destroy the timer
+
         (*this->executor_)();
+
+        if (temp)
+            delete this;
     }
 
@@ -136,5 +142,5 @@
             {
                 // It's time to call the function
-                if (this->bLoop_)
+                if (this->bLoop_ && !this->bKillAfterCall_)
                 {
                     this->time_ += this->interval_; // Q: Why '+=' and not '='? A: Think about it. It's more accurate like that. Seriously.
Index: code/trunk/src/orxonox/tools/Timer.h
===================================================================
--- code/trunk/src/orxonox/tools/Timer.h	(revision 1755)
+++ code/trunk/src/orxonox/tools/Timer.h	(revision 2087)
@@ -116,11 +116,12 @@
             TimerBase();
 
-            Executor* executor_; //!< The executor of the function that should be called when the time expires
-
-            long long interval_; //!< The time-interval in micro seconds
-            bool bLoop_;         //!< If true, the function gets called every 'interval' seconds
-            bool bActive_;       //!< If true, the Timer ticks and calls the function if the time's up
-
-            long long time_;     //!< Internal variable, counting the time till the next function-call
+            Executor* executor_;  //!< The executor of the function that should be called when the time expires
+
+            long long interval_;  //!< The time-interval in micro seconds
+            bool bLoop_;          //!< If true, the function gets called every 'interval' seconds
+            bool bActive_;        //!< If true, the Timer ticks and calls the function if the time's up
+            bool bKillAfterCall_; //!< If true the timer gets deleted after it called the function
+
+            long long time_;      //!< Internal variable, counting the time till the next function-call
     };
 
@@ -139,7 +140,7 @@
                 @param exeuctor A executor of the function to call
             */
-            Timer(float interval, bool bLoop, T* object, ExecutorMember<T>* exeuctor)
-            {
-                this->setTimer(interval, bLoop, object, exeuctor);
+            Timer(float interval, bool bLoop, T* object, ExecutorMember<T>* exeuctor, bool bKillAfterCall = false)
+            {
+                this->setTimer(interval, bLoop, object, exeuctor, bKillAfterCall);
             }
 
@@ -151,5 +152,5 @@
                 @param exeuctor A executor of the function to call
             */
-            void setTimer(float interval, bool bLoop, T* object, ExecutorMember<T>* executor)
+            void setTimer(float interval, bool bLoop, T* object, ExecutorMember<T>* executor, bool bKillAfterCall = false)
             {
                 this->deleteExecutor();
@@ -162,4 +163,5 @@
 
                 this->time_ = this->interval_;
+                this->bKillAfterCall_ = bKillAfterCall;
             }
     };
@@ -177,7 +179,7 @@
                 @param exeuctor A executor of the function to call
             */
-            StaticTimer(float interval, bool bLoop, ExecutorStatic* executor)
-            {
-                this->setTimer(interval, bLoop, executor);
+            StaticTimer(float interval, bool bLoop, ExecutorStatic* executor, bool bKillAfterCall = false)
+            {
+                this->setTimer(interval, bLoop, executor, bKillAfterCall);
             }
 
@@ -189,5 +191,5 @@
                 @param executor A executor of the function to call
             */
-            void setTimer(float interval, bool bLoop, ExecutorStatic* executor)
+            void setTimer(float interval, bool bLoop, ExecutorStatic* executor, bool bKillAfterCall = false)
             {
                 this->deleteExecutor();
@@ -199,4 +201,5 @@
 
                 this->time_ = this->interval_;
+                this->bKillAfterCall_ = bKillAfterCall;
             }
     };
