Index: branches/powerups/src/defs/globals.h
===================================================================
--- branches/powerups/src/defs/globals.h	(revision 5973)
+++ branches/powerups/src/defs/globals.h	(revision 5985)
@@ -72,4 +72,7 @@
 #define   CONFIG_NAME_PLAYER_LEFT          "Left"
 #define   CONFIG_NAME_PLAYER_RIGHT         "Right"
+#define   CONFIG_NAME_PLAYER_ROLL_RIGHT    "RollR"
+#define   CONFIG_NAME_PLAYER_ROLL_LEFT     "RollL"
+
 #define   CONFIG_NAME_PLAYER_FIRE          "Fire"
 #define   CONFIG_NAME_PLAYER_NEXT_WEAPON   "Next"
Index: branches/powerups/src/lib/event/event_handler.cc
===================================================================
--- branches/powerups/src/lib/event/event_handler.cc	(revision 5973)
+++ branches/powerups/src/lib/event/event_handler.cc	(revision 5985)
@@ -47,4 +47,5 @@
   this->flush(ES_ALL);
   this->withUNICODE(false);
+  this->grabEvents(false);
 
   this->state = ES_GAME;
@@ -255,4 +256,12 @@
 }
 
+void EventHandler::grabEvents(bool grabEvents)
+{
+     this->eventsGrabbed = grabEvents;
+     if(!grabEvents)
+      SDL_WM_GrabInput(SDL_GRAB_OFF);
+     else
+      SDL_WM_GrabInput(SDL_GRAB_ON); 
+}
 
 /**
Index: branches/powerups/src/lib/event/event_handler.h
===================================================================
--- branches/powerups/src/lib/event/event_handler.h	(revision 5973)
+++ branches/powerups/src/lib/event/event_handler.h	(revision 5985)
@@ -43,4 +43,5 @@
 
   void withUNICODE(bool enableUNICODE);
+  void grabEvents(bool grabEvents);
 
   void process();
@@ -62,4 +63,5 @@
 
   bool                       bUNICODE;                        //!< If unicode should be enabled.
+  bool                       eventsGrabbed;                   //!< If the events should be grabbed
 };
 
Index: branches/powerups/src/lib/event/key_mapper.cc
===================================================================
--- branches/powerups/src/lib/event/key_mapper.cc	(revision 5973)
+++ branches/powerups/src/lib/event/key_mapper.cc	(revision 5985)
@@ -37,4 +37,6 @@
 int KeyMapper::PEV_LEFT              = EV_UNKNOWN;
 int KeyMapper::PEV_RIGHT             = EV_UNKNOWN;
+int KeyMapper::PEV_ROLL_LEFT         = EV_UNKNOWN;
+int KeyMapper::PEV_ROLL_RIGHT        = EV_UNKNOWN;
 int KeyMapper::PEV_STRAFE_LEFT       = EV_UNKNOWN;
 int KeyMapper::PEV_STRAFE_RIGHT      = EV_UNKNOWN;
@@ -69,4 +71,6 @@
   {&KeyMapper::PEV_LEFT,                 CONFIG_NAME_PLAYER_LEFT},
   {&KeyMapper::PEV_RIGHT,                CONFIG_NAME_PLAYER_RIGHT},
+  {&KeyMapper::PEV_ROLL_LEFT,            CONFIG_NAME_PLAYER_ROLL_RIGHT},
+  {&KeyMapper::PEV_ROLL_RIGHT,           CONFIG_NAME_PLAYER_ROLL_LEFT},
   {&KeyMapper::PEV_STRAFE_LEFT,          "StrafeLeft"},
   {&KeyMapper::PEV_STRAFE_RIGHT,         "StrafeRight"},
Index: branches/powerups/src/lib/event/key_mapper.h
===================================================================
--- branches/powerups/src/lib/event/key_mapper.h	(revision 5973)
+++ branches/powerups/src/lib/event/key_mapper.h	(revision 5985)
@@ -44,4 +44,7 @@
   static int PEV_RIGHT;             //!< right button
 
+  static int PEV_ROLL_LEFT;         //!< rolls left
+  static int PEV_ROLL_RIGHT;        //!< rolls right
+
   static int PEV_STRAFE_LEFT;       //!< strafe left button
   static int PEV_STRAFE_RIGHT;      //!< strafe right button
Index: branches/powerups/src/lib/graphics/light.cc
===================================================================
--- branches/powerups/src/lib/graphics/light.cc	(revision 5973)
+++ branches/powerups/src/lib/graphics/light.cc	(revision 5985)
@@ -274,5 +274,5 @@
   while (element != NULL)
   {
-    Factory::getFirst()->fabricate(element);
+    Factory::fabricate(element);
 
     element = element->NextSiblingElement();
Index: branches/powerups/src/lib/gui/gtk_gui/gui_keys.cc
===================================================================
--- branches/powerups/src/lib/gui/gtk_gui/gui_keys.cc	(revision 5973)
+++ branches/powerups/src/lib/gui/gtk_gui/gui_keys.cc	(revision 5985)
@@ -115,8 +115,10 @@
 
         pKeysBox->setGroupName(player);
-        pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_UP, "UP"));
-        pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_DOWN, "DOWN"));
-        pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_LEFT, "LEFT"));
-        pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_RIGHT, "RIGHT"));
+        pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_UP, "w"));
+        pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_DOWN, "s"));
+        pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_LEFT, "a"));
+        pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_RIGHT, "d"));
+        pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_ROLL_LEFT, "q"));
+        pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_ROLL_RIGHT, "e"));
         pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_FIRE, "BUTTON_LEFT"));
         pKeysBox->fill(addKey(CONFIG_NAME_PLAYER_NEXT_WEAPON, "m"));
Index: branches/powerups/src/lib/math/vector.h
===================================================================
--- branches/powerups/src/lib/math/vector.h	(revision 5973)
+++ branches/powerups/src/lib/math/vector.h	(revision 5985)
@@ -21,6 +21,6 @@
 */
 
-#ifndef _VECTOR_H
-#define _VECTOR_H
+#ifndef __VECTOR_H_
+#define __VECTOR_H_
 
 #include <math.h>
@@ -318,4 +318,4 @@
 
 
-#endif /* _VECTOR_H */
-
+#endif /* __VECTOR_H_ */
+
Index: branches/powerups/src/lib/physics/physics_engine.cc
===================================================================
--- branches/powerups/src/lib/physics/physics_engine.cc	(revision 5973)
+++ branches/powerups/src/lib/physics/physics_engine.cc	(revision 5985)
@@ -103,5 +103,5 @@
   while (element != NULL)
   {
-    Factory::getFirst()->fabricate(element);
+    Factory::fabricate(element);
 
     element = element->NextSiblingElement();
@@ -119,5 +119,5 @@
   while (element != NULL)
   {
-    Factory::getFirst()->fabricate(element);
+    Factory::fabricate(element);
 
     element = element->NextSiblingElement();
Index: branches/powerups/src/lib/sound/sound_engine.cc
===================================================================
--- branches/powerups/src/lib/sound/sound_engine.cc	(revision 5973)
+++ branches/powerups/src/lib/sound/sound_engine.cc	(revision 5985)
@@ -286,6 +286,6 @@
 
 
-  }
-
+
+  }
   // INITIALIZING THE DEVICE:
   ALCchar deviceName[] =
@@ -300,6 +300,5 @@
   this->context = alcCreateContext(this->device, NULL);
 
-  alcMakeContextCurrent(this->context);
-
+  alcMakeContextCurrent(this->context); 
 
   if ((result = alGetError()) != AL_NO_ERROR)
Index: branches/powerups/src/orxonox.cc
===================================================================
--- branches/powerups/src/orxonox.cc	(revision 5973)
+++ branches/powerups/src/orxonox.cc	(revision 5985)
@@ -93,5 +93,5 @@
 
   // class-less services/factories
-  delete Factory::getFirst();
+  Factory::deleteFactories();
   FastFactory::deleteAll();
   ShellCommandClass::unregisterAllCommands();
Index: branches/powerups/src/story_entities/campaign.cc
===================================================================
--- branches/powerups/src/story_entities/campaign.cc	(revision 5973)
+++ branches/powerups/src/story_entities/campaign.cc	(revision 5985)
@@ -19,4 +19,5 @@
 #include "campaign.h"
 
+#include "factory.h"
 #include "game_loader.h"
 #include "story_entity.h"
@@ -90,5 +91,5 @@
   {
     PRINTF(5)("Campaign: Constructor: adding a world\n");
-    StoryEntity* created = (StoryEntity*) GameLoader::getInstance()->fabricate(element);
+    StoryEntity* created = (StoryEntity*) Factory::fabricate(element);
     if( created != NULL)
     {
Index: branches/powerups/src/story_entities/world.cc
===================================================================
--- branches/powerups/src/story_entities/world.cc	(revision 5973)
+++ branches/powerups/src/story_entities/world.cc	(revision 5985)
@@ -317,10 +317,10 @@
       while( element != NULL)
         {
-          BaseObject* created = (loader->fabricate(element));
+          BaseObject* created = (Factory::fabricate(element));
           if( created != NULL )
           {
             if(created->isA(CL_WORLD_ENTITY))
               this->spawn(dynamic_cast<WorldEntity*>(created));
-            printf("Created a %s: %s\n", created->getClassName(), created->getName());
+            PRINTF(4)("Created a %s: %s\n", created->getClassName(), created->getName());
           }
 
Index: branches/powerups/src/util/loading/factory.cc
===================================================================
--- branches/powerups/src/util/loading/factory.cc	(revision 5973)
+++ branches/powerups/src/util/loading/factory.cc	(revision 5985)
@@ -13,13 +13,13 @@
    co-programmer: Benjamin Grauer
 */
-
+#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_LOADING
 
 #include "factory.h"
 
-#include "shell_command.h"
-#include "game_loader.h"
+//#include "shell_command.h"
+
 using namespace std;
 
-SHELL_COMMAND(create, Factory, fabricate);
+//SHELL_COMMAND(create, Factory, fabricate);
 
 
@@ -39,18 +39,21 @@
   this->setName(factoryName);
 
-  this->next = NULL;
   this->classID = classID;
+  this->className = factoryName;
 
-  Factory::registerFactory(this);
+  if( Factory::factoryList == NULL)
+    Factory::factoryList = new std::list<Factory*>;
+
+  Factory::factoryList->push_back(this);
 }
 
 /** a reference to the First Factory */
-Factory* Factory::first = NULL;
+std::list<Factory*>* Factory::factoryList = NULL;
 
 /**
  *  destructor
-
-   clear the Q
-*/
+ *
+ * clear the Q
+ */
 Factory::~Factory ()
 {
@@ -58,52 +61,96 @@
   //  Factory* tmpDel = this->next;
   //  this->next = NULL;
-  if (this->next)
-    delete this->next;
 }
 
+void Factory::deleteFactories()
+{
+  if (Factory::factoryList != NULL)
+  {
+    while(!Factory::factoryList->empty())
+    {
+      delete Factory::factoryList->front();
+      Factory::factoryList->pop_front();
+    }
+    delete Factory::factoryList;
+    Factory::factoryList = NULL;
+  }
+}
+
+
 /**
- *  add a Factory to the Factory Queue
- * @param factory a Factory to be registered
-*/
-void Factory::registerFactory( Factory* factory)
+ * Compares the Factories Name against a given ClassName
+ * @param className the Name of the Class to Query
+ * @returns true on match, false otherwise.
+ */
+bool Factory::operator==(const char* className) const
 {
-  assert( factory != NULL);
+  return(className != NULL && !strcmp(className, this->className));
+}
 
-  PRINTF(5)("Registered factory for '%s'\n", factory->getName());
 
-  if( Factory::first == NULL)
+BaseObject* Factory::fabricate(const TiXmlElement* root)
+{
+  if (root == NULL || Factory::factoryList == NULL)
+    return NULL;
+
+  std::list<Factory*>::const_iterator factory;
+  for (factory = Factory::factoryList->begin(); factory != Factory::factoryList->end(); factory++)
+    if (*(*factory) == root->Value())
+      break;
+
+  if (factory != Factory::factoryList->end())
   {
-    Factory::first = factory;
+    PRINTF(4)("Create a new Object of type %s\n", (*factory)->getName());
+    return (*factory)->fabricateObject(root);
   }
   else
   {
-    Factory* tmpFac = Factory::first;
-    while( tmpFac->next != NULL)
-    {
-      tmpFac = tmpFac->next;
-    }
-    tmpFac->setNext(factory);
+    PRINTF(2)("Could not Fabricate an Object of Class '%s'\n", root->Value());
+    return NULL;
   }
 }
 
-void Factory::fabricate(const char* className, const char* entityName)
+BaseObject* Factory::fabricate(const char* className)
 {
-  if (className == NULL)
-    return;
-  Factory* fac = Factory::first;
+  if (className == NULL || Factory::factoryList == NULL)
+    return NULL;
 
-  while (fac != NULL)
+  std::list<Factory*>::const_iterator factory;
+  for (factory = Factory::factoryList->begin(); factory != Factory::factoryList->end(); factory++)
+    if (*(*factory) == className)
+      break;
+
+  if (factory != Factory::factoryList->end())
   {
-    if (!strcmp(className, fac->getName()))
-    {
-      PRINTF(3)("Create a new Object of type %s\n", fac->getName());
-      BaseObject* object = fac->fabricateDirect();
-      if (object != NULL)
-      {
-        object->setName(entityName);
-      }
-      break;
-    }
-    fac = fac->next;
+    PRINTF(4)("Create a new Object of type %s\n", (*factory)->getName());
+    return (*factory)->fabricateObject(NULL);
+  }
+  else
+  {
+    PRINTF(2)("Could not Fabricate an Object of Class '%s'\n", className);
+    return NULL;
   }
 }
+
+
+BaseObject* Factory::fabricate(ClassID classID)
+{
+  if (Factory::factoryList == NULL)
+    return NULL;
+
+  std::list<Factory*>::const_iterator factory;
+  for (factory = Factory::factoryList->begin(); factory != Factory::factoryList->end(); factory++)
+    if (*(*factory) == classID)
+      break;
+
+  if (factory != Factory::factoryList->end())
+  {
+    PRINTF(4)("Create a new Object of type %s\n", (*factory)->getName());
+    return (*factory)->fabricateObject(NULL);
+  }
+  else
+  {
+    PRINTF(2)("Could not Fabricate an Object of ClassID '%h'\n", classID);
+    return NULL;
+  }
+}
Index: branches/powerups/src/util/loading/factory.h
===================================================================
--- branches/powerups/src/util/loading/factory.h	(revision 5973)
+++ branches/powerups/src/util/loading/factory.h	(revision 5985)
@@ -28,4 +28,5 @@
 #include "base_object.h"
 #include "debug.h"
+#include <vector>
 
 /**
@@ -40,29 +41,23 @@
 
  public:
-  Factory (const char* factoryName = NULL, ClassID classID = CL_NULL);
+  Factory (const char* factoryName, ClassID classID);
   virtual ~Factory ();
 
-  void fabricate(const char* className, const char* entityName);
-  virtual BaseObject* fabricate(ClassID classID) = NULL;
-  virtual BaseObject* fabricate(const TiXmlElement* root) = NULL;
-  virtual BaseObject* fabricateDirect() = NULL;
+  static void deleteFactories();
 
-  static void registerFactory( Factory* factory);
-  /** @returns the first factory */
-  static Factory* getFirst() { return Factory::first; };
+  static  BaseObject* fabricate(const char* className);
+  static  BaseObject* fabricate(ClassID classID);
+  static  BaseObject* fabricate(const TiXmlElement* root = NULL);
+
+  bool operator==(ClassID classID) const { return (this->classID == classID); };
+  bool operator==(const char* className) const;
 
   protected:
-    /** sets the Next factory in the list @param nextFactory the next factory */
-    inline void setNext( Factory* nextFactory) { this->next = nextFactory; };
-    /** @returns the next factory */
-    Factory* getNext() const { return this->next; };
-
+    virtual BaseObject* fabricateObject(const TiXmlElement* root = NULL) const = 0;
 
   protected:
-    ClassID           classID;              //!< The CLass-Identifyer of the Factory.
-
-  private:
-    Factory*          next;                 //!< pointer to the next factory.
-    static Factory*   first;                //!< A pointer to the first factory.
+    ClassID                       classID;              //!< The Class-Identifyer of the Factory.
+    const char*                   className;            //!< The name of the Class.
+    static std::list<Factory*>*   factoryList;          //!< List of Registered Factories
 };
 
@@ -73,75 +68,21 @@
 template<class T> class tFactory : public Factory
 {
-  public:
-    tFactory(const char* factoryName, ClassID classID);
-    virtual ~tFactory();
+ public:
+  tFactory (const char* factoryName, ClassID classID)
+   : Factory(factoryName, classID)
+  {
+  }
 
   private:
-    virtual BaseObject* fabricate(ClassID classID);
-    virtual BaseObject* fabricate(const TiXmlElement* root);
-    virtual BaseObject* fabricateDirect();
+   /**
+    * fabricates an Object of type T, with the constructor T::T(const TiXmlElemnt*)
+    * @param root the TiXmlElement T should load parameters from.
+    * @return the newly fabricated T.
+    */
+    virtual BaseObject* fabricateObject(const TiXmlElement* root = NULL) const
+    {
+      return new T(root);
+    }
 };
-
-/**
- *  construnts a factory with
- * @param factoryName the name of the factory
-*/
-template<class T>
-    tFactory<T>::tFactory(const char* factoryName, ClassID classID) : Factory(factoryName, classID)
-{
-  PRINTF(4)("Class: %s loadable\n", this->getName());
-}
-
-/**
- * destructs the type-Factory
- */
-template<class T>
-    tFactory<T>::~tFactory()
-{}
-
-/**
- * fabricates an Object of type T, with the constructor T::T(const TiXmlElemnt*)
- * @param root the TiXmlElement T should load parameters from.
- * @return the newly fabricated T, NULL otherwise.
- */
-template<class T>
-    BaseObject* tFactory<T>::fabricate(const TiXmlElement* root)
-{
-  if (root == NULL)
-    return NULL;
-
-  if(!strcmp(root->Value(), this->getName()))
-    return new T ( root);
-  else if( getNext() != NULL)
-    return getNext()->fabricate( root);
-  else
-    return NULL;
-}
-
-
-/**
- * fabricates an Object of type T, with the constructor T::T(const TiXmlElemnt*)
- * @param classID the ClassID of T that should be created.
- * @return the newly fabricated T if fabricated NULL otherwise.
- */
-template<class T>
-    BaseObject* tFactory<T>::fabricate(ClassID classID)
-{
-  if(classID == this->classID)
-    return this->fabricateDirect();
-  else if( getNext() != NULL)
-    return getNext()->fabricate( classID);
-  else
-    return NULL;
-}
-
-/**
- * directly fabricate an Entity of this factory.
- */
-template<class T>
-    BaseObject* tFactory<T>::fabricateDirect()
-{
-  return new T((const TiXmlElement*)NULL);
-}
 
 #endif /* _FACTORY_H */
Index: branches/powerups/src/util/loading/game_loader.cc
===================================================================
--- branches/powerups/src/util/loading/game_loader.cc	(revision 5973)
+++ branches/powerups/src/util/loading/game_loader.cc	(revision 5985)
@@ -331,32 +331,2 @@
     this->currentCampaign->previousLevel();
 }
-
-/**
- *  load a StoryEntity
- * @param element a XMLElement containing all the needed info
-*/
-BaseObject* GameLoader::fabricate(const TiXmlElement* element)
-{
-  assert( element != NULL);
-
-  if( Factory::getFirst() == NULL)
-    {
-      PRINTF(1)("GameLoader does not know any factories, fabricate() failed\n");
-      return NULL;
-    }
-
-  if( element->Value() != NULL)
-    {
-      PRINTF(4)("Attempting fabrication of a '%s'\n", element->Value());
-      BaseObject* b = Factory::getFirst()->fabricate( element);
-      if( b == NULL)
-        PRINTF(2)("Failed to fabricate a '%s'\n", element->Value());
-      else
-        PRINTF(4)("Successfully fabricated a '%s'\n", element->Value());
-      return b;
-    }
-
-  PRINTF(2)("Fabricate failed, TiElement did not contain a value\n");
-
-  return NULL;
-}
Index: branches/powerups/src/util/loading/game_loader.h
===================================================================
--- branches/powerups/src/util/loading/game_loader.h	(revision 5973)
+++ branches/powerups/src/util/loading/game_loader.h	(revision 5985)
@@ -60,7 +60,4 @@
   ErrorMessage loadDebugCampaign(Uint32 campaignID);
 
-  void registerFactory( Factory* factory );
-  BaseObject* fabricate(const TiXmlElement* data);
-
   void process(const Event &event);
 
Index: branches/powerups/src/world_entities/extendable.h
===================================================================
--- branches/powerups/src/world_entities/extendable.h	(revision 5973)
+++ branches/powerups/src/world_entities/extendable.h	(revision 5985)
@@ -12,4 +12,5 @@
 class PowerUp;
 
+#include "power_ups/power_up.h"
 
 //! A class for ...
@@ -19,5 +20,5 @@
 //   Extendable();
 //   virtual ~Extendable();
-  virtual bool pickup(PowerUp* powerUp) { return false; }
+   virtual bool pickup(PowerUp* powerUp) { return false; };
 
  private:
Index: branches/powerups/src/world_entities/player.h
===================================================================
--- branches/powerups/src/world_entities/player.h	(revision 5973)
+++ branches/powerups/src/world_entities/player.h	(revision 5985)
@@ -8,4 +8,5 @@
 
 #include "event_listener.h"
+#include "extendable.h"
 
 /* Forward Declaration */
@@ -18,4 +19,5 @@
      the player.cc for debug also
 */
+
 class Player : public EventListener
 {
Index: branches/powerups/src/world_entities/space_ships/space_ship.cc
===================================================================
--- branches/powerups/src/world_entities/space_ships/space_ship.cc	(revision 5973)
+++ branches/powerups/src/world_entities/space_ships/space_ship.cc	(revision 5985)
@@ -31,6 +31,9 @@
 #include "factory.h"
 #include "key_mapper.h"
+#include "event_handler.h"
 
 #include "power_ups/weapon_power_up.h"
+
+#include "graphics_engine.h"
 
 using namespace std;
@@ -88,5 +91,5 @@
   Weapon* wpLeft = new TestGun(1);
   wpLeft->setName("testGun Left");
-  Weapon* cannon = dynamic_cast<Weapon*>(Factory::getFirst()->fabricate(CL_CANNON));
+  Weapon* cannon = dynamic_cast<Weapon*>(Factory::fabricate(CL_CANNON));
 
   cannon->setName("BFG");
@@ -112,7 +115,13 @@
   PRINTF(4)("SPACESHIP INIT\n");
 
-
-  bUp = bDown = bLeft = bRight = bAscend = bDescend = false;
+  EventHandler::getInstance()->grabEvents(true);
+
+  bUp = bDown = bLeft = bRight = bAscend = bDescend = bRollL = bRollR = false;
   bFire = false;
+  xMouse = yMouse = 0;
+  mouseSensitivity = 0.001;
+
+  cycle = 0.0;
+
 
   travelSpeed = 15.0;
@@ -126,8 +135,10 @@
 
   //add events to the eventlist
-  registerEvent(KeyMapper::PEV_UP);
-  registerEvent(KeyMapper::PEV_DOWN);
-  registerEvent(KeyMapper::PEV_LEFT);
-  registerEvent(KeyMapper::PEV_RIGHT);
+  registerEvent(SDLK_w);
+  registerEvent(SDLK_s);
+  registerEvent(SDLK_a);
+  registerEvent(SDLK_d);
+  registerEvent(SDLK_q);
+  registerEvent(SDLK_e);
   registerEvent(KeyMapper::PEV_FIRE1);
   registerEvent(KeyMapper::PEV_NEXT_WEAPON);
@@ -135,4 +146,5 @@
   registerEvent(SDLK_PAGEUP);
   registerEvent(SDLK_PAGEDOWN);
+  registerEvent(EV_MOUSE_MOTION);
 
   this->getWeaponManager()->setSlotCount(7);
@@ -255,4 +267,5 @@
 void SpaceShip::tick (float time)
 {
+     cycle += time;
   // spaceship controlled movement
   this->calculateVelocity(time);
@@ -261,4 +274,11 @@
 
   //orient the spaceship model in the direction of movement.
+
+  // this is the air friction (necessary for a smooth control)
+  if(velocity.len() != 0) velocity -= velocity*0.01;
+
+  this->shiftCoor(Vector(0,1,0)*cos(this->cycle*2.0)*0.02);
+
+  //SDL_WarpMouse(GraphicsEngine::getInstance()->getResolutionX()/2, GraphicsEngine::getInstance()->getResolutionY()/2);
 
   this->shiftCoor (move);
@@ -283,12 +303,12 @@
   if( this->bUp )
    {
-     this->shiftCoor(this->getAbsDirX());
-      //if(travelSpeed <= 5000)  travelSpeed += 10;
+     //this->shiftCoor(this->getAbsDirX());
+      accel += (this->getAbsDirX())*2;
    }
 
   if( this->bDown )
    {
-     this->shiftCoor(Vector()-this->getAbsDirX());
-     //if(travelSpeed >= 10) travelSpeed -= 10;
+     //this->shiftCoor((this->getAbsDirX())*-1);
+     accel -= (this->getAbsDirX())*2;
    }
 
@@ -310,4 +330,22 @@
     //rotVal += .4;
   }
+
+  if( this->bRollL /* > -this->getRelCoor().z*2*/)
+  {
+    this->shiftDir(Quaternion(-time, Vector(1,0,0)));
+//    accel -= rightDirection;
+    //velocityDir.normalize();
+    //rot +=Vector(1,0,0);
+    //rotVal -= .4;
+  }
+  if( this->bRollR /* > this->getRelCoor().z*2*/)
+  {
+    this->shiftDir(Quaternion(time, Vector(1,0,0)));
+
+    //    accel += rightDirection;
+    //velocityDir.normalize();
+    //rot += Vector(1,0,0);
+    //rotVal += .4;
+  }
   if (this->bAscend )
   {
@@ -329,5 +367,5 @@
   }
 
-  velocity += accel*(time);
+  velocity += accel;
   //rot.normalize();
   //this->setRelDirSoft(Quaternion(rotVal, rot), 5);
@@ -350,12 +388,10 @@
 void SpaceShip::process(const Event &event)
 {
-  if( event.type == KeyMapper::PEV_UP)
-      this->bUp = event.bPressed;
-  else if( event.type == KeyMapper::PEV_DOWN)
-      this->bDown = event.bPressed;
-  else if( event.type == KeyMapper::PEV_RIGHT)
-      this->bRight= event.bPressed;
-  else if( event.type == KeyMapper::PEV_LEFT)
-      this->bLeft = event.bPressed;
+
+
+  if( event.type == SDLK_a)
+      this->bRollL = event.bPressed;
+  else if( event.type == SDLK_d)
+      this->bRollR = event.bPressed;
   else if( event.type == KeyMapper::PEV_FIRE1)
       this->bFire = event.bPressed;
@@ -365,8 +401,14 @@
     this->getWeaponManager()->previousWeaponConfig();
 
-  else if( event.type == SDLK_PAGEUP)
-    this->bAscend = event.bPressed; //this->shiftCoor(0,.1,0);
-  else if( event.type == SDLK_PAGEDOWN)
-    this->bDescend = event.bPressed; //this->shiftCoor(0,-.1,0);
+  else if( event.type == SDLK_w)
+    this->bUp = event.bPressed; //this->shiftCoor(0,.1,0);
+  else if( event.type == SDLK_s)
+    this->bDown = event.bPressed; //this->shiftCoor(0,-.1,0);
+  else if( event.type == EV_MOUSE_MOTION)
+  {
+    this->xMouse = event.xRel;
+    this->yMouse = event.yRel;
+    this->shiftDir(Quaternion(-M_PI/4*xMouse*mouseSensitivity, Vector(0,1,0))*Quaternion(-M_PI/4*yMouse*mouseSensitivity, Vector(0,0,1)));
+  }
 }
 
Index: branches/powerups/src/world_entities/space_ships/space_ship.h
===================================================================
--- branches/powerups/src/world_entities/space_ships/space_ship.h	(revision 5973)
+++ branches/powerups/src/world_entities/space_ships/space_ship.h	(revision 5985)
@@ -58,4 +58,11 @@
     bool                  bDescend;           //!< descend button presses.
     bool                  bFire;              //!< fire button pressed.
+    bool                  bRollL;             //!< rolling button pressed (left)
+    bool                  bRollR;             //!< rolling button pressed (right)
+    
+    float                 xMouse;             //!< mouse moved in x-Direction
+    float                 yMouse;             //!< mouse moved in y-Direction
+    float                 mouseSensitivity;   //!< the mouse sensitivity
+    float                 cycle;              //!< hovercycle
 
     Vector                velocity;           //!< the velocity of the player.
Index: branches/powerups/src/world_entities/weapons/crosshair.cc
===================================================================
--- branches/powerups/src/world_entities/weapons/crosshair.cc	(revision 5973)
+++ branches/powerups/src/world_entities/weapons/crosshair.cc	(revision 5985)
@@ -70,5 +70,5 @@
   this->material = new Material;
 
-  EventHandler::getInstance()->subscribe(this, ES_GAME, EV_MOUSE_MOTION);
+  //EventHandler::getInstance()->subscribe(this, ES_GAME, EV_MOUSE_MOTION);
 
   // center the mouse on the screen, and also hide the cursors
@@ -122,5 +122,5 @@
   if  (event.type == EV_MOUSE_MOTION)
   {
-    this->setAbsCoor2D(event.x, event.y);
+    //this->setAbsCoor2D(event.x, event.y);
   }
 }
@@ -157,5 +157,5 @@
                &objZ );
 
-  this->setAbsCoor(objX, objY, objZ);
+  //this->setAbsCoor(objX, objY, objZ);
 }
 
@@ -166,5 +166,5 @@
 {
   glPushMatrix();
-  glTranslatef(this->getAbsCoor2D().x, this->getAbsCoor2D().y, 0);
+  glTranslatef(GraphicsEngine::getInstance()->getResolutionX()/2, GraphicsEngine::getInstance()->getResolutionY()/2, 0);
 
   glRotatef(this->getAbsDir2D(), 0,0,1);
Index: branches/powerups/src/world_entities/weapons/ground_turret.cc
===================================================================
--- branches/powerups/src/world_entities/weapons/ground_turret.cc	(revision 5973)
+++ branches/powerups/src/world_entities/weapons/ground_turret.cc	(revision 5985)
@@ -85,5 +85,5 @@
   element = root->FirstChildElement("weapon-left");
   if (element != NULL) element = element->FirstChildElement();
-  this->left = dynamic_cast<Weapon*>( Factory::getFirst()->fabricate( element) );
+  this->left = dynamic_cast<Weapon*>( Factory::fabricate( element) );
   if (this->left)
   {
@@ -94,5 +94,5 @@
   element = root->FirstChildElement("weapon-right");
   if (element != NULL)  if (element != NULL) element = element->FirstChildElement();
-  this->right = dynamic_cast<Weapon*>( Factory::getFirst()->fabricate( element) );
+  this->right = dynamic_cast<Weapon*>( Factory::fabricate( element) );
   if (this->right)
   {
Index: branches/powerups/src/world_entities/weapons/weapon_manager.cc
===================================================================
--- branches/powerups/src/world_entities/weapons/weapon_manager.cc	(revision 5973)
+++ branches/powerups/src/world_entities/weapons/weapon_manager.cc	(revision 5985)
@@ -140,5 +140,5 @@
   LOAD_PARAM_START_CYCLE(root, element);
 
-  Weapon* newWeapon = dynamic_cast<Weapon*>(Factory::getFirst()->fabricate(element));
+  Weapon* newWeapon = dynamic_cast<Weapon*>(Factory::fabricate(element));
   /// @todo implement this !!
 
