Index: trunk/src/world_entities/creatures/md2_creature.cc
===================================================================
--- trunk/src/world_entities/creatures/md2_creature.cc	(revision 6985)
+++ trunk/src/world_entities/creatures/md2_creature.cc	(revision 6986)
@@ -45,4 +45,5 @@
 MD2Creature::~MD2Creature ()
 {
+  this->setPlayer(NULL);
 }
 
Index: trunk/src/world_entities/playable.cc
===================================================================
--- trunk/src/world_entities/playable.cc	(revision 6985)
+++ trunk/src/world_entities/playable.cc	(revision 6986)
@@ -75,9 +75,8 @@
   delete this->weaponMan;
 
-  if (this->currentPlayer)
-  {
-    PRINTF(2)("There is Still a Player subscribed to this Playable (%s::%s)\n", this->getClassName(), this->getName());
-
-  }
+  // THE DERIVED CLASS MUST UNSUBSCRIBE THE PLAYER THROUGH
+  // this->setPlayer(NULL);
+  // IN ITS DESTRUCTOR.
+  assert(this->currentPlayer == NULL);
 }
 
@@ -158,14 +157,44 @@
  * @param player the player that shall controll this Playable
  */
-bool Playable::subscribePlayer(Player* player)
-{
-  if (this->currentPlayer != NULL)
-  {
-    PRINTF(1)("Already registered Player:%s to this Playable (%s:%s)\n", this->currentPlayer->getName(), this->getClassName(), this->getName());
+bool Playable::setPlayer(Player* player)
+{
+  // if we already have a Player inside do nothing
+  if (this->currentPlayer != NULL && player != NULL)
+  {
+    printf("No Change in Playable\n");
     return false;
   }
-  else
-  {
+
+  // eject the Player if player == NULL
+  if (this->currentPlayer != NULL && player == NULL)
+  {
+    PRINTF(0)("Player gets ejected\n");
+
+    // unsubscibe all events.
+    EventHandler* evh = EventHandler::getInstance();
+    std::list<int>::iterator ev;
+    for (ev = this->events.begin(); ev != events.end(); ev++)
+      evh->unsubscribe( ES_GAME, (*ev));
+
+    // leave the entity
+    this->leave();
+
+    // eject the current Player.
+    Player* ejectPlayer = this->currentPlayer;
+    this->currentPlayer = NULL;
+    // eject the Player.
+    ejectPlayer->setPlayable(NULL);
+
+    return true;
+  }
+
+  // get the new Player inside
+  if (this->currentPlayer == NULL && player != NULL)
+  {
+    PRINTF(0)("New Player gets inside\n");
     this->currentPlayer = player;
+    if (this->currentPlayer->getPlayable() != this)
+      this->currentPlayer->setPlayable(this);
+
     /*EventHandler*/
     EventHandler* evh = EventHandler::getInstance();
@@ -173,34 +202,13 @@
     for (ev = this->events.begin(); ev != events.end(); ev++)
       evh->subscribe(player, ES_GAME, (*ev));
+
     this->enter();
     return true;
   }
-}
-
-/**
- * unsubscribe from all events the controllable needs
- * @param player the Player, that controlled this Ship.
- */
-bool Playable::unsubscribePlayer(Player* player)
-{
-  if (this->currentPlayer != player)
-  {
-    PRINTF(1)("not the right Player to unregister from this Playable (%s:%s)\n", this->currentPlayer->getName(), this->getClassName(), this->getName());
-    return false;
-  }
-
-  else
-  {
-    /*EventHandler*/
-    EventHandler* evh = EventHandler::getInstance();
-    std::list<int>::iterator ev;
-    for (ev = this->events.begin(); ev != events.end(); ev++)
-      evh->unsubscribe( ES_GAME, (*ev));
-
-    this->leave();
-    this->currentPlayer = NULL;
-    return true;
-  }
-}
+
+  printf("none\n");
+  return false;
+}
+
 
 bool Playable::pickup(PowerUp* powerUp)
Index: trunk/src/world_entities/playable.h
===================================================================
--- trunk/src/world_entities/playable.h	(revision 6985)
+++ trunk/src/world_entities/playable.h	(revision 6986)
@@ -28,6 +28,4 @@
     virtual ~Playable();
 
-    virtual void enter() = 0;
-    virtual void leave() = 0;
 
     virtual void die();
@@ -44,6 +42,6 @@
 
 
-    bool subscribePlayer(Player* player);
-    bool unsubscribePlayer(Player* player);
+    bool setPlayer(Player* player);
+    Player* getCurrentPlayer() const { return this->currentPlayer; };
 
     void attachCamera();
@@ -68,4 +66,7 @@
     Playable();
 
+    virtual void enter() = 0;
+    virtual void leave() = 0;
+
     void registerEvent(int eventType);
     void unregisterEvent(int eventType);
Index: trunk/src/world_entities/player.cc
===================================================================
--- trunk/src/world_entities/player.cc	(revision 6985)
+++ trunk/src/world_entities/player.cc	(revision 6986)
@@ -49,5 +49,5 @@
 Player::~Player ()
 {
-
+  this->setPlayable(NULL);
 }
 
@@ -55,29 +55,40 @@
 bool Player::setPlayable(Playable* playable)
 {
-  if(playable != NULL && playable->subscribePlayer(this))
+  if (this->playable == playable)
+    return false;
+
+  // get out of the current Playable
+  if (this->playable != NULL)
   {
+    printf("Player gets ejected from Playable\n");
+    this->hud.setEnergyWidget(NULL);
+    this->hud.setWeaponManager(NULL);
+
+    Playable* ejectedPlayable = this->playable;
+
+    this->playable = NULL;
+    ejectedPlayable->setPlayer(NULL);
+  }
+
+  if (playable != NULL)
+  {
+    printf("Enter new Playable\n");
       this->playable = playable;
       this->hud.setEnergyWidget(this->playable->getHealthWidget());
       this->hud.setWeaponManager(this->playable->getWeaponManager());
+
+      this->playable->setPlayer(this);
       return true;
   }
-  else
-    return false;
+
+  printf("no change\n");
+  return true;
 }
 
-bool Player::disconnectPlayable()
+bool Player::eject()
  {
-   if(this->playable == NULL) return true;
+   this->setPlayable(NULL);
+ }
 
-   if(this->playable->unsubscribePlayer(this))
-   {
-     this->playable = NULL;
-     this->hud.setEnergyWidget(NULL);
-     this->hud.setWeaponManager(NULL);
-     return true;
-   }
-   else
-     return false;
- }
 
  void Player::weaponConfigChanged()
@@ -99,5 +110,4 @@
        {
 
-         this->disconnectPlayable();
          this->setPlayable(dynamic_cast<Playable*>(*node));
 
Index: trunk/src/world_entities/player.h
===================================================================
--- trunk/src/world_entities/player.h	(revision 6985)
+++ trunk/src/world_entities/player.h	(revision 6986)
@@ -29,6 +29,6 @@
 
     bool              setPlayable(Playable* controllalble);
-    inline Playable*  getPlayable() { return this->playable; };
-    bool              disconnectPlayable();
+    inline Playable*  getPlayable() const  { return this->playable; };
+    bool              eject();
 
     void              weaponConfigChanged();
Index: trunk/src/world_entities/space_ships/helicopter.cc
===================================================================
--- trunk/src/world_entities/space_ships/helicopter.cc	(revision 6985)
+++ trunk/src/world_entities/space_ships/helicopter.cc	(revision 6986)
@@ -48,4 +48,5 @@
 Helicopter::~Helicopter ()
 {
+  this->setPlayer(NULL);
 }
 
@@ -123,5 +124,5 @@
   this->cameraNode.setParentMode(PNODE_ALL);
   this->cameraNode.setRelCoor(Vector(0,1,0));
-  
+
   // rotors
   this->topRotor.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
@@ -141,5 +142,5 @@
   this->velocity = Vector(0.0,0.0,0.0);
   this->velocityDir = Vector(1.0,0.0,0.0);
-  
+
   // very, very old stuff
   //  GLGuiButton* button = new GLGuiPushButton();
Index: trunk/src/world_entities/space_ships/hover.cc
===================================================================
--- trunk/src/world_entities/space_ships/hover.cc	(revision 6985)
+++ trunk/src/world_entities/space_ships/hover.cc	(revision 6986)
@@ -39,5 +39,7 @@
  */
 Hover::~Hover ()
-{}
+{
+  this->setPlayer(NULL);
+}
 
 /**
Index: trunk/src/world_entities/space_ships/space_ship.cc
===================================================================
--- trunk/src/world_entities/space_ships/space_ship.cc	(revision 6985)
+++ trunk/src/world_entities/space_ships/space_ship.cc	(revision 6986)
@@ -62,4 +62,5 @@
 SpaceShip::~SpaceShip ()
 {
+  this->setPlayer(NULL);
 }
 
