Index: branches/gui/src/lib/gui/gl/glgui_handler.cc
===================================================================
--- branches/gui/src/lib/gui/gl/glgui_handler.cc	(revision 8663)
+++ branches/gui/src/lib/gui/gl/glgui_handler.cc	(revision 8664)
@@ -104,26 +104,28 @@
     {
       case  EV_MOUSE_BUTTON_LEFT:
-        if (GLGuiWidget::mouseFocused() != NULL)
+        if (GLGuiWidget::mouseFocused() != NULL && event.bPressed)
         {
-          if (event.bPressed)
+          // if clickable select the Widget.
+          if (GLGuiWidget::mouseFocused()->clickable())
           {
-            if (GLGuiWidget::mouseFocused()->clickable())
-            {
-              Vector2D cursorPos = (this->_cursor != NULL) ? this->_cursor->getAbsCoor2D() : Vector2D(event.x, event.y);
-              GLGuiWidget::mouseFocused()->select();
-              GLGuiWidget::mouseFocused()->click(cursorPos - GLGuiWidget::mouseFocused()->getAbsCoor2D());
-            }
-          }
-          else
-          {
-            if (GLGuiWidget::mouseFocused()->clickable())
-            {
-              Vector2D cursorPos = (this->_cursor != NULL) ? this->_cursor->getAbsCoor2D() : Vector2D(event.x, event.y);
-              GLGuiWidget::mouseFocused()->release(cursorPos - GLGuiWidget::mouseFocused()->getAbsCoor2D());
-            }
+            Vector2D cursorPos = (this->_cursor != NULL) ? this->_cursor->getAbsCoor2D() : Vector2D(event.x, event.y);
+            GLGuiWidget::mouseFocused()->select();
+            GLGuiWidget::selected()->click(cursorPos - GLGuiWidget::mouseFocused()->getAbsCoor2D());
           }
         }
+        else if (GLGuiWidget::selected != NULL && !event.bPressed)
+        {
+          if (GLGuiWidget::selected()->clickable())
+          {
+            Vector2D cursorPos = (this->_cursor != NULL) ? this->_cursor->getAbsCoor2D() : Vector2D(event.x, event.y);
+            GLGuiWidget::selected()->release(cursorPos - GLGuiWidget::selected()->getAbsCoor2D());
+          }
+        }
+
         break;
       case EV_LEAVE_STATE:
+        if (GLGuiWidget::selected() != NULL)
+          GLGuiWidget::selected()->unselect();
+
         if (GLGuiWidget::mouseFocused() != NULL)
           GLGuiWidget::mouseFocused()->breakMouseFocus();
@@ -138,5 +140,5 @@
 
 
-    if (GLGuiWidget::selected())
+    if (GLGuiWidget::selected() != NULL)
     {
       GLGuiWidget::selected()->processEvent(event);
@@ -178,4 +180,7 @@
   void GLGuiHandler::tick(float dt)
   {
+    // do not change if we already clicked into a Widget.
+    if (GLGuiWidget::selected() != NULL && GLGuiWidget::selected()->clicked())
+      return ;
 
     // CHECK THE COLLISIONS.
Index: branches/gui/src/lib/gui/gl/glgui_widget.cc
===================================================================
--- branches/gui/src/lib/gui/gl/glgui_widget.cc	(revision 8663)
+++ branches/gui/src/lib/gui/gl/glgui_widget.cc	(revision 8664)
@@ -95,4 +95,5 @@
     this->_pushed = false;
     this->_state = OrxGui::Normal;
+    this->_clicked = false;
 
 
@@ -167,15 +168,25 @@
 
 
+  /**
+   * @brief selects the Widget, unselecting the old one (if existing)
+   */
   void GLGuiWidget::select()
   {
-    if (GLGuiWidget::selected() != NULL)
+    if (GLGuiWidget::_selected != NULL)
       GLGuiWidget::selected()->unselect();
     GLGuiWidget::_selected = this;
   }
 
+  /**
+   * @brief unselects the current Widget.
+   *
+   * if the current Widget is not selected, nothing is done here.
+   */
   void GLGuiWidget::unselect()
   {
-    if (GLGuiWidget::selected() != this)
-      _selected = NULL;
+    if (GLGuiWidget::_selected != this)
+      return;
+
+    GLGuiWidget::_selected = NULL;
   }
 
@@ -217,4 +228,5 @@
   void GLGuiWidget::clicking(const Vector2D& pos)
   {
+    this->_clicked = true;
     this->switchState(OrxGui::Selected);
   }
@@ -222,4 +234,5 @@
   void GLGuiWidget::releasing(const Vector2D& pos)
   {
+    this->_clicked = false;
     this->switchState(OrxGui::Normal);
   }
@@ -236,5 +249,16 @@
   }
 
-  void GLGuiWidget::destroyed()
+  void GLGuiWidget::selecting()
+  {
+    this->switchState(OrxGui::Selected);
+  }
+
+  void GLGuiWidget::unselecting()
+  {
+    this->switchState(OrxGui::Normal);
+  }
+
+
+  void GLGuiWidget::destroying()
   {}
   ;
@@ -737,5 +761,5 @@
   void GLGuiWidget::tick(float dt)
   {
-        if (this->_animating)
+    if (this->_animating)
     {
       this->foregroundColor();
@@ -778,8 +802,8 @@
     for (unsigned int i = 0; i < GLGUI_STATE_COUNT; ++i)
       if (stateName == OrxGui::StateString[i])
-    {
-      *state = (OrxGui::State)i;
-      return true;
-    }
+      {
+        *state = (OrxGui::State)i;
+        return true;
+      }
     return false;
   }
@@ -788,5 +812,5 @@
    * @brief print out some nice debug output about the Widget.
    */
-  void GLGuiWidget::debug() const
+  void GLGuiWidget::debug(unsigned int level) const
   {
     PRINT(0)("Debug of %s::%s - WidgetPart ", this->getClassName(), this->getName());
Index: branches/gui/src/lib/gui/gl/glgui_widget.h
===================================================================
--- branches/gui/src/lib/gui/gl/glgui_widget.h	(revision 8663)
+++ branches/gui/src/lib/gui/gl/glgui_widget.h	(revision 8664)
@@ -42,7 +42,8 @@
 
     /// FOCUS
-    /** @brief gives focus to this widget */
+    /** @brief gives mouse - focus to this widget */
     void giveMouseFocus();
     void breakMouseFocus();
+
     /** @returns true if the widget is focusable */
     bool focusable() const { return this->_focusable; };
@@ -54,13 +55,20 @@
     bool focusOverWidget(const OrxGui::GLGuiCursor* const cursor) const;
 
-    /** @returns the currently focused Widget (NULL if none is selected) */
+    /** @returns the currently mouse - focused Widget (NULL if none is focused). */
     static GLGuiWidget* mouseFocused() { return GLGuiWidget::_mouseFocused; };
 
     /// SELECT
-    static GLGuiWidget* selected() { return GLGuiWidget::_selected; };
     void select();
     void unselect();
+    /** @returns true if the Widget is selectable */
+    bool selectable() const { return this->_selectable; }
+    /** @param selectable true if the widget should be selectable */
+    void setSelectable(bool selectable) { this->_selectable = selectable; }
+
+    /** @returns the currently Selected Widget (NULL if none is selected). */
+    static GLGuiWidget* selected() { return GLGuiWidget::_selected; };
 
     /// CLICK
+    bool clicked() { return _clicked; };
     void click(const Vector2D& pos);
     void release(const Vector2D& pos);
@@ -85,5 +93,6 @@
     void animateBack();
 
-    /// STYLE
+    ///////////////////////////////////////////////////////////////////////////////////
+    /// STYLE /////////////////////////////////////////////////////////////////////////
     ////////////////////////////////
     /// Retrieve Current Values. ///
@@ -205,5 +214,5 @@
     void setAnimatedStateChanges(bool animated);
     void switchState(OrxGui::State state);
-
+    ///////////////////////////////////////////////////////////////////////////////////
 
 
@@ -229,4 +238,9 @@
 
   protected:
+    /// RENDERING
+    inline void beginDraw() const { glPushMatrix(); glTranslatef(this->getAbsCoor2D().x, this->getAbsCoor2D().y, 0); };
+    inline void endDraw() const { glPopMatrix(); };
+
+
     /// LOOKS
     virtual void resize();
@@ -234,19 +248,23 @@
     virtual void hiding() {};
     virtual void showing() {};
+
     virtual void updateFrontColor() {};
 
-    inline void beginDraw() const { glPushMatrix(); glTranslatef(this->getAbsCoor2D().x, this->getAbsCoor2D().y, 0); };
-    inline void endDraw() const { glPopMatrix(); };
 
     /// EVENTS
-    // if something was clickt on the GUI-widget.
+    // mouse clicking
     virtual void clicking(const Vector2D& pos);
     virtual void releasing(const Vector2D& pos);
+    // mouse focusing
     virtual void receivedFocus();
     virtual void removedFocus();
-
-    virtual void destroyed();
-
-    virtual void debug() const;
+    // selecting either with the mouse by clicking, or by the keybord traversing to it.
+    virtual void selecting();
+    virtual void unselecting();
+    // destroying the Widget.
+    virtual void destroying();
+
+
+    virtual void debug(unsigned int level) const;
 
   private:
@@ -269,7 +287,9 @@
     /// EVENTS
     OrxGui::State                  _state;
+    bool                           _clicked;
 
     bool                           _focusable;        //!< If this widget can receive focus.
     bool                           _clickable;        //!< if this widget can be clicked upon.
+    bool                           _selectable;       //!< If this widget can be selected.
 
     bool                           _pushed;
@@ -280,31 +300,31 @@
     typedef struct
     {
-      float             _borderLeft;           //!< The Distance to the left Border of the widget, before any internal Element starts.
-      float             _borderRight;          //!< The Distance to the right Border of the widget, before any internal Element starts.
-      float             _borderTop;            //!< The Distance to the top Border of the widget, before any internal Element starts
-      float             _borderBottom;         //!< The Distance to the bottom Border of the widget, before any internal Element starts
-
-      float             _textSize;             //!< The TextSize of the Widget.
-
-      Material          _background;           //!< The Background Material of the Widget.
-
-      Material          _foreground;           //!< The foreground Material of the Widget.
+      float                        _borderLeft;           //!< The Distance to the left Border of the widget, before any internal Element starts.
+      float                        _borderRight;          //!< The Distance to the right Border of the widget, before any internal Element starts.
+      float                        _borderTop;            //!< The Distance to the top Border of the widget, before any internal Element starts
+      float                        _borderBottom;         //!< The Distance to the bottom Border of the widget, before any internal Element starts
+
+      float                        _textSize;             //!< The TextSize of the Widget.
+
+      Material                     _background;           //!< The Background Material of the Widget.
+
+      Material                     _foreground;           //!< The foreground Material of the Widget.
     }
     StatedStyle;
 
 
-    StatedStyle         _style[GLGUI_STATE_COUNT]; //!< Styles configured for different States
-
-    FeaturePosition     _featurePosition;      //!< The Position a Feature will be layed at (checkbox(box), slider(text),...)
-    Font*               _font;                 //!< The Font used in the current Widget.
+    StatedStyle                    _style[GLGUI_STATE_COUNT]; //!< Styles configured for different States
+
+    FeaturePosition                _featurePosition;      //!< The Position a Feature will be layed at (checkbox(box), slider(text),...)
+    Font*                          _font;                 //!< The Font used in the current Widget.
 
 
     /// ANIMATION STUFF:
-    bool                _animatedStateChanges; //!< If the Transitions between States are Animated automatically.
-
-    bool                _animating;            //!< If the Widget is animated at the moment (Texture might be an AnimatedTexture.)
-    float               _animationCycle;
-    float               _animationDuration;
-    StatedStyle         _currentStyle;
+    bool                           _animatedStateChanges; //!< If the Transitions between States are Animated automatically.
+
+    bool                           _animating;            //!< If the Widget is animated at the moment (Texture might be an AnimatedTexture.)
+    float                          _animationCycle;
+    float                          _animationDuration;
+    StatedStyle                    _currentStyle;
 
   };
