Index: orxonox/trunk/src/lib/coord/p_node.cc
===================================================================
--- orxonox/trunk/src/lib/coord/p_node.cc	(revision 4986)
+++ orxonox/trunk/src/lib/coord/p_node.cc	(revision 4987)
@@ -111,4 +111,6 @@
   this->bAbsDirChanged = false;
   this->parent = parent;
+
+  this->toPosition = NULL;
 }
 
@@ -179,4 +181,15 @@
 }
 
+void PNode::setRelCoorSoft(const Vector& relCoordSoft)
+{
+  if (likely(this->toPosition == NULL))
+    this->toPosition = new Vector();
+
+  *this->toPosition = relCoordSoft;
+
+  this->toPosition->debug();
+  printf("=-==============\n");
+}
+
 /**
  * @param absCoord set absolute coordinate
@@ -196,5 +209,5 @@
  * @param y y-coordinate.
  * @param z z-coordinate.
- * \see void PNode::setAbsCoor (const Vector& absCoord)
+ * @see void PNode::setAbsCoor (const Vector& absCoord)
  */
 void PNode::setAbsCoor(float x, float y, float z)
@@ -221,4 +234,7 @@
 
    yea right... shorter...
+ *
+ * @todo this is ambiguous, from the outside one does not know it absCoor has been changed
+ * this might lead to strange artefacts !!
 
 */
@@ -404,4 +420,26 @@
     parentNode->addChild(this);
 }
+
+void PNode::softReparent(PNode* parentNode)
+{
+  if (likely(this->toPosition == NULL))
+    this->toPosition = new Vector();
+
+  *this->toPosition = parentNode->getAbsCoor() + this->getRelCoor();
+
+  Vector tmp = this->getAbsCoor();
+
+  parentNode->addChild(this);
+
+  this->setRelCoor(tmp - parentNode->getAbsCoor());
+}
+
+void PNode::softReparent(const char* parentName)
+{
+  PNode* parentNode = dynamic_cast<PNode*>(ClassList::getObject(parentName, CL_PARENT_NODE));
+  if (parentNode != NULL)
+    this->softReparent(parentNode);
+}
+
 
 /**
@@ -456,30 +494,41 @@
 void PNode::update (float dt)
 {
+
+
   if( likely(this->parent != NULL))
     {
+      // movement for nodes with smoothMove enabled
+      if (unlikely(this->toPosition != NULL))
+      {
+        Vector moveVect = (*this->toPosition - this->getRelCoor()) *dt;
+
+        if (likely(moveVect.len() >= .001))
+        {
+          this->shiftCoor(moveVect);
+          moveVect.debug();
+        }
+        else
+        {
+          delete this->toPosition;
+          this->toPosition = NULL;
+          PRINTF(0)("SmoothMove of %s finished\n", this->getName());
+        }
+      }
+
       this->lastAbsCoordinate = this->absCoordinate;
 
-      PRINTF(4)("PNode::update - %s - (%f, %f, %f)\n", this->getName(), this->absCoordinate.x, this->absCoordinate.y, this->absCoordinate.z);
-
+      PRINTF(5)("PNode::update - %s - (%f, %f, %f)\n", this->getName(), this->absCoordinate.x, this->absCoordinate.y, this->absCoordinate.z);
 
       if( likely(this->parentMode & PNODE_MOVEMENT))
         {
-          if( unlikely(this->bAbsCoorChanged) /*&& this->timeStamp != DataTank::timeStamp*/)
+          if( unlikely(this->bAbsCoorChanged))
             {
               /* if you have set the absolute coordinates this overrides all other changes */
               this->relCoordinate = this->absCoordinate - parent->getAbsCoor ();
             }
-          if( likely(this->bRelCoorChanged) /*&& this->timeStamp != DataTank::timeStamp*/)
-
+          if( likely(this->bRelCoorChanged))
             {
-              /*this is bad style... must be deleted later - just for testing*/
-
-              /*
-                if( unlikely(this->parent == NULL))
-                {
-                *this->absCoordinate = *this->relCoordinate;
-                }
-                else */
-              this->absCoordinate = parent->getAbsCoor() + this->relCoordinate;       /* update the current absCoordinate */
+              /* update the current absCoordinate */
+              this->absCoordinate = parent->getAbsCoor() + this->relCoordinate;
             }
         }
@@ -487,10 +536,10 @@
       if( this->parentMode & PNODE_LOCAL_ROTATE)
         {
-          if( unlikely(this->bAbsDirChanged) /*&& this->timeStamp != DataTank::timeStamp*/)
+          if( unlikely(this->bAbsDirChanged))
             {
               /* if you have set the absolute coordinates this overrides all other changes */
               this->relDirection = this->absDirection - parent->getAbsDir();
             }
-          else if( likely(this->bRelDirChanged) /*&& this->timeStamp != DataTank::timeStamp*/)
+          else if( likely(this->bRelDirChanged))
             {
               /* update the current absDirection - remember * means rotation around sth.*/
@@ -501,16 +550,13 @@
       if( this->parentMode & PNODE_ROTATE_MOVEMENT)
         {
-          if( unlikely(this->bAbsCoorChanged) /*&& this->timeStamp != DataTank::timeStamp*/)
+          if( unlikely(this->bAbsCoorChanged))
             {
               /* if you have set the absolute coordinates this overrides all other changes */
               this->relCoordinate = this->absCoordinate - parent->getAbsCoor ();
             }
-          else if( likely(this->bRelCoorChanged) /*&& this->timeStamp != DataTank::timeStamp*/)
+          else if( likely(this->bRelCoorChanged))
             {
-              /*this is bad style... must be deleted later - just for testing*/
-              /*if( this->parent == NULL)
-               *this->absCoordinate = *this->relCoordinate;
-               else*/
-              this->absCoordinate = parent->getAbsCoor() + parent->getAbsDir().apply(this->relCoordinate);            /* update the current absCoordinate */
+              /* update the current absCoordinate */
+              this->absCoordinate = parent->getAbsCoor() + parent->getAbsDir().apply(this->relCoordinate);
             }
         }
@@ -518,5 +564,4 @@
 
       tIterator<PNode>* iterator = this->children->getIterator();
-      //PNode* pn = this->children->enumerate();
       PNode* pn = iterator->nextElement();
       while( pn != NULL)
Index: orxonox/trunk/src/lib/coord/p_node.h
===================================================================
--- orxonox/trunk/src/lib/coord/p_node.h	(revision 4986)
+++ orxonox/trunk/src/lib/coord/p_node.h	(revision 4987)
@@ -62,4 +62,5 @@
   void setRelCoor (const Vector& relCoord);
   void setRelCoor (float x, float y, float z);
+  void setRelCoorSoft(const Vector& softRelCoord);
   /** @returns the relative position */
   inline const Vector& getRelCoor () const { return this->relCoordinate; };
@@ -96,7 +97,10 @@
 
   void setParent (PNode* parent);
-  void setParent (const char* name);
+  void setParent (const char* parentName);
   /** @returns the parent of this PNode */
   PNode* getParent () const { return this->parent; };
+
+  void softReparent(PNode* parentNode);
+  void softReparent(const char* parentName);
 
   void setParentMode (PARENT_MODE parentMode);
@@ -112,7 +116,7 @@
  private:
   void init(PNode* parent);
-  /** \brief tells the child that the parent's Coordinate has changed */
+  /** tells the child that the parent's Coordinate has changed */
   inline void parentCoorChanged () { this->bRelCoorChanged = true; }
-  /** \brief tells the child that the parent's Direction has changed */
+  /** tells the child that the parent's Direction has changed */
   inline void parentDirChanged () { this->bRelDirChanged = true; }
   /** @returns the last calculated coordinate */
@@ -134,6 +138,9 @@
   Vector          lastAbsCoordinate;  //!< this is used for speedcalculation, it stores the last coordinate
 
+
+  Vector*         toPosition;         //!< a position to wich to iterate. (This is used in conjunction with softReparent.)
+
   PNode*          parent;             //!< a pointer to the parent node
-  tList<PNode>*   children;           //!< list of the children
+  tList<PNode>*   children;           //!< list of the children of this PNode
 
   unsigned int    parentMode;         //!< the mode of the binding
Index: orxonox/trunk/src/lib/math/vector.cc
===================================================================
--- orxonox/trunk/src/lib/math/vector.cc	(revision 4986)
+++ orxonox/trunk/src/lib/math/vector.cc	(revision 4987)
@@ -56,7 +56,6 @@
 void Vector::debug() const
 {
-  PRINT(0)("Vector Debug information\n");
   PRINT(0)("x: %f; y: %f; z: %f", x, y, z);
-  PRINT(3)(" lenght: %f", len());
+  PRINT(0)(" lenght: %f", len());
   PRINT(0)("\n");
 }
Index: orxonox/trunk/src/world_entities/camera.cc
===================================================================
--- orxonox/trunk/src/world_entities/camera.cc	(revision 4986)
+++ orxonox/trunk/src/world_entities/camera.cc	(revision 4987)
@@ -36,4 +36,5 @@
 {
   this->setClassID(CL_CAMERA, "Camera");
+  this->setName("camera");
   this->target = new CameraTarget();
 
@@ -50,4 +51,6 @@
 
   this->setViewMode(VIEW_NORMAL);
+
+  this->setParentMode(PNODE_MOVEMENT);
 }
 
@@ -116,11 +119,14 @@
     case VIEW_NORMAL:
       this->toFovy = 60.0;
-      this->toRelCoor = Vector(-10, 5, 0);
+      this->setRelCoorSoft(Vector(-10, 5, 0));
+      this->target->setRelCoorSoft(Vector(0,0,0));
       break;
     case VIEW_BEHIND:
-      this->toFovy = 120.0;
-      this->toRelCoor = Vector(3.5, 0, 0);
-      this->target->setRelCoor(4,0,0);
-/*      this->setParent("main-Turret");
+//      this->toFovy = 120.0;
+      this->setRelCoorSoft(Vector(3.5, 0, 0));
+      this->target->setRelCoorSoft(Vector(10,0,0));
+
+      /*this->target->softReparent("main-Turret");
+      this->setParent("main-Turret");
       this->setParentMode(PNODE_ALL);
       this->target->setParent("Crosshair");*/
@@ -128,17 +134,21 @@
     case VIEW_FRONT:
       this->toFovy = 95.0;
-      this->toRelCoor = Vector(12, 5, 0);
+      this->setRelCoorSoft(Vector(10, 2, 0));
+      this->target->setRelCoorSoft(Vector(0,0,0));
       break;
     case VIEW_LEFT:
       this->toFovy = 90;
-      this->toRelCoor = Vector(0, 2, -10);
+      this->setRelCoorSoft(Vector(0, 1, -10));
+      this->target->setRelCoorSoft(Vector(0,0,0));
       break;
     case VIEW_RIGHT:
       this->toFovy = 90;
-      this->toRelCoor = Vector(0, 2, 10);
+      this->setRelCoorSoft(Vector(0, 1, 10));
+      this->target->setRelCoorSoft(Vector(0,0,0));
       break;
     case VIEW_TOP:
       this->toFovy= 120;
-      this->toRelCoor = Vector(0, 4, 0);
+      this->setRelCoorSoft(Vector(0, 10, 0));
+      this->target->setRelCoorSoft(Vector(0,0,0));
     }
 }
@@ -154,10 +164,4 @@
   if (tmpFovy > .001)
     this->fovy += (this->toFovy - this->fovy) * dt;
-  Vector tmpPos = (this->toRelCoor - this->getRelCoor()) * dt;
-  if (tmpPos.len() >= .001)
-    {
-      tmpPos = tmpPos + this->getRelCoor();
-      this->setRelCoor(tmpPos);
-    }
 }
 
Index: orxonox/trunk/src/world_entities/camera.h
===================================================================
--- orxonox/trunk/src/world_entities/camera.h	(revision 4986)
+++ orxonox/trunk/src/world_entities/camera.h	(revision 4987)
@@ -57,5 +57,4 @@
   float             farClip;         //!< The far clipping plane.
 
-  Vector            toRelCoor;       //!< The relativeCoordinate to move the camera to.
   float             toFovy;          //!< The fovy-mode to iterate to.
 };
