Index: code/trunk/src/orxonox/CMakeLists.txt
===================================================================
--- code/trunk/src/orxonox/CMakeLists.txt	(revision 1602)
+++ code/trunk/src/orxonox/CMakeLists.txt	(revision 1608)
@@ -20,4 +20,5 @@
 
   objects/Ambient.cc
+  objects/Backlight.cc
   objects/Camera.cc
   objects/CameraHandler.cc
Index: code/trunk/src/orxonox/Orxonox.cc
===================================================================
--- code/trunk/src/orxonox/Orxonox.cc	(revision 1602)
+++ code/trunk/src/orxonox/Orxonox.cc	(revision 1608)
@@ -72,4 +72,5 @@
 #include "console/InGameConsole.h"
 #include "objects/Tickable.h"
+#include "objects/Backlight.h"
 #include "tools/ParticleInterface.h"
 
@@ -169,7 +170,9 @@
     float change = factor / Orxonox::getSingleton()->getTimeFactor();
     Orxonox::getSingleton()->timefactor_ = factor;
-
     for (Iterator<ParticleInterface> it = ObjectList<ParticleInterface>::begin(); it; ++it)
         it->setSpeedFactor(it->getSpeedFactor() * change);
+
+    for (Iterator<Backlight> it = ObjectList<Backlight>::begin(); it; ++it)
+        it->setTimeFactor(Orxonox::getSingleton()->getTimeFactor());
   }
 
Index: code/trunk/src/orxonox/objects/Backlight.cc
===================================================================
--- code/trunk/src/orxonox/objects/Backlight.cc	(revision 1608)
+++ code/trunk/src/orxonox/objects/Backlight.cc	(revision 1608)
@@ -0,0 +1,154 @@
+/*
+ *   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:
+ *      ...
+ *
+ */
+
+#include "OrxonoxStableHeaders.h"
+#include "Backlight.h"
+
+#include <OgreBillboard.h>
+#include <OgreRibbonTrail.h>
+
+#include "core/CoreIncludes.h"
+#include "core/ConfigValueIncludes.h"
+#include "core/Executor.h"
+#include "util/Math.h"
+#include "GraphicsEngine.h"
+#include "Orxonox.h"
+
+namespace orxonox
+{
+    CreateFactory(Backlight);
+
+    float Backlight::timeFactor_s = 1.0;
+
+    Backlight::Backlight(float maxspeed, float brakingtime, float scale)
+    {
+        RegisterObject(Backlight);
+
+        this->setConfigValues();
+        this->traillength_ = 1;
+
+        this->getNode()->setInheritScale(false);
+
+        this->billboard_.setBillboardSet("Flares/backlightflare");
+        this->attachObject(this->billboard_.getBillboardSet());
+
+        this->ribbonTrail_ = GraphicsEngine::getSingleton().getSceneManager()->createRibbonTrail(this->getName() + "RibbonTrail");
+        this->ribbonTrailNode_ = GraphicsEngine::getSingleton().getSceneManager()->getRootSceneNode()->createChildSceneNode(this->getName() + "RibbonTrailNode");
+        this->ribbonTrailNode_->attachObject(this->ribbonTrail_);
+        this->ribbonTrail_->addNode(this->getNode());
+
+        this->configure(maxspeed, brakingtime, scale);
+
+        this->ribbonTrail_->setTrailLength(this->maxTraillength_);
+        this->ribbonTrail_->setMaterialName("Trail/backlighttrail");
+
+        this->setTimeFactor(Orxonox::getSingleton()->getTimeFactor());
+    }
+
+    Backlight::~Backlight()
+    {
+        if (this->isInitialized())
+        {
+            this->detachObject(this->billboard_.getBillboardSet());
+            GraphicsEngine::getSingleton().getSceneManager()->destroySceneNode(this->getName() + "RibbonTrailNode");
+            GraphicsEngine::getSingleton().getSceneManager()->destroyRibbonTrail(this->ribbonTrail_);
+        }
+    }
+
+    void Backlight::setConfigValues()
+    {
+        SetConfigValue(maxLifeTime_, 4.0).description("The maximal amount of seconds the trail behind a SpaceShip stays visible");
+        SetConfigValue(trailSegmentLength_, 50).description("The length of one segment of the trail behind a SpaceShip (lower values make it more smooth)");
+        SetConfigValue(width_, 7.0).description("The width of the trail");
+    }
+
+    void Backlight::setTimeFactor(float factor)
+    {
+        Backlight::timeFactor_s = factor;
+        float change = Backlight::timeFactor_s / this->maxLifeTime_;
+        this->ribbonTrail_->setWidthChange(0, this->width_ * change);
+        this->updateColourChange();
+    }
+
+    void Backlight::updateColourChange()
+    {
+        this->ribbonTrail_->setColourChange(0, ColourValue(0, 0, 0, this->maxTraillength_ / this->traillength_ / this->maxLifeTime_ * Backlight::timeFactor_s));
+    }
+
+    void Backlight::tick(float dt)
+    {
+        WorldEntity::tick(dt);
+
+        if (this->isActive())
+        {
+            if (this->traillength_ < this->maxTraillength_)
+            {
+                this->traillength_ = min<float>(this->maxTraillength_, this->traillength_ + dt * this->maxTraillength_ / this->maxLifeTime_);
+                this->updateColourChange();
+            }
+        }
+        else
+        {
+            if (this->traillength_ > 1)
+            {
+                this->traillength_ = max<float>(1, this->traillength_ - this->brakefactor_ * dt * this->maxTraillength_ / this->maxLifeTime_);
+                this->updateColourChange();
+            }
+        }
+
+        this->ribbonTrail_->setTrailLength(this->traillength_);
+    }
+
+    void Backlight::setColour(const ColourValue& colour)
+    {
+        this->billboard_.getBillboardSet()->getBillboard(0)->setColour(colour);
+        this->ribbonTrail_->setInitialColour(0, ColourValue(colour.r / 4 + 0.75, colour.g / 4 + 0.75, colour.b / 4 + 0.75));
+    }
+
+    void Backlight::configure(float maxspeed, float brakingtime, float scale)
+    {
+        this->maxTraillength_ = this->maxLifeTime_ * maxspeed;
+        this->maxTrailsegments_ = (size_t)(this->maxTraillength_ / this->trailSegmentLength_);
+        this->ribbonTrail_->setMaxChainElements(this->maxTrailsegments_);
+        this->ribbonTrail_->setTrailLength(this->traillength_ = 2 * this->maxTrailsegments_);
+
+        this->brakefactor_ = this->maxLifeTime_ / brakingtime;
+
+        this->scale(scale);
+        this->ribbonTrail_->setInitialWidth(0, this->width_ * scale);
+        this->ribbonTrail_->setWidthChange(0, this->width_ * scale / this->maxLifeTime_ * Backlight::timeFactor_s);
+    }
+
+    void Backlight::changedVisibility()
+    {
+        WorldEntity::changedVisibility();
+
+        this->billboard_.setVisible(this->isVisible());
+        this->ribbonTrail_->setVisible(this->isVisible());
+    }
+}
Index: code/trunk/src/orxonox/objects/Backlight.h
===================================================================
--- code/trunk/src/orxonox/objects/Backlight.h	(revision 1608)
+++ code/trunk/src/orxonox/objects/Backlight.h	(revision 1608)
@@ -0,0 +1,75 @@
+/*
+ *   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:
+ *      ...
+ *
+ */
+
+#ifndef _Backlight_H__
+#define _Backlight_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include "WorldEntity.h"
+#include "tools/Timer.h"
+#include "tools/BillboardSet.h"
+
+namespace orxonox
+{
+    class _OrxonoxExport Backlight : public WorldEntity
+    {
+        public:
+            Backlight(float maxspeed = 1.0, float brakingtime = 1.0, float scale = 1.0);
+            virtual ~Backlight();
+
+            void setConfigValues();
+            virtual void tick(float dt);
+            virtual void changedVisibility();
+
+            void setColour(const ColourValue& colour);
+            void setTimeFactor(float factor);
+
+        private:
+            void configure(float maxspeed, float brakingtime, float scale = 1);
+            void updateColourChange();
+
+            static float timeFactor_s;
+            BillboardSet billboard_;
+            Ogre::SceneNode* ribbonTrailNode_;
+            Ogre::RibbonTrail* ribbonTrail_;
+
+            float maxLifeTime_;
+            float trailSegmentLength_;
+            float width_;
+
+            float brakefactor_;
+
+            float maxTraillength_;
+            float traillength_;
+
+            size_t maxTrailsegments_;
+    };
+}
+
+#endif /* _Backlight_H__ */
Index: code/trunk/src/orxonox/objects/ParticleSpawner.cc
===================================================================
--- code/trunk/src/orxonox/objects/ParticleSpawner.cc	(revision 1602)
+++ code/trunk/src/orxonox/objects/ParticleSpawner.cc	(revision 1608)
@@ -33,4 +33,5 @@
 #include "core/Executor.h"
 #include "tools/ParticleInterface.h"
+#include "GraphicsEngine.h"
 
 namespace orxonox
@@ -44,15 +45,16 @@
     }
 
-    ParticleSpawner::ParticleSpawner(const std::string& templateName, LODParticle::LOD detaillevel, float lifetime, float delay, const Vector3& direction)
+    ParticleSpawner::ParticleSpawner(const std::string& templateName, LODParticle::LOD detaillevel, float lifetime, float startdelay, float destroydelay, const Vector3& direction)
     {
         RegisterObject(ParticleSpawner);
-        this->setParticle(templateName, detaillevel, lifetime, delay, direction);
+        this->setParticle(templateName, detaillevel, lifetime, startdelay, destroydelay, direction);
     }
 
-    void ParticleSpawner::setParticle(const std::string& templateName, LODParticle::LOD detaillevel, float lifetime, float delay, const Vector3& direction)
+    void ParticleSpawner::setParticle(const std::string& templateName, LODParticle::LOD detaillevel, float lifetime, float startdelay, float destroydelay, const Vector3& direction)
     {
         ExecutorMember<ParticleSpawner>* executor = createExecutor(createFunctor(&ParticleSpawner::createParticleSpawner));
+        this->destroydelay_ = destroydelay;
         executor->setDefaultValues(lifetime);
-        this->timer_.setTimer(delay, false, this, executor);
+        this->timer_.setTimer(startdelay, false, this, executor);
         this->particle_ = new ParticleInterface(templateName, detaillevel);
         this->particle_->addToSceneNode(this->getNode());
@@ -72,4 +74,15 @@
         }
     };
+
+    void ParticleSpawner::destroy()
+    {
+        this->setPosition(this->getNode()->getParent()->getPosition());
+        this->getNode()->getParent()->removeChild(this->getNode());
+        GraphicsEngine::getSingleton().getSceneManager()->getRootSceneNode()->addChild(this->getNode());
+        if (this->particle_)
+            this->particle_->setEnabled(false);
+        if (!this->timer_.isActive() || this->timer_.getRemainingTime() > this->destroydelay_)
+            this->timer_.setTimer(this->destroydelay_, false, this, createExecutor(createFunctor(&ParticleSpawner::destroyParticleSpawner)));
+    }
 
     void ParticleSpawner::createParticleSpawner(float lifetime)
Index: code/trunk/src/orxonox/objects/ParticleSpawner.h
===================================================================
--- code/trunk/src/orxonox/objects/ParticleSpawner.h	(revision 1602)
+++ code/trunk/src/orxonox/objects/ParticleSpawner.h	(revision 1608)
@@ -41,8 +41,9 @@
         public:
             ParticleSpawner();
-            ParticleSpawner(const std::string& templateName, LODParticle::LOD detaillevel, float lifetime = 0, float delay = 0, const Vector3& direction = Vector3::ZERO);
+            ParticleSpawner(const std::string& templateName, LODParticle::LOD detaillevel, float lifetime = 0, float startdelay = 0, float destroydelay = 0, const Vector3& direction = Vector3::ZERO);
             virtual ~ParticleSpawner();
+            void destroy();
 
-            void setParticle(const std::string& templateName, LODParticle::LOD detaillevel, float lifetime = 0, float delay = 0, const Vector3& direction = Vector3::ZERO);
+            void setParticle(const std::string& templateName, LODParticle::LOD detaillevel, float lifetime = 0, float startdelay = 0, float destroydelay = 0, const Vector3& direction = Vector3::ZERO);
             inline ParticleInterface* getParticleInterface() const
                 { return this->particle_; }
@@ -56,4 +57,5 @@
             Timer<ParticleSpawner> timer_;
             ParticleInterface* particle_;
+            float destroydelay_;
     };
 }
Index: code/trunk/src/orxonox/objects/SpaceShip.cc
===================================================================
--- code/trunk/src/orxonox/objects/SpaceShip.cc	(revision 1602)
+++ code/trunk/src/orxonox/objects/SpaceShip.cc	(revision 1608)
@@ -35,19 +35,25 @@
 #include <OgreSceneNode.h>
 
-#include "CameraHandler.h"
 #include "util/Convert.h"
 #include "util/Math.h"
+
 #include "core/CoreIncludes.h"
 #include "core/ConfigValueIncludes.h"
 #include "core/Debug.h"
+#include "core/XMLPort.h"
+#include "core/ConsoleCommand.h"
+#include "core/input/InputManager.h"
+
+#include "network/Client.h"
+
+#include "hud/HUD.h"
+#include "tools/ParticleInterface.h"
+
 #include "GraphicsEngine.h"
-#include "core/input/InputManager.h"
-#include "tools/ParticleInterface.h"
 #include "RotatingProjectile.h"
 #include "ParticleProjectile.h"
-#include "core/XMLPort.h"
-#include "core/ConsoleCommand.h"
-#include "network/Client.h"
-#include "hud/HUD.h"
+#include "ParticleSpawner.h"
+#include "Backlight.h"
+#include "CameraHandler.h"
 
 namespace orxonox
@@ -101,4 +107,8 @@
         this->tt1_ = 0;
         this->tt2_ = 0;
+        this->smoke_ = 0;
+        this->fire_ = 0;
+
+        this->backlight_ = 0;
 
         this->redNode_ = 0;
@@ -143,5 +153,13 @@
                 delete this->tt2_;
 
-            if (setMouseEventCallback_)
+            if (this->smoke_)
+                this->smoke_->destroy();
+            if (this->fire_)
+                this->fire_->destroy();
+
+            if (this->backlight_)
+                delete this->backlight_;
+
+            if (this->setMouseEventCallback_)
                 InputManager::removeMouseHandler("SpaceShip");
 
@@ -184,5 +202,5 @@
     void SpaceShip::init()
     {
-        // START CREATING THRUSTER
+        // START CREATING THRUSTERS
         this->tt1_ = new ParticleInterface("Orxonox/thruster1", LODParticle::low);
         this->tt1_->createNewEmitter();
@@ -216,5 +234,5 @@
         node2c->attachObject(this->leftThrusterFlare_.getBillboardSet());
         node2c->attachObject(this->rightThrusterFlare_.getBillboardSet());
-        // END CREATING THRUSTER
+        // END CREATING THRUSTERS
 
         // START CREATING BLINKING LIGHTS
@@ -234,8 +252,18 @@
         // END CREATING BLINKING LIGHTS
 
-        this->smoke_.setParticle("Orxonox/smoke5", LODParticle::normal);
-        this->fire_.setParticle("Orxonox/fire3", LODParticle::normal);
+        // START CREATING ADDITIONAL EFFECTS
+        this->backlight_ = new Backlight(this->maxSpeed_, 0.8);
+        this->attachObject(this->backlight_);
+        this->backlight_->setPosition(-2.35, 0, 0.2);
+        this->backlight_->setColour(this->getProjectileColour());
+
+        this->smoke_ = new ParticleSpawner();
+        this->smoke_->setParticle("Orxonox/smoke5", LODParticle::normal, 0, 0, 3);
         this->attachObject(this->smoke_);
+
+        this->fire_ = new ParticleSpawner();
+        this->fire_->setParticle("Orxonox/fire3", LODParticle::normal, 0, 0, 1);
         this->attachObject(this->fire_);
+        // END CREATING ADDITIONAL EFFECTS
 
         if (this->isExactlyA(Class(SpaceShip)))
@@ -255,8 +283,8 @@
             this->chFarNode_->attachObject(this->crosshairFar_.getBillboardSet());
             this->chFarNode_->setScale(0.4, 0.4, 0.4);
+            // END of testing crosshair
         }
 
         createCamera();
-        // END of testing crosshair
     }
 
@@ -280,6 +308,7 @@
         this->rightThrusterFlare_.setVisible(this->isVisible());
         this->leftThrusterFlare_.setVisible(this->isVisible());
-        this->smoke_.setVisible(this->isVisible());
-        this->fire_.setVisible(this->isVisible());
+        this->smoke_->setVisible(this->isVisible());
+        this->fire_->setVisible(this->isVisible());
+        this->backlight_->setVisible(this->isVisible());
     }
 
@@ -336,5 +365,4 @@
         CameraHandler::getInstance()->requestFocus(cam_);
       }
-
     }
 
@@ -378,16 +406,8 @@
     }
 
-    int sgn(float x)
-    {
-        if (x >= 0)
-            return 1;
-        else
-            return -1;
-    }
-
     std::string SpaceShip::whereAmI() {
-	return getConvertedValue<float, std::string>(SpaceShip::getLocalShip()->getPosition().x)
-	+ "  " + getConvertedValue<float, std::string>(SpaceShip::getLocalShip()->getPosition().y)
-	+ "  " + getConvertedValue<float, std::string>(SpaceShip::getLocalShip()->getPosition().z);
+        return getConvertedValue<float, std::string>(SpaceShip::getLocalShip()->getPosition().x)
+        + "  " + getConvertedValue<float, std::string>(SpaceShip::getLocalShip()->getPosition().y)
+        + "  " + getConvertedValue<float, std::string>(SpaceShip::getLocalShip()->getPosition().z);
     }
 
@@ -403,6 +423,16 @@
             this->cam_->tick(dt);
 
-        this->smoke_.setVisible(this->isVisible() && this->health_ < 40);
-        this->fire_.setVisible(this->isVisible() && this->health_ < 20);
+        if (this->smoke_)
+            this->smoke_->setVisible(this->isVisible() && this->health_ < 40);
+        if (this->fire_)
+            this->fire_->setVisible(this->isVisible() && this->health_ < 20);
+
+        if (this->backlight_)
+        {   // (there's already fire ||                 we're to slow                 ||                  we're moving backwards                  )
+            if (this->health_ < 20   || this->getVelocity().squaredLength() < 150*150 || this->getVelocity().dotProduct(this->getInitialDir()) < 0)
+                this->backlight_->setActive(false);
+            else
+                this->backlight_->setActive(true);
+        }
 
         if (this->redNode_ && this->greenNode_)
@@ -521,16 +551,11 @@
         }
 
-        if( myShip_ )
-        {
-          COUT(5) << "steering our ship: " << objectID << std::endl;
-          this->acceleration_.x = 0;
-          this->acceleration_.y = 0;
-          this->momentum_ = 0;
-          this->mouseXRotation_ = Radian(0);
-          this->mouseYRotation_ = Radian(0);
-        }/*else
-          COUT(4) << "not steering ship: " << objectID << " our ship: " << network::Client::getSingleton()->getShipID() << std::endl;*/
-
-          this->bLMousePressed_ = false;
+        COUT(5) << "steering our ship: " << objectID << std::endl;
+        this->acceleration_.x = 0;
+        this->acceleration_.y = 0;
+        this->momentum_ = 0;
+        this->mouseXRotation_ = Radian(0);
+        this->mouseYRotation_ = Radian(0);
+        this->bLMousePressed_ = false;
     }
 
Index: code/trunk/src/orxonox/objects/SpaceShip.h
===================================================================
--- code/trunk/src/orxonox/objects/SpaceShip.h	(revision 1602)
+++ code/trunk/src/orxonox/objects/SpaceShip.h	(revision 1608)
@@ -37,5 +37,4 @@
 #include "Model.h"
 #include "tools/BillboardSet.h"
-#include "ParticleSpawner.h"
 
 namespace orxonox
@@ -145,4 +144,6 @@
             BillboardSet rightThrusterFlare_;
 
+            Backlight* backlight_;
+
             BillboardSet redBillboard_;
             BillboardSet greenBillboard_;
@@ -151,6 +152,6 @@
             float blinkTime_;
 
-            ParticleSpawner smoke_;
-            ParticleSpawner fire_;
+            ParticleSpawner* smoke_;
+            ParticleSpawner* fire_;
 
             BillboardSet crosshairNear_;
Index: code/trunk/src/orxonox/objects/SpaceShipAI.cc
===================================================================
--- code/trunk/src/orxonox/objects/SpaceShipAI.cc	(revision 1602)
+++ code/trunk/src/orxonox/objects/SpaceShipAI.cc	(revision 1608)
@@ -102,5 +102,5 @@
             newenemy->XMLPort(xmlelement, XMLPort::LoadObject);
 
-            ParticleSpawner* spawneffect = new ParticleSpawner("Orxonox/fairytwirl", LODParticle::normal, 2.0, 0.0, newenemy->getOrth());
+            ParticleSpawner* spawneffect = new ParticleSpawner("Orxonox/fairytwirl", LODParticle::normal, 2.0, 0, 0, newenemy->getOrth());
             spawneffect->setPosition(newenemy->getPosition() - newenemy->getOrth() * 50);
             spawneffect->create();
@@ -131,5 +131,5 @@
         // search enemy
         random = rnd(maxrand);
-        if (random < 20 && (!this->target_))
+        if (random < 15 && (!this->target_))
             this->searchNewTarget();
 
@@ -146,5 +146,5 @@
         // fly somewhere
         random = rnd(maxrand);
-        if (random < 40 && (!this->bHasTargetPosition_ && !this->target_))
+        if (random < 50 && (!this->bHasTargetPosition_ && !this->target_))
             this->searchNewTargetPosition();
 
@@ -201,10 +201,10 @@
         Vector3 ringdirection = Vector3(rnd(), rnd(), rnd());
         ringdirection.normalise();
-        explosion = new ParticleSpawner("Orxonox/BigExplosion1part3", LODParticle::normal, 3.0, 0.5, ringdirection);
-        explosion->setPosition(this->getPosition());
-        explosion->getParticleInterface()->setKeepParticlesInLocalSpace(true);
-        explosion->setScale(4);
-        explosion->create();
-        explosion = new ParticleSpawner("Orxonox/BigExplosion1part3", LODParticle::high, 3.0, 0.5, ringdirection);
+        explosion = new ParticleSpawner("Orxonox/BigExplosion1part3", LODParticle::normal, 3.0, 0.5, 0, ringdirection);
+        explosion->setPosition(this->getPosition());
+        explosion->getParticleInterface()->setKeepParticlesInLocalSpace(true);
+        explosion->setScale(4);
+        explosion->create();
+        explosion = new ParticleSpawner("Orxonox/BigExplosion1part3", LODParticle::high, 3.0, 0.5, 0, ringdirection);
         explosion->setPosition(this->getPosition());
         explosion->getParticleInterface()->setKeepParticlesInLocalSpace(true);
@@ -235,15 +235,19 @@
     {
         Vector2 coord = get2DViewdirection(this->getPosition(), this->getDir(), this->getOrth(), this->targetPosition_);
-        this->setMoveYaw(0.8 * sgn(coord.x));
-        this->setMovePitch(0.8 * sgn(coord.y));
-
-        if ((this->targetPosition_ - this->getPosition()).length() > 500)
+
+        float distance = (this->targetPosition_ - this->getPosition()).length();
+        if (this->target_ || distance > 50)
+        {
+            // Multiply with 0.8 to make them a bit slower
+            this->setMoveYaw(0.8 * sgn(coord.x) * coord.x*coord.x);
+            this->setMovePitch(0.8 * sgn(coord.y) * coord.y*coord.y);
+        }
+
+        if (this->target_ && distance < 1000 && this->getVelocity().squaredLength() > this->target_->getVelocity().squaredLength())
+            this->setMoveLongitudinal(-0.5); // They don't brake with full power to give the player a chance
+        else if (!this->target_ && distance <= this->getVelocity().length() / (2 * this->getTransAcc()))
+            this->setMoveLongitudinal(-1.0);
+        else
             this->setMoveLongitudinal(0.8);
-
-        if (this->isCloseAtTarget(300) && this->target_)
-        {
-            if (this->getVelocity().length() > this->target_->getVelocity().length())
-                this->setMoveLongitudinal(-0.5);
-        }
     }
 
@@ -306,6 +310,9 @@
     void SpaceShipAI::shipDied(SpaceShipAI* ship)
     {
-        this->forgetTarget();
-        this->searchNewTargetPosition();
+        if (ship == this->target_)
+        {
+            this->forgetTarget();
+            this->searchNewTargetPosition();
+        }
     }
 }
Index: code/trunk/src/orxonox/tools/Timer.h
===================================================================
--- code/trunk/src/orxonox/tools/Timer.h	(revision 1602)
+++ code/trunk/src/orxonox/tools/Timer.h	(revision 1608)
@@ -95,4 +95,7 @@
             inline bool isActive() const
                 { return this->bActive_; }
+            /** @brief Returns the remaining time until the Timer calls the function. @return The remaining time */
+            inline float getRemainingTime() const
+                { return this->time_; }
             /** @brief Gives the Timer some extra time. @param time The amount of extra time in seconds */
             inline void addTime(float time)
