Index: code/trunk/src/orxonox/CMakeLists.txt
===================================================================
--- code/trunk/src/orxonox/CMakeLists.txt	(revision 1735)
+++ code/trunk/src/orxonox/CMakeLists.txt	(revision 1747)
@@ -7,4 +7,5 @@
   RadarViewable.cc
   Settings.cc
+  SignalHandler.cc
 
   overlays/OrxonoxOverlay.cc
Index: code/trunk/src/orxonox/GraphicsEngine.cc
===================================================================
--- code/trunk/src/orxonox/GraphicsEngine.cc	(revision 1735)
+++ code/trunk/src/orxonox/GraphicsEngine.cc	(revision 1747)
@@ -47,7 +47,8 @@
 #include "core/CoreIncludes.h"
 #include "core/ConfigValueIncludes.h"
-#include "core/Debug.h"
+#include "core/Iterator.h"
 #include "core/CommandExecutor.h"
 #include "core/ConsoleCommand.h"
+#include "util/Debug.h"
 
 #include "overlays/console/InGameConsole.h"
@@ -97,10 +98,11 @@
     SetConfigValue(ogreLogLevelCritical_, 2).description("Corresponding orxonox debug level for ogre Critical");
 
-    unsigned int old = this->detailLevelParticle_;
-    SetConfigValue(detailLevelParticle_, 2).description("O: off, 1: low, 2: normal, 3: high");
-
-    if (this->detailLevelParticle_ != old)
-      for (Iterator<ParticleInterface> it = ObjectList<ParticleInterface>::begin(); it; ++it)
-        it->detailLevelChanged(this->detailLevelParticle_);
+    SetConfigValue(detailLevelParticle_, 2).description("O: off, 1: low, 2: normal, 3: high").callback(this, &GraphicsEngine::detailLevelParticleChanged);
+  }
+
+  void GraphicsEngine::detailLevelParticleChanged()
+  {
+    for (ObjectList<ParticleInterface>::iterator it = ObjectList<ParticleInterface>::begin(); it; ++it)
+      it->detailLevelChanged(this->detailLevelParticle_);
   }
 
@@ -441,5 +443,5 @@
   void GraphicsEngine::windowMoved(Ogre::RenderWindow *rw)
   {
-    for (Iterator<orxonox::WindowEventListener> it = ObjectList<orxonox::WindowEventListener>::start(); it; ++it)
+    for (ObjectList<orxonox::WindowEventListener>::iterator it = ObjectList<orxonox::WindowEventListener>::begin(); it; ++it)
       it->windowMoved();
   }
@@ -453,5 +455,5 @@
   void GraphicsEngine::windowResized(Ogre::RenderWindow *rw)
   {
-    for (Iterator<orxonox::WindowEventListener> it = ObjectList<orxonox::WindowEventListener>::start(); it; ++it)
+    for (ObjectList<orxonox::WindowEventListener>::iterator it = ObjectList<orxonox::WindowEventListener>::begin(); it; ++it)
       it->windowResized(this->renderWindow_->getWidth(), this->renderWindow_->getHeight());
   }
@@ -463,5 +465,5 @@
   void GraphicsEngine::windowFocusChanged(Ogre::RenderWindow *rw)
   {
-    for (Iterator<orxonox::WindowEventListener> it = ObjectList<orxonox::WindowEventListener>::start(); it; ++it)
+    for (ObjectList<orxonox::WindowEventListener>::iterator it = ObjectList<orxonox::WindowEventListener>::begin(); it; ++it)
       it->windowFocusChanged();
   }
Index: code/trunk/src/orxonox/GraphicsEngine.h
===================================================================
--- code/trunk/src/orxonox/GraphicsEngine.h	(revision 1735)
+++ code/trunk/src/orxonox/GraphicsEngine.h	(revision 1747)
@@ -56,4 +56,5 @@
         public:
             void setConfigValues();
+            void detailLevelParticleChanged();
             bool setup();
             bool declareRessourceLocations();
Index: code/trunk/src/orxonox/Main.cc
===================================================================
--- code/trunk/src/orxonox/Main.cc	(revision 1735)
+++ code/trunk/src/orxonox/Main.cc	(revision 1747)
@@ -37,5 +37,5 @@
 
 #include "util/OrxonoxPlatform.h"
-#include "core/SignalHandler.h"
+#include "SignalHandler.h"
 #include "Orxonox.h"
 
Index: code/trunk/src/orxonox/Orxonox.cc
===================================================================
--- code/trunk/src/orxonox/Orxonox.cc	(revision 1735)
+++ code/trunk/src/orxonox/Orxonox.cc	(revision 1747)
@@ -54,10 +54,11 @@
 // core
 #include "core/ConfigFileManager.h"
+#include "core/Iterator.h"
 #include "core/ConsoleCommand.h"
-#include "core/Debug.h"
 #include "core/Loader.h"
 #include "core/input/InputManager.h"
 #include "core/TclBind.h"
 #include "core/Core.h"
+#include "util/Debug.h"
 
 // audio
@@ -85,7 +86,7 @@
 namespace orxonox
 {
-  SetConsoleCommandShortcut(Orxonox, exit).setKeybindMode(KeybindMode::OnPress);
-  SetConsoleCommandShortcut(Orxonox, slomo).setAccessLevel(AccessLevel::Offline).setDefaultValue(0, 1.0).setAxisParamIndex(0).setIsAxisRelative(false);
-  SetConsoleCommandShortcut(Orxonox, setTimeFactor).setAccessLevel(AccessLevel::Offline).setDefaultValue(0, 1.0);
+  SetConsoleCommandShortcut(Orxonox, exit).keybindMode(KeybindMode::OnPress);
+  SetConsoleCommandShortcut(Orxonox, slomo).accessLevel(AccessLevel::Offline).defaultValue(0, 1.0).axisParamIndex(0).isAxisRelative(false);
+  SetConsoleCommandShortcut(Orxonox, setTimeFactor).accessLevel(AccessLevel::Offline).defaultValue(0, 1.0);
 
   /**
@@ -181,5 +182,5 @@
     float change = factor / Orxonox::getSingleton()->getTimeFactor();
     Orxonox::getSingleton()->timefactor_ = factor;
-    for (Iterator<ParticleInterface> it = ObjectList<ParticleInterface>::begin(); it; ++it)
+    for (ObjectList<ParticleInterface>::iterator it = ObjectList<ParticleInterface>::begin(); it; ++it)
         it->setSpeedFactor(it->getSpeedFactor() * change);
 
@@ -197,7 +198,7 @@
   {
 #ifdef _DEBUG
-    ConfigFileManager::getSingleton()->setFile(CFT_Settings, "orxonox_d.ini");
+    ConfigFileManager::getInstance()->setFile(CFT_Settings, "orxonox_d.ini");
 #else
-    ConfigFileManager::getSingleton()->setFile(CFT_Settings, "orxonox.ini");
+    ConfigFileManager::getInstance()->setFile(CFT_Settings, "orxonox.ini");
 #endif
     Factory::createClassHierarchy();
@@ -442,5 +443,5 @@
 
     unsigned long frameCount = 0;
-    
+
     // TODO: this would very well fit into a configValue
     const unsigned long refreshTime = 200000;
@@ -468,8 +469,8 @@
 
       // Call those objects that need the real time
-      for (Iterator<TickableReal> it = ObjectList<TickableReal>::start(); it; ++it)
+      for (ObjectList<TickableReal>::iterator it = ObjectList<TickableReal>::begin(); it; ++it)
         it->tick(dt);
       // Call the scene objects
-      for (Iterator<Tickable> it = ObjectList<Tickable>::start(); it; ++it)
+      for (ObjectList<Tickable>::iterator it = ObjectList<Tickable>::begin(); it; ++it)
         it->tick(dt * this->timefactor_);
 
Index: code/trunk/src/orxonox/OrxonoxStableHeaders.h
===================================================================
--- code/trunk/src/orxonox/OrxonoxStableHeaders.h	(revision 1735)
+++ code/trunk/src/orxonox/OrxonoxStableHeaders.h	(revision 1747)
@@ -92,7 +92,9 @@
 
 #include "util/Convert.h"
+#include "util/Debug.h"
 #include "util/Math.h"
 #include "util/Multitype.h"
-#include "util/MultiTypeMath.h"
+#include "util/OutputBuffer.h"
+#include "util/OutputHandler.h"
 #include "util/Sleep.h"
 #include "util/String.h"
@@ -104,7 +106,4 @@
 #include "core/CoreIncludes.h"
 #include "core/ConfigValueIncludes.h"
-#include "core/Debug.h"
-#include "core/OutputBuffer.h"
-#include "core/OutputHandler.h"
 #include "core/Executor.h"
 #include "core/XMLPort.h"
Index: code/trunk/src/orxonox/Radar.cc
===================================================================
--- code/trunk/src/orxonox/Radar.cc	(revision 1735)
+++ code/trunk/src/orxonox/Radar.cc	(revision 1747)
@@ -39,10 +39,11 @@
 #include "core/CoreIncludes.h"
 #include "core/ConsoleCommand.h"
+#include "core/Iterator.h"
 #include "RadarListener.h"
 
 namespace orxonox
 {
-    SetConsoleCommand(Radar, cycleNavigationFocus, true).setAccessLevel(AccessLevel::User);
-    SetConsoleCommand(Radar, releaseNavigationFocus, true).setAccessLevel(AccessLevel::User);
+    SetConsoleCommand(Radar, cycleNavigationFocus, true).accessLevel(AccessLevel::User);
+    SetConsoleCommand(Radar, releaseNavigationFocus, true).accessLevel(AccessLevel::User);
 
     Radar* Radar::instance_s = 0;
@@ -106,9 +107,9 @@
         }
 
-        for (Iterator<RadarListener> itListener = ObjectList<RadarListener>::begin(); itListener; ++itListener)
+        for (ObjectList<RadarListener>::iterator itListener = ObjectList<RadarListener>::begin(); itListener; ++itListener)
         {
             (*itListener)->radarTick(dt);
 
-            for (Iterator<RadarViewable> itElement = ObjectList<RadarViewable>::begin(); itElement; ++itElement)
+            for (ObjectList<RadarViewable>::iterator itElement = ObjectList<RadarViewable>::begin(); itElement; ++itElement)
             {
                 if ((*itElement) != SpaceShip::getLocalShip() && (*itListener)->getRadarSensitivity() > (*itElement)->getRadarObjectCamouflage())
@@ -120,5 +121,5 @@
     void Radar::cycleFocus()
     {
-        if (*(ObjectList<RadarViewable>::begin()) == 0)
+        if (ObjectList<RadarViewable>::begin() == 0)
         {
             // list is empty
@@ -137,7 +138,7 @@
             float nextDistance = FLT_MAX;
             float minimumDistance = FLT_MAX;
-            Iterator<RadarViewable> itFallback = 0;
-
-            for (Iterator<RadarViewable> it = ObjectList<RadarViewable>::begin(); it; ++it)
+            ObjectList<RadarViewable>::iterator itFallback = 0;
+
+            for (ObjectList<RadarViewable>::iterator it = ObjectList<RadarViewable>::begin(); it; ++it)
             {
                 if (*it == SpaceShip::getLocalShip())
@@ -181,5 +182,5 @@
         // iterate through all Radar Objects
         unsigned int i = 0;
-        for (Iterator<RadarViewable> it = ObjectList<RadarViewable>::start(); it; ++it, ++i)
+        for (ObjectList<RadarViewable>::iterator it = ObjectList<RadarViewable>::begin(); it; ++it, ++i)
         {
             COUT(3) << i++ << ": " << (*it)->getWorldPosition() << std::endl;
Index: code/trunk/src/orxonox/Radar.h
===================================================================
--- code/trunk/src/orxonox/Radar.h	(revision 1735)
+++ code/trunk/src/orxonox/Radar.h	(revision 1747)
@@ -55,5 +55,5 @@
         RadarBase() { }
     };
- 
+
     class _OrxonoxExport Radar : public Tickable, private virtual RadarBase
     {
@@ -61,4 +61,6 @@
         Radar();
         ~Radar();
+
+        virtual void tick(float dt);
 
         const RadarViewable* getFocus();
@@ -75,5 +77,4 @@
     private:
         Radar(Radar& instance);
-        void tick(float dt);
 
         void releaseFocus();
@@ -81,8 +82,8 @@
         void cycleFocus();
 
-        Iterator<RadarViewable> itFocus_;
+        ObjectListIterator<RadarViewable> itFocus_;
         RadarViewable* focus_;
         std::map<std::string, RadarViewable::Shape> objectTypes_;
-        int objectTypeCounter_; 
+        int objectTypeCounter_;
 
         static Radar* instance_s;
Index: code/trunk/src/orxonox/RadarViewable.cc
===================================================================
--- code/trunk/src/orxonox/RadarViewable.cc	(revision 1735)
+++ code/trunk/src/orxonox/RadarViewable.cc	(revision 1747)
@@ -29,5 +29,5 @@
 #include "OrxonoxStableHeaders.h"
 #include "RadarViewable.h"
-#include "core/Debug.h"
+#include "util/Debug.h"
 #include "core/CoreIncludes.h"
 #include "objects/WorldEntity.h"
Index: code/trunk/src/orxonox/RadarViewable.h
===================================================================
--- code/trunk/src/orxonox/RadarViewable.h	(revision 1735)
+++ code/trunk/src/orxonox/RadarViewable.h	(revision 1747)
@@ -33,5 +33,5 @@
 #include <string>
 #include "util/Math.h"
-#include "core/Debug.h"
+#include "util/Debug.h"
 #include "core/OrxonoxClass.h"
 
Index: code/trunk/src/orxonox/Settings.cc
===================================================================
--- code/trunk/src/orxonox/Settings.cc	(revision 1735)
+++ code/trunk/src/orxonox/Settings.cc	(revision 1747)
@@ -68,5 +68,12 @@
   void Settings::setConfigValues()
   {
-    SetConfigValue(dataPath_, "../../Media/").description("Relative path to the game data.");
+    SetConfigValue(dataPath_, "../../Media/").description("Relative path to the game data.").callback(this, &Settings::dataPathChanged);
+  }
+
+  /**
+    @brief Callback function if the datapath has changed.
+  */
+  void Settings::dataPathChanged()
+  {
     if (dataPath_ != "" && dataPath_[dataPath_.size() - 1] != '/')
     {
Index: code/trunk/src/orxonox/Settings.h
===================================================================
--- code/trunk/src/orxonox/Settings.h	(revision 1735)
+++ code/trunk/src/orxonox/Settings.h	(revision 1747)
@@ -48,4 +48,5 @@
     public:
       void setConfigValues();
+      void dataPathChanged();
 
       static const std::string& getDataPath();
Index: code/trunk/src/orxonox/SignalHandler.cc
===================================================================
--- code/trunk/src/orxonox/SignalHandler.cc	(revision 1747)
+++ code/trunk/src/orxonox/SignalHandler.cc	(revision 1747)
@@ -0,0 +1,353 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Christoph Renner
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+/**
+    @file SignalHandler.cc
+    @brief Implementation of the SignalHandler class.
+*/
+
+#include "OrxonoxStableHeaders.h"
+#include "SignalHandler.h"
+#include "util/Debug.h"
+
+#include <assert.h>
+#include <iostream>
+
+SignalHandler * SignalHandler::singletonRef = NULL;
+
+#if ORXONOX_PLATFORM != ORXONOX_PLATFORM_WIN32
+
+#include <wait.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/keysym.h>
+
+bool SignalHandler::bXAutoKeyRepeatOn_ = false;
+
+SignalHandler::SignalHandler()
+{
+}
+
+/**
+ * register signal handlers for SIGSEGV and SIGABRT
+ * @param appName path to executable eg argv[0]
+ * @param fileName filename to append backtrace to
+ */
+void SignalHandler::doCatch( const std::string & appName, const std::string & fileName )
+{
+  this->appName = appName;
+  this->fileName = fileName;
+
+  // prepare for restoring XAutoKeyRepeat
+  Display* display;
+  if ((display = XOpenDisplay(0)))
+  {
+    XKeyboardState oldState;
+    XGetKeyboardControl(display, &oldState);
+    if (oldState.global_auto_repeat == AutoRepeatModeOn)
+      bXAutoKeyRepeatOn_ = true;
+    else
+      bXAutoKeyRepeatOn_ = false;
+    XCloseDisplay(display);
+  }
+  else
+  {
+    std::cout << "Warning: couldn't open X display to restore XAutoKeyRepeat." << std::endl;
+    bXAutoKeyRepeatOn_ = false;
+  }
+
+
+  // make sure doCatch is only called once without calling dontCatch
+  assert( sigRecList.size() == 0 );
+
+  catchSignal( SIGSEGV );
+  catchSignal( SIGABRT );
+  catchSignal( SIGILL );
+}
+
+/**
+ * restore previous signal handlers
+ */
+void SignalHandler::dontCatch()
+{
+  for ( SignalRecList::iterator it = sigRecList.begin(); it != sigRecList.end(); it++ )
+  {
+    signal( it->signal, it->handler );
+  }
+
+  sigRecList.clear();
+}
+
+/**
+ * catch signal sig
+ * @param sig signal to catch
+ */
+void SignalHandler::catchSignal( int sig )
+{
+  sig_t handler = signal( sig, SignalHandler::sigHandler );
+
+  assert( handler != SIG_ERR );
+
+  SignalRec rec;
+  rec.signal = sig;
+  rec.handler = handler;
+
+  sigRecList.push_front( rec );
+}
+
+/**
+ * sigHandler is called when receiving signals
+ * @param sig
+ */
+void SignalHandler::sigHandler( int sig )
+{
+  for ( SignalCallbackList::iterator it = SignalHandler::getInstance()->callbackList.begin(); it != SignalHandler::getInstance()->callbackList.end(); it++  )
+  {
+    (*(it->cb))( it->someData );
+  }
+
+  std::string sigName = "UNKNOWN";
+
+  switch ( sig )
+  {
+    case SIGSEGV:
+      sigName = "SIGSEGV";
+      break;
+    case SIGABRT:
+      sigName = "SIGABRT";
+      break;
+    case SIGILL:
+      sigName = "SIGILL";
+      break;
+  }
+
+  if (bXAutoKeyRepeatOn_)
+  {
+    std::cout << "Trying to restore XAutoKeyRepeat" << std::endl;
+    Display* display;
+    if ((display = XOpenDisplay(0)))
+    {
+      XAutoRepeatOn(display);
+      XCloseDisplay(display);
+    }
+  }
+
+  COUT(0) << "recieved signal " << sigName.c_str() << std::endl << "try to write backtrace to file orxonox.log" << std::endl;
+
+  int sigPipe[2];
+  if ( pipe(sigPipe) == -1 )
+  {
+    perror("pipe failed!\n");
+    exit(EXIT_FAILURE);
+  }
+
+  int sigPid = fork();
+
+  if ( sigPid == -1 )
+  {
+    perror("fork failed!\n");
+    exit(EXIT_FAILURE);
+  }
+
+  // gdb will be attached to this process
+  if ( sigPid == 0 )
+  {
+    getInstance()->dontCatch();
+    // wait for message from parent when it has attached gdb
+    int someData;
+
+    read( sigPipe[0], &someData, sizeof(someData) );
+
+    if ( someData != 0x12345678 )
+    {
+      COUT(0) << "something went wrong :(" << std::endl;
+    }
+
+    return;
+  }
+
+  int gdbIn[2];
+  int gdbOut[2];
+  int gdbErr[2];
+
+  if ( pipe(gdbIn) == -1 || pipe(gdbOut) == -1 || pipe(gdbErr) == -1 )
+  {
+    perror("pipe failed!\n");
+    kill( sigPid, SIGTERM );
+    waitpid( sigPid, NULL, 0 );
+    exit(EXIT_FAILURE);
+  }
+
+  int gdbPid = fork();
+  // this process will run gdb
+
+  if ( gdbPid == -1 )
+  {
+    perror("fork failed\n");
+    kill( sigPid, SIGTERM );
+    waitpid( sigPid, NULL, 0 );
+    exit(EXIT_FAILURE);
+  }
+
+  if ( gdbPid == 0 )
+  {
+    // start gdb
+
+    close(gdbIn[1]);
+    close(gdbOut[0]);
+    close(gdbErr[0]);
+
+    dup2( gdbIn[0], STDIN_FILENO );
+    dup2( gdbOut[1], STDOUT_FILENO );
+    dup2( gdbErr[1], STDERR_FILENO );
+
+    execlp( "sh", "sh", "-c", "gdb", (void*)NULL);
+  }
+
+  char cmd[256];
+  snprintf( cmd, 256, "file %s\nattach %d\nc\n", getInstance()->appName.c_str(), sigPid );
+  write( gdbIn[1], cmd, strlen(cmd) );
+
+  int charsFound = 0;
+  int promptFound = 0;
+  char byte;
+  while ( read( gdbOut[0], &byte, 1 ) == 1 )
+  {
+    if (
+      charsFound == 0 && byte == '(' ||
+      charsFound == 1 && byte == 'g' ||
+      charsFound == 2 && byte == 'd' ||
+      charsFound == 3 && byte == 'b' ||
+      charsFound == 4 && byte == ')' ||
+      charsFound == 5 && byte == ' '
+        )
+          charsFound++;
+    else
+      charsFound = 0;
+
+    if ( charsFound == 6 )
+    {
+      promptFound++;
+      charsFound = 0;
+    }
+
+    if ( promptFound == 3 )
+    {
+      break;
+    }
+  }
+
+  int someData = 0x12345678;
+  write( sigPipe[1], &someData, sizeof(someData) );
+
+  write( gdbIn[1], "bt\nk\nq\n", 7 );
+
+
+  charsFound = 0;
+  promptFound = 0;
+  std::string bt;
+  while ( read( gdbOut[0], &byte, 1 ) == 1 )
+  {
+    bt += std::string( &byte, 1 );
+
+    if (
+      charsFound == 0 && byte == '(' ||
+      charsFound == 1 && byte == 'g' ||
+      charsFound == 2 && byte == 'd' ||
+      charsFound == 3 && byte == 'b' ||
+      charsFound == 4 && byte == ')' ||
+      charsFound == 5 && byte == ' '
+        )
+          charsFound++;
+    else
+      charsFound = 0;
+
+    if ( charsFound == 6 )
+    {
+      promptFound++;
+      charsFound = 0;
+      bt += "\n";
+    }
+
+    if ( promptFound == 3 )
+    {
+      break;
+    }
+  }
+
+
+  waitpid( sigPid, NULL, 0 );
+  waitpid( gdbPid, NULL, 0 );
+
+  int wsRemoved = 0;
+
+  while ( wsRemoved < 2 && bt.length() > 0 )
+  {
+    if ( bt[1] == '\n' )
+      wsRemoved++;
+    bt.erase(0, 1);
+  }
+
+  if ( bt.length() > 0 )
+    bt.erase(0, 1);
+
+  time_t now = time(NULL);
+
+  std::string timeString = "\n\n\n\n"
+                     "=======================================================\n"
+                     "= time: " + std::string(ctime(&now)) +
+         "=======================================================\n";
+  bt.insert(0, timeString);
+
+  FILE * f = fopen( getInstance()->fileName.c_str(), "a" );
+
+  if ( !f )
+  {
+    perror( ( std::string( "could not append to " ) + getInstance()->fileName ).c_str() );
+    exit(EXIT_FAILURE);
+  }
+
+  if ( fwrite( bt.c_str(), 1, bt.length(), f ) != bt.length() )
+  {
+    COUT(0) << "could not write " << bt.length() << " byte to " << getInstance()->fileName << std::endl;
+    exit(EXIT_FAILURE);
+  }
+
+  exit(EXIT_FAILURE);
+}
+
+void SignalHandler::registerCallback( SignalCallback cb, void * someData )
+{
+  SignalCallbackRec rec;
+  rec.cb = cb;
+  rec.someData = someData;
+
+  callbackList.push_back(rec);
+}
+
+#endif /* ORXONOX_PLATFORM == ORXONOX_PLATFORM_WIN32 */
Index: code/trunk/src/orxonox/SignalHandler.h
===================================================================
--- code/trunk/src/orxonox/SignalHandler.h	(revision 1747)
+++ code/trunk/src/orxonox/SignalHandler.h	(revision 1747)
@@ -0,0 +1,109 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Christoph Renner
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+/**
+    @file SignalHandler.h
+    @brief Definition of the SignalHandler class.
+*/
+
+#ifndef _SignalHandler_H__
+#define _SignalHandler_H__
+
+#include "OrxonoxPrereqs.h"
+
+#include <list>
+#include <string>
+
+typedef int (*SignalCallback)( void * someData );
+
+#if ORXONOX_PLATFORM != ORXONOX_PLATFORM_WIN32
+#include <signal.h>
+
+struct SignalRec
+{
+  int signal;
+  sig_t handler;
+};
+
+struct SignalCallbackRec
+{
+  SignalCallback cb;
+  void * someData;
+};
+
+
+typedef std::list<SignalRec> SignalRecList;
+typedef std::list<SignalCallbackRec> SignalCallbackList;
+
+class SignalHandler
+{
+  private:
+    SignalHandler();
+  public:
+    inline static SignalHandler* getInstance() { if (!SignalHandler::singletonRef) SignalHandler::singletonRef = new SignalHandler(); return SignalHandler::singletonRef; }
+    ~SignalHandler(){ SignalHandler::singletonRef = NULL; }
+
+    void registerCallback( SignalCallback cb, void * someData );
+
+    void doCatch( const std::string & appName, const std::string & fileName );
+    void dontCatch();
+
+  private:
+    static void sigHandler( int sig );
+
+    void catchSignal( int sig );
+    SignalRecList sigRecList;
+
+    SignalCallbackList callbackList;
+
+    static SignalHandler * singletonRef;
+
+    std::string appName;
+    std::string fileName;
+
+    // used to turn on KeyAutoRepeat if OIS crashes
+    static bool bXAutoKeyRepeatOn_;
+};
+
+#else /* ORXONOX_PLATFORM == ORXONOX_PLATFORM_WIN32 */
+
+class _OrxonoxExport SignalHandler
+{
+  public:
+    inline static SignalHandler* getInstance() { if (!SignalHandler::singletonRef) SignalHandler::singletonRef = new SignalHandler(); return SignalHandler::singletonRef; };
+    void doCatch( const std::string & appName, const std::string & fileName ) {};
+    void dontCatch() {};
+    void registerCallback( SignalCallback cb, void * someData ) {};
+
+  private:
+    static SignalHandler * singletonRef;
+};
+
+#endif /* ORXONOX_PLATFORM == ORXONOX_PLATFORM_WIN32 */
+
+#endif /* _SignalHandler_H__ */
Index: code/trunk/src/orxonox/objects/Ambient.cc
===================================================================
--- code/trunk/src/orxonox/objects/Ambient.cc	(revision 1735)
+++ code/trunk/src/orxonox/objects/Ambient.cc	(revision 1747)
@@ -39,13 +39,13 @@
 #include "util/Convert.h"
 #include "util/Math.h"
-#include "core/Debug.h"
+#include "util/Debug.h"
 #include "core/CoreIncludes.h"
-#include "GraphicsEngine.h"
 #include "core/XMLPort.h"
 #include "core/ConsoleCommand.h"
+#include "GraphicsEngine.h"
 
 namespace orxonox
 {
-    SetConsoleCommand(Ambient, setAmbientLightTest, false).setDefaultValues(ColourValue(1, 1, 1, 1)).setAccessLevel(AccessLevel::Offline);
+    SetConsoleCommandAlias(Ambient, setAmbientLightTest, "setAmbientLight", false).defaultValues(ColourValue(1, 1, 1, 1)).accessLevel(AccessLevel::Offline);
 
     CreateFactory(Ambient);
@@ -64,18 +64,19 @@
     }
 
-    bool Ambient::create(){
-      GraphicsEngine::getSingleton().getSceneManager()->setAmbientLight(ambientLight_);
-      return Synchronisable::create();
+    bool Ambient::create()
+    {
+        GraphicsEngine::getSingleton().getSceneManager()->setAmbientLight(ambientLight_);
+        return Synchronisable::create();
     }
-    
-    void Ambient::registerAllVariables(){
-      registerVar(&ambientLight_, sizeof(ColourValue), network::DATA);
-      
+
+    void Ambient::registerAllVariables()
+    {
+        registerVar(&ambientLight_, sizeof(ColourValue), network::DATA);
     }
 
     void Ambient::setAmbientLight(const ColourValue& colour)
     {
-	    GraphicsEngine::getSingleton().getSceneManager()->setAmbientLight(colour);
-      ambientLight_=colour;	
+        GraphicsEngine::getSingleton().getSceneManager()->setAmbientLight(colour);
+        ambientLight_=colour;
     }
 
@@ -88,7 +89,7 @@
     void Ambient::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
-        BaseObject::XMLPort(xmlelement, mode);
+        SUPER(Ambient, XMLPort, xmlelement, mode);
 
-        XMLPortParamLoadOnly(Ambient, "colourvalue", setAmbientLight, xmlelement, mode);
+        XMLPortParam(Ambient, "colourvalue", setAmbientLight, getAmbienetLight, xmlelement, mode);
         create();
     }
Index: code/trunk/src/orxonox/objects/Ambient.h
===================================================================
--- code/trunk/src/orxonox/objects/Ambient.h	(revision 1735)
+++ code/trunk/src/orxonox/objects/Ambient.h	(revision 1747)
@@ -45,7 +45,10 @@
 
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
-            void setAmbientLight(const ColourValue& colour);
             virtual bool create();
             void registerAllVariables();
+
+            void setAmbientLight(const ColourValue& colour);
+            inline const ColourValue& getAmbienetLight() const
+                { return this->ambientLight_; }
 
             static void setAmbientLightTest(const ColourValue& colour)
Index: code/trunk/src/orxonox/objects/Backlight.cc
===================================================================
--- code/trunk/src/orxonox/objects/Backlight.cc	(revision 1735)
+++ code/trunk/src/orxonox/objects/Backlight.cc	(revision 1747)
@@ -103,5 +103,5 @@
     void Backlight::tick(float dt)
     {
-        WorldEntity::tick(dt);
+        SUPER(Backlight, tick, dt);
 
         if (this->isActive())
@@ -147,5 +147,5 @@
     void Backlight::changedVisibility()
     {
-        WorldEntity::changedVisibility();
+        SUPER(Backlight, changedVisibility);
 
         this->billboard_.setVisible(this->isVisible());
Index: code/trunk/src/orxonox/objects/BillboardProjectile.cc
===================================================================
--- code/trunk/src/orxonox/objects/BillboardProjectile.cc	(revision 1735)
+++ code/trunk/src/orxonox/objects/BillboardProjectile.cc	(revision 1747)
@@ -63,5 +63,5 @@
     void BillboardProjectile::changedVisibility()
     {
-        Projectile::changedVisibility();
+        SUPER(BillboardProjectile, changedVisibility);
         this->billboard_.setVisible(this->isVisible());
     }
Index: code/trunk/src/orxonox/objects/Camera.cc
===================================================================
--- code/trunk/src/orxonox/objects/Camera.cc	(revision 1735)
+++ code/trunk/src/orxonox/objects/Camera.cc	(revision 1747)
@@ -42,5 +42,5 @@
 #include "util/Convert.h"
 #include "util/Math.h"
-#include "core/Debug.h"
+#include "util/Debug.h"
 #include "core/CoreIncludes.h"
 #include "GraphicsEngine.h"
Index: code/trunk/src/orxonox/objects/Model.cc
===================================================================
--- code/trunk/src/orxonox/objects/Model.cc	(revision 1735)
+++ code/trunk/src/orxonox/objects/Model.cc	(revision 1747)
@@ -65,14 +65,9 @@
     void Model::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
-        WorldEntity::XMLPort(xmlelement, mode);
+        SUPER(Model, XMLPort, xmlelement, mode);
 
-        XMLPortParamLoadOnly(Model, "mesh", setMesh, xmlelement, mode);
+        XMLPortParam(Model, "mesh", setMesh, getMesh, xmlelement, mode);
 
         Model::create();
-    }
-
-    void Model::setMesh(const std::string& meshname)
-    {
-        this->meshSrc_ = meshname;
     }
 
@@ -98,5 +93,5 @@
     void Model::changedVisibility()
     {
-        WorldEntity::changedVisibility();
+        SUPER(Model, changedVisibility);
         if (this->isInitialized())
             this->mesh_.setVisible(this->isVisible());
Index: code/trunk/src/orxonox/objects/Model.h
===================================================================
--- code/trunk/src/orxonox/objects/Model.h	(revision 1735)
+++ code/trunk/src/orxonox/objects/Model.h	(revision 1747)
@@ -45,5 +45,8 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
             virtual void changedVisibility();
-            void setMesh(const std::string& meshname);
+            inline void setMesh(const std::string& meshname)
+                { this->meshSrc_ = meshname; }
+            inline const std::string& getMesh() const
+                { return this->meshSrc_; }
             virtual bool create();
 
Index: code/trunk/src/orxonox/objects/NPC.cc
===================================================================
--- code/trunk/src/orxonox/objects/NPC.cc	(revision 1735)
+++ code/trunk/src/orxonox/objects/NPC.cc	(revision 1747)
@@ -31,4 +31,5 @@
 
 #include "core/CoreIncludes.h"
+#include "core/Iterator.h"
 
 namespace orxonox {
@@ -56,10 +57,10 @@
     movable_ = movable;
   }
-  
+
   void NPC::registerAllVariables(){
     Model::registerAllVariables();
     registerVar(&movable_, sizeof(movable_), network::DATA);
   }
-  
+
 
   /**
@@ -112,5 +113,5 @@
     int numberOfNeighbour = 0;  //number of observed neighbours
     float distance = 0;  // distance to the actual element
-    for(Iterator<WorldEntity> it = ObjectList<WorldEntity>::start(); it; ++it) {  //go through all elements
+    for(ObjectList<WorldEntity>::iterator it = ObjectList<WorldEntity>::begin(); it; ++it) {  //go through all elements
       distance = getDistance(*it);  //get distance between this and actual
       if ((distance > 0) && (distance < SEPERATIONDISTANCE)) {  //do only if actual is inside detectionradius
@@ -139,5 +140,5 @@
     //float distance = 0;
     //go through all elements
-    for(Iterator<NPC> it = ObjectList<NPC>::start(); it; ++it) {  //just working with 3 elements at the moment
+    for(ObjectList<NPC>::iterator it = ObjectList<NPC>::begin(); it; ++it) {  //just working with 3 elements at the moment
       float distance = getDistance(*it);  //get distance between this and actual
       if ((distance > 0) && (distance < ALIGNMENTDISTANCE)) {  //check if actual element is inside detectionradius
@@ -159,5 +160,5 @@
     //float distance = 0;
     //go through all elements
-    for(Iterator<NPC> it = ObjectList<NPC>::start(); it; ++it) {  //just working with 3 elements at the moment
+    for(ObjectList<NPC>::iterator it = ObjectList<NPC>::begin(); it; ++it) {  //just working with 3 elements at the moment
       float distance = getDistance(*it);  //get distance between this and actual
       if ((distance > 0) && (distance < COHESIONDISTANCE)) {  //check if actual element is inside detectionradius
Index: code/trunk/src/orxonox/objects/NPC.h
===================================================================
--- code/trunk/src/orxonox/objects/NPC.h	(revision 1735)
+++ code/trunk/src/orxonox/objects/NPC.h	(revision 1747)
@@ -48,5 +48,5 @@
       NPC();
       virtual ~NPC();
-      void tick(float dt);
+      virtual void tick(float dt);
       void update();
       void setValues(Vector3 location, Vector3 speed, Vector3 acceleration, bool movable);
Index: code/trunk/src/orxonox/objects/ParticleProjectile.cc
===================================================================
--- code/trunk/src/orxonox/objects/ParticleProjectile.cc	(revision 1735)
+++ code/trunk/src/orxonox/objects/ParticleProjectile.cc	(revision 1747)
@@ -32,4 +32,5 @@
 #include "SpaceShip.h"
 #include "core/CoreIncludes.h"
+#include "core/ConfigValueIncludes.h"
 
 namespace orxonox
@@ -52,4 +53,6 @@
             this->particles_ = 0;
         }
+
+        this->setConfigValues();
     }
 
@@ -60,7 +63,12 @@
     }
 
+    void ParticleProjectile::setConfigValues()
+    {
+        SetConfigValue(speed_, 5000.0).description("The speed of a projectile in units per second").callback((Projectile*)this, &ParticleProjectile::speedChanged);
+    }
+
     void ParticleProjectile::changedVisibility()
     {
-        BillboardProjectile::changedVisibility();
+        SUPER(ParticleProjectile, changedVisibility);
         this->particles_->setEnabled(this->isVisible());
     }
Index: code/trunk/src/orxonox/objects/ParticleProjectile.h
===================================================================
--- code/trunk/src/orxonox/objects/ParticleProjectile.h	(revision 1735)
+++ code/trunk/src/orxonox/objects/ParticleProjectile.h	(revision 1747)
@@ -44,4 +44,5 @@
             virtual ~ParticleProjectile();
             virtual void changedVisibility();
+            void setConfigValues();
 
         private:
Index: code/trunk/src/orxonox/objects/Projectile.cc
===================================================================
--- code/trunk/src/orxonox/objects/Projectile.cc	(revision 1735)
+++ code/trunk/src/orxonox/objects/Projectile.cc	(revision 1747)
@@ -35,4 +35,5 @@
 #include "core/Executor.h"
 #include "core/ConfigValueIncludes.h"
+#include "core/Iterator.h"
 #include "tools/ParticleInterface.h"
 
@@ -43,5 +44,5 @@
 namespace orxonox
 {
-    float Projectile::speed_ = 5000;
+    float Projectile::speed_s = 5000;
 
     Projectile::Projectile(SpaceShip* owner) : owner_(owner)
@@ -73,13 +74,17 @@
         SetConfigValue(damage_, 15.0).description("The damage caused by the projectile");
         SetConfigValue(lifetime_, 4.0).description("The time in seconds a projectile stays alive");
-        SetConfigValue(speed_, 5000.0).description("The speed of a projectile in units per second");
+        SetConfigValue(speed_, 5000.0).description("The speed of a projectile in units per second").callback(this, &Projectile::speedChanged);
+    }
 
-	if(this->owner_)
-          this->setVelocity(this->owner_->getInitialDir() * this->speed_);
+    void Projectile::speedChanged()
+    {
+        Projectile::speed_s = this->speed_;
+        if (this->owner_)
+            this->setVelocity(this->owner_->getInitialDir() * this->speed_);
     }
 
     void Projectile::tick(float dt)
     {
-        WorldEntity::tick(dt);
+        SUPER(Projectile, tick, dt);
 
         if (!this->isActive())
@@ -87,9 +92,9 @@
 
         float radius;
-        for (Iterator<Model> it = ObjectList<Model>::start(); it; ++it)
+        for (ObjectList<Model>::iterator it = ObjectList<Model>::begin(); it; ++it)
         {
             if ((*it) != this->owner_)
             {
-                radius = it->getScale().x * 3.0;
+                radius = it->getScale3D().x * 3.0;
 
                 if (this->getPosition().squaredDistance(it->getPosition()) <= (radius*radius))
Index: code/trunk/src/orxonox/objects/Projectile.h
===================================================================
--- code/trunk/src/orxonox/objects/Projectile.h	(revision 1735)
+++ code/trunk/src/orxonox/objects/Projectile.h	(revision 1747)
@@ -42,9 +42,10 @@
             virtual ~Projectile();
             void setConfigValues();
+            void speedChanged();
             void destroyObject();
             virtual void tick(float dt);
 
             static float getSpeed()
-                { return Projectile::speed_; }
+                { return Projectile::speed_s; }
 
         protected:
@@ -55,5 +56,8 @@
             std::string explosionTemplateName_;
             std::string smokeTemplateName_;
-            static float speed_;
+        protected:
+            static float speed_s;
+            float speed_;
+        private:
             float lifetime_;
             float damage_;
Index: code/trunk/src/orxonox/objects/RotatingProjectile.cc
===================================================================
--- code/trunk/src/orxonox/objects/RotatingProjectile.cc	(revision 1735)
+++ code/trunk/src/orxonox/objects/RotatingProjectile.cc	(revision 1747)
@@ -65,8 +65,14 @@
     void RotatingProjectile::setConfigValues()
     {
-        SetConfigValue(colour_, ColourValue(1.0, 0.0, 0.0));
+        SetConfigValue(colour_, ColourValue(1.0, 0.0, 0.0)).callback(this, &RotatingProjectile::colourChanged);
+    }
 
-        this->rotatingBillboard1_.getBillboardSet()->getBillboard(0)->setColour(this->colour_);
-        this->rotatingBillboard2_.getBillboardSet()->getBillboard(0)->setColour(this->colour_);
+    void RotatingProjectile::colourChanged()
+    {
+        if (this->isInitialized())
+        {
+            this->rotatingBillboard1_.getBillboardSet()->getBillboard(0)->setColour(this->colour_);
+            this->rotatingBillboard2_.getBillboardSet()->getBillboard(0)->setColour(this->colour_);
+        }
     }
 
@@ -81,10 +87,10 @@
         }
 
-        Projectile::tick(dt);
+        SUPER(RotatingProjectile, tick, dt);
     }
 
     void RotatingProjectile::changedVisibility()
     {
-        BillboardProjectile::changedVisibility();
+        SUPER(RotatingProjectile, changedVisibility);
         this->rotatingBillboard1_.setVisible(this->isVisible());
         this->rotatingBillboard2_.setVisible(this->isVisible());
Index: code/trunk/src/orxonox/objects/RotatingProjectile.h
===================================================================
--- code/trunk/src/orxonox/objects/RotatingProjectile.h	(revision 1735)
+++ code/trunk/src/orxonox/objects/RotatingProjectile.h	(revision 1747)
@@ -14,4 +14,5 @@
             virtual ~RotatingProjectile();
             void setConfigValues();
+            void colourChanged();
             virtual void tick(float dt);
             virtual void changedVisibility();
Index: code/trunk/src/orxonox/objects/Skybox.cc
===================================================================
--- code/trunk/src/orxonox/objects/Skybox.cc	(revision 1735)
+++ code/trunk/src/orxonox/objects/Skybox.cc	(revision 1747)
@@ -37,6 +37,6 @@
 #include "GraphicsEngine.h"
 #include "core/CoreIncludes.h"
-#include "core/Debug.h"
 #include "core/XMLPort.h"
+#include "util/Debug.h"
 
 namespace orxonox
@@ -59,9 +59,4 @@
     }
 
-    void Skybox::setSkyboxSrc(const std::string& src)
-    {
-        this->skyboxSrc_ = src;
-    }
-
     /**
         @brief XML loading and saving.
@@ -72,7 +67,7 @@
     void Skybox::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
-        BaseObject::XMLPort(xmlelement, mode);
+        SUPER(Skybox, XMLPort, xmlelement, mode);
 
-        XMLPortParamLoadOnly(Skybox, "src", setSkyboxSrc, xmlelement, mode);
+        XMLPortParam(Skybox, "src", setSkyboxSrc, getSkyboxSrc, xmlelement, mode);
         create();
     }
@@ -91,5 +86,5 @@
     void Skybox::changedVisibility()
     {
-        BaseObject::changedVisibility();
+        SUPER(Skybox, changedVisibility);
         GraphicsEngine::getSingleton().getSceneManager()->setSkyBox(this->isVisible(), this->skyboxSrc_);
     }
Index: code/trunk/src/orxonox/objects/Skybox.h
===================================================================
--- code/trunk/src/orxonox/objects/Skybox.h	(revision 1735)
+++ code/trunk/src/orxonox/objects/Skybox.h	(revision 1747)
@@ -49,5 +49,9 @@
             virtual bool create();
             void registerAllVariables();
-            void setSkyboxSrc(const std::string &src);
+
+            inline void setSkyboxSrc(const std::string &src)
+                { this->skyboxSrc_ = src; }
+            inline const std::string& getSkyboxSrc() const
+                { return this->skyboxSrc_; }
 
         private:
Index: code/trunk/src/orxonox/objects/SpaceShip.cc
===================================================================
--- code/trunk/src/orxonox/objects/SpaceShip.cc	(revision 1735)
+++ code/trunk/src/orxonox/objects/SpaceShip.cc	(revision 1747)
@@ -37,34 +37,33 @@
 #include "util/Convert.h"
 #include "util/Math.h"
-
+#include "util/Debug.h"
 #include "core/CoreIncludes.h"
 #include "core/ConfigValueIncludes.h"
-#include "core/Debug.h"
+#include "core/Iterator.h"
+#include "core/input/InputManager.h"
 #include "core/XMLPort.h"
 #include "core/ConsoleCommand.h"
-#include "network/Host.h"
-
 #include "tools/ParticleInterface.h"
-
-#include "GraphicsEngine.h"
+#include "network/Client.h"
+#include "Backlight.h"
+#include "CameraHandler.h"
+#include "ParticleSpawner.h"
 #include "RotatingProjectile.h"
 #include "ParticleProjectile.h"
-#include "ParticleSpawner.h"
-#include "Backlight.h"
-#include "CameraHandler.h"
+#include "GraphicsEngine.h"
 
 namespace orxonox
 {
-    SetConsoleCommand(SpaceShip, setMaxSpeedTest, false).setAccessLevel(AccessLevel::Debug);
-    SetConsoleCommand(SpaceShip, whereAmI, true).setAccessLevel(AccessLevel::User);
-    SetConsoleCommand(SpaceShip, moveLongitudinal, true).setAccessLevel(AccessLevel::User).setDefaultValue(0, 1.0f).setAxisParamIndex(0).setKeybindMode(KeybindMode::OnHold);
-    SetConsoleCommand(SpaceShip, moveLateral, true).setAccessLevel(AccessLevel::User).setDefaultValue(0, 1.0f).setAxisParamIndex(0).setKeybindMode(KeybindMode::OnHold);
-    SetConsoleCommand(SpaceShip, moveYaw, true).setAccessLevel(AccessLevel::User).setDefaultValue(0, 1.0f).setAxisParamIndex(0).setKeybindMode(KeybindMode::OnHold);
-    SetConsoleCommand(SpaceShip, movePitch, true).setAccessLevel(AccessLevel::User).setDefaultValue(0, 1.0f).setAxisParamIndex(0).setKeybindMode(KeybindMode::OnHold);
-    SetConsoleCommand(SpaceShip, moveRoll, true).setAccessLevel(AccessLevel::User).setDefaultValue(0, 1.0f).setAxisParamIndex(0).setKeybindMode(KeybindMode::OnHold);
-    SetConsoleCommand(SpaceShip, fire, true).setAccessLevel(AccessLevel::User).setKeybindMode(KeybindMode::OnHold);
-    SetConsoleCommandGeneric(test1, SpaceShip, createConsoleCommand(createFunctor(&SpaceShip::setMaxSpeedTest), "setMaxSpeed"), false).setAccessLevel(AccessLevel::Debug);
-    SetConsoleCommandGeneric(test2, SpaceShip, createConsoleCommand(createFunctor(&SpaceShip::setMaxSpeedTest), "setMaxBlubber"), false).setAccessLevel(AccessLevel::Debug);
-    SetConsoleCommandGeneric(test3, SpaceShip, createConsoleCommand(createFunctor(&SpaceShip::setMaxSpeedTest), "setRofl"), false).setAccessLevel(AccessLevel::Debug);
+    SetConsoleCommand(SpaceShip, setMaxSpeedTest, false).accessLevel(AccessLevel::Debug);
+    SetConsoleCommand(SpaceShip, whereAmI, true).accessLevel(AccessLevel::User);
+    SetConsoleCommand(SpaceShip, moveLongitudinal, true).accessLevel(AccessLevel::User).defaultValue(0, 1.0f).axisParamIndex(0).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(SpaceShip, moveLateral, true).accessLevel(AccessLevel::User).defaultValue(0, 1.0f).axisParamIndex(0).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(SpaceShip, moveYaw, true).accessLevel(AccessLevel::User).defaultValue(0, 1.0f).axisParamIndex(0).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(SpaceShip, movePitch, true).accessLevel(AccessLevel::User).defaultValue(0, 1.0f).axisParamIndex(0).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(SpaceShip, moveRoll, true).accessLevel(AccessLevel::User).defaultValue(0, 1.0f).axisParamIndex(0).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommand(SpaceShip, fire, true).accessLevel(AccessLevel::User).keybindMode(KeybindMode::OnHold);
+    SetConsoleCommandAliasMulti(SpaceShip, setMaxSpeedTest, "setMaxSpeed", 1, false).accessLevel(AccessLevel::Debug);
+    SetConsoleCommandAliasMulti(SpaceShip, setMaxSpeedTest, "setMaxBlubber", 2, false).accessLevel(AccessLevel::Debug);
+    SetConsoleCommandAliasMulti(SpaceShip, setMaxSpeedTest, "setRofl", 3, false).accessLevel(AccessLevel::Debug);
 
     CreateFactory(SpaceShip);
@@ -74,6 +73,6 @@
 
     SpaceShip *SpaceShip::getLocalShip(){
-      Iterator<SpaceShip> it;
-      for(it = ObjectList<SpaceShip>::start(); it; ++it){
+      ObjectList<SpaceShip>::iterator it;
+      for(it = ObjectList<SpaceShip>::begin(); it; ++it){
         if( (it)->myShip_ )
           return *it;
@@ -289,5 +288,5 @@
     void SpaceShip::changedVisibility()
     {
-        Model::changedVisibility();
+        SUPER(SpaceShip, changedVisibility);
 
         this->tt1_->setEnabled(this->isVisible());
@@ -306,5 +305,5 @@
     void SpaceShip::changedActivity()
     {
-        Model::changedActivity();
+        SUPER(SpaceShip, changedActivity);
 
         this->tt1_->setEnabled(this->isVisible());
@@ -392,14 +391,14 @@
     void SpaceShip::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
-        Model::XMLPort(xmlelement, mode);
-
-        XMLPortParamLoadOnly(SpaceShip, "camera", setCamera, xmlelement, mode);
-        XMLPortParamLoadOnly(SpaceShip, "maxSpeed", setMaxSpeed, xmlelement, mode);
-        XMLPortParamLoadOnly(SpaceShip, "maxSideAndBackSpeed", setMaxSideAndBackSpeed, xmlelement, mode);
-        XMLPortParamLoadOnly(SpaceShip, "maxRotation", setMaxRotation, xmlelement, mode);
-        XMLPortParamLoadOnly(SpaceShip, "transAcc", setTransAcc, xmlelement, mode);
-        XMLPortParamLoadOnly(SpaceShip, "rotAcc", setRotAcc, xmlelement, mode);
-        XMLPortParamLoadOnly(SpaceShip, "transDamp", setTransDamp, xmlelement, mode);
-        XMLPortParamLoadOnly(SpaceShip, "rotDamp", setRotDamp, xmlelement, mode);
+        SUPER(SpaceShip, XMLPort, xmlelement, mode);
+
+        XMLPortParam(SpaceShip, "camera", setCamera, getCamera, xmlelement, mode);
+        XMLPortParam(SpaceShip, "maxSpeed", setMaxSpeed, getMaxSpeed, xmlelement, mode);
+        XMLPortParam(SpaceShip, "maxSideAndBackSpeed", setMaxSideAndBackSpeed, getMaxSideAndBackSpeed, xmlelement, mode);
+        XMLPortParam(SpaceShip, "maxRotation", setMaxRotation, getMaxRotation, xmlelement, mode);
+        XMLPortParam(SpaceShip, "transAcc", setTransAcc, getTransAcc, xmlelement, mode);
+        XMLPortParam(SpaceShip, "rotAcc", setRotAcc, getRotAcc, xmlelement, mode);
+        XMLPortParam(SpaceShip, "transDamp", setTransDamp, getTransDamp, xmlelement, mode);
+        XMLPortParam(SpaceShip, "rotDamp", setRotDamp, getRotDamp, xmlelement, mode);
 
         myShip_=true; //TODO: this is a hack
@@ -535,5 +534,5 @@
 
 
-        WorldEntity::tick(dt);
+        SUPER(SpaceShip, tick, dt);
 
         this->roll(this->mouseXRotation_ * dt);
Index: code/trunk/src/orxonox/objects/SpaceShipAI.cc
===================================================================
--- code/trunk/src/orxonox/objects/SpaceShipAI.cc	(revision 1735)
+++ code/trunk/src/orxonox/objects/SpaceShipAI.cc	(revision 1747)
@@ -44,6 +44,6 @@
 namespace orxonox
 {
-    SetConsoleCommand(SpaceShipAI, createEnemy, true).setDefaultValue(0, 1);
-    SetConsoleCommand(SpaceShipAI, killEnemies, true).setDefaultValue(0, 0);
+    SetConsoleCommand(SpaceShipAI, createEnemy, true).defaultValue(0, 1);
+    SetConsoleCommand(SpaceShipAI, killEnemies, true).defaultValue(0, 0);
 
     CreateFactory(SpaceShipAI);
@@ -72,5 +72,5 @@
     SpaceShipAI::~SpaceShipAI()
     {
-        for (Iterator<SpaceShipAI> it = ObjectList<SpaceShipAI>::begin(); it; ++it)
+        for (ObjectList<SpaceShipAI>::iterator it = ObjectList<SpaceShipAI>::begin(); it; ++it)
             it->shipDied(this);
     }
@@ -78,5 +78,5 @@
     void SpaceShipAI::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
-        SpaceShip::XMLPort(xmlelement, mode);
+        SUPER(SpaceShipAI, XMLPort, xmlelement, mode);
 
         this->actionTimer_.setTimer(ACTION_INTERVAL, true, this, createExecutor(createFunctor(&SpaceShipAI::action)));
@@ -111,5 +111,5 @@
     {
         int i = 0;
-        for (Iterator<SpaceShipAI> it = ObjectList<SpaceShipAI>::begin(); it; )
+        for (ObjectList<SpaceShipAI>::iterator it = ObjectList<SpaceShipAI>::begin(); it; )
         {
             (it++)->kill();
@@ -229,5 +229,5 @@
             this->doFire();
 
-        SpaceShip::tick(dt);
+        SUPER(SpaceShipAI, tick, dt);
     }
 
@@ -263,5 +263,5 @@
         this->forgetTarget();
 
-        for (Iterator<SpaceShip> it = ObjectList<SpaceShip>::begin(); it; ++it)
+        for (ObjectList<SpaceShip>::iterator it = ObjectList<SpaceShip>::begin(); it; ++it)
         {
             if (it->getTeamNr() != this->getTeamNr())
Index: code/trunk/src/orxonox/objects/SpaceShipAI.h
===================================================================
--- code/trunk/src/orxonox/objects/SpaceShipAI.h	(revision 1735)
+++ code/trunk/src/orxonox/objects/SpaceShipAI.h	(revision 1747)
@@ -47,4 +47,5 @@
 
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode);
+            virtual void tick(float dt);
             static void createEnemy(int num);
             static void killEnemies(int num);
@@ -54,5 +55,4 @@
 
         private:
-            virtual void tick(float dt);
             virtual ColourValue getProjectileColour() const;
 
Index: code/trunk/src/orxonox/objects/Tickable.h
===================================================================
--- code/trunk/src/orxonox/objects/Tickable.h	(revision 1735)
+++ code/trunk/src/orxonox/objects/Tickable.h	(revision 1747)
@@ -45,4 +45,5 @@
 
 #include "core/OrxonoxClass.h"
+#include "core/Super.h"
 
 namespace orxonox
@@ -61,4 +62,6 @@
             Tickable();
     };
+
+    SUPER_FUNCTION(1, Tickable, tick, true);
 
     //! The Tickable interface provides a tick(dt) function, that gets called every frame.
Index: code/trunk/src/orxonox/objects/WorldEntity.cc
===================================================================
--- code/trunk/src/orxonox/objects/WorldEntity.cc	(revision 1735)
+++ code/trunk/src/orxonox/objects/WorldEntity.cc	(revision 1747)
@@ -95,5 +95,4 @@
     }
 
-
     void WorldEntity::setYawPitchRoll(const Degree& yaw, const Degree& pitch, const Degree& roll)
     {
@@ -111,11 +110,11 @@
     void WorldEntity::XMLPort(Element& xmlelement, XMLPort::Mode mode)
     {
-        BaseObject::XMLPort(xmlelement, mode);
+        SUPER(WorldEntity, XMLPort, xmlelement, mode);
 
-        XMLPortParam(WorldEntity, "position", setPositionLoader2, getPosition, xmlelement, mode);
-        XMLPortParamLoadOnly(WorldEntity, "direction", setDirectionLoader, xmlelement, mode);
+        XMLPortParamExternTemplate(WorldEntity, Ogre::Node, this->node_, "position", setPosition, getPosition, xmlelement, mode, Ogre::Node, const Vector3&);
+        XMLPortParamLoadOnly(WorldEntity, "direction", setDirectionSimple, xmlelement, mode);
         XMLPortParamLoadOnly(WorldEntity, "yawpitchroll", setYawPitchRoll, xmlelement, mode);
-        XMLPortParam(WorldEntity, "scale", setTotalScale, getScale, xmlelement, mode);
-        XMLPortParam(WorldEntity, "rotationAxis", setRotationAxisLoader, getRotationAxis, xmlelement, mode);
+        XMLPortParam(WorldEntity, "scale", setScale, getScale, xmlelement, mode);
+        XMLPortParamTemplate(WorldEntity, "rotationAxis", setRotationAxis, getRotationAxis, xmlelement, mode, WorldEntity, const Vector3&);
         XMLPortParam(WorldEntity, "rotationRate", setRotationRate, getRotationRate, xmlelement, mode);
 
@@ -150,7 +149,7 @@
       registerVar( (void*) &(this->getRotationAxis().z), sizeof(this->getRotationAxis().z), network::DATA, 0x3);
       // register scale of node
-      registerVar( (void*) &(this->getScale().x), sizeof(this->getScale().x), network::DATA, 0x3);
-      registerVar( (void*) &(this->getScale().y), sizeof(this->getScale().y), network::DATA, 0x3);
-      registerVar( (void*) &(this->getScale().z), sizeof(this->getScale().z), network::DATA, 0x3);
+      registerVar( (void*) &(this->getScale3D().x), sizeof(this->getScale3D().x), network::DATA, 0x3);
+      registerVar( (void*) &(this->getScale3D().y), sizeof(this->getScale3D().y), network::DATA, 0x3);
+      registerVar( (void*) &(this->getScale3D().z), sizeof(this->getScale3D().z), network::DATA, 0x3);
       //register staticity
       registerVar( (void*) &(this->bStatic_), sizeof(this->bStatic_), network::DATA, 0x3);
Index: code/trunk/src/orxonox/objects/WorldEntity.h
===================================================================
--- code/trunk/src/orxonox/objects/WorldEntity.h	(revision 1735)
+++ code/trunk/src/orxonox/objects/WorldEntity.h	(revision 1747)
@@ -65,8 +65,4 @@
             inline void setPosition(const Vector3& pos)
                 { this->node_->setPosition(pos); }
-            inline void setPositionLoader1(const Vector3& pos)
-                { this->node_->setPosition(pos); }
-            inline void setPositionLoader2(Real x, Real y, Real z)
-                { this->node_->setPosition(x, y, z); }
             inline void setPosition(Real x, Real y, Real z)
                 { this->node_->setPosition(x, y, z); }
@@ -108,5 +104,5 @@
             inline void rotate(const Vector3& axis, const Radian& angle, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL)
               { this->node_->rotate(axis, angle, relativeTo); }
-            inline void setDirectionLoader(Real x, Real y, Real z)
+            inline void setDirectionSimple(Real x, Real y, Real z)
               { this->setDirection(x, y, z); }
             inline void setDirection(Real x, Real y, Real z, Ogre::Node::TransformSpace relativeTo=Ogre::Node::TS_LOCAL, const Vector3& localDirectionVector=Vector3::NEGATIVE_UNIT_Z)
@@ -117,17 +113,17 @@
               { this->node_->lookAt(targetPoint, relativeTo, localDirectionVector); }
 
-            inline void setScale(const Vector3& scale)
+            inline void setScale3D(const Vector3 &scale)
               { this->node_->setScale(scale); }
-            inline void setScale(Real x, Real y, Real z)
+            inline void setScale3D(Real x, Real y, Real z)
               { this->node_->setScale(x, y, z); }
-            inline void setScale(Real scale)
+            inline const Vector3& getScale3D(void) const
+              { return this->node_->getScale(); }
+            inline void setScale(float scale)
               { this->node_->setScale(scale, scale, scale); }
-            inline void setTotalScale(Real scale)
-              { this->node_->setScale(scale, scale, scale); }
-            inline const Vector3& getScale(void) const
-              { return this->node_->getScale(); }
-            inline void scale(const Vector3& scale)
+            inline float getScale() const
+              { Vector3 scale = this->getScale3D(); return (scale.x == scale.y && scale.x == scale.z) ? scale.x : 1; }
+            inline void scale3D(const Vector3 &scale)
               { this->node_->scale(scale); }
-            inline void scale(Real x, Real y, Real z)
+            inline void scale3D(Real x, Real y, Real z)
               { this->node_->scale(x, y, z); }
             inline void scale(Real scale)
@@ -159,8 +155,6 @@
                 { return this->acceleration_; }
 
-            inline void setRotationAxisLoader(const Vector3& axis)
-                { this->rotationAxis_ = axis; rotationAxis_.normalise(); }
             inline void setRotationAxis(const Vector3& axis)
-                { this->rotationAxis_ = axis; rotationAxis_.normalise(); }
+                { this->rotationAxis_ = axis; this->rotationAxis_.normalise(); }
             inline void setRotationAxis(Real x, Real y, Real z)
                 { this->rotationAxis_.x = x; this->rotationAxis_.y = y; this->rotationAxis_.z = z; rotationAxis_.normalise(); }
Index: code/trunk/src/orxonox/overlays/OrxonoxOverlay.cc
===================================================================
--- code/trunk/src/orxonox/overlays/OrxonoxOverlay.cc	(revision 1735)
+++ code/trunk/src/orxonox/overlays/OrxonoxOverlay.cc	(revision 1747)
@@ -51,7 +51,7 @@
     std::map<std::string, OrxonoxOverlay*> OrxonoxOverlay::overlays_s;
 
-    SetConsoleCommand(OrxonoxOverlay, scaleOverlay, false).setAccessLevel(AccessLevel::User);
-    SetConsoleCommand(OrxonoxOverlay, scrollOverlay, false).setAccessLevel(AccessLevel::User);
-    SetConsoleCommand(OrxonoxOverlay, rotateOverlay, false).setAccessLevel(AccessLevel::User);
+    SetConsoleCommand(OrxonoxOverlay, scaleOverlay, false).accessLevel(AccessLevel::User);
+    SetConsoleCommand(OrxonoxOverlay, scrollOverlay, false).accessLevel(AccessLevel::User);
+    SetConsoleCommand(OrxonoxOverlay, rotateOverlay, false).accessLevel(AccessLevel::User);
 
     OrxonoxOverlay::OrxonoxOverlay()
@@ -84,5 +84,5 @@
     @brief
         Loads the OrxonoxOverlay.
-        
+
         This has to be called before usage, otherwise strange behaviour is
         guaranteed! (there should be no segfaults however).
@@ -92,5 +92,5 @@
     void OrxonoxOverlay::XMLPort(Element& xmlElement, XMLPort::Mode mode)
     {
-        BaseObject::XMLPort(xmlElement, mode);
+        SUPER(OrxonoxOverlay, XMLPort, xmlElement, mode);
 
         if (mode == XMLPort::LoadObject)
@@ -267,5 +267,5 @@
         if (angle > Ogre::Math::PI * 0.5)
             angle = Ogre::Math::PI - angle;
-        
+
         // do some mathematical fiddling for a bounding box
         Vector2 actualSize = size_ * sizeCorrection_;
Index: code/trunk/src/orxonox/overlays/OrxonoxOverlay.h
===================================================================
--- code/trunk/src/orxonox/overlays/OrxonoxOverlay.h	(revision 1735)
+++ code/trunk/src/orxonox/overlays/OrxonoxOverlay.h	(revision 1747)
@@ -150,6 +150,7 @@
         static void rotateOverlay(const std::string& name, const Degree& angle);
 
+        virtual void changedVisibility();
+
     protected:
-        virtual void changedVisibility();
         virtual void angleChanged();
         virtual void sizeCorrectionChanged();
Index: code/trunk/src/orxonox/overlays/OverlayGroup.cc
===================================================================
--- code/trunk/src/orxonox/overlays/OverlayGroup.cc	(revision 1735)
+++ code/trunk/src/orxonox/overlays/OverlayGroup.cc	(revision 1747)
@@ -35,7 +35,8 @@
 #include "OverlayGroup.h"
 
-#include "core/Debug.h"
+#include "util/Debug.h"
 #include "core/ConsoleCommand.h"
 #include "core/CoreIncludes.h"
+#include "core/Iterator.h"
 #include "core/XMLPort.h"
 #include "OrxonoxOverlay.h"
@@ -45,7 +46,7 @@
     CreateFactory(OverlayGroup);
 
-    SetConsoleCommand(OverlayGroup, toggleVisibility, false).setAccessLevel(AccessLevel::User);
-    SetConsoleCommand(OverlayGroup, scaleGroup, false).setAccessLevel(AccessLevel::User);
-    SetConsoleCommand(OverlayGroup, scrollGroup, false).setAccessLevel(AccessLevel::User);
+    SetConsoleCommand(OverlayGroup, toggleVisibility, false).accessLevel(AccessLevel::User);
+    SetConsoleCommand(OverlayGroup, scaleGroup, false).accessLevel(AccessLevel::User);
+    SetConsoleCommand(OverlayGroup, scrollGroup, false).accessLevel(AccessLevel::User);
 
     OverlayGroup::OverlayGroup()
@@ -62,5 +63,5 @@
     void OverlayGroup::XMLPort(Element& xmlElement, XMLPort::Mode mode)
     {
-        BaseObject::XMLPort(xmlElement, mode);
+        SUPER(OverlayGroup, XMLPort, xmlElement, mode);
 
         XMLPortParam(OverlayGroup, "scale",  setScale,  getScale,  xmlElement, mode).defaultValues(Vector2(1.0, 1.0));
@@ -135,5 +136,5 @@
     /*static*/ void OverlayGroup::toggleVisibility(const std::string& name)
     {
-        for (Iterator<OverlayGroup> it = ObjectList<OverlayGroup>::begin(); it; ++it)
+        for (ObjectList<OverlayGroup>::iterator it = ObjectList<OverlayGroup>::begin(); it; ++it)
         {
             if ((*it)->getName() == name)
@@ -151,5 +152,5 @@
     /*static*/ void OverlayGroup::scaleGroup(const std::string& name, float scale)
     {
-        for (Iterator<OverlayGroup> it = ObjectList<OverlayGroup>::begin(); it; ++it)
+        for (ObjectList<OverlayGroup>::iterator it = ObjectList<OverlayGroup>::begin(); it; ++it)
         {
             if ((*it)->getName() == name)
@@ -167,5 +168,5 @@
     /*static*/ void OverlayGroup::scrollGroup(const std::string& name, const Vector2& scroll)
     {
-        for (Iterator<OverlayGroup> it = ObjectList<OverlayGroup>::begin(); it; ++it)
+        for (ObjectList<OverlayGroup>::iterator it = ObjectList<OverlayGroup>::begin(); it; ++it)
         {
             if ((*it)->getName() == name)
Index: code/trunk/src/orxonox/overlays/OverlayGroup.h
===================================================================
--- code/trunk/src/orxonox/overlays/OverlayGroup.h	(revision 1735)
+++ code/trunk/src/orxonox/overlays/OverlayGroup.h	(revision 1747)
@@ -58,9 +58,11 @@
         ~OverlayGroup() { }
 
-        void XMLPort(Element& xmlElement, XMLPort::Mode mode);
+        virtual void XMLPort(Element& xmlElement, XMLPort::Mode mode);
 
         static void toggleVisibility(const std::string& name);
         static void scaleGroup(const std::string& name, float scale);
         static void scrollGroup(const std::string& name, const Vector2& scroll);
+
+        void changedVisibility();
 
     private:
@@ -80,6 +82,4 @@
         OrxonoxOverlay* getElement(unsigned int index);
 
-        void changedVisibility();
-
         std::map<std::string, OrxonoxOverlay*> hudElements_;    //!< Contains all the OrxonoxOverlays of the this group.
         Vector2 scale_;                                         //!< Current scale (independant of the elements).
Index: code/trunk/src/orxonox/overlays/OverlayText.cc
===================================================================
--- code/trunk/src/orxonox/overlays/OverlayText.cc	(revision 1735)
+++ code/trunk/src/orxonox/overlays/OverlayText.cc	(revision 1747)
@@ -57,5 +57,5 @@
     void OverlayText::XMLPort(Element& xmlElement, XMLPort::Mode mode)
     {
-        OrxonoxOverlay::XMLPort(xmlElement, mode);
+        SUPER(OverlayText, XMLPort, xmlElement, mode);
 
         if (mode == XMLPort::LoadObject)
Index: code/trunk/src/orxonox/overlays/console/InGameConsole.cc
===================================================================
--- code/trunk/src/orxonox/overlays/console/InGameConsole.cc	(revision 1735)
+++ code/trunk/src/orxonox/overlays/console/InGameConsole.cc	(revision 1747)
@@ -41,5 +41,5 @@
 #include "util/Math.h"
 #include "util/Convert.h"
-#include "core/Debug.h"
+#include "util/Debug.h"
 #include "core/CoreIncludes.h"
 #include "core/ConfigValueIncludes.h"
Index: code/trunk/src/orxonox/overlays/console/InGameConsole.h
===================================================================
--- code/trunk/src/orxonox/overlays/console/InGameConsole.h	(revision 1735)
+++ code/trunk/src/orxonox/overlays/console/InGameConsole.h	(revision 1747)
@@ -50,5 +50,5 @@
             void setConfigValues();
 
-            void tick(float dt);
+            virtual void tick(float dt);
 
             static InGameConsole& getInstance();
Index: code/trunk/src/orxonox/overlays/debug/DebugFPSText.h
===================================================================
--- code/trunk/src/orxonox/overlays/debug/DebugFPSText.h	(revision 1735)
+++ code/trunk/src/orxonox/overlays/debug/DebugFPSText.h	(revision 1747)
@@ -43,8 +43,5 @@
         ~DebugFPSText();
 
-    private:
-        void tick(float dt);
-
-    private:
+        virtual void tick(float dt);
     };
 }
Index: code/trunk/src/orxonox/overlays/debug/DebugRTRText.h
===================================================================
--- code/trunk/src/orxonox/overlays/debug/DebugRTRText.h	(revision 1735)
+++ code/trunk/src/orxonox/overlays/debug/DebugRTRText.h	(revision 1747)
@@ -43,6 +43,5 @@
         ~DebugRTRText();
 
-    private:
-        void tick(float dt);
+        virtual void tick(float dt);
     };
 }
Index: code/trunk/src/orxonox/overlays/hud/HUDBar.cc
===================================================================
--- code/trunk/src/orxonox/overlays/hud/HUDBar.cc	(revision 1735)
+++ code/trunk/src/orxonox/overlays/hud/HUDBar.cc	(revision 1747)
@@ -53,5 +53,5 @@
     void BarColour::XMLPort(Element& xmlElement, XMLPort::Mode mode)
     {
-        BaseObject::XMLPort(xmlElement, mode);
+        SUPER(BarColour, XMLPort, xmlElement, mode);
 
         XMLPortParam(BarColour, "colour", setColour, getColour, xmlElement, mode)
@@ -78,5 +78,5 @@
     void HUDBar::XMLPort(Element& xmlElement, XMLPort::Mode mode)
     {
-        OrxonoxOverlay::XMLPort(xmlElement, mode);
+        SUPER(HUDBar, XMLPort, xmlElement, mode);
 
         if (mode == XMLPort::LoadObject)
Index: code/trunk/src/orxonox/overlays/hud/HUDBar.h
===================================================================
--- code/trunk/src/orxonox/overlays/hud/HUDBar.h	(revision 1735)
+++ code/trunk/src/orxonox/overlays/hud/HUDBar.h	(revision 1747)
@@ -47,5 +47,5 @@
         ~BarColour() { }
 
-        void XMLPort(Element& xmlElement, XMLPort::Mode mode);
+        virtual void XMLPort(Element& xmlElement, XMLPort::Mode mode);
 
         void setColour(const ColourValue& colour) { this->colour_ = colour; }
Index: code/trunk/src/orxonox/overlays/hud/HUDNavigation.cc
===================================================================
--- code/trunk/src/orxonox/overlays/hud/HUDNavigation.cc	(revision 1735)
+++ code/trunk/src/orxonox/overlays/hud/HUDNavigation.cc	(revision 1747)
@@ -69,5 +69,5 @@
     void HUDNavigation::XMLPort(Element& xmlElement, XMLPort::Mode mode)
     {
-        OrxonoxOverlay::XMLPort(xmlElement, mode);
+        SUPER(HUDNavigation, XMLPort, xmlElement, mode);
 
         if (mode == XMLPort::LoadObject)
@@ -87,5 +87,5 @@
                 .createOverlayElement("Panel", "HUDNavigation_aimMarker_" + getUniqueNumberStr()));
             aimMarker_->setMaterialName("Orxonox/NavCrosshair");
-            
+
             background_->addChild(navMarker_);
             background_->addChild(aimMarker_);
Index: code/trunk/src/orxonox/overlays/hud/HUDNavigation.h
===================================================================
--- code/trunk/src/orxonox/overlays/hud/HUDNavigation.h	(revision 1735)
+++ code/trunk/src/orxonox/overlays/hud/HUDNavigation.h	(revision 1747)
@@ -44,5 +44,6 @@
         ~HUDNavigation();
 
-        void XMLPort(Element& xmlElement, XMLPort::Mode mode);
+        virtual void XMLPort(Element& xmlElement, XMLPort::Mode mode);
+        virtual void tick(float dt);
 
     private:
@@ -50,6 +51,4 @@
         void angleChanged() { }
         void positionChanged() { }
-
-        void tick(float dt);
 
         // XMLPort accessors
Index: code/trunk/src/orxonox/overlays/hud/HUDRadar.cc
===================================================================
--- code/trunk/src/orxonox/overlays/hud/HUDRadar.cc	(revision 1735)
+++ code/trunk/src/orxonox/overlays/hud/HUDRadar.cc	(revision 1747)
@@ -66,5 +66,5 @@
     void HUDRadar::XMLPort(Element& xmlElement, XMLPort::Mode mode)
     {
-        OrxonoxOverlay::XMLPort(xmlElement, mode);
+        SUPER(HUDRadar, XMLPort, xmlElement, mode);
 
         if (mode == XMLPort::LoadObject)
Index: code/trunk/src/orxonox/overlays/hud/HUDRadar.h
===================================================================
--- code/trunk/src/orxonox/overlays/hud/HUDRadar.h	(revision 1735)
+++ code/trunk/src/orxonox/overlays/hud/HUDRadar.h	(revision 1747)
@@ -48,5 +48,5 @@
         ~HUDRadar();
 
-        void XMLPort(Element& xmlElement, XMLPort::Mode mode);
+        virtual void XMLPort(Element& xmlElement, XMLPort::Mode mode);
 
     private:
Index: code/trunk/src/orxonox/overlays/hud/HUDSpeedBar.h
===================================================================
--- code/trunk/src/orxonox/overlays/hud/HUDSpeedBar.h	(revision 1735)
+++ code/trunk/src/orxonox/overlays/hud/HUDSpeedBar.h	(revision 1747)
@@ -44,6 +44,5 @@
         ~HUDSpeedBar();
 
-    private:
-        void tick(float dt);
+        virtual void tick(float dt);
     };
 }
Index: code/trunk/src/orxonox/tools/WindowEventListener.cc
===================================================================
--- code/trunk/src/orxonox/tools/WindowEventListener.cc	(revision 1735)
+++ code/trunk/src/orxonox/tools/WindowEventListener.cc	(revision 1747)
@@ -38,5 +38,5 @@
     WindowEventListener::WindowEventListener()
     {
-        RegisterObject(WindowEventListener);
+        RegisterRootObject(WindowEventListener);
     }
 }
