Index: code/trunk/src/orxonox/objects/ParticleSpawner.cc
===================================================================
--- code/trunk/src/orxonox/objects/ParticleSpawner.cc	(revision 1582)
+++ code/trunk/src/orxonox/objects/ParticleSpawner.cc	(revision 1602)
@@ -41,4 +41,5 @@
     {
         RegisterObject(ParticleSpawner);
+        this->particle_ = 0;
     }
 
@@ -46,5 +47,9 @@
     {
         RegisterObject(ParticleSpawner);
+        this->setParticle(templateName, detaillevel, lifetime, delay, direction);
+    }
 
+    void ParticleSpawner::setParticle(const std::string& templateName, LODParticle::LOD detaillevel, float lifetime, float delay, const Vector3& direction)
+    {
         ExecutorMember<ParticleSpawner>* executor = createExecutor(createFunctor(&ParticleSpawner::createParticleSpawner));
         executor->setDefaultValues(lifetime);
@@ -61,5 +66,5 @@
     ParticleSpawner::~ParticleSpawner()
     {
-        if (this->isInitialized())
+        if (this->isInitialized() && this->particle_)
         {
             this->particle_->detachFromSceneNode();
@@ -70,6 +75,7 @@
     void ParticleSpawner::createParticleSpawner(float lifetime)
     {
-        this->timer_.setTimer(lifetime, false, this, createExecutor(createFunctor(&ParticleSpawner::destroyParticleSpawner)));
         this->particle_->setEnabled(true);
+        if (lifetime != 0)
+            this->timer_.setTimer(lifetime, false, this, createExecutor(createFunctor(&ParticleSpawner::destroyParticleSpawner)));
     }
 
@@ -78,3 +84,9 @@
         delete this;
     }
+
+    void ParticleSpawner::setVisible(bool visible)
+    {
+        if (this->particle_)
+            this->particle_->setEnabled(visible);
+    }
 }
Index: code/trunk/src/orxonox/objects/ParticleSpawner.h
===================================================================
--- code/trunk/src/orxonox/objects/ParticleSpawner.h	(revision 1582)
+++ code/trunk/src/orxonox/objects/ParticleSpawner.h	(revision 1602)
@@ -41,8 +41,12 @@
         public:
             ParticleSpawner();
-            ParticleSpawner(const std::string& templateName, LODParticle::LOD detaillevel, float lifetime, float delay = 0, const Vector3& direction = Vector3::ZERO);
+            ParticleSpawner(const std::string& templateName, LODParticle::LOD detaillevel, float lifetime = 0, float delay = 0, const Vector3& direction = Vector3::ZERO);
             virtual ~ParticleSpawner();
+
+            void setParticle(const std::string& templateName, LODParticle::LOD detaillevel, float lifetime = 0, float delay = 0, const Vector3& direction = Vector3::ZERO);
             inline ParticleInterface* getParticleInterface() const
                 { return this->particle_; }
+
+            void setVisible(bool visible);
 
         private:
Index: code/trunk/src/orxonox/objects/Projectile.cc
===================================================================
--- code/trunk/src/orxonox/objects/Projectile.cc	(revision 1582)
+++ code/trunk/src/orxonox/objects/Projectile.cc	(revision 1602)
@@ -50,6 +50,6 @@
 
         this->setConfigValues();
-        this->explosionTemplateName_ = "Orxonox/explosion1";
-        this->smokeTemplateName_ = "Orxonox/smoke3";
+        this->explosionTemplateName_ = "Orxonox/explosion3";
+        this->smokeTemplateName_ = "Orxonox/smoke4";
 
         if (this->owner_)
@@ -101,7 +101,7 @@
                     explosion->setPosition(this->getPosition());
                     explosion->create();
-                    ParticleSpawner* smoke = new ParticleSpawner(this->smokeTemplateName_, LODParticle::normal, 6.0, 0.0);
+                    ParticleSpawner* smoke = new ParticleSpawner(this->smokeTemplateName_, LODParticle::normal, 2.0, 0.0);
                     smoke->setPosition(this->getPosition());
-                    smoke->getParticleInterface()->setSpeedFactor(3.0);
+//                    smoke->getParticleInterface()->setSpeedFactor(3.0);
                     smoke->create();
                     delete this;
Index: code/trunk/src/orxonox/objects/SpaceShip.cc
===================================================================
--- code/trunk/src/orxonox/objects/SpaceShip.cc	(revision 1582)
+++ code/trunk/src/orxonox/objects/SpaceShip.cc	(revision 1602)
@@ -132,6 +132,4 @@
         this->teamNr_ = 0;
         this->health_ = 100;
-
-        COUT(3) << "Info: SpaceShip was loaded" << std::endl;
     }
 
@@ -209,4 +207,13 @@
         node2b->setScale(0.5, 0.5, 0.5);
         tt2_->addToSceneNode(node2b);
+
+        this->leftThrusterFlare_.setBillboardSet("Flares/ThrusterFlare1", Vector3(-7.5, -10, -0.5));
+        this->rightThrusterFlare_.setBillboardSet("Flares/ThrusterFlare1", Vector3(-7.5, 10, -0.5));
+
+        Ogre::SceneNode* node2c = this->getNode()->createChildSceneNode(this->getName() + "particle2c");
+        node2c->setInheritScale(false);
+        node2c->setScale(2, 2, 2);
+        node2c->attachObject(this->leftThrusterFlare_.getBillboardSet());
+        node2c->attachObject(this->rightThrusterFlare_.getBillboardSet());
         // END CREATING THRUSTER
 
@@ -226,4 +233,9 @@
         this->greenNode_->setScale(0.3, 0.3, 0.3);
         // END CREATING BLINKING LIGHTS
+
+        this->smoke_.setParticle("Orxonox/smoke5", LODParticle::normal);
+        this->fire_.setParticle("Orxonox/fire3", LODParticle::normal);
+        this->attachObject(this->smoke_);
+        this->attachObject(this->fire_);
 
         if (this->isExactlyA(Class(SpaceShip)))
@@ -266,4 +278,8 @@
         this->crosshairNear_.setVisible(this->isVisible());
         this->crosshairFar_.setVisible(this->isVisible());
+        this->rightThrusterFlare_.setVisible(this->isVisible());
+        this->leftThrusterFlare_.setVisible(this->isVisible());
+        this->smoke_.setVisible(this->isVisible());
+        this->fire_.setVisible(this->isVisible());
     }
 
@@ -278,4 +294,6 @@
         this->crosshairNear_.setVisible(this->isVisible());
         this->crosshairFar_.setVisible(this->isVisible());
+        this->rightThrusterFlare_.setVisible(this->isVisible());
+        this->leftThrusterFlare_.setVisible(this->isVisible());
     }
 
@@ -385,4 +403,7 @@
             this->cam_->tick(dt);
 
+        this->smoke_.setVisible(this->isVisible() && this->health_ < 40);
+        this->fire_.setVisible(this->isVisible() && this->health_ < 20);
+
         if (this->redNode_ && this->greenNode_)
         {
Index: code/trunk/src/orxonox/objects/SpaceShip.h
===================================================================
--- code/trunk/src/orxonox/objects/SpaceShip.h	(revision 1582)
+++ code/trunk/src/orxonox/objects/SpaceShip.h	(revision 1602)
@@ -37,4 +37,5 @@
 #include "Model.h"
 #include "tools/BillboardSet.h"
+#include "ParticleSpawner.h"
 
 namespace orxonox
@@ -141,4 +142,6 @@
             ParticleInterface* tt1_;
             ParticleInterface* tt2_;
+            BillboardSet leftThrusterFlare_;
+            BillboardSet rightThrusterFlare_;
 
             BillboardSet redBillboard_;
@@ -147,4 +150,7 @@
             Ogre::SceneNode* greenNode_;
             float blinkTime_;
+
+            ParticleSpawner smoke_;
+            ParticleSpawner fire_;
 
             BillboardSet crosshairNear_;
Index: code/trunk/src/orxonox/objects/WorldEntity.cc
===================================================================
--- code/trunk/src/orxonox/objects/WorldEntity.cc	(revision 1582)
+++ code/trunk/src/orxonox/objects/WorldEntity.cc	(revision 1602)
@@ -172,4 +172,5 @@
     {
         this->attachedWorldEntities_.push_back(entity);
+        this->attachObject(entity);
     }
 
@@ -181,3 +182,15 @@
             return 0;
     }
+
+    void WorldEntity::attachObject(const WorldEntity& obj) const
+    {
+        GraphicsEngine::getSingleton().getSceneManager()->getRootSceneNode()->removeChild(obj.getNode());
+        this->getNode()->addChild(obj.getNode());
+    }
+
+    void WorldEntity::attachObject(WorldEntity* obj) const
+    {
+        GraphicsEngine::getSingleton().getSceneManager()->getRootSceneNode()->removeChild(obj->getNode());
+        this->getNode()->addChild(obj->getNode());
+    }
 }
Index: code/trunk/src/orxonox/objects/WorldEntity.h
===================================================================
--- code/trunk/src/orxonox/objects/WorldEntity.h	(revision 1582)
+++ code/trunk/src/orxonox/objects/WorldEntity.h	(revision 1602)
@@ -58,5 +58,5 @@
             const WorldEntity* getAttachedWorldEntity(unsigned int index) const;
 
-            inline Ogre::SceneNode* getNode()
+            inline Ogre::SceneNode* getNode() const
                 { return this->node_; }
 
@@ -75,26 +75,26 @@
                 { return this->node_->getPosition(); }
 
-            inline void translate(const Vector3 &d, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_PARENT)
+            inline void translate(const Vector3& d, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_PARENT)
                 { this->node_->translate(d, relativeTo); }
             inline void translate(Real x, Real y, Real z, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_PARENT)
                 { this->node_->translate(x, y, z, relativeTo); }
-            inline void translate(const Matrix3 &axes, const Vector3 &move, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_PARENT)
+            inline void translate(const Matrix3& axes, const Vector3& move, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_PARENT)
                 { this->node_->translate(axes, move, relativeTo); }
-            inline void translate(const Matrix3 &axes, Real x, Real y, Real z, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_PARENT)
+            inline void translate(const Matrix3& axes, Real x, Real y, Real z, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_PARENT)
                 { this->node_->translate(axes, x, y, z, relativeTo); }
 
-            inline void yaw(const Radian &angle, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL)
+            inline void yaw(const Radian& angle, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL)
                 { this->node_->yaw(angle, relativeTo); }
-            inline void pitch(const Radian &angle, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL)
+            inline void pitch(const Radian& angle, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL)
                 { this->node_->pitch(angle, relativeTo); }
-            inline void roll(const Radian &angle, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL)
+            inline void roll(const Radian& angle, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL)
                 { this->node_->roll(angle, relativeTo); }
             void setYawPitchRoll(const Degree& yaw, const Degree& pitch, const Degree& roll);
 
-            inline void setYaw(const Degree &angle)
+            inline void setYaw(const Degree& angle)
                 { this->node_->yaw(angle, Ogre::Node::TS_LOCAL); }
-            inline void setPitch(const Degree &angle)
+            inline void setPitch(const Degree& angle)
                 { this->node_->pitch(angle, Ogre::Node::TS_LOCAL); }
-            inline void setRoll(const Degree &angle)
+            inline void setRoll(const Degree& angle)
                 { this->node_->roll(angle, Ogre::Node::TS_LOCAL); }
 
@@ -103,16 +103,16 @@
             inline void setOrientation(const Ogre::Quaternion& quat)
               { this->node_->setOrientation(quat); }
-            inline void rotate(const Vector3 &axis, const Radian &angle, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL)
+            inline void rotate(const Vector3& axis, const Radian& angle, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL)
               { this->node_->rotate(axis, angle, relativeTo); }
             inline void setDirectionLoader(Real x, Real y, Real z)
               { this->setDirection(x, y, z); }
-            inline void setDirection(Real x, Real y, Real z, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL, const Vector3 &localDirectionVector=Vector3::NEGATIVE_UNIT_Z)
+            inline void setDirection(Real x, Real y, Real z, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL, const Vector3& localDirectionVector=Vector3::NEGATIVE_UNIT_Z)
               { this->node_->setDirection(x, y, z, relativeTo, localDirectionVector); }
-            inline void setDirection(const Vector3 &vec, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL, const Vector3 &localDirectionVector=Vector3::NEGATIVE_UNIT_Z)
+            inline void setDirection(const Vector3& vec, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL, const Vector3& localDirectionVector=Vector3::NEGATIVE_UNIT_Z)
               { this->node_->setDirection(vec, relativeTo, localDirectionVector); }
-            inline void lookAt(const Vector3 &targetPoint, Ogre::Node::TransformSpace relativeTo, const Vector3 &localDirectionVector=Vector3::NEGATIVE_UNIT_Z)
+            inline void lookAt(const Vector3& targetPoint, Ogre::Node::TransformSpace relativeTo, const Vector3& localDirectionVector=Vector3::NEGATIVE_UNIT_Z)
               { this->node_->lookAt(targetPoint, relativeTo, localDirectionVector); }
 
-            inline void setScale(const Vector3 &scale)
+            inline void setScale(const Vector3& scale)
               { this->node_->setScale(scale); }
             inline void setScale(Real x, Real y, Real z)
@@ -124,5 +124,5 @@
             inline const Vector3& getScale(void) const
               { return this->node_->getScale(); }
-            inline void scale(const Vector3 &scale)
+            inline void scale(const Vector3& scale)
               { this->node_->scale(scale); }
             inline void scale(Real x, Real y, Real z)
@@ -131,11 +131,13 @@
               { this->node_->scale(scale, scale, scale); }
 
-            inline void attachObject(Ogre::MovableObject *obj)
+            void attachObject(const WorldEntity& obj) const;
+            void attachObject(WorldEntity* obj) const;
+            inline void attachObject(Ogre::MovableObject* obj) const
               { this->node_->attachObject(obj); }
-            inline void attachObject(Mesh &mesh)
+            inline void attachObject(Mesh& mesh) const
               { this->node_->attachObject(mesh.getEntity()); }
-            inline void detachObject(Ogre::MovableObject *obj)
+            inline void detachObject(Ogre::MovableObject* obj) const
               { this->node_->detachObject(obj); }
-            inline void detachAllObjects()
+            inline void detachAllObjects() const
               { this->node_->detachAllObjects(); }
 
@@ -179,5 +181,5 @@
             inline void setStatic(bool bStatic)
                 { this->bStatic_ = bStatic; }
-            inline bool isStatic()
+            inline bool isStatic() const
                 { return this->bStatic_; }
 
Index: code/trunk/src/orxonox/tools/BillboardSet.cc
===================================================================
--- code/trunk/src/orxonox/tools/BillboardSet.cc	(revision 1582)
+++ code/trunk/src/orxonox/tools/BillboardSet.cc	(revision 1602)
@@ -46,5 +46,32 @@
     }
 
-    void BillboardSet::setBillboardSet(const std::string& file, const ColourValue& colour, int count, const Vector3& position)
+    void BillboardSet::setBillboardSet(const std::string& file, int count)
+    {
+        std::ostringstream name;
+        name << (BillboardSet::billboardSetCounter_s++);
+        this->billboardSet_ = GraphicsEngine::getSingleton().getSceneManager()->createBillboardSet("Billboard" + name.str(), count);
+        this->billboardSet_->createBillboard(Vector3::ZERO);
+        this->billboardSet_->setMaterialName(file);
+    }
+
+    void BillboardSet::setBillboardSet(const std::string& file, const ColourValue& colour, int count)
+    {
+        std::ostringstream name;
+        name << (BillboardSet::billboardSetCounter_s++);
+        this->billboardSet_ = GraphicsEngine::getSingleton().getSceneManager()->createBillboardSet("Billboard" + name.str(), count);
+        this->billboardSet_->createBillboard(Vector3::ZERO, colour);
+        this->billboardSet_->setMaterialName(file);
+    }
+
+    void BillboardSet::setBillboardSet(const std::string& file, const Vector3& position, int count)
+    {
+        std::ostringstream name;
+        name << (BillboardSet::billboardSetCounter_s++);
+        this->billboardSet_ = GraphicsEngine::getSingleton().getSceneManager()->createBillboardSet("Billboard" + name.str(), count);
+        this->billboardSet_->createBillboard(position);
+        this->billboardSet_->setMaterialName(file);
+    }
+
+    void BillboardSet::setBillboardSet(const std::string& file, const ColourValue& colour, const Vector3& position, int count)
     {
         std::ostringstream name;
Index: code/trunk/src/orxonox/tools/BillboardSet.h
===================================================================
--- code/trunk/src/orxonox/tools/BillboardSet.h	(revision 1582)
+++ code/trunk/src/orxonox/tools/BillboardSet.h	(revision 1602)
@@ -44,5 +44,8 @@
             BillboardSet();
             ~BillboardSet();
-            void setBillboardSet(const std::string& file, const ColourValue& colour = ColourValue(1.0, 1.0, 1.0), int count = 1, const Vector3& position = Vector3::ZERO);
+            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);
 
             inline Ogre::BillboardSet* getBillboardSet()
