Index: code/branches/core4/src/core/input/InputDevice.h
===================================================================
--- code/branches/core4/src/core/input/InputDevice.h	(revision 3281)
+++ code/branches/core4/src/core/input/InputDevice.h	(revision 3285)
@@ -138,5 +138,5 @@
         std::string getClassName()
         {
-            return InputDeviceNames::values[OISDeviceValue];
+            return DeviceClass::getClassNameImpl();
         }
 
Index: code/branches/core4/src/core/input/InputHandler.h
===================================================================
--- code/branches/core4/src/core/input/InputHandler.h	(revision 3281)
+++ code/branches/core4/src/core/input/InputHandler.h	(revision 3285)
@@ -41,4 +41,61 @@
 namespace orxonox
 {
+    namespace ButtonEvent
+    {
+        //! Helper enum to deploy events with the help of templates
+        enum Value
+        {
+            Press,
+            Release,
+            Hold
+        };
+
+        //! Enables function overloading with integer values
+        template <ButtonEvent::Value Event>
+        struct EnumToType { };
+        typedef EnumToType<Press>   TPress;
+        typedef EnumToType<Release> TRelease;
+        typedef EnumToType<Hold>    THold;
+    }
+
+    namespace KeyboardModifier
+    {
+        //! Keyboard modifiers (shift, ctrl and alt)
+        enum Enum
+        {
+            Shift = 0x0000001,
+            Ctrl  = 0x0000010,
+            Alt   = 0x0000100
+        };
+    }
+
+    //! Event argument for key events
+    class _CoreExport KeyEvent
+    {
+    public:
+        KeyEvent(const OIS::KeyEvent& evt)
+            : key_(static_cast<KeyCode::ByEnum>(evt.key))
+            , text_(evt.text)
+            , modifiers_(0)
+        { }
+        bool operator==(const KeyEvent& rhs) const
+            { return rhs.key_ == key_; }
+        bool operator!=(const KeyEvent& rhs) const
+            { return rhs.key_ != key_; }
+        void setModifiers(int modifiers)
+            { modifiers_ = modifiers; }
+
+        bool isModifierDown(KeyboardModifier::Enum modifier) const
+            { return static_cast<KeyboardModifier::Enum>(modifier & modifiers_); }
+        KeyCode::ByEnum getKeyCode() const
+            { return key_; }
+        unsigned int getText() const { return text_; }
+
+    private:
+        KeyCode::ByEnum key_;
+        unsigned int text_;
+        int modifiers_;
+    };
+
     /**
     @brief
Index: code/branches/core4/src/core/input/InputPrereqs.h
===================================================================
--- code/branches/core4/src/core/input/InputPrereqs.h	(revision 3281)
+++ code/branches/core4/src/core/input/InputPrereqs.h	(revision 3285)
@@ -442,96 +442,4 @@
         };
     }
-
-    namespace ButtonEvent
-    {
-        enum Value
-        {
-            Press,
-            Release,
-            Hold
-        };
-
-        template <ButtonEvent::Value Event>
-        struct EnumToType { };
-        typedef EnumToType<Press>   TPress;
-        typedef EnumToType<Release> TRelease;
-        typedef EnumToType<Hold>    THold;
-    }
-
-
-    namespace KeyboardModifier
-    {
-        enum Enum
-        {
-            Shift = 0x0000001,
-            Ctrl  = 0x0000010,
-            Alt   = 0x0000100
-        };
-    }
-
-    class _CoreExport KeyEvent
-    {
-    public:
-        KeyEvent(const OIS::KeyEvent& evt)
-            : key_(static_cast<KeyCode::ByEnum>(evt.key))
-            , text_(evt.text)
-            , modifiers_(0)
-        { }
-        bool operator==(const KeyEvent& rhs) const
-            { return rhs.key_ == key_; }
-        bool operator!=(const KeyEvent& rhs) const
-            { return rhs.key_ != key_; }
-        void setModifiers(int modifiers)
-            { modifiers_ = modifiers; }
-
-        bool isModifierDown(KeyboardModifier::Enum modifier) const
-            { return static_cast<KeyboardModifier::Enum>(modifier & modifiers_); }
-        KeyCode::ByEnum getKeyCode() const
-            { return key_; }
-        unsigned int getText() const { return text_; }
-
-    private:
-        KeyCode::ByEnum key_;
-        unsigned int text_;
-        int modifiers_;
-    };
-
-
-    //-----------------------------------------------------------------------
-    // Device type traits
-    //-----------------------------------------------------------------------
-
-    struct KeyboardTraits
-    {
-        typedef Keyboard DeviceClass;
-        typedef OIS::Keyboard OISDeviceClass;
-        typedef KeyEvent ButtonType;
-        typedef KeyEvent& ButtonTypeParam;
-        static const OIS::Type OISDeviceValue = OIS::OISKeyboard;
-    };
-
-    struct MouseTraits
-    {
-        typedef Mouse DeviceClass;
-        typedef OIS::Mouse OISDeviceClass;
-        typedef MouseButtonCode::ByEnum ButtonType;
-        typedef MouseButtonCode::ByEnum ButtonTypeParam;
-        static const OIS::Type OISDeviceValue = OIS::OISMouse;
-    };
-
-    struct JoyStickTraits
-    {
-        typedef JoyStick DeviceClass;
-        typedef OIS::JoyStick OISDeviceClass;
-        typedef JoyStickButtonCode::ByEnum ButtonType;
-        typedef JoyStickButtonCode::ByEnum ButtonTypeParam;
-        static const OIS::Type OISDeviceValue = OIS::OISJoyStick;
-    };
-
-    // Note: Entries correspond to OIS::Type enum
-    namespace InputDeviceNames
-    {
-        const char* const values[] = { "", "Keyboard", "Mouse", "JoyStick" };
-    }
 }
 
Index: code/branches/core4/src/core/input/JoyStick.h
===================================================================
--- code/branches/core4/src/core/input/JoyStick.h	(revision 3281)
+++ code/branches/core4/src/core/input/JoyStick.h	(revision 3285)
@@ -38,4 +38,13 @@
 namespace orxonox
 {
+    struct JoyStickTraits
+    {
+        typedef JoyStick DeviceClass;
+        typedef OIS::JoyStick OISDeviceClass;
+        typedef JoyStickButtonCode::ByEnum ButtonType;
+        typedef JoyStickButtonCode::ByEnum ButtonTypeParam;
+        static const OIS::Type OISDeviceValue = OIS::OISJoyStick;
+    };
+
     /**
     @brief
@@ -93,4 +102,6 @@
         bool vector3Moved  (const OIS::JoyStickEvent &arg, int id) { return true; }
 
+        static std::string getClassNameImpl() { return "JoyStick"; }
+
         std::string idString_;                //!< ID string generated by the number of knobs and the device name
         int povStates_[4];                    //!< Internal states for the POVs
Index: code/branches/core4/src/core/input/Keyboard.h
===================================================================
--- code/branches/core4/src/core/input/Keyboard.h	(revision 3281)
+++ code/branches/core4/src/core/input/Keyboard.h	(revision 3285)
@@ -31,8 +31,18 @@
 
 #include "InputPrereqs.h"
+#include "InputHandler.h"
 #include "InputDevice.h"
 
 namespace orxonox
 {
+    struct KeyboardTraits
+    {
+        typedef Keyboard DeviceClass;
+        typedef OIS::Keyboard OISDeviceClass;
+        typedef KeyEvent ButtonType;
+        typedef KeyEvent& ButtonTypeParam;
+        static const OIS::Type OISDeviceValue = OIS::OISKeyboard;
+    };
+
     /**
     @brief
@@ -63,4 +73,6 @@
         bool keyReleased(const OIS::KeyEvent& arg);
 
+        static std::string getClassNameImpl() { return "Keyboard"; }
+
         //! Bit mask representing keyboard modifiers
         int modifiers_;
Index: code/branches/core4/src/core/input/Mouse.h
===================================================================
--- code/branches/core4/src/core/input/Mouse.h	(revision 3281)
+++ code/branches/core4/src/core/input/Mouse.h	(revision 3285)
@@ -35,4 +35,13 @@
 namespace orxonox
 {
+    struct MouseTraits
+    {
+        typedef Mouse DeviceClass;
+        typedef OIS::Mouse OISDeviceClass;
+        typedef MouseButtonCode::ByEnum ButtonType;
+        typedef MouseButtonCode::ByEnum ButtonTypeParam;
+        static const OIS::Type OISDeviceValue = OIS::OISMouse;
+    };
+
     /**
     @brief
@@ -92,4 +101,6 @@
         bool mouseMoved(const OIS::MouseEvent &arg);
 
+        static std::string getClassNameImpl() { return "Mouse"; }
+
         // HACK:
         static Mouse* instancePointer_s;
