Index: branches/playability.merge/src/util/Makefile.am
===================================================================
--- branches/playability.merge/src/util/Makefile.am	(revision 10365)
+++ branches/playability.merge/src/util/Makefile.am	(revision 10366)
@@ -26,7 +26,7 @@
 			animation/animation_player.cc \
 			\
-			track/pilot_node.cc
-
-#			track/track_manager.cc \
+			track/pilot_node.cc \
+			track/track.cc \
+			track/track_manager.cc \
 			track/track_node.cc
 
@@ -52,6 +52,7 @@
 			animation/t_animation.h \
 			\
-			track/pilot_node.h
+			track/pilot_node.h \
+			track/track.h \
+			track/track_manager.h \
+			track/track_node.h
 
-#			track/track_manager.h \
-			track/track_node.h
Index: branches/playability.merge/src/util/hud.cc
===================================================================
--- branches/playability.merge/src/util/hud.cc	(revision 10365)
+++ branches/playability.merge/src/util/hud.cc	(revision 10366)
@@ -23,8 +23,12 @@
 #include "world_entities/weapons/weapon_manager.h"
 #include "glgui_widget.h"
+#include "glgui_box.h"
+#include "glgui_bar.h"
+#include "elements/glgui_energywidgetvertical.h"
 
 #include "glgui_inputline.h"
 #include "specials/glgui_notifier.h"
 #include "elements/glgui_radar.h"
+#include "world_entities/space_ships/space_ship.h"
 
 
@@ -45,9 +49,17 @@
   //this->setSize2D(
   this->weaponManager = NULL;
+  this->weaponManagerSecondary = NULL;
   this->energyWidget = NULL;
   this->shieldWidget = NULL;
   this->armorWidget = NULL;
+  //this->leftRect = NULL;
+  //this->rightRect = NULL;
   this->resX = 1;
   this->resY = 1;
+
+  this->overlayPercentage = 40;
+  this->overlayActive = false;
+  this->rightRect = new OrxGui::GLGuiImage();
+  this->leftRect = new OrxGui::GLGuiImage();
 
   this->inputLine = new OrxGui::GLGuiInputLine();
@@ -58,9 +70,10 @@
 
   this->_radar = new OrxGui::GLGuiRadar();
+  this->radarCenterNode = NULL;
 
   this->subscribeEvent(ES_ALL, EV_VIDEO_RESIZE);
   this->subscribeEvent(ES_ALL, SDLK_TAB);
 
-
+  //this->shipValuesBox = NULL;
 }
 
@@ -75,4 +88,9 @@
 
   delete this->_radar;
+  delete this->rightRect;
+  delete this->leftRect;
+  //if (this->shipValuesBox != NULL)
+    //delete this->shipValuesBox;
+
   // delete what has to be deleted here
 }
@@ -94,4 +112,7 @@
 void Hud::setEnergyWidget(OrxGui::GLGuiWidget* widget)
 {
+  //if (this->shipValuesBox == NULL)
+    //this->createShipValuesBox();
+
   // decopple old widget
   if (this->energyWidget != NULL)
@@ -103,6 +124,10 @@
   if (this->energyWidget != NULL)
   {
+    //this->energyWidget->shiftDir2D(270);
+    //dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (this->energyWidget)->setDisplayedName("Electronics");
+    //this->shipValuesBox->pack(this->energyWidget);
+    //dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (this->energyWidget)->setStandardSettings();
+    this->energyWidget->setParent2D(this->leftRect);
     this->energyWidget->show();
-    this->energyWidget->setBackgroundTexture( "hud_energy_background.png");
     /*    this->energyWidget->frontMaterial().setDiffuseMap("hud_energy_bar.png");
         this->energyWidget->frontMaterial().setBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);*/
@@ -113,11 +138,66 @@
 
 void Hud::setShiledWidget(OrxGui::GLGuiWidget* widget)
-{}
+{
+  /*
+  if (this->shipValuesBox == NULL)
+    this->createShipValuesBox();
+  */
+
+  // decopple old widget
+  if (this->shieldWidget != NULL)
+  {
+    this->shieldWidget->hide();
+  }
+
+  this->shieldWidget = widget;
+  if (this->shieldWidget != NULL)
+  {
+    //this->shieldWidget->shiftDir2D(270);
+    //this->shipValuesBox->pack(this->shieldWidget);
+    //dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (this->shieldWidget)->setStandardSettings();
+    this->shieldWidget->setParent2D(this->leftRect);
+    this->shieldWidget->show();
+    /*    this->shieldWidget->frontMaterial().setDiffuseMap("hud_energy_bar.png");
+        this->shieldWidget->frontMaterial().setBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);*/
+  }
+  else
+    printf("schild im hud nicht uebergeben!!!!!!!!!!!!!!!!!!!!!!!!!");
+
+  this->updateResolution();
+}
 
 void Hud::setArmorWidget(OrxGui::GLGuiWidget* widget)
-{}
-
-void Hud::setWeaponManager(WeaponManager* weaponMan)
-{
+{
+  /*
+  if (this->shipValuesBox == NULL)
+    this->createShipValuesBox();
+  */
+
+// decopple old widget
+  if (this->armorWidget != NULL)
+  {
+    this->armorWidget->hide();
+  }
+
+  this->armorWidget = widget;
+  if (this->armorWidget != NULL)
+  {
+    //this->armorWidget->shiftDir2D(270);
+    //this->shipValuesBox->pack(this->armorWidget);
+    //dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (this->armorWidget)->setStandardSettings();
+    this->armorWidget->setParent2D(this->leftRect);
+    this->armorWidget->show();
+    /*    this->armorWidget->frontMaterial().setDiffuseMap("hud_energy_bar.png");
+        this->armorWidget->frontMaterial().setBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);*/
+  }
+
+  this->updateResolution();
+}
+
+void Hud::setWeaponManager(WeaponManager* weaponMan, WeaponManager* weaponManSec)
+{
+  //clearWeaponManager();
+
+  //Hide all widgets
   if (this->weaponManager != NULL)
   {
@@ -128,10 +208,24 @@
       {
         weapon->getEnergyWidget()->hide();
-        this->weaponsWidgets.remove(weapon->getEnergyWidget());
+        //this->weaponsWidgetsPrim.remove(dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (weapon->getEnergyWidget()));
       }
     }
   }
 
+  if (this->weaponManagerSecondary != NULL)
+  {
+    for (unsigned int i = 0; i < this->weaponManagerSecondary->getSlotCount(); i++)
+    {
+      Weapon* weapon = this->weaponManagerSecondary->getWeapon(i);
+      if (weapon != NULL)
+      {
+        weapon->getEnergyWidget()->hide();
+        //this->weaponsWidgetsSec.remove(dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (weapon->getEnergyWidget()));
+      }
+    }
+  }
+
   this->weaponManager = weaponMan;
+  this->weaponManagerSecondary = weaponManSec; 
 
   this->updateWeaponManager();
@@ -139,15 +233,59 @@
 }
 
+/*
+void Hud::clearWeaponManager()
+{
+  //Hide all widgets
+  if (this->weaponManager != NULL)
+  {
+    for (unsigned int i = 0; i < this->weaponManager->getSlotCount(); i++)
+    {
+      Weapon* weapon = this->weaponManager->getWeapon(i);
+      if (weapon != NULL)
+      {
+        weapon->getEnergyWidget()->hide();
+        //this->weaponsWidgetsPrim.remove(dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (weapon->getEnergyWidget()));
+      }
+    }
+  }
+
+  if (this->weaponManagerSecondary != NULL)
+  {
+    for (unsigned int i = 0; i < this->weaponManagerSecondary->getSlotCount(); i++)
+    {
+      Weapon* weapon = this->weaponManagerSecondary->getWeapon(i);
+      if (weapon != NULL)
+      {
+        weapon->getEnergyWidget()->hide();
+        //this->weaponsWidgetsSec.remove(dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (weapon->getEnergyWidget()));
+      }
+    }
+  }
+
+  //this->weaponsWidgetsPrim.clear();
+  //this->weaponsWidgetsSec.clear();
+}
+*/
+
 void Hud::updateWeaponManager()
 {
   // hide all the Widgets
-  std::list<OrxGui::GLGuiWidget*>::iterator weaponWidget;
-  for (weaponWidget = this->weaponsWidgets.begin(); weaponWidget != this->weaponsWidgets.end(); weaponWidget++)
+  
+  std::list<OrxGui::GLGuiEnergyWidgetVertical*>::iterator weaponWidget;
+  for (weaponWidget = this->weaponsWidgetsPrim.begin(); weaponWidget != this->weaponsWidgetsPrim.end(); weaponWidget++)
   {
     (*weaponWidget)->hide();
   }
-  this->weaponsWidgets.clear();
+  this->weaponsWidgetsPrim.clear();
+
+  for (weaponWidget = this->weaponsWidgetsSec.begin(); weaponWidget != this->weaponsWidgetsSec.end(); weaponWidget++)
+  {
+    (*weaponWidget)->hide();
+  }
+  this->weaponsWidgetsSec.clear();
+  
 
   // add all that we need again.
+
   if (this->weaponManager != NULL)
     for (unsigned int i = 0; i < this->weaponManager->getSlotCount(); i++)
@@ -157,12 +295,33 @@
       {
         //PRINTF(0)("WEAPON %s::%s in Slots\n", weapon->getClassCName(), weapon->getName());
+        weapon->getEnergyWidget()->setParent2D(this->rightRect);
         weapon->getEnergyWidget()->show();
         weapon->getEnergyWidget()->setBackgroundColor(Color(.8,.2,.11, 0.1));
         weapon->getEnergyWidget()->setFrontColor(Color( .2,.5,.7,.6));
-        //      weapon->getEnergyWidget()->frontMaterial().setTransparency(.6);
-        this->weaponsWidgets.push_back(weapon->getEnergyWidget());
+        weapon->getEnergyWidget()->setWidgetSize(120,30);
+        //weapon->getEnergyWidget()->frontMaterial().setTransparency(.6);
+        this->weaponsWidgetsPrim.push_back(dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (weapon->getEnergyWidget()));
       }
     }
+
+  if (this->weaponManagerSecondary != NULL)
+    for (unsigned int i = 0; i < this->weaponManagerSecondary->getSlotCount(); i++)
+    {
+      Weapon* weapon = this->weaponManagerSecondary->getWeapon(i);
+      if (weapon != NULL)
+      {
+        //PRINTF(0)("WEAPON %s::%s in Slots\n", weapon->getClassCName(), weapon->getName());
+        weapon->getEnergyWidget()->setParent2D(this->rightRect);
+        weapon->getEnergyWidget()->show();
+        weapon->getEnergyWidget()->setBackgroundColor(Color(.8,.2,.11, 0.1));
+        weapon->getEnergyWidget()->setFrontColor(Color( .2,.5,.7,.6));
+        weapon->getEnergyWidget()->setWidgetSize(150,50);
+        //weapon->getEnergyWidget()->frontMaterial().setTransparency(.6);
+        this->weaponsWidgetsSec.push_back(dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (weapon->getEnergyWidget()));
+      }
+    }
+
   this->updateResolution();
+
 }
 
@@ -182,40 +341,180 @@
   this->notifier->setWidgetSize(0.25 * this->resX, 0.6 * this->resY);
 
+  int overlayWidth = 0;
+  if (overlayPercentage >= 20)
+    overlayWidth = this->resX * (overlayPercentage)/(200);
+  else
+    overlayWidth = this->resX * 0.1;
+  //if (overlayWidth < 100)
+    //overlayWidth = 100;
+
+  this->rightRect->hide();
+  this->leftRect->hide();
+
+  this->leftRect->setParent2D(this);
+  this->leftRect->setWidgetSize(float(overlayWidth), float(this->resY));
+  this->leftRect->setAbsCoor2D(0,0);
+  this->leftRect->setBackgroundTexture(Texture());
+  this->leftRect->setBackgroundColor(Color(0,0,0.7,0.2));
+  this->leftRect->setForegroundTexture(Texture());
+  this->leftRect->setForegroundColor(Color(0,0,0,0));
+
+  this->rightRect->setParent2D(this);
+  this->rightRect->setWidgetSize(float(overlayWidth), float(this->resY));
+  this->rightRect->setAbsCoor2D(this->resX - overlayWidth,0);
+  this->rightRect->setBackgroundTexture(Texture());
+  this->rightRect->setBackgroundColor(Color(0,0,0.7,0.2));
+  this->rightRect->setForegroundTexture(Texture());
+  this->rightRect->setForegroundColor(Color(0,0,0,0));
+
+
+  if (this->overlayActive == true)
+  {
+    this->rightRect->show();
+    this->leftRect->show();
+  }
+
 
   if (State::getPlayer() && State::getPlayer()->getPlayable() && State::getObjectManager())
   {
     PRINTF(4)("UPDATING RADAR\n");
-    this->_radar->setCenterNode(State::getPlayer()->getPlayable());
-    this->_radar->addEntityList(&State::getObjectManager()->getEntityList((OM_LIST)(State::getPlayer()->getPlayable()->getOMListNumber()+1)), Color(.4, .4, 1.0));
-    this->_radar->addEntityList(&State::getObjectManager()->getEntityList(OM_GROUP_02), Color(1.0, .2, .2));
-    this->_radar->setAbsCoor2D(0.8 * this->resX, 0.01 * this->resY);
-    this->_radar->setWidgetSize(0.2 * this->resX, 0.2 * this->resY);
+    this->_radar->setParent2D(this->leftRect);
+    if (radarCenterNode == NULL)
+      this->_radar->setCenterNode(State::getPlayer()->getPlayable());
+    else
+      this->_radar->setCenterNode(this->radarCenterNode);
+
+    //this->_radar->addEntityList(&State::getObjectManager()->getEntityList((OM_LIST)(State::getPlayer()->getPlayable()->getOMListNumber()+1)), Color(.4, .4, 1.0));
+    this->_radar->addEntityList(&State::getObjectManager()->getEntityList(OM_GROUP_00), Color(1, 0, 0));
+    this->_radar->addEntityList(&State::getObjectManager()->getEntityList(OM_GROUP_01), Color(0, 0, 1));
+    this->_radar->setAbsCoor2D(0, 0.01 * this->resY);
+    this->_radar->setWidgetSize(overlayWidth, overlayWidth);
     this->_radar->setRange(300);
     this->_radar->show();
-  }
-
-
-  if (this->energyWidget != NULL)
-  {
-    this->energyWidget->setAbsCoor2D(0.0 * this->resX, 0.85 * this->resY);
-    this->energyWidget->setWidgetSize(.25 * this->resX, 0.1 * this->resY);
-  }
-
-
-  std::list<OrxGui::GLGuiWidget*>::iterator weaponWidget;
-  Vector2D pos(0.3, .9);
-  for (weaponWidget = this->weaponsWidgets.begin(); weaponWidget != this->weaponsWidgets.end(); weaponWidget++, pos.x+=.2)
-  {
-    if (pos.x > .8)
-    {
-      pos.x = 0.3;
-      pos.y -= .1;
-
-    }
-    (*weaponWidget)->setAbsCoor2D(pos.x*this->resX, pos.y*this->resY);
-    (*weaponWidget)->setWidgetSize(.02*this->resX, .1 *this->resY);
+    
+    int statWidgetsNumber = 0;
+    float expectedArmorSizeX = 0;
+    float expectedArmorSizeY = 0;
+    float newSizeY = 0; float newSizeX = 0;
+    float moduloWidth = 0;
+
+    if (this->armorWidget != NULL)
+    {
+      expectedArmorSizeX = 150;
+      expectedArmorSizeY = 50;
+      statWidgetsNumber++;
+    }
+
+    if (this->shieldWidget != NULL)
+      statWidgetsNumber++;
+    
+    if (this->energyWidget != NULL)
+      statWidgetsNumber++;
+
+    if (expectedArmorSizeY * statWidgetsNumber > overlayWidth)
+    {
+      newSizeY = overlayWidth / float(statWidgetsNumber);
+      newSizeX = expectedArmorSizeX;
+      PRINTF(0)("Statwidgets resized\n");
+    }
+    else
+    {
+      newSizeY = expectedArmorSizeY;
+      newSizeX = expectedArmorSizeX;
+      moduloWidth = int(overlayWidth) % int(expectedArmorSizeY * statWidgetsNumber);
+    }
+
+    float posY = overlayWidth + newSizeX;
+
+    if (this->armorWidget != NULL)
+    {
+      this->armorWidget->setSize2D(newSizeX, newSizeY);
+      this->armorWidget->setRelCoor2D((statWidgetsNumber - 1) * newSizeY + 3 * moduloWidth / (statWidgetsNumber + 1),posY);
+    }
+    if (this->shieldWidget != NULL)
+    {
+      this->shieldWidget->setSize2D(newSizeX, newSizeY);
+      this->shieldWidget->setRelCoor2D((statWidgetsNumber - 2) * newSizeY + 2 *moduloWidth / (statWidgetsNumber + 1),posY);
+    }
+    if (this->energyWidget != NULL)
+    {
+      this->energyWidget->setSize2D(newSizeX, newSizeY);
+      this->energyWidget->setRelCoor2D(moduloWidth / (statWidgetsNumber + 1),posY);
+    }
+
+    /*
+    if (this->armorWidget != NULL)
+      this->armorWidget->setRelCoor2D(100,0.2*this->resY + this->armorWidget->getSizeX2D());
+    if (this->shieldWidget != NULL)
+      this->shieldWidget->setRelCoor2D(60,0.2*this->resY + this->armorWidget->getSizeX2D());
+    if (this->energyWidget != NULL)
+      this->energyWidget->setRelCoor2D(20,0.2*this->resY + this->armorWidget->getSizeX2D());
+    */
+    //this->shieldWidget->setRelCoor2D(0.1*this->resX + this->armorWidget->getSizeX2D(),0);
+    //this->energyWidget->setRelCoor2D(0.1*this->resX + this->armorWidget->getSizeX2D() + this->shieldWidget->getSizeX2D(),0);
+  }
+
+  /*
+  if (this->shipValuesBox != NULL)
+  {
+    this->shipValuesBox->setAbsCoor2D(0.2 * this->resX, 0.4 * this->resY);
+    this->shipValuesBox->setWidgetSize(.4 * this->resX, 0.1 * this->resY);
+  }
+  else
+    createShipValuesBox();
+  */
+
+  std::list<OrxGui::GLGuiEnergyWidgetVertical*>::iterator weaponWidget;
+  Vector2D pos = Vector2D(overlayWidth, 0.4*this->resY);
+  float largestWidgetSizeX = 0;
+  //PRINTF(0)("Cur Pos: %f,%f\n",pos.x,pos.y);
+  // out of reasons i can't get behind, this version is segfaulting when calling getSizeX2D or getSizeY2D. the other
+  // element2D- related function works tough.. :s
+
+  for (weaponWidget = this->weaponsWidgetsPrim.begin(); weaponWidget != this->weaponsWidgetsPrim.end(); weaponWidget++)
+  {
+    float ySize = (*weaponWidget)->getSizeY2D();
+    float xSize = (*weaponWidget)->getSizeX2D();
+    if (xSize > largestWidgetSizeX)
+      largestWidgetSizeX = xSize;
+    if (pos.x < ySize)
+    {
+      pos.x = overlayWidth;
+      pos.y += largestWidgetSizeX;
+    }
+    pos.x -= ySize;
+    (*weaponWidget)->setAbsCoor2D(pos.x + this->rightRect->getAbsCoor2D().x, pos.y);
+    //(*weaponWidget)->setAbsCoor2D(0,100);
     (*weaponWidget)->show();
     //printf("update thing %s::%s\n", (*weaponWidget)->getClassCName(), (*weaponWidget)->getName());
   }
+  
+  weaponWidget = this->weaponsWidgetsSec.begin();
+  float expectedWidgetSizeY = 0;
+  if (weaponWidget != this->weaponsWidgetsSec.end())
+  {
+    expectedWidgetSizeY = (*weaponWidget)->getSizeY2D();
+  }
+  pos.y = resY - expectedWidgetSizeY * 0.6;
+  pos.x = overlayWidth + this->rightRect->getAbsCoor2D().x;
+
+  for (weaponWidget = this->weaponsWidgetsSec.begin(); weaponWidget != this->weaponsWidgetsSec.end(); weaponWidget++)
+  {
+    float ySize = (*weaponWidget)->getSizeY2D();
+    float xSize = (*weaponWidget)->getSizeX2D();
+    if (xSize > largestWidgetSizeX)
+      largestWidgetSizeX = xSize;
+    if (pos.x < ySize)
+    {
+      pos.x = overlayWidth;
+      pos.y -= largestWidgetSizeX + expectedWidgetSizeY * 0.6;
+    }
+    pos.x -= ySize;
+    //PRINTF(0)("secweaponwidget y-size: %f/n", (*weaponWidget)->getSizeY2D());
+    (*weaponWidget)->setAbsCoor2D(pos.x + this->rightRect->getAbsCoor2D().x, pos.y);
+    (*weaponWidget)->show();
+    //printf("update thing %s::%s\n", (*weaponWidget)->getClassCName(), (*weaponWidget)->getName());
+  }
+
 }
 
@@ -235,7 +534,17 @@
   //  this->inputLine->select();
   }
-
-
-}
-
-
+}
+
+/*
+void Hud::createShipValuesBox()
+{
+  this->shipValuesBox = new OrxGui::GLGuiBox(OrxGui::Vertical);
+  //this->shipValuesBox->setWidgetSize(1000,500);
+  //this->shipValuesBox->setBackgroundTexture("maps/gui_container_background.png");
+  this->shipValuesBox->setBackgroundTexture(Texture());
+  this->shipValuesBox->setBackgroundColor(Color(0,0,1,0.5));
+  this->shipValuesBox->setVisibility(true);
+}
+*/
+
+
Index: branches/playability.merge/src/util/hud.h
===================================================================
--- branches/playability.merge/src/util/hud.h	(revision 10365)
+++ branches/playability.merge/src/util/hud.h	(revision 10366)
@@ -9,4 +9,6 @@
 #include "element_2d.h"
 #include "event_listener.h"
+#include "glgui_box.h"
+#include "elements/glgui_energywidgetvertical.h"
 
 
@@ -39,5 +41,10 @@
   void setShiledWidget(OrxGui::GLGuiWidget* widget);
   void setArmorWidget(OrxGui::GLGuiWidget* widget);
-  void setWeaponManager(WeaponManager* weaponMan);
+  inline OrxGui::GLGuiWidget* getEnergyWidget() {return this->energyWidget;};
+  inline OrxGui::GLGuiWidget* getShieldWidget() {return this->shieldWidget;};
+  inline OrxGui::GLGuiWidget* getArmorWidget() {return this->armorWidget;};
+
+  void setWeaponManager(WeaponManager* weaponMan, WeaponManager* weaponManSec = NULL);
+  inline void setRadarCenterNode(PNode* node) {this->radarCenterNode = node;};
 
   void addWeaponWidget(OrxGui::GLGuiWidget* widget);
@@ -47,4 +54,20 @@
 
   void updateWeaponManager();
+  //void clearWeaponManager();
+
+  inline void setOverlayPercentage(int perc) 
+  {
+    if (perc > 100) perc = 100;
+    else if (perc < 0) perc = 0;
+
+    this->overlayPercentage = perc;
+    updateResolution();
+  };
+
+  inline void setOverlayActive(bool b)
+  {
+    overlayActive = b;
+    updateResolution();
+  };
 
   void draw() const;
@@ -54,8 +77,11 @@
   private:
     void updateResolution();
+    //void createShipValuesBox();
 
 private:
   unsigned int             resX;
   unsigned int             resY;
+
+  float                    travelZoneWidth; //the percentage of the screen, the player has got for his movements. should always be a value between 0 and 1;
 
   OrxGui::GLGuiWidget*     energyWidget;
@@ -66,8 +92,16 @@
   OrxGui::GLGuiInputLine*  inputLine;
   OrxGui::GLGuiRadar*      _radar;
+  PNode*                   radarCenterNode;
+
+  OrxGui::GLGuiWidget*     rightRect;
+  OrxGui::GLGuiWidget*     leftRect;
+  bool                     overlayActive;
+  int                      overlayPercentage; //the percentage of the screen, the player has got for his movements. should always be a value between 0 and 1;
 
   WeaponManager*           weaponManager;
+  WeaponManager*           weaponManagerSecondary;
 
-  std::list<OrxGui::GLGuiWidget*> weaponsWidgets; //!< WeaponWidgets will be displayed one after another
+  std::list<OrxGui::GLGuiEnergyWidgetVertical*> weaponsWidgetsPrim; //!< WeaponWidgets will be displayed one after another
+  std::list<OrxGui::GLGuiEnergyWidgetVertical*> weaponsWidgetsSec;
 };
 
Index: branches/playability.merge/src/util/state.h
===================================================================
--- branches/playability.merge/src/util/state.h	(revision 10365)
+++ branches/playability.merge/src/util/state.h	(revision 10366)
@@ -109,4 +109,11 @@
   static inline int getMenuID() { return State::menuID;}
 
+  ////////////////////////
+  /// Scroller-Control ///
+  ////////////////////////
+  /** sets the scroller-travelnode (center of the screen) */
+  static void setTravelNode(PNode* travelNode) {State::travelNode = travelNode;}
+  /** @returns the scroller-travelnode (center of the screen) */
+  static PNode* getTravelNode() { return State::travelNode; }
 
 
@@ -123,4 +130,5 @@
   static GameRules*             gameRules;          //!< A reference to the GameRules
   static Player*                player;             //!< A reference to the Player
+  static PNode*                 travelNode;         //!< A reference to the scroller-travelnode
 
   static SkyBox*                skyBox;            //!< The SkyBox used in the current world.
Index: branches/playability.merge/src/util/track/track.cc
===================================================================
--- branches/playability.merge/src/util/track/track.cc	(revision 10366)
+++ branches/playability.merge/src/util/track/track.cc	(revision 10366)
@@ -0,0 +1,260 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2006 orx
+
+   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, or (at your option)
+   any later version.
+
+### File Specific:
+
+   This is anohter installment of the infamous track system. It serves for
+   temporary use only and is mainly a slimmed version of the old track.
+
+   The track is used to steer the spaceship. In this case the track will have
+   to control a PNode. The spaceship will be able to fly around this node.
+   The camera will always be focused on that point.
+
+   As we do this we have exactly the verticalscroller feeling we want.
+
+   main-programmer: Benjamin Knecht
+*/
+
+#include "util/loading/load_param.h"
+#include "track/track.h"
+
+#include "p_node.h"
+
+#include "stdincl.h"
+
+#include "debug.h"
+
+ObjectListDefinition(Track);
+// CREATE_FACTORY(Track);
+
+
+/**
+ *  standard constructor
+*/
+Track::Track()
+{
+  this->init();
+}
+
+
+/**
+ * this is a constructor for use with the xml loading file
+ * @param root xml root element for this object
+ */
+Track::Track(const TiXmlElement* root)
+{
+  this->init();
+
+  if (root != NULL)
+    this->loadParams(root);
+}
+
+
+/**
+ * initializes this class
+ */
+void Track::init()
+{
+  this->curveType = CURVE_BEZIER;
+//  this->startingTime = 0;
+  this->duration = 20;
+  this->endTime = 20;
+  this->width = 10;
+  this->curve = new BezierCurve();
+  this->trackNode = new PNode(PNode::getNullParent(), PNODE_ALL);
+  this->nodeCount = 0;
+  this->localTime = 0;
+}
+
+/**
+ *  standard destructor
+*/
+Track::~Track()
+{
+
+}
+
+
+void Track::loadParams(const TiXmlElement* root)
+{
+     LOAD_PARAM_START_CYCLE(root, element);
+     {
+           LoadParam_CYCLE(element, "addPoint", this, Track, addPoint)
+             .describe("Adds a new Point to the currently selected TrackElement");
+           LoadParam_CYCLE(element, "speed", this, Track, setSpeed)
+             .describe("Sets speed of traveling");
+
+     }
+     LOAD_PARAM_END_CYCLE(element);
+}
+
+
+
+/**
+ * This function adds a point with its coordinates to the track
+ * @param x
+ * @param y
+ * @param z
+ */
+void Track::addPoint(float x, float y, float z)
+{
+     this->addPointV(Vector (x,y,z));
+}
+
+
+/**
+ * This function adds a point to the track as a vector
+ * @param newPoint
+ */
+void Track::addPointV(Vector newPoint)
+{
+   this->curve->addNode(newPoint);
+   if( this->nodeCount == 0) this->trackNode->setAbsCoor(newPoint);
+   this->nodeCount++;
+   // PRINTF(0)("Point added to curve\n");
+}
+
+/**
+ * This function sets the speed of the trackNode by altering the duration
+ * of the time the trackNode travels on the whole track. This is bad because
+ * the speed depends on the length of the curve. (by getting the curve's length
+ * this function will make a lot more sense)
+ */
+void Track::setSpeed(float speed)
+{
+     this->duration = this->duration/speed;
+     
+}
+
+/**
+ * We probably doesn't even need this
+ */
+//void Track::finalize()
+//{
+//   for (int i = 1; i<= trackElemCount ;i++)
+//     {
+//       TrackElement* tmpElem = this->firstTrackElem->findByID(i);
+//       if( tmpElem->childCount > 0)
+//         {
+//           tIterator<TrackElement>* iterator = tmpElem->children->getIterator();
+//           TrackElement* enumElem = iterator->firstElement();
+//           //TrackElement* enumElem = tmpElem->children->enumerate();
+//           while (enumElem)
+//             {
+//
+//               // c1-continuity
+//               enumElem->curve->addNode(enumElem->curve->getNode(0) +
+//                                                    ((enumElem->curve->getNode(0) -
+//                                                     tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-1))
+//                                                     ),2);
+//               enumElem->nodeCount++;
+//               // c2-continuity
+//               enumElem->curve->addNode((tmpElem->curve->getNode(tmpElem->curve->getNodeCount())-
+//                                                     tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-1)) * 4 +
+//                                                    tmpElem->curve->getNode(tmpElem->curve->getNodeCount()-2), 3);
+//               enumElem->nodeCount++;
+//               PRINTF(5)("accelerations: %d-in: count: %d, %f, %f, %f\n                  %d-out: count: %d %f, %f, %f\n",
+//                      tmpElem->ID, tmpElem->nodeCount,
+//                      tmpElem->curve->calcAcc(0.999).x, tmpElem->curve->calcAcc(0.999).y, tmpElem->curve->calcAcc(0.999).z,
+//                      enumElem->ID, enumElem->nodeCount,
+//                      enumElem->curve->calcAcc(0).x, enumElem->curve->calcAcc(0).y, enumElem->curve->calcAcc(0).z);
+//
+//               enumElem = iterator->nextElement();
+//             }
+//           delete iterator;
+//         }
+//     }
+
+
+
+  /*for (int i = 1; i <= trackElemCount;i++)
+    if (this->firstTrackElem->findByID(i)->endTime > this->maxTime)
+      this->maxTime = this->firstTrackElem->findByID(i)->endTime; // very bad implemented :/
+      */
+//}
+
+Vector Track::calcPos() const
+{
+  return this->curve->calcPos(this->localTime/this->duration);
+}
+
+Vector Track::calcDir() const
+{
+  return this->curve->calcDir(this->localTime/this->duration);
+}
+
+void Track::tick(float dt)
+{
+//   PRINTF(4)("CurrentTrackID: %d, LocalTime is: %f, timestep is: %f\n", this->currentTrackElem->ID, this->localTime, dt);
+//   if (this->localTime <= this->firstTrackElem->duration)
+//     this->jumpTo(this->localTime);
+//   if (this->localTime <= this->maxTime)
+     this->localTime += dt;
+     if(this->localTime >= this->duration)
+       this->localTime = 0;
+//   if (this->localTime > this->currentTrackElem->endTime
+//       && this->currentTrackElem->children)
+//     {
+//       if (this->currentTrackElem->jumpTime != 0.0)
+//         this->jumpTo(this->localTime + this->currentTrackElem->jumpTime);
+//       // jump to the next TrackElement and also set the history of the new Element to the old one.
+//       TrackElement* tmpHistoryElem = this->currentTrackElem;
+//       this->currentTrackElem = this->currentTrackElem->getChild(this->choosePath(this->currentTrackElem));
+//       this->currentTrackElem->history = tmpHistoryElem;
+//       if (this->currentTrackElem->getName())
+//         {
+//           this->trackText->setText(this->currentTrackElem->getName());
+//           this->textAnimation->replay();
+//         }
+//     }
+   if (this->trackNode)
+     {
+       Vector tmp = this->calcPos();
+       //Quaternion quat = Quaternion(this->calcDir(), Vector(this->curve->calcAcc(this->localTime/this->duration).x,1,this->curve->calcAcc(this->localTime/this->duration).z));
+       
+
+       Vector v(0.0, 1.0, 0.0);
+       Quaternion quat = Quaternion(this->calcDir(), v);
+       Quaternion q(-PI/2, v);
+       quat = quat * q;
+
+       // move trackNode of the track
+       this->trackNode->shiftCoor(tmp - this->trackNode->getAbsCoor());
+       // set direction and roll angle of trackNode
+       this->trackNode->setAbsDir(quat);
+     }
+}
+
+/**
+ * @returns the main TrackNode
+*/
+PNode* Track::getTrackNode()
+{
+  return this->trackNode;
+}
+
+/**
+ *  Imports a model of the Graph into the OpenGL-environment.
+ * @param dt The Iterator used in seconds for Painting the Graph.
+
+   This is for testing facility only. Do this if you want to see the Path inside the Level.
+   eventually this will all be packed into a gl-list.
+*/
+/*void Track::drawGraph(float dt) const
+{
+      glBegin(GL_LINE_STRIP);
+        for(float f = 0.0; f < 1.0; f+=dt)
+          {
+            // PRINTF(4)("drawing",this->calcPos().x, this->calcPos().y, this->calcPos().z);
+            Vector tmpVector = this->curve->calcPos(f);
+            glVertex3f(tmpVector.x, tmpVector.y, tmpVector.z);
+          }
+      glEnd();
+}*/
Index: branches/playability.merge/src/util/track/track.h
===================================================================
--- branches/playability.merge/src/util/track/track.h	(revision 10366)
+++ branches/playability.merge/src/util/track/track.h	(revision 10366)
@@ -0,0 +1,56 @@
+/*!
+ * @file track.h
+ */
+
+#ifndef _TRACK_H_
+#define _TRACK_H_
+
+#include "curve.h"
+#include "base_object.h"
+
+// Forward Definition
+class PNode;
+class TiXmlElement;
+
+class Track : public BaseObject
+{
+  ObjectListDeclaration(Track);
+
+ public:
+   Track();
+   Track(const TiXmlElement* root);
+   virtual ~Track();
+
+   virtual void loadParams(const TiXmlElement* root);
+   void addPoint(float x, float y, float z);
+   void addPointV(Vector newPoint);
+   void setSpeed(float speed);
+
+   //void finalize();
+   inline Vector calcPos() const;
+   inline Vector calcDir() const;
+   void tick(float dt);
+
+   PNode* getTrackNode();
+   
+//   void drawGraph(float dt) const;
+      
+   //float                 startingTime;         //!< The time at which this Track begins.
+   float                 duration;             //!< The time used to cross this Track (curve).
+   float                 endTime;              //!< The time at which this Track ends.
+   float                 width;                //!< Th width of the Path. This tells the Player(s), how far he(they) can go to the left/right.
+
+   int                   nodeCount;            //!< The count of points this Track has.
+   Curve*                curve;                //!< The Curve of this Track
+
+ private:
+   void init();
+
+
+ private:
+   CurveType            curveType;              //!< The CurveType the entire TrackSystem will have.
+   float                localTime;              //!< The time that has been passed since the traveling the Track.
+   PNode*               trackNode;              //!< The node that is slave to the Track. This node will be moved while update the Track, and must NOT move itself.
+};
+
+#endif /* _TRACK_H */
Index: branches/playability.merge/src/util/track/track_manager.cc
===================================================================
--- branches/playability.merge/src/util/track/track_manager.cc	(revision 10365)
+++ branches/playability.merge/src/util/track/track_manager.cc	(revision 10366)
@@ -26,4 +26,6 @@
 #include "t_animation.h"
 
+#include <string.h>
+
 
 #include "parser/tinyxml/tinyxml.h"
@@ -32,4 +34,5 @@
 #include <stdarg.h>
 
+ObjectListDefinition(TrackElement);
 
 
@@ -39,5 +42,6 @@
 TrackElement::TrackElement()
 {
-  this->setClassID(CL_TRACK_ELEMENT, "TrackElement");
+  this->registerObject(this, TrackElement::_objectList);
+
 
   this->isFresh = true;
@@ -126,6 +130,6 @@
 {
   // return if Found.
-  if (this->getName() && !strcmp(this->getName(), trackName))
-    return this;
+//   if (this->getName() && !strcmp(this->getName(), trackName))
+//     return this;
   // search all children
   if (this->childCount > 0)
@@ -217,43 +221,43 @@
 void TrackElement::debug() const
 {
-  PRINT(0)("--== TrackElement:%i ==--", this->ID);
-  if(this->getName())
-    PRINT(0)("--++Name: %s++--", this->getName());
-  if(this->isFresh)
-    PRINT(0)("  -- has not jet eddited in any way --\n");
-  PRINT(0)("\n   TimeTable: startingTime=%f; endTime=%f; duration=%f; jumpTime=%f\n", this->startingTime, this->endTime, this->duration, this->jumpTime);
-  PRINT(0)("   consists of %d Points\n", this->nodeCount);
-  if (this->childCount == 0)
-    PRINT(0)("   has no child\n");
-  else if (this->childCount == 1)
-    PRINT(0)("   has 1 child: =%d=\n", this->getChild(0)->ID);
-  else if (this->childCount > 1)
-    {
-      PRINT(0)("   has %d children: ", this->childCount);
-      //TrackElement* enumElem = this->children->enumerate();
-      tIterator<TrackElement>* iterator = this->children->getIterator();
-      TrackElement* enumElem = iterator->firstElement();
-      while (enumElem)
-        {
-          PRINT(0)("=%d= ", enumElem->ID);
-          enumElem = iterator->nextElement();
-        }
-      delete iterator;
-      PRINT(0)("\n");
-    }
-
-  if(this->isHotPoint)
-    PRINT(0)("   is a special Point:\n");
-  if(this->isSavePoint)
-    PRINT(0)("    is a SavePoint\n");
-  if(this->isFork)
-    {
-      PRINT(0)("    is A Fork with with %d children.\n", this->childCount);
-    }
-  if(this->isJoined)
-    PRINT(0)("   is Joined at the End\n");
-
-  if(!this->backLoopCheck()) /* this should not happen */
-    PRINT(2)(" THERE IS A BACKLOOP TO THIS ELEMENT\n");
+//   PRINT(0)("--== TrackElement:%i ==--", this->ID);
+//   if(this->getName())
+//     PRINT(0)("--++Name: %s++--", this->getName());
+//   if(this->isFresh)
+//     PRINT(0)("  -- has not jet eddited in any way --\n");
+//   PRINT(0)("\n   TimeTable: startingTime=%f; endTime=%f; duration=%f; jumpTime=%f\n", this->startingTime, this->endTime, this->duration, this->jumpTime);
+//   PRINT(0)("   consists of %d Points\n", this->nodeCount);
+//   if (this->childCount == 0)
+//     PRINT(0)("   has no child\n");
+//   else if (this->childCount == 1)
+//     PRINT(0)("   has 1 child: =%d=\n", this->getChild(0)->ID);
+//   else if (this->childCount > 1)
+//     {
+//       PRINT(0)("   has %d children: ", this->childCount);
+//       //TrackElement* enumElem = this->children->enumerate();
+//       tIterator<TrackElement>* iterator = this->children->getIterator();
+//       TrackElement* enumElem = iterator->firstElement();
+//       while (enumElem)
+//         {
+//           PRINT(0)("=%d= ", enumElem->ID);
+//           enumElem = iterator->nextElement();
+//         }
+//       delete iterator;
+//       PRINT(0)("\n");
+//     }
+//
+//   if(this->isHotPoint)
+//     PRINT(0)("   is a special Point:\n");
+//   if(this->isSavePoint)
+//     PRINT(0)("    is a SavePoint\n");
+//   if(this->isFork)
+//     {
+//       PRINT(0)("    is A Fork with with %d children.\n", this->childCount);
+//     }
+//   if(this->isJoined)
+//     PRINT(0)("   is Joined at the End\n");
+//
+//   if(!this->backLoopCheck()) /* this should not happen */
+//     PRINT(2)(" THERE IS A BACKLOOP TO THIS ELEMENT\n");
 }
 
@@ -358,7 +362,4 @@
 TrackManager::TrackManager()
 {
-  this->setClassID(CL_TRACK_MANAGER, "TrackManager");
-  this->setName("TrackManager");
-
   TrackManager::singletonRef = this; // do this because otherwise the TrackNode cannot get The instance of the TrackManager
 
@@ -395,29 +396,29 @@
 void TrackManager::loadParams(const TiXmlElement* root)
 {
-  double x, y, z, d;
-
-  LOAD_PARAM_START_CYCLE(root, element);
-  {
-
-    LoadParam_CYCLE(element, "WorkOn", this, TrackManager, workOnS)
-        .describe("Selects a TrackElement (by name) to work on");
-
-    LoadParam_CYCLE(element, "Point", this, TrackManager, addPoint)
-        .describe("Adds a new Point to the currently selected TrackElement");
-
-    LoadParam_CYCLE(element, "Duration", this, TrackManager, setDuration)
-        .describe("Sets the Duration of the currently selected TrackElement");
-
-    LoadParam_CYCLE(element, "HotPoint", this, TrackManager, addHotPoint)
-        .describe("Sets a new Point that acts as a hot point. meaning, the curve will flow through this Point");
-
-    LoadParam_CYCLE(element, "SavePoint", this, TrackManager, setSavePointS)
-        .describe("Sets the current selected Point to a Savepoint, meaning that the curve will be ended and a new one starts, and that one starts again from this point on");
-
-    LoadParam_CYCLE(element, "Fork", this, TrackManager, forkS)
-        .describe("Forks the Path into multiple forked Path names seperated by ','");
-
-    LoadParam_CYCLE(element, "Join", this, TrackManager, joinS)
-        .describe("Joins multiple joining Path names seperated by ','");
+//   double x, y, z, d;
+//
+//   LOAD_PARAM_START_CYCLE(root, element);
+//   {
+//
+//     LoadParam_CYCLE(element, "WorkOn", this, TrackManager, workOnS)
+//         .describe("Selects a TrackElement (by name) to work on");
+//
+//     LoadParam_CYCLE(element, "Point", this, TrackManager, addPoint)
+//         .describe("Adds a new Point to the currently selected TrackElement");
+//
+//     LoadParam_CYCLE(element, "Duration", this, TrackManager, setDuration)
+//         .describe("Sets the Duration of the currently selected TrackElement");
+//
+//     LoadParam_CYCLE(element, "HotPoint", this, TrackManager, addHotPoint)
+//         .describe("Sets a new Point that acts as a hot point. meaning, the curve will flow through this Point");
+//
+//     LoadParam_CYCLE(element, "SavePoint", this, TrackManager, setSavePointS)
+//         .describe("Sets the current selected Point to a Savepoint, meaning that the curve will be ended and a new one starts, and that one starts again from this point on");
+//
+//     LoadParam_CYCLE(element, "Fork", this, TrackManager, forkS)
+//         .describe("Forks the Path into multiple forked Path names seperated by ','");
+//
+//     LoadParam_CYCLE(element, "Join", this, TrackManager, joinS)
+//         .describe("Joins multiple joining Path names seperated by ','");
 
       /*
@@ -445,6 +446,7 @@
         }
       */
-  }
-  LOAD_PARAM_END_CYCLE(element);
+
+//   }
+//   LOAD_PARAM_END_CYCLE(element);
 }
 
@@ -477,38 +479,38 @@
 void TrackManager::initChildren(unsigned int childCount, TrackElement* trackElem)
 {
-  if (!trackElem)
-    trackElem = this->currentTrackElem;
-
-  trackElem->childCount = childCount;
-  trackElem->mainJoin = true;  // this tells join, that this one is the Main Join, if it tries to join multiple Tracks
-  trackElem->children =  new tList<TrackElement>();
-  for (int i = 0; i < childCount; i++)
-    {
-      // create a new Element
-      TrackElement* newElem = new TrackElement();
-      // setting up the new ID
-      newElem->ID = ++trackElemCount;
-      // setting up the Time
-      newElem->startingTime = trackElem->endTime + trackElem->jumpTime;
-      // adds the conection Point
-      this->addPointV(trackElem->curve->getNode(trackElem->curve->getNodeCount()),
-                     newElem);
-      // add the new child to the childList.
-      trackElem->children->add(newElem);
-    }
-
-  // setting the Name of the new TrackElement to the name of the last one + _childI
-
-  if (trackElem->getName())
-    {
-      for (int i = 0; i < trackElem->childCount; i++)
-      {
-        char* childName = new char[strlen(trackElem->getName())+10];
-        sprintf(childName, "%s_child%d", trackElem->getName(), i);
-        trackElem->getChild(i)->setName(childName);
-      }
-    }
-  // select the first Child to work on.
-  this->currentTrackElem = trackElem->getChild(0);
+//   if (!trackElem)
+//     trackElem = this->currentTrackElem;
+//
+//   trackElem->childCount = childCount;
+//   trackElem->mainJoin = true;  // this tells join, that this one is the Main Join, if it tries to join multiple Tracks
+//   trackElem->children =  new tList<TrackElement>();
+//   for (int i = 0; i < childCount; i++)
+//     {
+//       // create a new Element
+//       TrackElement* newElem = new TrackElement();
+//       // setting up the new ID
+//       newElem->ID = ++trackElemCount;
+//       // setting up the Time
+//       newElem->startingTime = trackElem->endTime + trackElem->jumpTime;
+//       // adds the conection Point
+//       this->addPointV(trackElem->curve->getNode(trackElem->curve->getNodeCount()),
+//                      newElem);
+//       // add the new child to the childList.
+//       trackElem->children->add(newElem);
+//     }
+//
+//   // setting the Name of the new TrackElement to the name of the last one + _childI
+//
+//   if (trackElem->getName())
+//     {
+//       for (int i = 0; i < trackElem->childCount; i++)
+//       {
+//         char* childName = new char[strlen(trackElem->getName())+10];
+//         sprintf(childName, "%s_child%d", trackElem->getName(), i);
+//         trackElem->getChild(i)->setName(childName);
+//       }
+//     }
+//   // select the first Child to work on.
+//   this->currentTrackElem = trackElem->getChild(0);
 }
 
@@ -659,7 +661,7 @@
 void TrackManager::setSavePointS(const std::string& nextElementName)
 {
-  this->setSavePoint(NULL);
-  if (strcmp(nextElementName, ""))
-    this->firstTrackElem->findByID(this->trackElemCount)->setName(nextElementName);
+//   this->setSavePoint(NULL);
+//   if (strcmp(nextElementName, ""))
+//     this->firstTrackElem->findByID(this->trackElemCount)->setName(nextElementName);
 }
 
@@ -736,14 +738,14 @@
 void TrackManager::forkS(const std::string& forkString)
 {
-  SubString strings(forkString, ',');
-
-  int* trackIDs = new int[strings.getCount()];
-  this->forkV(strings.getCount(), trackIDs, NULL);
-
-  for(int i = 0; i < strings.getCount(); i++)
-    {
-      this->firstTrackElem->findByID(trackIDs[i])->setName(strings.getString(i));
-    }
-  delete []trackIDs;
+//   SubString strings(forkString, ',');
+//
+//   int* trackIDs = new int[strings.getCount()];
+//   this->forkV(strings.getCount(), trackIDs, NULL);
+//
+//   for(int i = 0; i < strings.getCount(); i++)
+//     {
+//       this->firstTrackElem->findByID(trackIDs[i])->setName(strings.getString(i));
+//     }
+//   delete []trackIDs;
 }
 
@@ -877,22 +879,22 @@
 void TrackManager::joinS(const std::string& joinString)
 {
-  SubString strings(joinString, ',');
-
-  int* trackIDs = new int[strings.getCount()];
-  this->joinV(strings.getCount(), trackIDs);
-
-  for(unsigned int i = 0; i < strings.getCount(); i++)
-    {
-      TrackElement* tmpElem = this->firstTrackElem->findByName(strings.getString(i).c_str());
-      if (tmpElem != NULL)
-        trackIDs[i] = tmpElem->ID;
-      else
-      {
-        PRINTF(1)("Trying to join a Track, of which the name does not exist: %s\n", strings.getString(i).c_str());
-        trackIDs[i] = -1;
-      }
-    }
-  this->joinV(strings.getCount(), trackIDs);
-  delete []trackIDs;
+//   SubString strings(joinString, ',');
+//
+//   int* trackIDs = new int[strings.getCount()];
+//   this->joinV(strings.getCount(), trackIDs);
+//
+//   for(unsigned int i = 0; i < strings.getCount(); i++)
+//     {
+//       TrackElement* tmpElem = this->firstTrackElem->findByName(strings.getString(i).c_str());
+//       if (tmpElem != NULL)
+//         trackIDs[i] = tmpElem->ID;
+//       else
+//       {
+//         PRINTF(1)("Trying to join a Track, of which the name does not exist: %s\n", strings.getString(i).c_str());
+//         trackIDs[i] = -1;
+//       }
+//     }
+//   this->joinV(strings.getCount(), trackIDs);
+//   delete []trackIDs;
 }
 
@@ -1073,36 +1075,36 @@
 void TrackManager::tick(float dt)
 {
-  PRINTF(4)("CurrentTrackID: %d, LocalTime is: %f, timestep is: %f\n", this->currentTrackElem->ID, this->localTime, dt);
-  if (this->localTime <= this->firstTrackElem->duration)
-    this->jumpTo(this->localTime);
-  if (this->localTime <= this->maxTime)
-    this->localTime += dt;
-  if (this->localTime > this->currentTrackElem->endTime
-      && this->currentTrackElem->children)
-    {
-      if (this->currentTrackElem->jumpTime != 0.0)
-        this->jumpTo(this->localTime + this->currentTrackElem->jumpTime);
-      // jump to the next TrackElement and also set the history of the new Element to the old one.
-      TrackElement* tmpHistoryElem = this->currentTrackElem;
-      this->currentTrackElem = this->currentTrackElem->getChild(this->choosePath(this->currentTrackElem));
-      this->currentTrackElem->history = tmpHistoryElem;
-      if (this->currentTrackElem->getName())
-        {
-          this->trackText->setText(this->currentTrackElem->getName());
-          this->textAnimation->replay();
-        }
-    }
-  if (this->bindSlave)
-    {
-      Vector tmp = this->calcPos();
-      Quaternion quat = Quaternion(this->calcDir(), Vector(this->currentTrackElem->curve->calcAcc((localTime-this->currentTrackElem->startingTime)/this->currentTrackElem->duration).x,1,this->currentTrackElem->curve->calcAcc((localTime-this->currentTrackElem->startingTime)/this->currentTrackElem->duration).z));
-
-      Vector v(0.0, 1.0, 0.0);
-      Quaternion q(-PI/2, v);
-      quat = quat * q;
-
-      this->bindSlave->setAbsCoor(tmp);
-      this->bindSlave->setAbsDir(quat);
-    }
+//   PRINTF(4)("CurrentTrackID: %d, LocalTime is: %f, timestep is: %f\n", this->currentTrackElem->ID, this->localTime, dt);
+//   if (this->localTime <= this->firstTrackElem->duration)
+//     this->jumpTo(this->localTime);
+//   if (this->localTime <= this->maxTime)
+//     this->localTime += dt;
+//   if (this->localTime > this->currentTrackElem->endTime
+//       && this->currentTrackElem->children)
+//     {
+//       if (this->currentTrackElem->jumpTime != 0.0)
+//         this->jumpTo(this->localTime + this->currentTrackElem->jumpTime);
+//       // jump to the next TrackElement and also set the history of the new Element to the old one.
+//       TrackElement* tmpHistoryElem = this->currentTrackElem;
+//       this->currentTrackElem = this->currentTrackElem->getChild(this->choosePath(this->currentTrackElem));
+//       this->currentTrackElem->history = tmpHistoryElem;
+//       if (this->currentTrackElem->getName())
+//         {
+//           this->trackText->setText(this->currentTrackElem->getName());
+//           this->textAnimation->replay();
+//         }
+//     }
+//   if (this->bindSlave)
+//     {
+//       Vector tmp = this->calcPos();
+//       Quaternion quat = Quaternion(this->calcDir(), Vector(this->currentTrackElem->curve->calcAcc((localTime-this->currentTrackElem->startingTime)/this->currentTrackElem->duration).x,1,this->currentTrackElem->curve->calcAcc((localTime-this->currentTrackElem->startingTime)/this->currentTrackElem->duration).z));
+//
+//       Vector v(0.0, 1.0, 0.0);
+//       Quaternion q(-PI/2, v);
+//       quat = quat * q;
+//
+//       this->bindSlave->setAbsCoor(tmp);
+//       this->bindSlave->setAbsDir(quat);
+//     }
 }
 
@@ -1116,14 +1118,14 @@
 void TrackManager::jumpTo(float time)
 {
-  if (time == 0)
-    {
-      this->currentTrackElem = this->firstTrackElem;
-      if (this->currentTrackElem->getName())
-        {
-          this->trackText->setText(this->currentTrackElem->getName());
-          this->textAnimation->play();
-        }
-    }
-  this->localTime = time;
+//   if (time == 0)
+//     {
+//       this->currentTrackElem = this->firstTrackElem;
+//       if (this->currentTrackElem->getName())
+//         {
+//           this->trackText->setText(this->currentTrackElem->getName());
+//           this->textAnimation->play();
+//         }
+//     }
+//   this->localTime = time;
 }
 
Index: branches/playability.merge/src/util/track/track_manager.h
===================================================================
--- branches/playability.merge/src/util/track/track_manager.h	(revision 10365)
+++ branches/playability.merge/src/util/track/track_manager.h	(revision 10366)
@@ -41,4 +41,6 @@
 class TrackElement : public BaseObject
 {
+  ObjectListDeclaration(TrackElement);
+
  public:
   TrackElement();
@@ -131,5 +133,5 @@
     \li TrackElement: A Part of A whole Track
 */
-class TrackManager : public BaseObject
+class TrackManager
 {
  public:
Index: branches/playability.merge/src/util/track/track_node.cc
===================================================================
--- branches/playability.merge/src/util/track/track_node.cc	(revision 10365)
+++ branches/playability.merge/src/util/track/track_node.cc	(revision 10366)
@@ -17,10 +17,11 @@
 
 
-#include "track_node.h"
+#include "track/track_node.h"
 
-#include "track_manager.h"
+#include "track/track_manager.h"
 
 
-ObjectListDefinition(TracNode);
+ObjectListDefinition(TrackNode);
+
 /**
  *  standard constructor
@@ -28,6 +29,5 @@
 TrackNode::TrackNode ()
 {
-  this->registerObject(this, TracNode::_objectList);
-  this->setName("TrackNode");
+  this->registerObject(this, TrackNode::_objectList);
 
   PNode::getNullParent()->addChild(this);
Index: branches/playability.merge/src/util/track/track_node.h
===================================================================
--- branches/playability.merge/src/util/track/track_node.h	(revision 10365)
+++ branches/playability.merge/src/util/track/track_node.h	(revision 10366)
@@ -14,4 +14,5 @@
 #include "p_node.h"
 
+
 /* FORWARD DECLARATION */
 class TrackManager;
@@ -20,5 +21,5 @@
 class TrackNode : public PNode
 {
-  ObjectListDeclaratrion(TracNode);
+  ObjectListDeclaration(TrackNode);
  public:
   TrackNode ();
