Index: code/branches/hud/bin/hud/hud.oxh
===================================================================
--- code/branches/hud/bin/hud/hud.oxh	(revision 1590)
+++ code/branches/hud/bin/hud/hud.oxh	(revision 1595)
@@ -1,6 +1,6 @@
 <HUD name="OrxonoxHUD">
-  <HUDSpeedBar name ="SpeedBar1" scale=0.35,0.2 scroll=-0.6,-1.0 value=0 />
-  <HUDFPSText name="FPSText" scale = 0.043,0.043 scroll=-0.93,0.9 font="Monofur" caption="Frames per second: " />
-  <HUDRTRText name="RTRText" scale = 0.043,0.043 scroll=-0.93,0.8 font="Monofur" caption="Render time ratio: " />
-  <Navigation name="Navigation" font="Monofur" navmarkersize=0.03,0.03 />
+  <HUDSpeedBar name ="SpeedBar1" size=0.35,0.2 scroll=-0.6,-1.0 value=0 />
+  <HUDFPSText name="FPSText" size = 0.043,0.043 scroll=-0.93,0.9 font="Monofur" caption="Frames per second: " />
+  <HUDRTRText name="RTRText" size = 0.043,0.043 scroll=-0.93,0.8 font="Monofur" caption="Render time ratio: " />
+  <Navigation name="Navigation" correctAspect=true font="Monofur" navmarkersize=0.03,0.03 />
 </HUD>
Index: code/branches/hud/src/core/Executor.cc
===================================================================
--- code/branches/hud/src/core/Executor.cc	(revision 1590)
+++ code/branches/hud/src/core/Executor.cc	(revision 1595)
@@ -30,4 +30,5 @@
 #include "Executor.h"
 #include "util/Math.h"
+#include "util/Convert.h"
 #include "Language.h"
 
@@ -136,5 +137,5 @@
             {
                 std::string paramnumber;
-                if (!Convert::ToString(&paramnumber, param))
+                if (!convertValue(&paramnumber, param))
                     return (*this);
 
Index: code/branches/hud/src/core/TclThreadManager.h
===================================================================
--- code/branches/hud/src/core/TclThreadManager.h	(revision 1590)
+++ code/branches/hud/src/core/TclThreadManager.h	(revision 1595)
@@ -45,6 +45,4 @@
 namespace orxonox
 {
-    class boost::thread;
-
     struct _CoreExport TclInterpreterBundle
     {
Index: code/branches/hud/src/orxonox/hud/HUDOverlay.cc
===================================================================
--- code/branches/hud/src/orxonox/hud/HUDOverlay.cc	(revision 1590)
+++ code/branches/hud/src/orxonox/hud/HUDOverlay.cc	(revision 1595)
@@ -41,4 +41,8 @@
   HUDOverlay::HUDOverlay()
     : overlay_(0)
+    , windowAspectRatio_(1.0f)
+    , bCorrectAspect_(false)
+    , size_(1.0f)
+    , sizeCorrection_(1.0f)
   {
     RegisterObject(HUDOverlay);
@@ -54,10 +58,10 @@
             + convertToString(hudOverlayCounter_s++) + "_" + this->getName());
 
-      this->windowWidth_ = GraphicsEngine::getSingleton().getWindowWidth();
-      this->windowHeight_ = GraphicsEngine::getSingleton().getWindowHeight();
-      this->windowAspectRatio_ = windowWidth_/(float)windowHeight_;
+      this->windowResized(GraphicsEngine::getSingleton().getWindowWidth(),
+            GraphicsEngine::getSingleton().getWindowHeight());
     }
 
-    XMLPortParam(HUDOverlay, "scale", setScale, getScale, xmlElement, mode);
+    XMLPortParam(HUDOverlay, "size", setSize, getSize, xmlElement, mode);
+    XMLPortParam(HUDOverlay, "correctAspect", setAspectCorrection, getAspectCorrection, xmlElement, mode);
     XMLPortParam(HUDOverlay, "scroll", setScroll, getScroll, xmlElement, mode);
     XMLPortParam(HUDOverlay, "rotation", setRotation, getRotation, xmlElement, mode);
@@ -68,4 +72,6 @@
       if (!this->isVisible())
           this->overlay_->hide();
+
+      this->sizeChanged();
     }
   }
@@ -77,18 +83,46 @@
   void HUDOverlay::changedVisibility()
   {
-      if (this->overlay_)
-      {
-          if (this->isVisible())
-              overlay_->show();
-          else
-              overlay_->hide();
-      }
+    if (this->overlay_)
+    {
+      if (this->isVisible())
+        this->overlay_->show();
+      else
+        this->overlay_->hide();
+    }
   }
 
   void HUDOverlay::windowResized(int newWidth, int newHeight)
   {
-    this->windowWidth_ = newWidth;
-    this->windowHeight_ = newHeight;
-    this->windowAspectRatio_ = windowWidth_/(float)windowHeight_;
+    this->windowAspectRatio_ = newWidth/(float)newHeight;
+
+    this->setAspectCorrection(this->bCorrectAspect_);
+  }
+
+  void HUDOverlay::setAspectCorrection(bool val)
+  {
+    if (val)
+    {
+      // note: this is only an approximation that is mostly valid when the
+      // magnitude of the width is about the magnitude of the height.
+      // Correctly we would have to take the square root of width*height
+      this->sizeCorrection_.x = 2.0 / (this->windowAspectRatio_ + 1.0);
+      this->sizeCorrection_.y = this->windowAspectRatio_ * this->sizeCorrection_.x;
+    }
+    else
+    {
+      this->sizeCorrection_ = Vector2::UNIT_SCALE;
+    }
+
+    this->bCorrectAspect_ = val;
+    this->sizeChanged();
+  }
+
+  /**
+    @remarks
+      This function can be overriden by any derivative.
+  */
+  void HUDOverlay::sizeChanged()
+  {
+    this->overlay_->setScale(size_.x * sizeCorrection_.x, size_.x * sizeCorrection_.y);
   }
 
Index: code/branches/hud/src/orxonox/hud/HUDOverlay.h
===================================================================
--- code/branches/hud/src/orxonox/hud/HUDOverlay.h	(revision 1590)
+++ code/branches/hud/src/orxonox/hud/HUDOverlay.h	(revision 1595)
@@ -47,5 +47,6 @@
       virtual void XMLPort(Element& xmlElement, XMLPort::Mode mode);
 
-      virtual void changedVisibility();
+      void setAspectCorrection(bool val);
+      bool getAspectCorrection() { return this->bCorrectAspect_; }
 
       /** Sets the scrolling factor of this overlay. */
@@ -68,23 +69,34 @@
 
       /** Sets the scaling factor of this overlay. */
-      void setScale(const Vector2& scale) { overlay_->setScale(scale.x, scale.y); }
+      void setSize(const Vector2& size) { this->size_ = size; this->sizeChanged(); }
 
-      /** Gets the current scale value */
-      Vector2 getScale() const { return Vector2(overlay_->getScaleX(), overlay_->getScaleY()); }
+      /** Gets the current size (not corrected) */
+      Vector2 getSize() const { return this->size_; }
+
+      /** Gets the current size (corrected) */
+      Vector2 getActualSize() const { return this->size_ * this->sizeCorrection_; }
+
+      /** Gets the current size correction */
+      Vector2 getSizeCorrection() const { return this->sizeCorrection_; }
 
       /** Scales the overlay */
-      void scale(Vector2 scale) { overlay_->setScale(overlay_->getScaleX()*scale.x, overlay_->getScaleY()*scale.y); }
+      void scale(Vector2 scale) { this->size_ *= scale; this->sizeChanged(); }
 
     protected:
-      virtual void windowResized(int newWidth, int newHeight);
+      virtual void changedVisibility();
+      virtual void sizeChanged();
+      float getWindowAspectRatio() { return windowAspectRatio_; } 
 
       Ogre::Overlay* overlay_;
-      float windowAspectRatio_;
-      int windowWidth_;
-      int windowHeight_;
 
     private:
+      void windowResized(int newWidth, int newHeight);
+
+      float windowAspectRatio_;
+      bool bCorrectAspect_;
+      Vector2 size_;
+      Vector2 sizeCorrection_;
+
       static unsigned int hudOverlayCounter_s;
-
   };
 }
Index: code/branches/hud/src/orxonox/hud/Navigation.cc
===================================================================
--- code/branches/hud/src/orxonox/hud/Navigation.cc	(revision 1590)
+++ code/branches/hud/src/orxonox/hud/Navigation.cc	(revision 1595)
@@ -54,4 +54,5 @@
       , navMarker_(0)
       , aimMarker_(0)
+      , navText_(0)
       , focus_(0)
     {
@@ -81,23 +82,23 @@
         {
             // create container
-            this->container_ = static_cast<OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", getName() + "_navContainer"));
-            this->container_->setMetricsMode(Ogre::GMM_RELATIVE);
-            this->container_->setLeft(0.0);
-            this->container_->setTop(0.0);
-            this->container_->setWidth(1.0);
-            this->container_->setHeight(1.0);
+            container_ = static_cast<OverlayContainer*>(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", getName() + "_navContainer"));
+            container_->setMetricsMode(Ogre::GMM_RELATIVE);
+            container_->setLeft(0.0);
+            container_->setTop(0.0);
+            container_->setWidth(1.0);
+            container_->setHeight(1.0);
 
             // create nav text
-            this->navText_ = static_cast<TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", getName() + "_navText"));
-            this->navText_->setMetricsMode(Ogre::GMM_RELATIVE);
-            this->navText_->setPosition(0.0f, 0.0f);
-            this->navText_->setCharHeight(0.05f);
-            this->navText_->setFontName("Monofur");
+            navText_ = static_cast<TextAreaOverlayElement*>(Ogre::OverlayManager::getSingleton().createOverlayElement("TextArea", getName() + "_navText"));
+            navText_->setMetricsMode(Ogre::GMM_RELATIVE);
+            navText_->setPosition(0.0f, 0.0f);
+            navText_->setCharHeight(0.05f);
+            navText_->setFontName("Monofur");
 
             // create nav marker
             navMarker_ = static_cast<PanelOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("Panel", getName() + "_navMarker"));
             navMarker_->setMetricsMode(GMM_RELATIVE);
-            navMarker_->setDimensions(0.05f, 0.05f);
             navMarker_->setMaterialName("Orxonox/NavArrows");
+            this->navMarkerSize_ = 0.05;
             this->wasOutOfView_ = true; // just a to ensure the material is changed right the first time..
 
@@ -105,6 +106,6 @@
             aimMarker_ = static_cast<PanelOverlayElement*>(OverlayManager::getSingleton().createOverlayElement("Panel", getName() + "_aimMarker"));
             aimMarker_->setMetricsMode(GMM_RELATIVE);
-            aimMarker_->setDimensions(0.05f, 0.05f);
             aimMarker_->setMaterialName("Orxonox/NavCrosshair");
+            this->aimMarkerSize_ = 0.04;
             
             container_->addChild(navMarker_);
@@ -121,32 +122,29 @@
         XMLPortParam(Navigation, "navmarkersize", setNavMarkerSize, getNavMarkerSize, xmlElement, mode);
         XMLPortParam(Navigation, "aimmarkersize", setAimMarkerSize, getAimMarkerSize, xmlElement, mode);
-    }
-
-    void Navigation::setNavMarkerSize(Vector2 size)
-    {
-        if (this->navMarker_ && size.squaredLength() >= 0.0f)
-            this->navMarker_->setDimensions(size.x, size.y);
-    }
-
-    Vector2 Navigation::getNavMarkerSize() const
-    {
-        if (this->navMarker_)
-            return Vector2(navMarker_->getWidth(), navMarker_->getHeight());
-        else
-            return Vector2::ZERO;
-    }
-
-    void Navigation::setAimMarkerSize(Vector2 size)
-    {
-        if (this->aimMarker_ && size.squaredLength() >= 0.0f)
-            this->aimMarker_->setDimensions(size.x, size.y);
-    }
-
-    Vector2 Navigation::getAimMarkerSize() const
-    {
-        if (this->aimMarker_)
-            return Vector2(aimMarker_->getWidth(), aimMarker_->getHeight());
-        else
-            return Vector2::ZERO;
+
+        if (mode == XMLPort::LoadObject)
+        {
+            this->sizeChanged();
+        }
+    }
+
+    void Navigation::setNavMarkerSize(float size)
+    {
+        this->navMarkerSize_ = size;
+    }
+
+    float Navigation::getNavMarkerSize() const
+    {
+        return this->navMarkerSize_;
+    }
+
+    void Navigation::setAimMarkerSize(float size)
+    {
+        this->aimMarkerSize_ = size;
+    }
+
+    float Navigation::getAimMarkerSize() const
+    {
+        return this->aimMarkerSize_;
     }
 
@@ -208,5 +206,4 @@
             pos.x = -pos.x;
             pos.y = -pos.y;
-            pos.z = -pos.z;
         }
         else
@@ -366,11 +363,14 @@
     }
 
-    void Navigation::windowResized(int newWidth, int newHeight)
-    {
-        HUDOverlay::windowResized(newWidth, newHeight);
-
-        //if (this->navMarker_)
-        //    navMarker_->setDimensions(0.05, 0.05);
-
+    void Navigation::sizeChanged()
+    {
+        float xScale = this->getActualSize().x;
+        float yScale = this->getActualSize().y;
+        if (this->navMarker_)
+            navMarker_->setDimensions(navMarkerSize_ * xScale, navMarkerSize_ * yScale);
+        if (this->aimMarker_)
+            aimMarker_->setDimensions(aimMarkerSize_ * xScale, aimMarkerSize_ * yScale);
+        if (this->navText_)
+            navText_->setCharHeight(navText_->getCharHeight() * yScale);
     }
 }
Index: code/branches/hud/src/orxonox/hud/Navigation.h
===================================================================
--- code/branches/hud/src/orxonox/hud/Navigation.h	(revision 1590)
+++ code/branches/hud/src/orxonox/hud/Navigation.h	(revision 1595)
@@ -58,5 +58,5 @@
 
     protected:
-      virtual void windowResized(int newWidth, int newHeight);
+      virtual void sizeChanged();
 
       private:
@@ -65,8 +65,8 @@
         void updateFocus();
 
-        void setNavMarkerSize(Vector2 size);
-        Vector2 getNavMarkerSize() const;
-        void setAimMarkerSize(Vector2 size);
-        Vector2 getAimMarkerSize() const;
+        void setNavMarkerSize(float size);
+        float getNavMarkerSize() const;
+        void setAimMarkerSize(float size);
+        float getAimMarkerSize() const;
         void setTextSize(float size);
         float getTextSize() const;
@@ -75,7 +75,9 @@
 
         Ogre::OverlayContainer* container_;         //!< Container that holds the navigation elements
-        Ogre::PanelOverlayElement* navMarker_;      // the panel used to show the arrow
-        Ogre::PanelOverlayElement* aimMarker_;
-        Ogre::TextAreaOverlayElement* navText_;     // displaying distance
+        Ogre::PanelOverlayElement* navMarker_;      //!< the panel used to show the arrow and the target marker
+        float navMarkerSize_;                       //!< One paramter size of the navigation marker
+        Ogre::PanelOverlayElement* aimMarker_;      //!< Panel used to show the aim Marker
+        float aimMarkerSize_;                       //!< One paramter size of the aim marker
+        Ogre::TextAreaOverlayElement* navText_;     //!< Text overlay to display the target distance
         std::list<RadarObject*>::iterator it_;
         RadarObject* focus_;                        // next pointer of linked list
Index: code/branches/hud/src/util/Convert.h
===================================================================
--- code/branches/hud/src/util/Convert.h	(revision 1590)
+++ code/branches/hud/src/util/Convert.h	(revision 1595)
@@ -43,4 +43,5 @@
 #include "SubString.h"
 #include "MultiTypeMath.h"
+#include "String.h"
 
 // disable annoying warning about forcing value to boolean
@@ -320,4 +321,11 @@
     }
 };
+
+// convert from string Shortcut
+template <class ToType>
+ToType convertFromString(std::string str)
+{
+  return getConvertedValue<std::string, ToType>(str);
+}
 
 
@@ -411,4 +419,19 @@
 ////////////////////
 
+// bool to std::string
+template <>
+struct ConverterSpecialized<bool, std::string, _Explicit_>
+{
+    enum { specialized = true };
+    static bool convert(std::string* output, const bool& input)
+    {
+        if (input)
+          *output = "true";
+        else
+          *output = "false";
+        return false;
+    }
+};
+
 // Vector2 to std::string
 template <>
@@ -501,4 +524,31 @@
 ////////////////////
 
+// std::string to bool
+template <>
+struct ConverterSpecialized<std::string, bool, _Explicit_>
+{
+    enum { specialized = true };
+    static bool convert(bool* output, const std::string& input)
+    {
+        std::string stripped = getLowercase(removeTrailingWhitespaces(input));
+        if (stripped == "true" || stripped == "on" || stripped == "yes")
+        {
+          *output = true;
+          return true;
+        }
+        else if (stripped == "false" || stripped == "off" || stripped == "no")
+        {
+          *output = false;
+          return true;
+        }
+
+        std::istringstream iss(input);
+        if (iss >> (*output))
+            return true;
+        else
+            return false;
+    }
+};
+
 // std::string to Vector2
 template <>
Index: code/branches/hud/src/util/String.h
===================================================================
--- code/branches/hud/src/util/String.h	(revision 1590)
+++ code/branches/hud/src/util/String.h	(revision 1595)
@@ -70,97 +70,3 @@
 _UtilExport unsigned int getNextCommentPosition(const std::string& str, unsigned int start = 0);
 
-//! The Convert class has some static member functions to convert strings to values and values to strings.
-class _UtilExport Convert
-{
-    public:
-        /**
-            @brief Converts a value of any type to a string.
-            @param output The string to write the result in
-            @param input The variable to convert
-            @return True if the conversion succeded
-
-            @example
-            float f = 3.14;
-            std::string output;
-            bool success = Convert::ToString(&output, f);
-        */
-        template <typename T>
-        static bool ToString(std::string* output, T input)
-        {
-            std::ostringstream oss;
-            if (oss << input)
-            {
-                (*output) = oss.str();
-                return true;
-            }
-
-            return false;
-        }
-
-        /**
-            @brief Converts a value of any type to a string and assigns a defaultvalue if the conversion fails.
-            @param output The string to write the result in
-            @param input The variable to convert
-            @param fallbackString The assigned string if the conversion fails.
-            @return True if the conversion succeeded
-
-            @example
-            float f = 3.14;
-            std::string output;
-            bool success = Convert::ToString(&output, f, "0.000000");
-        */
-        template <typename T>
-        static bool ToString(std::string* output, T input, const std::string& fallbackString)
-        {
-            if (Convert::ToString(output, input))
-                return true;
-
-            (*output) = fallbackString;
-            return false;
-        }
-
-        /**
-            @brief Converts a string to a value of any type.
-            @param output The variable to assign the result to
-            @param input The string to convert
-            @return True if the conversion succeeded
-
-            @example
-            std::string input = "3.14";
-            float f;
-            bool success = string2Number(&f, input);
-        */
-        template <typename T>
-        static bool FromString(T* output, const std::string& input)
-        {
-            std::istringstream iss(input);
-            if (iss >> (*output))
-                return true;
-
-            return false;
-        }
-
-        /**
-            @brief Converts a string to a value of any type.
-            @param output The variable to assign the result to
-            @param input The string to convert
-            @param fallbackValue The assigned value if the conversion fails
-            @return True if the conversion succeeded
-
-            @example
-            std::string input = "3.14";
-            float f;
-            bool success = string2Number(&f, input, 0.000000);
-        */
-        template <typename T>
-        static bool FromString(T* output, const std::string& input, T fallbackValue)
-        {
-            if (Convert::FromString(output, input))
-                return true;
-
-            (*output) = fallbackValue;
-            return false;
-        }
-};
-
 #endif /* _Util_String_H__ */
