Index: /orxonox/trunk/src/lib/gui/gui/orxonox_gui.cc
===================================================================
--- /orxonox/trunk/src/lib/gui/gui/orxonox_gui.cc	(revision 3624)
+++ /orxonox/trunk/src/lib/gui/gui/orxonox_gui.cc	(revision 3625)
@@ -95,5 +95,5 @@
 
   // Reading Values from File
-  exec->setFilename("~/.orxonox.conf");
+  exec->setConfFile("~/.orxonox/orxonox.conf");
   exec->readFromFile(orxonoxGUI);
   // Merging changes to the Options from appended flags.
Index: /orxonox/trunk/src/lib/gui/gui/orxonox_gui_exec.cc
===================================================================
--- /orxonox/trunk/src/lib/gui/gui/orxonox_gui_exec.cc	(revision 3624)
+++ /orxonox/trunk/src/lib/gui/gui/orxonox_gui_exec.cc	(revision 3625)
@@ -25,6 +25,11 @@
 
 #include "orxonox_gui_exec.h"
+
 #include <iostream>
 #include <string>
+
+#include <sys/stat.h>
+#include <sys/types.h>
+
 
 HashTable* orxonoxFlagHash;
@@ -50,5 +55,5 @@
   this->saveSettings->saveability();
   this->execBox->fill(this->saveSettings);
-  this->verboseMode = new Menu("verbose mode", "no output", "error", "warning", "info", "lastItem");
+  this->verboseMode = new Menu("verbose mode", "nothing", "error", "warning", "info", "lastItem");
   this->verboseMode->setFlagName("verbose", "v", 0);
   this->verboseMode->saveability();
@@ -90,6 +95,61 @@
 
 /**
+   \brief sets the confDir and File-name out of an input-string
+*/
+void OrxonoxGuiExec::setConfFile(char* confFile)
+{
+  char splitter = 
+#ifdef __WIN32__ 
+    '\\';
+#else
+  '/';
+#endif
+  char* tmpConfFile = new char[strlen(confFile)+1];
+  strcpy(tmpConfFile, confFile);
+  char* tmp = strrchr(tmpConfFile, splitter);
+  if (tmp)
+    {
+      tmp[0] = '\0';
+      this->setConfDir(tmpConfFile);
+      this->setFileName(tmp+1);
+    }
+  else
+    {
+      this->setConfDir("~/");
+      this->setFileName(tmpConfFile);
+    }
+  delete []tmp;
+  delete []tmpConfFile;
+}
+
+/**
+   \brief sets the Directory of the configuration files
+   \param confDir the Directory for the configuration files
+*/
+void OrxonoxGuiExec::setConfDir(char* confDir)
+{
+  if (!strncmp(confDir, "~/", 2))
+    {
+      char tmp[500];
+#ifdef __WIN32__
+      strcpy(tmp, getenv("USERPROFILE"));
+#else
+      strcpy(tmp, getenv("HOME"));
+#endif
+      this->confDir = new char[strlen(tmp)+strlen(confDir)];
+      sprintf(this->confDir, "%s%s", tmp, confDir+1);
+    }
+  else
+    {
+      this->confDir = new char[strlen(confDir)+1];
+      strcpy(this->confDir, confDir);
+    }
+  PRINTF(3)("Config Directory is: %s.\n", this->confDir);
+  mkdir(this->confDir, 0755);
+}
+
+/**
    \brief Sets the location of the configuration File.
-   \param filename the location of the configFile
+   \param fileName the location of the configFile
 
    \todo: memory allocation could be better.
@@ -97,19 +157,11 @@
    The name will be parsed from ~/ to /home/[username] on unix and c:/Documents and Settings/username/Settings/ on Windows
 */
-void OrxonoxGuiExec::setFilename(char* filename)
-{
-  char* buffer = (char*)malloc(2048*sizeof(char));
-  sprintf(buffer, "%s", filename);
-  if(!strncmp(buffer, "~/", 2))
-  {
-#ifdef __WIN32__
-    sprintf(configFile, "%s/%s", getenv("USERPROFILE"), buffer+2);
-#else
-    sprintf(configFile, "%s/%s", getenv("HOME"), buffer+2);
-#endif
-  }
-  else if(buffer)
-    strcpy(this->configFile, buffer);
-  free (buffer);
+void OrxonoxGuiExec::setFileName(char* fileName)
+{
+  if (!this->confDir)
+    this->setConfDir("~/");
+  this->configFile = new char[strlen(this->confDir)+strlen(fileName)+2];
+  sprintf(this->configFile, "%s/%s", this->confDir, fileName);
+  PRINTF(3)("ConfigurationFile is %s.\n", this->configFile);
 }
 
@@ -117,5 +169,5 @@
    \returns The name of the Configuration-File
 */
-char* OrxonoxGuiExec::getConfigFile(void)
+char* OrxonoxGuiExec::getConfigFile(void) const
 {
   return this->configFile;
@@ -190,8 +242,5 @@
 	    space2under[0] = '_';
 	  }
-	if(widget->isOption <=3)
-	  fprintf(CONFIG_FILE, "%s = %d\n", Buffer, static_cast<Option*>(widget)->value);
-	else if(widget->isOption == 5)
-	  fprintf(CONFIG_FILE, "%s = %s\n", Buffer, static_cast<OptionLabel*>(widget)->cValue);
+	  fprintf(CONFIG_FILE, "%s = %s\n", Buffer, static_cast<Option*>(widget)->save());
       }
 
@@ -259,11 +308,6 @@
     {
       PRINT(3)("Located Option %s.\n", widget->title);
-      if(widget->isOption >= 1 && widget->isOption <= 3)
-	{
-	  static_cast<Option*>(widget)->value = atoi(info->variableValue);
-	  static_cast<Option*>(widget)->redraw(); //!< \todo change this to setValue.
-	}
-      else if(widget->isOption == 5)
-	static_cast<OptionLabel*>(widget)->setValue(info->variableValue);
+      if(widget->isOption >= 1)
+	  static_cast<Option*>(widget)->load(info->variableValue);
     }
 }
Index: /orxonox/trunk/src/lib/gui/gui/orxonox_gui_exec.h
===================================================================
--- /orxonox/trunk/src/lib/gui/gui/orxonox_gui_exec.h	(revision 3624)
+++ /orxonox/trunk/src/lib/gui/gui/orxonox_gui_exec.h	(revision 3625)
@@ -22,4 +22,5 @@
   CheckButton* alwaysShow;     //!< A CheckButton, for if orxonox should start with or without gui.
   Button* quit;                //!< A Button to quit the Gui without starting orxonox.
+  char* confDir;               //!< The directory of the orxonox-configuration-files.
   char* configFile;            //!< The name of the .orxonox.conf(ig)-file.
   FILE* CONFIG_FILE;           //!< Filehandler for reading and writing.
@@ -37,7 +38,9 @@
   
   Widget* getWidget(void);
-  
-  void setFilename(char* filename);
-  char* getConfigFile(void);
+
+  void setConfFile(char* confFile);
+  void setConfDir(char* confDir);
+  void setFileName(char* fileName);
+  char* getConfigFile(void) const;
   int shouldsave(void);
   void writeToFile(Widget* widget);
Index: /orxonox/trunk/src/lib/gui/gui/orxonox_gui_gtk.cc
===================================================================
--- /orxonox/trunk/src/lib/gui/gui/orxonox_gui_gtk.cc	(revision 3624)
+++ /orxonox/trunk/src/lib/gui/gui/orxonox_gui_gtk.cc	(revision 3625)
@@ -1032,4 +1032,28 @@
 
 /**
+   \brief saves an Option
+   \returns the String that should be saved.
+
+   this is a default Option save
+*/
+char* Option::save(void)
+{
+  char* value = new char [10];
+  sprintf (value, "%d", this->value);
+  return value;
+}
+
+/**
+   \brief loads an Option from of its loadString
+   \param loadString the string from which to load the data from
+*/
+void Option::load(char* loadString)
+{
+  this->value = atoi(loadString);
+  PRINT(3)("Loading %s: %s %d\n", this->title, loadString, value); 
+  this->redraw();
+}
+
+/**
    \returns The saveable-state.
 */
@@ -1319,5 +1343,6 @@
   this->init();
   this->setTitle(menuname);
-    
+  va_list itemlist;                     //!< The list to readin multiple Options.
+
   char *itemName;
 
@@ -1371,4 +1396,42 @@
 
 /**
+   \brief saves the Label of the Menu
+   \returns the name of the selected Menu-Item
+*/
+char* Menu::save(void)
+{
+  MenuItem* tmpItem = this->firstItem;
+  for (int i = 0; i<this->value; i++)
+    tmpItem = tmpItem->next;
+      
+  return tmpItem->name;
+}
+
+/**
+   \brief loads a Menu from of its loadString
+   \param loadString the string from which to load the data from
+*/
+void Menu::load(char* loadString)
+{
+  MenuItem* tmpItem = firstItem;
+  bool foundItem = false;
+  while (tmpItem)
+    {
+      if (!strcmp(loadString, tmpItem->name))
+	{foundItem = true; break;}
+      tmpItem = tmpItem->next;
+    }
+  if (foundItem)
+    this->value = tmpItem->itemNumber;
+  else
+    {
+      this->value = 0;
+      PRINTF(2)("Sorry, but %s has not been found in the Itemlist of %s\n", loadString, this->title);
+    }
+  PRINTF(3)( "Loading %s: setting to %d\n", this->title, this->value); 
+  this->redraw();
+}
+
+/**
    \brief appends a new Item to the Menu-List.
    \param itemName the itemName to be appendet.
@@ -1377,10 +1440,18 @@
 {
   if (!this->firstItem)
-    this->firstItem = this->currItem = new MenuItem;
+    {
+      this->firstItem = this->currItem = new MenuItem;
+      this->currItem->itemNumber = 0;
+    }
   else
-    this->currItem = this->currItem->next = new MenuItem;
+    {
+      int tmpI = this->currItem->itemNumber;
+      this->currItem = this->currItem->next = new MenuItem;
+      this->currItem->itemNumber = tmpI+1;
+    }
 
   this->currItem->name = new char[strlen(itemName)+1];
   strcpy(this->currItem->name, itemName);
+
 #ifdef HAVE_GTK2
   this->currItem->item = gtk_menu_item_new_with_label(itemName);
@@ -1499,4 +1570,23 @@
 
 /**
+   \brief creates the Optionlabel save-string
+   \returns the String to save.
+*/
+char* OptionLabel::save(void)
+{
+  return cValue;
+}
+
+/**
+   \brief loads an Option from of its loadString
+   \param loadString the string from which to load the data from
+*/
+void OptionLabel::load(char* loadString)
+{
+  PRINTF(3)( "Loading %s: setting to %s\n", this->title, loadString); 
+  this->setValue(loadString);
+}
+
+/**
    \brief Creates a new default Label with no Text.
    You migth consider adding Label::setTitle with this.
Index: /orxonox/trunk/src/lib/gui/gui/orxonox_gui_gtk.h
===================================================================
--- /orxonox/trunk/src/lib/gui/gui/orxonox_gui_gtk.h	(revision 3624)
+++ /orxonox/trunk/src/lib/gui/gui/orxonox_gui_gtk.h	(revision 3625)
@@ -217,4 +217,7 @@
   void saveability(void);
   void saveability(bool isSaveable);
+  virtual char* save(void);
+  virtual void load(char* loadString);
+
   bool isSaveable(void);
   void setFlagName(char* flagname, int defaultvalue);
@@ -286,10 +289,10 @@
   GtkWidget* menu;                      //!< The menu That will hold the Options.
 #endif /* HAVE_GTK2 */
-  va_list itemlist;                     //!< The list to readin multiple Options.
-  
+
   //! A struct to handle the MenuItems
   struct MenuItem
   {
-    char* name;                         //!< The name of this entry. 
+    char* name;                         //!< The name of this entry.
+    int itemNumber;                     //!< The n'th entry of this menu;
 #ifdef HAVE_GTK2
     GtkWidget* item;                    //!< One Item From a Menu.
@@ -305,4 +308,7 @@
   virtual ~Menu(void);
   void init(void);
+
+  virtual char* save(void);
+  virtual void load(char* loadString);
   
   void addItem(char* itemName);
@@ -322,4 +328,8 @@
   
   void setValue(char* newValue);
+
+  virtual char* save(void);
+  virtual void load(char* loadString);
+
   void redraw(void);
   void changeOption(void);
