diff --git a/modules/gui/doc/gui.rst b/modules/gui/doc/gui.rst
index 6c25f35ec22beff4a9ba89d8dccee83229c42569..675bf6b139294abb9507955d9e4b1978ffb075b7 100644
--- a/modules/gui/doc/gui.rst
+++ b/modules/gui/doc/gui.rst
@@ -4,108 +4,19 @@
 .. module:: ost.gui
 
 The GUI of OpenStructure is designed to be intuitive, flexible and extensible. 
-Most of the widgets are organized in a big main window which is divided into
-four parts: the main area and three panels containing one or more 
-smaller widgets:
 
-.. image:: images/100208_OpenStructure_UI_Colored.png
+.. image:: images/100622_gui.png
+    :width: 600
 
-The panels primarily contains widgets interacting with the 3D window.
 All parts of the GUI are exported to Python and can be expanded with 
 C++ Qt widgets as well as with PyQt widgets. Learn more about :doc:`python_cpp`.
 
 .. toctree::
 
+  layout
   python_cpp
   scene_win
-  inspector_gadget
   tools
-  drag_and_drop
   python_shell
-  menubar
-  panels
   sequence_viewer
 
-Tools
---------------------------------------------------------------------------------
-OpenStructure has several :class:`Tool` which are all listed in the toolbar
-close to the 3D window. A tool is activated upon selecting it in the toolbar.
-Input events are sent to the tool as long as the `Ctrl` key (`Cmd` on Mac) is
-pressed. For example the rigid body manipulator will rotate and shift the
-currently selected nodes in the scene win. Upon releasing `Ctrl`, the events are
-sent to the camera, making it possible to rapidly switch between adjusting the
-viewing angle of the camera and manipulating the position and orientation of
-scene objects.
- 
-.. image:: images/100208_Tools.png  
- 
-The example `Write a Tool in Python` demonstrates how to add a simple tool
-(written in python) to OpenStructure.
-
-Drag and Drop support
---------------------------------------------------------------------------------
-The user interface of OpenStructure supports drag and drop events. Every file
-format that is supported by Openstructure can be opened by dragging and dropping
-it on the main window. When a python script (ending with .py) is being dropped
-on the UI, the script will be executed. For any other file type (for example PDB
-files, images and density maps), OpenStructure will try to load the file and
-display it in the 3D window, in the data viewer for images or in the sequence
-viewer.
-
-Python Shell
---------------------------------------------------------------------------------
-OpenStructure has a integrated python shell which allows you interactively enter
-Python commands. Learn more about it in :doc:`python_shell`-Tutorial.  
-
-The Side Panels
---------------------------------------------------------------------------------
-View Modes
-^^^^^^^^^^
-Each :class:`PanelBar` can have different :class:`PanelWidgetContainer` also
-called view modes. View modes can display the widgets which are held by the Side
-Panel in a different style. Every panel has the splitter and the tabbed view
-mode.
-The view mode can be changed in the Window menu of the Menubar.
-
-Drag and Drop
-^^^^^^^^^^^^^
-The widgets which are held by a Side Panel can be moved to an other position in
-the panel or even to another side panel. The widget can be moved by simply
-clicking on the border of the widget and drag and drop it to the desired
-position. The drag and drop feature is currently only supported by the splitter
-view mode.
-
-Adding a custom Widget
-^^^^^^^^^^^^^^^^^^^^^^
-The Left-, Bottom- and Right-Panel are organized by the :class:`Panels`-class. 
-It is only possible to display a widget which is in the :class:`WidgetPool` of 
-the panels class. Once a widget is in the pool all the methods of the Panels
-class can be used to display / hide the widget in any position of the panels.
-The Example `Add a custom Widget` describes, how to add a fancy PyQt Widget to
-the widget pool and finally display it in the right side bar.
-OpenStructure remembers the size and location of a Widget. So, OpenStructure 
-should look the same after restarting it.
-
-Main Area
---------------------------------------------------------------------------------
-Adding an own Widget
-^^^^^^^^^^^^^^^^^^^^
-The :class:`MainArea` is a mdi (multi document interface). Therefore it's
-possible to display multiple widgets in it. The example `Add a Widget to MDI` 
-demonstrates how to add a  widget to the MDI area.
-
-Menubar
---------------------------------------------------------------------------------
-Adding an new Menupoint
-^^^^^^^^^^^^^^^^^^^^^^^
-It is really straightforward to add a custom menupoint. Since the menubar is 
-exported to Python it is even easier to create such e menupoint. See the example 
-`Adding a Menu` which describes how this is done within python and PyQt.
-
-Nice to know
----------------------------------------------------------------------------------
-As you might have noticed nearly every gui example needs the :class:`GostyApp` 
-and the :class:`Perspective` within the code. Gosty app is a singleton class 
-which has getter methods to all important gui classes. The perspective class has 
-all the information about the layout of the whole application, it is accessible 
-over the gosty app instance.  
diff --git a/modules/gui/doc/images/100622_gui.png b/modules/gui/doc/images/100622_gui.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ec2da2072df7bfc41cf8c655c869bda6e697893
Binary files /dev/null and b/modules/gui/doc/images/100622_gui.png differ
diff --git a/modules/gui/doc/images/100622_view_modes.png b/modules/gui/doc/images/100622_view_modes.png
new file mode 100644
index 0000000000000000000000000000000000000000..60e27bd3df2e2a85db8d21026fd6414f59d9d361
Binary files /dev/null and b/modules/gui/doc/images/100622_view_modes.png differ
diff --git a/modules/gui/doc/inspector_gadget.rst b/modules/gui/doc/inspector_gadget.rst
deleted file mode 100644
index 116746d1ef090a10f1c110a08434476ed8b81392..0000000000000000000000000000000000000000
--- a/modules/gui/doc/inspector_gadget.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-The Inspector Gadget
-================================================================================
-.. currentmodule:: ost.gui
-
-With our Inspector Gadget it is straightforward to modify rendering and coloring
-options of scene objects without using the keyboard:
- 
-.. image:: images/100614_Inspector_gadget.png
-   
-The render and coloring options affect only the currently selected objects of
-the scene win. The Shortcut `Ctrl+I` toggles the visibility of the inspector.
diff --git a/modules/gui/doc/layout.rst b/modules/gui/doc/layout.rst
new file mode 100644
index 0000000000000000000000000000000000000000..08fd60b5e72de79d51b8565476d2aa3ad64a6675
--- /dev/null
+++ b/modules/gui/doc/layout.rst
@@ -0,0 +1,328 @@
+Layout
+================================================================================
+.. currentmodule:: ost.gui
+
+Most of the widgets are organized in a big main window which is divided into
+four parts: the :class:`MainArea` and three panels (which are organized by the 
+:class:`PanelManager`) containing one or more smaller widgets:
+
+.. image:: images/100208_OpenStructure_UI_Colored.png
+
+The panels primarily contain widgets interacting with the 3D window.
+
+Drag and Drop support
+--------------------------------------------------------------------------------
+The user interface of OpenStructure supports drag and drop events. Every file
+format that is supported by Openstructure can be opened by dragging and dropping
+it on the main window. When a python script (ending with .py) is being dropped
+on the UI, the script will be executed. For any other file type (for example PDB
+files, images and density maps), OpenStructure will try to load the file and
+display it in the 3D window, in the data viewer for images or in the sequence
+viewer.
+
+Perspective
+--------------------------------------------------------------------------------
+
+.. class:: Perspective
+
+  The perspective manages the layout of the widgets inside the main window.
+  It contains important classes which itself manages again a sub part of the whole layout.
+  You can get the active perspective object from the gosty app:
+
+  .. code-block:: python
+  
+    app=gui.GostyApp.Instance()
+    perspective=app.perspective
+
+  .. method:: GetMainArea()
+  
+    Returns the main area which is used in this perspective.
+    
+    :rtype: :class:`MainArea`
+
+  .. method:: GetMenu(name)
+    
+    Get QMenu that corresponds to the given name.
+    If it does not exist, it will be created and returned.
+    
+    :param name: The name of the menu
+    :type  arg2: :class:`str`
+    :rtype: :class:`QtCore.QMenu`
+
+  .. method:: GetMenuBar()
+  
+    Returns the Menubar of the Application. Can be used to add some menupoints.
+    
+    :rtype: :class:`QtCore.QMenuBar`
+
+  .. method:: GetPanels()
+
+    The PanelManager class organizes all the widgets in the side panels.
+    Returns the PanelManager instance which is used in this perspective.
+
+    :rtype: :class:`PanelManager`
+
+  .. method:: HideAllBars()
+
+     Hides all side bars. Can be used if the MainArea should be expanded to full size.
+  
+  .. method:: StatusMessage(message)
+  
+    Set a status message. This method can also be called from Qt as slot.
+    
+    :param message: The message that will be displayed in the status bar.
+    :type  message: :class:`str`
+
+
+
+
+Main Area
+--------------------------------------------------------------------------------
+Adding an own Widget
+^^^^^^^^^^^^^^^^^^^^
+The :class:`MainArea` is a mdi (multi document interface). Therefore it's
+possible to display multiple widgets in it. The following example demonstrates 
+how to add a  widget to the MDI area:
+
+  .. code-block:: python
+  
+    app=gui.GostyApp.Instance()
+    main_area=app.perspective.main_area
+    label=QtGui.QLabel("Hello World")
+    main_area.AddWidget("The beginning..", label)
+    
+.. class:: MainArea
+
+   It is implemented as a MDI (multi document interface). This allows you to add custom widgets to it.
+
+  .. method:: AddPersistentWidget(title, name, widget [, window_state])
+
+    add a widget whose geometry is preserved across application relaunches.
+    For widgets that are volatile, use :meth:`AddWidget`
+    If tabbed mode is enabled, the widget geometry is ignored.
+
+    :param title: string that is displayed in the gui
+    :type  title: :class:`str`
+    :param name: is the unique name (within the scope of the main area) for the widget that is used to restore and save the widget geometry.
+    :type  name: :class:`str`
+    :param widget: is the widget to be added to the main area
+    :type  widget: :class:`QtCore.QWidget`
+    :param window_state: custom window_state for the widget. See Qt Documentation to learn more about WindowStates.
+    :type  name: :class:`QWindowState`
+
+  .. method:: AddPersistentWidget(title, name, widget, width, height, x, y)
+
+     add a widget whose geometry is preserved across application relaunches
+     For widgets that are volatile, use #AddWidget()
+     If tabbed mode is enabled, the widget geometry is ignored.
+
+    :param title: string that is displayed in the gui
+    :type  title: :class:`str`
+    :param name: is the unique name (within the scope of the main area) for the widget that is used to restore and save the widget geometry.
+    :type  name: :class:`str`
+    :param widget: is the widget to be added to the main area
+    :type  widget: :class:`QtCore.QWidget`
+    :param width: width of the widget inside the mdi
+    :type  width: :class:`int`
+    :param height: height of the widget inside the mdi
+    :type  height: :class:`int`
+    :param x: x position of the widget inside the mdi
+    :type  x: :class:`int`
+    :param y: y position of the widget inside the mdi
+    :type  y: :class:`int`
+
+  .. method:: AddWidget(title, widget)
+  
+    add volatile widget
+  
+    :param title: string that is displayed in the gui
+    :type  title: :class:`str`
+    :param widget: is the widget to be added to the main area
+    :type  widget: :class:`QtCore.QWidget`
+
+  .. method:: ShowSubWindow(widget)
+  
+    display the given widget inside the main area
+    This method can be used to make a widget visible that has been added to the mdi area.
+    This method should only be called if you are sure, that the widget has been added to the main area.
+    Otherwise, there might be an unexpected behavior!
+  
+    :param widget: widget which you want to make visible
+    :type  widget: :class:`QtCore.QWidget`
+
+  
+  .. method:: HideSubWindow(widget)
+  
+    brief hides the given widget inside the main area
+    This method can be used to hide a widget that has been added to this mdi area.
+    This method should only be called if you are sure, that the widget has been added to the main area.
+    Otherwise, there might be an unexpected behavior!
+  
+    :param widget: widget which you want to hide
+    :type  widget: :class:`QtCore.QWidget`
+  
+  .. method:: EnableTabbedMode(tabbed_mode)
+    
+    brief switch between free window and tabbed window mode
+     
+    :param tabbed_mode: whether you want to enable or disable the tabbed mode. Default is True
+    :type  tabbed_mode: :class:`bool`
+  
+Panels
+--------------------------------------------------------------------------------
+
+View Modes
+^^^^^^^^^^
+
+Each side panel can have different view modes. View modes can display the widgets 
+which are held by the Side Panel in a different style. Every panel has the 
+`splitter` and the `tabbed` view mode. The view mode can be changed in the Window 
+menu of the Menubar:
+
+.. image:: images/100622_view_modes.png
+
+Drag and Drop
+^^^^^^^^^^^^^
+
+The widgets which are held by a Side Panel can be moved to an other position in 
+the panel or even to another side panel. The widget can be moved by simply 
+clicking on the border of the widget and drag and drop it to the desired position.
+The drag and drop feature is currently only supported by the splitter view mode.
+
+Adding a custom Widget
+^^^^^^^^^^^^^^^^^^^^^^
+
+The Left-, Bottom- and Right-Panel are organized by one Superclass. It is only 
+possible to display a widget which is in the widget pool of the panels class. 
+Once a widget is in the pool all the methods of the Panels class can be used to 
+display / hide the widget in any position of the panels. OpenStructure remembers 
+the size and location of a Widget. So, OpenStructure should look the same after 
+restarting it.
+
+The following example shows, how to add a PyQt Widget to the widget pool and finally 
+display it in the right side bar:
+
+  .. code-block:: python
+  
+    qwidget = QtGui.QLabel("Test")
+    widget=gui.WrappedWidget(qwidget)
+    panels=gui.GostyApp.Instance().perspective.GetPanels()
+    panels.AddWidgetToPool("Test Label",widget)
+    panels.AddWidget(gui.PanelPosition.RIGHT_PANEL, widget)
+    qwidget.show()
+
+.. class:: PanelManager
+
+  Class which organizes all widgets which are in the side panels
+  This class handles all side bar widgets. It can be used to display, hide or move a widget to a :class:`PanelBar`. There are three Bars (left, bottom, right) which are organized by this class.
+  Whenever a widget is being removed or added it checks first if the widget type is known and if there are available instances.
+  
+  .. method:: AddWidget(pos, widget[, hidden])
+
+    Display a Widget in a PanelBar. 
+    With Method you can add a widget to the given PanelBar. The widget which finally will be added to the gui will be created from the WidgetRegistry.
+    If the WidgetPool does not know the class name of the given widget or if there are no instances left, nothing will happen.
+
+    :param pos: Indicates which PanelBar is affected
+    :type  pos: :data:`PanelPosition`
+    :param widget: the widget will not directly added to the PanelBar. The class_name will be used to identify the widget in the WidgetRegistry which will return a fresh instance of this class.
+    :type  arg3: :class:`int`
+    :param hidden: marks if the class should be displayed in the gui. Default the widget will be shown. By default False is set
+    :type  hidden: bool
+
+  .. method:: AddWidgetByName(pos, class_name, hidden)
+
+    Display a Widget in a PanelBar
+    Same as :meth:`AddWidget`
+
+    :param pos: Indicates which PanelBar is affected
+    :type  pos: :class:`PanelPosition`
+    :param class_name: the class_name of the widget you would like to add.
+    :type  class_name: :class:`str`
+    :param hidden: marks if the class should be displayed in the gui. Default the widget will be shown.
+    :type  hidden: bool
+
+  .. method:: AddWidgetToPool(class_name, limit)
+
+     Add a widget to the widget pool.
+     The widget must already be in the WidgetRegistry.
+     If you are not sure if the Widget is in the WidgetRegistry, use the other `AddWidgetToPool` Method instead.
+
+    :param class_name: class name of class which should be added to the widget pool.
+    :type  class_name: :class:`str`
+    :param limit: amount of parallel instances allowed (-1 if infinite)
+    :type  limit: :class:`int`
+
+  .. method:: AddWidgetToPool(name, widget)
+
+     Add a widget to the widget pool. Same as :meth:`AddWidgetToPool`
+     
+    :param name: Name which is displayed in the gui.
+    :type  name: :class:`str`
+    :param widget: Widget which will be added to the WidgetPool of this class and the WidgetRegistry. 
+    :type  widget: :class:`WrappedWidget`
+
+  .. method:: GetMenu()
+    
+     The GetMenu method returns a QMenu reference, which contains various actions. The action states will be updated automatically.
+     Returns a reference to a QMenu which can be used for example in a QMenuBar
+     
+    :rtype: :class:`QObject`
+
+  .. method:: GetQObject()
+
+    Get the SIP-QObject (QObject), learn more about :doc:`python_cpp`.
+    
+    :rtype: PyQt4.QObject
+
+  .. method:: RemoveWidget(widget)
+
+    Remove a Widget out of a PanelBar
+    The widget will be removed if it is in a PanelBar
+  
+    :param arg2: widget which should be removed
+    :type  arg2: :class:`WrappedWidget`
+
+.. data:: PanelPosition
+ 
+  This enum indicates the Position of the Panel
+
+  * BOTTOM_PANEL
+     The bottom panel  
+  * LEFT_PANEL
+     The left panel
+  * RIGHT_PANEL
+      The right panel
+
+Menubar
+--------------------------------------------------------------------------------
+Adding an new Menupoint
+^^^^^^^^^^^^^^^^^^^^^^^
+It is really straightforward to add a custom menupoint. Since the menubar is 
+exported to Python it is even easier to create such e menupoint. The following example 
+describes how this is done within python and PyQt:
+
+.. code-block:: python
+
+  menu_bar=gui.GostyApp.Instance().perspective.GetMenuBar()
+  test_action = QtGui.QAction('Test Menu Point', menu_bar) 
+  test = menu_bar.addMenu('&Test')
+  test.addAction(test_action)
+
+The MenuBar class is a normal Qt QMenubar (see the Qt Documentation for more information 
+about QMenubar). By getting the Menubar from the perspective, it is automatically 
+converted to a SIP Object which can be used within python.
+
+The Inspector Gadget
+--------------------------------------------------------------------------------
+
+.. currentmodule:: ost.gui
+
+With our Inspector Gadget it is straightforward to modify rendering and coloring
+options of scene objects without using the keyboard:
+ 
+.. image:: images/100614_Inspector_gadget.png
+   
+The render and coloring options affect only the currently selected objects of
+the scene win. The Shortcut `Ctrl+I` toggles the visibility of the inspector.
+ 
\ No newline at end of file
diff --git a/modules/gui/doc/python_cpp.rst b/modules/gui/doc/python_cpp.rst
index 9b30010fee0b2257936c4ae8b885cc5e38c249ae..9ec7c5f72717881278db000f22bb67e0c5464730 100644
--- a/modules/gui/doc/python_cpp.rst
+++ b/modules/gui/doc/python_cpp.rst
@@ -8,18 +8,18 @@ done with SIP, which has a different mechanism than boost::python.
 To access a exported boost::python Qt-Object from python we provide a method 
 which wraps the Object into a Python SIP Object.
 
-  .. code-block:: python
+.. code-block:: python
    
-    seq_viewer = gui.SequenceViewer() # Create SequenceViewer Object
-    qobj = seq_viewer.qobject #Get Python SIP Object
-    print qobj.size()   # Call function on QWidget
+  seq_viewer = gui.SequenceViewer() # Create SequenceViewer Object
+  qobj = seq_viewer.qobject #Get Python SIP Object
+  print qobj.size()   # Call function on QWidget
 
 The other way around, each boost::python Qt Object accepts python objects as 
 input for Qt Objects. It handles the cast to a C++ Qt Object internally.
 
-  .. code-block:: python
-   
-    persp=gui.GostyApp.Instance().perspective
-    test=persp.GetMenu("Test") #Get boost::python qobject
-    test_action = QtGui.QAction('&Test me', test) #Create Python SIP Object 
-    test.addAction(test_action) #Add Action to boost::python object
+.. code-block:: python
+  
+  persp=gui.GostyApp.Instance().perspective
+  test=persp.GetMenu("Test") #Get boost::python qobject
+  test_action = QtGui.QAction('&Test me', test) #Create Python SIP Object 
+  test.addAction(test_action) #Add Action to boost::python object
diff --git a/modules/gui/doc/scene_win.rst b/modules/gui/doc/scene_win.rst
index 8cbd6875219bca8d774bb359863e667d6a5c6b1f..fcb6b9a27cfdea498b0cfa8a16004c573d98ab7f 100644
--- a/modules/gui/doc/scene_win.rst
+++ b/modules/gui/doc/scene_win.rst
@@ -16,7 +16,7 @@ selected objects.
 
   .. method:: GetContextMenu()
   
-     Returns the :class:`ContextMenu`-instance.
+    Returns the :class:`ContextMenu`-instance.
      
     :rtype: ContextMenu
 
diff --git a/modules/gui/doc/tools.rst b/modules/gui/doc/tools.rst
new file mode 100644
index 0000000000000000000000000000000000000000..9c0da468bdeea30d310410c5607e223db3aa6877
--- /dev/null
+++ b/modules/gui/doc/tools.rst
@@ -0,0 +1,77 @@
+Tools
+--------------------------------------------------------------------------------
+.. currentmodule:: ost.gui
+
+OpenStructure has several :class:`Tool` which are all listed in the toolbar
+close to the 3D window. A tool is activated upon selecting it in the toolbar.
+Input events are sent to the tool as long as the `Ctrl` key (`Cmd` on Mac) is
+pressed. For example the rigid body manipulator will rotate and shift the
+currently selected nodes in the scene win. Upon releasing `Ctrl`, the events are
+sent to the camera, making it possible to rapidly switch between adjusting the
+viewing angle of the camera and manipulating the position and orientation of
+scene objects.
+ 
+.. image:: images/100208_Tools.png  
+ 
+The example `Write a Tool in Python` demonstrates how to add a simple tool
+(written in python) to OpenStructure.
+
+.. class:: Tool
+
+  Parameters of the tool that are configurable should be implemented using the
+  ToolOptions facility. This automatically takes care of remembering the
+  used options over different sessions (in the future) and creates a widget 
+  to modify these options.
+
+  input_events Input Events
+
+  Tools receive input events when the Control key (Command on MacOS X) is
+  pressed. This includes both keyboard events and mouse events such as mouse
+  move events, clicks and Real clicks.
+
+  Tools only receive mouse move events when one of the mouse buttons is 
+  pressed. 
+
+  .. method:: CanOperateOn(nodes)
+
+    determines if the tool can manipulate a certain :class:`gfx.GfxNode`. 
+    This method is used to enabled/disable certain actions (in the toolbar, for example).
+
+    Return True if the Tool can operate on all GfxNodes which are in the given list. Otherwise False 
+
+    :param nodes: List with :class:`gfx.GfxNode`
+    :type  nodes: :class:`NodePtrList`
+    :rtype: bool
+
+  .. method:: Click(event)
+
+    left mouse click
+
+    :param event: object with the event information
+    :type  arg2: :class:`MouseEvent`
+
+  .. method:: DoubleClick(event)
+    
+    double click
+    
+    :param event: object with the event information
+    :type  event: :class:`MouseEvent`
+
+  .. method:: GetIconPath()
+    
+    Returns the path to an shiny icon. 
+    If no path is given, no icon will be displayed
+    
+    :rtype: :class:`str`
+
+  .. method:: GetName()
+    
+    Returns the name of the Tool which will be displayed in the gui.
+    
+    :rtype: :class:`str`
+
+  .. method:: GetToolOptions()
+
+       
+    :rtype: :class:`ToolOptions`
+