Index: trunk/src/lib/coord/p_node.cc
===================================================================
--- trunk/src/lib/coord/p_node.cc	(revision 5378)
+++ trunk/src/lib/coord/p_node.cc	(revision 5382)
@@ -235,4 +235,5 @@
 }
 
+
 /**
  * @param absCoord set absolute coordinate
@@ -266,4 +267,5 @@
 }
 
+
 /**
  * @param x x-coordinate.
@@ -287,5 +289,5 @@
    someNode->shiftCoor(objectMovement);
 
-   elsewhere you would have to:
+   otherwise you would have to:
    PNode* someNode = ...;
    Vector objectMovement = calculateShift();
@@ -293,8 +295,6 @@
    Vector newCoor = currentCoor + objectMovement;
    someNode->setRelCoor(newCoor);
-
-   yea right... shorter...
  *
-*/
+ */
 void PNode::shiftCoor (const Vector& shift)
 {
@@ -405,9 +405,7 @@
  *  adds a child and makes this node to a parent
  * @param child child reference
- * @param parentMode on which changes the child should also change ist state
- *
  * use this to add a child to this node.
 */
-void PNode::addChild (PNode* child, int parentMode)
+void PNode::addChild (PNode* child)
 {
   if( likely(child->parent != NULL))
@@ -416,5 +414,4 @@
       child->parent->children->remove(child);
     }
-  child->parentMode = parentMode;
   child->parent = this;
   this->children->add(child);
@@ -461,5 +458,5 @@
   while( pn != NULL)
     {
-      NullParent::getInstance()->addChild(pn, pn->getParentMode());
+      NullParent::getInstance()->addChild(pn);
       pn = iterator->nextElement();
     }
@@ -494,9 +491,11 @@
  * @param bias the speed to iterate to this new Positions
  */
-void PNode::softReparent(PNode* parentNode, float bias)
-{
+void PNode::setParentSoft(PNode* parentNode, float bias)
+{
+  // return if the new parent and the old one match
   if (this->parent == parentNode)
     return;
 
+  // store the Valures to iterate to.
   if (likely(this->toCoordinate == NULL))
   {
@@ -517,10 +516,10 @@
   parentNode->addChild(this);
 
- if (this->parentMode & PNODE_ROTATE_MOVEMENT)
-   this->setRelCoor(this->parent->getAbsDir().inverse().apply(tmpV - this->parent->getAbsCoor()));
+ if (this->parentMode & PNODE_ROTATE_MOVEMENT && this->parent != NULL)
+   this->relCoordinate = this->parent->getAbsDir().inverse().apply(tmpV - this->parent->getAbsCoor());
  else
-   this->setRelCoor(tmpV - parentNode->getAbsCoor());
-
-  this->setRelDir(tmpQ / parentNode->getAbsDir());
+   this->relCoordinate = tmpV - parentNode->getAbsCoor();
+
+ this->relDirection = tmpQ / parentNode->getAbsDir();
 }
 
@@ -530,9 +529,9 @@
  * @param bias the speed to iterate to this new Positions
  */
-void PNode::softReparent(const char* parentName, float bias)
+void PNode::setParentSoft(const char* parentName, float bias)
 {
   PNode* parentNode = dynamic_cast<PNode*>(ClassList::getObject(parentName, CL_PARENT_NODE));
   if (parentNode != NULL)
-    this->softReparent(parentNode, bias);
+    this->setParentSoft(parentNode, bias);
 }
 
@@ -561,6 +560,5 @@
       if (unlikely(this->toCoordinate != NULL))
       {
-        Vector moveVect = (*this->toCoordinate - this->getRelCoor()) *fabsf(dt)*bias;
-
+        Vector moveVect = (*this->toCoordinate - this->relCoordinate) *fabsf(dt)*bias;
         if (likely(moveVect.len() >= PNODE_ITERATION_DELTA))
         {
@@ -701,5 +699,5 @@
    displays the PNode at its position with its rotation as a cube.
 */
-void PNode::debugDraw(unsigned int depth, float size, Vector color) const
+void PNode::debugDraw(unsigned int depth, float size, const Vector& color) const
 {
   glMatrixMode(GL_MODELVIEW);
Index: trunk/src/lib/coord/p_node.h
===================================================================
--- trunk/src/lib/coord/p_node.h	(revision 5378)
+++ trunk/src/lib/coord/p_node.h	(revision 5382)
@@ -96,5 +96,5 @@
 
 
-  void addChild (PNode* child, int parentingMode = PNODE_PARENT_MODE_DEFAULT);
+  void addChild (PNode* child);
   void addChild (const char* childName);
   void removeChild (PNode* child);
@@ -106,6 +106,6 @@
   PNode* getParent () const { return this->parent; };
 
-  void softReparent(PNode* parentNode, float bias = 1.0);
-  void softReparent(const char* parentName, float bias = 1.0);
+  void setParentSoft(PNode* parentNode, float bias = 1.0);
+  void setParentSoft(const char* parentName, float bias = 1.0);
 
   /** @param parentMode sets the parentingMode of this Node */
@@ -118,5 +118,5 @@
 
   void debug (unsigned int depth = 1, unsigned int level = 0) const;
-  void debugDraw(unsigned int depth = 1, float size = 1.0, Vector color = Vector(1,1,1)) const;
+  void debugDraw(unsigned int depth = 1, float size = 1.0, const Vector& color = Vector(1,1,1)) const;
 
 
@@ -150,6 +150,6 @@
   Vector          velocity;           //!< Saves the velocity.
 
-  Vector*         toCoordinate;       //!< a position to which to iterate. (This is used in conjunction with softReparent.and set*CoorSoft)
-  Quaternion*     toDirection;        //!< a direction to which to iterate. (This is used in conjunction with softReparent and set*DirSoft)
+  Vector*         toCoordinate;       //!< a position to which to iterate. (This is used in conjunction with setParentSoft.and set*CoorSoft)
+  Quaternion*     toDirection;        //!< a direction to which to iterate. (This is used in conjunction with setParentSoft and set*DirSoft)
   float           bias;               //!< how fast to iterate to the given position (default is 1)
 
Index: trunk/src/lib/graphics/render2D/element_2d.cc
===================================================================
--- trunk/src/lib/graphics/render2D/element_2d.cc	(revision 5378)
+++ trunk/src/lib/graphics/render2D/element_2d.cc	(revision 5382)
@@ -555,5 +555,5 @@
  * @param bias the speed to iterate to this new Positions
  */
-void Element2D::softReparent2D(Element2D* parentNode, float bias)
+void Element2D::setParentSoft2D(Element2D* parentNode, float bias)
 {
   if (this->parent == parentNode)
@@ -578,10 +578,12 @@
   parentNode->addChild2D(this);
 
-  if (this->parentMode & PNODE_ROTATE_MOVEMENT)
+  if (this->parentMode & PNODE_ROTATE_MOVEMENT) //! @todo implement this.
     ;//this->setRelCoor(this->parent->getAbsDir().inverse().apply(tmpV - this->parent->getAbsCoor()));
   else
-    this->setRelCoor2D(tmpV - parentNode->getAbsCoor2D());
-
-  this->setRelDir2D(tmpQ - parentNode->getAbsDir2D());
+    this->relCoordinate = (tmpV - parentNode->getAbsCoor2D());
+  this->bRelCoorChanged = true;
+
+  this->relDirection = (tmpQ - parentNode->getAbsDir2D());
+  this->bRelDirChanged = true;
 }
 
@@ -591,9 +593,9 @@
  * @param bias the speed to iterate to this new Positions
  */
-void Element2D::softReparent2D(const char* parentName, float bias)
+void Element2D::setParentSoft2D(const char* parentName, float bias)
 {
   Element2D* parentNode = dynamic_cast<Element2D*>(ClassList::getObject(parentName, CL_ELEMENT_2D));
   if (parentNode != NULL)
-    this->softReparent2D(parentNode, bias);
+    this->setParentSoft2D(parentNode, bias);
 }
 
@@ -852,5 +854,4 @@
 
 
-
 ///////////////////
 // NullElement2D //
Index: trunk/src/lib/graphics/render2D/element_2d.h
===================================================================
--- trunk/src/lib/graphics/render2D/element_2d.h	(revision 5378)
+++ trunk/src/lib/graphics/render2D/element_2d.h	(revision 5382)
@@ -155,6 +155,6 @@
     Element2D* getParent () const { return this->parent; };
 
-    void softReparent2D(Element2D* parentNode, float bias = 1.0);
-    void softReparent2D(const char* parentName, float bias = 1.0);
+    void setParentSoft2D(Element2D* parentNode, float bias = 1.0);
+    void setParentSoft2D(const char* parentName, float bias = 1.0);
 
     /** @param parentMode sets the parentingMode of this Node */
@@ -207,10 +207,9 @@
     Vector                  lastAbsCoordinate;  //!< this is used for speedcalculation, it stores the last coordinate
     float                   prevRelDirection;   //!< The last Relative Direciton from the last update-Cycle.
-//  float                   lastAbsDirection;
 
     Vector                  velocity;           //!< Saves the velocity.
 
-    Vector*                 toCoordinate;       //!< a position to which to iterate. (This is used in conjunction with softReparent.and set*CoorSoft)
-    float*                  toDirection;        //!< a direction to which to iterate. (This is used in conjunction with softReparent and set*DirSoft)
+    Vector*                 toCoordinate;       //!< a position to which to iterate. (This is used in conjunction with setParentSoft.and set*CoorSoft)
+    float*                  toDirection;        //!< a direction to which to iterate. (This is used in conjunction with setParentSoft and set*DirSoft)
     float                   bias;               //!< how fast to iterate to the given position (default is 1)
 
Index: trunk/src/lib/graphics/render2D/render_2d.cc
===================================================================
--- trunk/src/lib/graphics/render2D/render_2d.cc	(revision 5378)
+++ trunk/src/lib/graphics/render2D/render_2d.cc	(revision 5382)
@@ -66,6 +66,8 @@
 void Render2D::registerElement2D(Element2D* element2D)
 {
-  this->element2DList[(int)log2(E2D_DEFAULT_LAYER)]->add(element2D);
+  if (likely(element2D != NULL))
+    this->element2DList[(int)log2(E2D_DEFAULT_LAYER)]->add(element2D);
 }
+
 
 /**
@@ -88,4 +90,9 @@
 void Render2D::moveToLayer(Element2D* element2D, E2D_LAYER to)
 {
+  if (element2D == NULL)
+    return;
+
+  if (unlikely(pow(2, E2D_LAYER_COUNT ) > to))
+    to = E2D_DEFAULT_LAYER;
   if (element2D->getLayer() != to)
   {
Index: trunk/src/lib/shell/shell.cc
===================================================================
--- trunk/src/lib/shell/shell.cc	(revision 5378)
+++ trunk/src/lib/shell/shell.cc	(revision 5382)
@@ -364,6 +364,6 @@
     2:
   */
-    lastText->setRelDir2D(-90);
-    lastText->setRelDirSoft2D(0, 10);
+    lastText->setRelDir2D(-360);
+    lastText->setRelDirSoft2D(0, 5);
     lastText->setRelCoor2D(this->calculateLinePosition(0)- Vector(-1000,0,0));
     lastText->setRelCoorSoft2D(this->calculateLinePosition(0),10);
