Index: code/branches/cpp11_v3/src/OrxonoxConfig.h.in
===================================================================
--- code/branches/cpp11_v3/src/OrxonoxConfig.h.in	(revision 11067)
+++ code/branches/cpp11_v3/src/OrxonoxConfig.h.in	(revision 11068)
@@ -207,13 +207,4 @@
 #endif
 
-// Forward declare the everywhere used std::string
-namespace std
-{
-    template<class _Elem> struct char_traits;
-    template<class _Ty>   class  allocator;
-    template<class _Elem, class _Traits, class _Ax> class basic_string;
-    typedef basic_string<char, char_traits<char>, allocator<char>> string;
-}
-
 // Define Boost Filesystem version
 #include <boost/version.hpp>
Index: code/branches/cpp11_v3/src/libraries/core/CorePrereqs.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/core/CorePrereqs.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/core/CorePrereqs.h	(revision 11068)
@@ -38,4 +38,5 @@
 #include "OrxonoxConfig.h"
 #include <boost/version.hpp>
+#include <string>
 
 //-----------------------------------------------------------------------
Index: code/branches/cpp11_v3/src/libraries/core/XMLPort.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/core/XMLPort.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/core/XMLPort.h	(revision 11068)
@@ -324,14 +324,14 @@
     {
     public:
-        enum ParseResult
+        enum class ParseResult
         {
-            PR_not_started,
-            PR_finished,
-            PR_waiting_for_default_values
+            not_started,
+            finished,
+            waiting_for_default_values
         };
 
         public:
             XMLPortParamContainer()
-                { this->parseResult_ = PR_not_started; }
+                { this->parseResult_ = ParseResult::not_started; }
             virtual ~XMLPortParamContainer() = default;
 
@@ -415,12 +415,12 @@
                             this->loadexecutor_->parse(object, attributeValue, &error, ",");
                             if (!error || (mode  == XMLPort::ExpandObject))
-                                this->parseResult_ = PR_finished;
+                                this->parseResult_ = ParseResult::finished;
                             else
-                                this->parseResult_ = PR_waiting_for_default_values;
+                                this->parseResult_ = ParseResult::waiting_for_default_values;
                         }
                         else if (mode == XMLPort::ExpandObject)
-                            this->parseResult_ = PR_finished;
+                            this->parseResult_ = ParseResult::finished;
                         else
-                            this->parseResult_ = PR_waiting_for_default_values;
+                            this->parseResult_ = ParseResult::waiting_for_default_values;
                     }
                     catch (ticpp::Exception& ex)
@@ -449,5 +449,5 @@
             XMLPortParamContainer& portIfWaitingForDefaultValues(const ParseResult& result, const ParseParams& params)
             {
-                if (result == PR_waiting_for_default_values)
+                if (result == ParseResult::waiting_for_default_values)
                     return this->port(this->owner_, params);
                 else
Index: code/branches/cpp11_v3/src/libraries/core/command/ConsoleCommand.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/core/command/ConsoleCommand.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/core/command/ConsoleCommand.h	(revision 11068)
@@ -60,21 +60,18 @@
     }
 
-    namespace AccessLevel
+    /**
+        @brief Possible access levels: A command can only be executed if the program is in the state which is requested by the access level.
+    */
+    enum class AccessLevel
     {
-        /**
-            @brief Possible access levels: A command can only be executed if the program is in the state which is requested by the access level.
-        */
-        enum Enum
-        {
-            All,
-            Standalone,
-            Master,
-            Server,
-            Client,
-            Online,
-            Offline,
-            None
-        };
-    }
+        All,
+        Standalone,
+        Master,
+        Server,
+        Client,
+        Online,
+        Offline,
+        None
+    };
 
     /**
@@ -249,5 +246,5 @@
 
                     /// Changes the access level of the command.
-                    inline ConsoleCommandManipulator& accessLevel(AccessLevel::Enum level)
+                    inline ConsoleCommandManipulator& accessLevel(AccessLevel level)
                         { if (this->command_) { this->command_->accessLevel(level); } return *this; }
 
@@ -332,8 +329,8 @@
 
             /// Changes the access level of the command.
-            inline ConsoleCommand& accessLevel(AccessLevel::Enum level)
+            inline ConsoleCommand& accessLevel(AccessLevel level)
                 { this->accessLevel_ = level; return *this; }
             /// Returns the access level of the command.
-            inline AccessLevel::Enum getAccessLevel() const
+            inline AccessLevel getAccessLevel() const
                 { return this->accessLevel_; }
 
@@ -394,5 +391,5 @@
             bool bActive_;                                                  ///< True if the command should be active (it can still be inactive, for example if the function is missing)
             bool bHidden_;                                                  ///< True if the command is hidden (it is still executable, but not visible in the list of available commands)
-            AccessLevel::Enum accessLevel_;                                 ///< The access level (the state of the game in which you can access the command)
+            AccessLevel accessLevel_;                                       ///< The access level (the state of the game in which you can access the command)
             std::string baseName_;                                          ///< The name that was first assigned to the command
             std::vector<CommandName> names_;                                ///< All names and aliases of this command
Index: code/branches/cpp11_v3/src/libraries/core/command/Executor.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/core/command/Executor.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/core/command/Executor.h	(revision 11068)
@@ -147,5 +147,5 @@
                 { return this->functor_->hasReturnvalue(); }
             /// Returns the type of the wrapped function (static or member).
-            inline Functor::Type::Enum getType() const
+            inline Functor::Type getType() const
                 { return this->functor_->getType(); }
             /// Returns the name of the type of a parameter with given index (the first parameter has index 0).
Index: code/branches/cpp11_v3/src/libraries/core/command/Functor.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/core/command/Functor.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/core/command/Functor.h	(revision 11068)
@@ -176,12 +176,9 @@
     {
         public:
-            struct Type
-            {
-                /// Defines the type of a function (static or member)
-                enum Enum
-                {
-                    Static,
-                    Member
-                };
+            /// Defines the type of a function (static or member)
+            enum class Type
+            {
+                Static,
+                Member
             };
 
@@ -196,5 +193,5 @@
 
             /// Returns the type of the function: static or member.
-            virtual Type::Enum getType() const = 0;
+            virtual Type getType() const = 0;
             /// Returns the number of parameters of the function.
             virtual unsigned int getParamCount() const = 0;
@@ -262,5 +259,5 @@
 
             // see Functor::getType()
-            virtual inline Functor::Type::Enum getType() const override
+            virtual inline Functor::Type getType() const override
                 { return Functor::Type::Member; }
 
@@ -339,5 +336,5 @@
 
             // see Functor::getType()
-            virtual inline Functor::Type::Enum getType() const override
+            virtual inline Functor::Type getType() const override
                 { return Functor::Type::Static; }
 
Index: code/branches/cpp11_v3/src/libraries/core/command/IOConsolePOSIX.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/core/command/IOConsolePOSIX.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/core/command/IOConsolePOSIX.cc	(revision 11068)
@@ -46,13 +46,10 @@
     IOConsole* IOConsole::singletonPtr_s = nullptr;
 
-    namespace EscapeMode
-    {
-        enum Value
-        {
-            None,
-            First,
-            Second
-        };
-    }
+    enum class EscapeMode
+    {
+        None,
+        First,
+        Second
+    };
 
     IOConsole::IOConsole()
@@ -90,5 +87,5 @@
         std::cout.flush();
         if (!this->origCout_.str().empty())
-            this->shell_->addOutput(this->origCout_.str(), Shell::Cout);
+            this->shell_->addOutput(this->origCout_.str(), Shell::LineType::Cout);
         // Erase input and status lines
         this->cout_ << "\033[1G\033[J";
@@ -111,5 +108,5 @@
         unsigned char c;
         std::string escapeSequence;
-        EscapeMode::Value escapeMode = EscapeMode::None;
+        EscapeMode escapeMode = EscapeMode::None;
         while (std::cin.good())
         {
@@ -231,5 +228,5 @@
         if (!this->origCout_.str().empty())
         {
-            this->shell_->addOutput(this->origCout_.str(), Shell::Cout);
+            this->shell_->addOutput(this->origCout_.str(), Shell::LineType::Cout);
             this->origCout_.str("");
         }
@@ -241,25 +238,25 @@
         switch (type)
         {
-            case Shell::Message:
-            case Shell::DebugOutput:     this->cout_ << "\033[0m"; break;
-
-            case Shell::UserError:       this->cout_ << "\033[91m"; break;
-            case Shell::UserWarning:     this->cout_ << "\033[93m"; break;
-            case Shell::UserStatus:      this->cout_ << "\033[92m"; break;
-            case Shell::UserInfo:        this->cout_ << "\033[96m"; break;
-
-            case Shell::InternalError:   this->cout_ << "\033[31m"; break;
-            case Shell::InternalWarning: this->cout_ << "\033[33m"; break;
-            case Shell::InternalStatus:  this->cout_ << "\033[32m"; break;
-            case Shell::InternalInfo:    this->cout_ << "\033[36m"; break;
-
-            case Shell::Verbose:         this->cout_ << "\033[94m"; break;
-            case Shell::VerboseMore:     this->cout_ << "\033[34m"; break;
-            case Shell::VerboseUltra:    this->cout_ << "\033[34m"; break;
-
-            case Shell::Command:         this->cout_ << "\033[95m"; break;
-            case Shell::Hint:            this->cout_ << "\033[35m"; break;
-
-            default:                     this->cout_ << "\033[37m"; break;
+            case Shell::LineType::Message:
+            case Shell::LineType::DebugOutput:     this->cout_ << "\033[0m"; break;
+
+            case Shell::LineType::UserError:       this->cout_ << "\033[91m"; break;
+            case Shell::LineType::UserWarning:     this->cout_ << "\033[93m"; break;
+            case Shell::LineType::UserStatus:      this->cout_ << "\033[92m"; break;
+            case Shell::LineType::UserInfo:        this->cout_ << "\033[96m"; break;
+
+            case Shell::LineType::InternalError:   this->cout_ << "\033[31m"; break;
+            case Shell::LineType::InternalWarning: this->cout_ << "\033[33m"; break;
+            case Shell::LineType::InternalStatus:  this->cout_ << "\033[32m"; break;
+            case Shell::LineType::InternalInfo:    this->cout_ << "\033[36m"; break;
+
+            case Shell::LineType::Verbose:         this->cout_ << "\033[94m"; break;
+            case Shell::LineType::VerboseMore:     this->cout_ << "\033[34m"; break;
+            case Shell::LineType::VerboseUltra:    this->cout_ << "\033[34m"; break;
+
+            case Shell::LineType::Command:         this->cout_ << "\033[95m"; break;
+            case Shell::LineType::Hint:            this->cout_ << "\033[35m"; break;
+
+            default:                               this->cout_ << "\033[37m"; break;
         }
 
@@ -384,5 +381,5 @@
     void IOConsole::executed()
     {
-        this->shell_->addOutput(this->promptString_ + this->shell_->getInput(), Shell::Command);
+        this->shell_->addOutput(this->promptString_ + this->shell_->getInput(), Shell::LineType::Command);
     }
 
Index: code/branches/cpp11_v3/src/libraries/core/command/IOConsoleWindows.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/core/command/IOConsoleWindows.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/core/command/IOConsoleWindows.cc	(revision 11068)
@@ -97,5 +97,5 @@
         std::cout.flush();
         if (!this->origCout_.str().empty())
-            this->shell_->addOutput(this->origCout_.str(), Shell::Cout);
+            this->shell_->addOutput(this->origCout_.str(), Shell::LineType::Cout);
 
         this->shell_->unregisterListener(this);
@@ -190,5 +190,5 @@
         if (!this->origCout_.str().empty())
         {
-            this->shell_->addOutput(this->origCout_.str(), Shell::Cout);
+            this->shell_->addOutput(this->origCout_.str(), Shell::LineType::Cout);
             this->origCout_.str("");
         }
@@ -202,25 +202,25 @@
         switch (type)
         {
-            case Shell::Message:
-            case Shell::DebugOutput:     colour = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
-
-            case Shell::UserError:       colour = FOREGROUND_INTENSITY | FOREGROUND_RED | 0                | 0              ; break;
-            case Shell::UserWarning:     colour = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | 0              ; break;
-            case Shell::UserStatus:      colour = FOREGROUND_INTENSITY | 0              | FOREGROUND_GREEN | 0              ; break;
-            case Shell::UserInfo:        colour = FOREGROUND_INTENSITY | 0              | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
-
-            case Shell::InternalError:   colour = 0                    | FOREGROUND_RED | 0                | 0              ; break;
-            case Shell::InternalWarning: colour = 0                    | FOREGROUND_RED | FOREGROUND_GREEN | 0              ; break;
-            case Shell::InternalStatus:  colour = 0                    | 0              | FOREGROUND_GREEN | 0              ; break;
-            case Shell::InternalInfo:    colour = 0                    | 0              | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
-
-            case Shell::Verbose:         colour = FOREGROUND_INTENSITY | 0              | 0                | FOREGROUND_BLUE; break;
-            case Shell::VerboseMore:     colour = FOREGROUND_INTENSITY | 0              | 0                | FOREGROUND_BLUE; break;
-            case Shell::VerboseUltra:    colour = FOREGROUND_INTENSITY | 0              | 0                | FOREGROUND_BLUE; break;
-
-            case Shell::Command:         colour = FOREGROUND_INTENSITY | FOREGROUND_RED | 0                | FOREGROUND_BLUE; break;
-            case Shell::Hint:            colour = 0                    | FOREGROUND_RED | 0                | FOREGROUND_BLUE; break;
-
-            default:                     colour = 0                    | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
+            case Shell::LineType::Message:
+            case Shell::LineType::DebugOutput:     colour = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
+
+            case Shell::LineType::UserError:       colour = FOREGROUND_INTENSITY | FOREGROUND_RED | 0                | 0              ; break;
+            case Shell::LineType::UserWarning:     colour = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | 0              ; break;
+            case Shell::LineType::UserStatus:      colour = FOREGROUND_INTENSITY | 0              | FOREGROUND_GREEN | 0              ; break;
+            case Shell::LineType::UserInfo:        colour = FOREGROUND_INTENSITY | 0              | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
+
+            case Shell::LineType::InternalError:   colour = 0                    | FOREGROUND_RED | 0                | 0              ; break;
+            case Shell::LineType::InternalWarning: colour = 0                    | FOREGROUND_RED | FOREGROUND_GREEN | 0              ; break;
+            case Shell::LineType::InternalStatus:  colour = 0                    | 0              | FOREGROUND_GREEN | 0              ; break;
+            case Shell::LineType::InternalInfo:    colour = 0                    | 0              | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
+
+            case Shell::LineType::Verbose:         colour = FOREGROUND_INTENSITY | 0              | 0                | FOREGROUND_BLUE; break;
+            case Shell::LineType::VerboseMore:     colour = FOREGROUND_INTENSITY | 0              | 0                | FOREGROUND_BLUE; break;
+            case Shell::LineType::VerboseUltra:    colour = FOREGROUND_INTENSITY | 0              | 0                | FOREGROUND_BLUE; break;
+
+            case Shell::LineType::Command:         colour = FOREGROUND_INTENSITY | FOREGROUND_RED | 0                | FOREGROUND_BLUE; break;
+            case Shell::LineType::Hint:            colour = 0                    | FOREGROUND_RED | 0                | FOREGROUND_BLUE; break;
+
+            default:                               colour = 0                    | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
         }
 
@@ -331,5 +331,5 @@
     void IOConsole::executed()
     {
-        this->shell_->addOutput(this->promptString_ + this->shell_->getInput(), Shell::Command);
+        this->shell_->addOutput(this->promptString_ + this->shell_->getInput(), Shell::LineType::Command);
     }
 
Index: code/branches/cpp11_v3/src/libraries/core/command/Shell.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/core/command/Shell.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/core/command/Shell.cc	(revision 11068)
@@ -268,5 +268,5 @@
     {
         // yes it was - push the new line to the list
-        this->outputLines_.push_front(std::make_pair(line, static_cast<LineType>(type)));
+        this->outputLines_.push_front(std::make_pair(line, type));
 
         // adjust the scroll position if needed
@@ -381,7 +381,7 @@
         const std::string& result = CommandExecutor::query(this->inputBuffer_->get(), &error);
         if (error)
-            this->addOutput("Error: Can't execute \"" + this->inputBuffer_->get() + "\", " + CommandExecutor::getErrorDescription(error) + ". (Shell)", UserError);
+            this->addOutput("Error: Can't execute \"" + this->inputBuffer_->get() + "\", " + CommandExecutor::getErrorDescription(error) + ". (Shell)", LineType::UserError);
         else if (result != "")
-            this->addOutput(result, Result);
+            this->addOutput(result, LineType::Result);
 
         this->clearInput();
@@ -392,5 +392,5 @@
     {
         this->inputBuffer_->set(CommandExecutor::evaluate(this->inputBuffer_->get()).complete());
-        this->addOutput(CommandExecutor::evaluate(this->inputBuffer_->get()).hint(), Hint);
+        this->addOutput(CommandExecutor::evaluate(this->inputBuffer_->get()).hint(), LineType::Hint);
 
         this->inputChanged();
Index: code/branches/cpp11_v3/src/libraries/core/command/Shell.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/core/command/Shell.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/core/command/Shell.h	(revision 11068)
@@ -88,5 +88,5 @@
         public:
             /// Defines the type of a line of text in the Shell - some types depend on the output level, others are of internal use.
-            enum LineType
+            enum class LineType
             {
                 DebugOutput     = debug_output,
@@ -133,6 +133,6 @@
             LineList::const_iterator getEndIterator() const;
 
-            void addOutput(const std::string& text, LineType type = DebugOutput);
-            void addLine(const std::string& line, LineType type = DebugOutput);
+            void addOutput(const std::string& text, LineType type = LineType::DebugOutput);
+            void addLine(const std::string& line, LineType type = LineType::DebugOutput);
             void clearOutput();
 
Index: code/branches/cpp11_v3/src/libraries/core/config/ConfigFileSection.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/core/config/ConfigFileSection.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/core/config/ConfigFileSection.h	(revision 11068)
@@ -39,4 +39,5 @@
 #include <string>
 #include <list>
+#include "util/StringUtils.h"
 #include "ConfigFileEntry.h"
 
Index: code/branches/cpp11_v3/src/libraries/network/Connection.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/Connection.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/Connection.cc	(revision 11068)
@@ -81,5 +81,5 @@
   {
 //     this->overallMutex_->lock();
-    outgoingEvent outEvent = { peerID, outgoingEventType::disconnectPeer, nullptr, 0 };
+    outgoingEvent outEvent = { peerID, OutgoingEventType::disconnectPeer, nullptr, 0 };
     
     this->outgoingEventsMutex_->lock();
@@ -91,5 +91,5 @@
   void Connection::disconnectPeers()
   {
-    outgoingEvent outEvent = { 0, outgoingEventType::disconnectPeers, nullptr, 0 };
+    outgoingEvent outEvent = { 0, OutgoingEventType::disconnectPeers, nullptr, 0 };
     
     this->outgoingEventsMutex_->lock();
@@ -101,5 +101,5 @@
   {
 //     this->overallMutex_->lock();
-    outgoingEvent outEvent = { peerID, outgoingEventType::sendPacket, packet, channelID };
+    outgoingEvent outEvent = { peerID, OutgoingEventType::sendPacket, packet, channelID };
     
     this->outgoingEventsMutex_->lock();
@@ -112,5 +112,5 @@
   {
 //     this->overallMutex_->lock();
-    outgoingEvent outEvent = { 0, outgoingEventType::broadcastPacket, packet, channelID };
+    outgoingEvent outEvent = { 0, OutgoingEventType::broadcastPacket, packet, channelID };
     
     this->outgoingEventsMutex_->lock();
@@ -197,5 +197,5 @@
     switch( event.type )
     {
-      case outgoingEventType::sendPacket:
+      case OutgoingEventType::sendPacket:
         // check whether the peer is still/already in the peer list
         if( this->peerMap_.find(event.peerID) != this->peerMap_.end() )
@@ -211,5 +211,5 @@
         }
         break;
-      case outgoingEventType::disconnectPeer:
+      case OutgoingEventType::disconnectPeer:
         if( this->peerMap_.find(event.peerID) != this->peerMap_.end() )
         {
@@ -223,8 +223,8 @@
         }
         break;
-      case outgoingEventType::disconnectPeers:
+      case OutgoingEventType::disconnectPeers:
         disconnectPeersInternal();
         break;
-      case outgoingEventType::broadcastPacket:
+      case OutgoingEventType::broadcastPacket:
         enet_host_broadcast( this->host_, event.channelID, event.packet );
         break;
@@ -271,11 +271,11 @@
       switch( inEvent.type )
       {
-        case incomingEventType::peerConnect:
+        case IncomingEventType::peerConnect:
           addPeer(inEvent.peerID);
           break;
-        case incomingEventType::peerDisconnect:
+        case IncomingEventType::peerDisconnect:
           removePeer(inEvent.peerID);
           break;
-        case incomingEventType::receivePacket:
+        case IncomingEventType::receivePacket:
           processPacket(inEvent.packet);
           break;
@@ -322,5 +322,5 @@
     
     // create new peerEvent and return it
-    incomingEvent inEvent = { peerID, incomingEventType::peerConnect, nullptr };
+    incomingEvent inEvent = { peerID, IncomingEventType::peerConnect, nullptr };
     return inEvent;
   }
@@ -337,5 +337,5 @@
     
     // create new peerEvent and return it
-    incomingEvent inEvent = { peerID, incomingEventType::peerDisconnect, nullptr };
+    incomingEvent inEvent = { peerID, IncomingEventType::peerDisconnect, nullptr };
     return inEvent;
   }
@@ -351,5 +351,5 @@
     
     // create new peerEvent and return it
-    incomingEvent inEvent = { peerID, incomingEventType::receivePacket, p };
+    incomingEvent inEvent = { peerID, IncomingEventType::receivePacket, p };
     return inEvent;
   }
Index: code/branches/cpp11_v3/src/libraries/network/Connection.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/Connection.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/Connection.h	(revision 11068)
@@ -60,40 +60,32 @@
   const unsigned int NETWORK_MAX_QUEUE_PROCESS_TIME = 5;
   
-  namespace incomingEventType
+  enum class IncomingEventType
   {
-    enum Value
-    {
-      receivePacket   = 1,  // incoming packet
-      peerConnect     = 2,  // incoming connect request
-      peerDisconnect  = 3   // incoming disconnect request
-    };
-    
-  }
+    receivePacket   = 1,  // incoming packet
+    peerConnect     = 2,  // incoming connect request
+    peerDisconnect  = 3   // incoming disconnect request
+  };
   
-  namespace outgoingEventType
+  enum class OutgoingEventType
   {
-    enum Value
-    {
-      sendPacket      = 1,  // outgoing packet
-      broadcastPacket = 2,  // outgoing broadcast packet
-      disconnectPeer  = 3,  // outgoing disconnect request
-      disconnectPeers = 4   // outgoing disconnect request
-    };
-    
-  }
+    sendPacket      = 1,  // outgoing packet
+    broadcastPacket = 2,  // outgoing broadcast packet
+    disconnectPeer  = 3,  // outgoing disconnect request
+    disconnectPeers = 4   // outgoing disconnect request
+  };
   
   struct _NetworkExport incomingEvent
   {
-    uint32_t                  peerID;
-    incomingEventType::Value  type;
-    packet::Packet*           packet;
+    uint32_t          peerID;
+    IncomingEventType type;
+    packet::Packet*   packet;
   };
   
   struct _NetworkExport outgoingEvent
   {
-    uint32_t                  peerID;
-    outgoingEventType::Value  type;
-    ENetPacket*               packet;
-    ENetChannelID             channelID;
+    uint32_t          peerID;
+    OutgoingEventType type;
+    ENetPacket*       packet;
+    ENetChannelID     channelID;
   };
   
Index: code/branches/cpp11_v3/src/libraries/network/NetworkPrereqs.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/NetworkPrereqs.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/NetworkPrereqs.h	(revision 11068)
@@ -89,10 +89,7 @@
     namespace PacketFlag
     {
-      enum Value
-      {
-        Reliable    = 1,
-        Unsequenced = 2,
-        NoAllocate  = 4
-      };
+      static constexpr uint32_t Reliable    = 1;
+      static constexpr uint32_t Unsequenced = 2;
+      static constexpr uint32_t NoAllocate  = 4;
     }
   }
@@ -101,5 +98,5 @@
   {
     typedef int Type;
-    static const Type NETWORK_FUNCTION = 6;
+    static constexpr Type NETWORK_FUNCTION = 6;
   }
 }
Index: code/branches/cpp11_v3/src/libraries/network/packet/Acknowledgement.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/packet/Acknowledgement.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/packet/Acknowledgement.cc	(revision 11068)
@@ -38,5 +38,5 @@
 #define PACKET_FLAGS_ACK    0
 #define _PACKETID           0
-#define _ACKID              _PACKETID + sizeof(packet::Type::Value)
+#define _ACKID              _PACKETID + sizeof(packet::Type)
 
 Acknowledgement::Acknowledgement( unsigned int id, unsigned int peerID )
@@ -45,5 +45,5 @@
   flags_ = flags_ | PACKET_FLAGS_ACK;
   data_=new uint8_t[ getSize() ];
-  *(Type::Value *)(data_ + _PACKETID ) = Type::Acknowledgement;
+  *(Type *)(data_ + _PACKETID ) = Type::Acknowledgement;
   *(uint32_t *)(data_ + _ACKID ) = id;
   peerID_=peerID;
Index: code/branches/cpp11_v3/src/libraries/network/packet/Chat.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/packet/Chat.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/packet/Chat.cc	(revision 11068)
@@ -40,5 +40,5 @@
 /* Some lengths */
 #define _PACKETID         0
-#define _SOURCEID         _PACKETID + sizeof(Type::Value)
+#define _SOURCEID         _PACKETID + sizeof(Type)
 #define _TARGETID         _SOURCEID + sizeof(uint32_t)
 #define _MESSAGELENGTH    _TARGETID + sizeof(uint32_t)
@@ -57,5 +57,5 @@
   data_=new unsigned char[ getSize() ];
 
-  *(Type::Value *)(data_ + _PACKETID ) = Type::Chat;
+  *(Type *)(data_ + _PACKETID ) = Type::Chat;
   *(unsigned int *)(data_ + _SOURCEID ) = sourceID;
   *(unsigned int *)(data_ + _TARGETID ) = targetID;
Index: code/branches/cpp11_v3/src/libraries/network/packet/ClassID.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/packet/ClassID.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/packet/ClassID.cc	(revision 11068)
@@ -70,5 +70,5 @@
   //set the appropriate packet id
   assert(this->data_);
-  *(Type::Value *)(this->data_ + _PACKETID ) = Type::ClassID;
+  *(Type *)(this->data_ + _PACKETID ) = Type::ClassID;
 
   uint8_t *temp=data_+sizeof(uint32_t);
Index: code/branches/cpp11_v3/src/libraries/network/packet/DeleteObjects.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/packet/DeleteObjects.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/packet/DeleteObjects.cc	(revision 11068)
@@ -39,5 +39,5 @@
 #define PACKET_FLAG_DELETE  PacketFlag::Reliable
 #define _PACKETID           0
-#define _QUANTITY           _PACKETID + sizeof(Type::Value)
+#define _QUANTITY           _PACKETID + sizeof(Type)
 #define _OBJECTIDS          _QUANTITY + sizeof(uint32_t)
 
@@ -63,9 +63,9 @@
     return false;
   orxout(verbose, context::packets) << "sending DeleteObjects: ";
-  unsigned int size = sizeof(Type::Value) + sizeof(uint32_t)*(number+1);
+  unsigned int size = sizeof(Type) + sizeof(uint32_t)*(number+1);
   data_ = new uint8_t[size];
   uint8_t *tdata = data_;
-  *reinterpret_cast<Type::Value*>(tdata) = Type::DeleteObjects;
-  tdata += sizeof(Type::Value);
+  *reinterpret_cast<Type*>(tdata) = Type::DeleteObjects;
+  tdata += sizeof(Type);
   *(uint32_t *)tdata = number;
   tdata += sizeof(uint32_t);
Index: code/branches/cpp11_v3/src/libraries/network/packet/FunctionCalls.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/packet/FunctionCalls.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/packet/FunctionCalls.cc	(revision 11068)
@@ -96,5 +96,5 @@
   assert(this->functionCalls_.size());
   data_=new uint8_t[ currentSize_ ];
-  *(Type::Value *)(data_ + _PACKETID ) = Type::FunctionCalls; // Set the Packet ID
+  *(Type *)(data_ + _PACKETID ) = Type::FunctionCalls; // Set the Packet ID
   *(uint32_t*)(data_+sizeof(uint32_t)) = this->functionCalls_.size(); // set nrOfCalls
   *(uint32_t*)(data_+2*sizeof(uint32_t)) = this->minGamestateID_; // set minGamestateID_
Index: code/branches/cpp11_v3/src/libraries/network/packet/FunctionIDs.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/packet/FunctionIDs.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/packet/FunctionIDs.cc	(revision 11068)
@@ -71,5 +71,5 @@
   //set the appropriate packet id
   assert(this->data_);
-  *(Type::Value *)(this->data_ + _PACKETID ) = Type::FunctionIDs;
+  *(Type *)(this->data_ + _PACKETID ) = Type::FunctionIDs;
 
   uint8_t *temp=data_+sizeof(uint32_t);
Index: code/branches/cpp11_v3/src/libraries/network/packet/Gamestate.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/packet/Gamestate.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/packet/Gamestate.h	(revision 11068)
@@ -56,9 +56,9 @@
     GamestateHeader(){ data_=nullptr; }
     GamestateHeader(uint8_t* data)
-      { assert(data); data_ = data; *(uint32_t*)data_ = Type::Gamestate; }
+      { assert(data); data_ = data; *(Type*)data_ = Type::Gamestate; }
     /*GamestateHeader(uint8_t* data, GamestateHeader* h)
       { assert(data); data_=data; memcpy(data_, h->data_, getSize()); }*/
     void setData(uint8_t* data)
-      { assert(data); data_ = data; *(uint32_t*)data_ = Type::Gamestate; }
+      { assert(data); data_ = data; *(Type*)data_ = Type::Gamestate; }
     static inline uint32_t getSize()
       { return 21; }
Index: code/branches/cpp11_v3/src/libraries/network/packet/Packet.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/packet/Packet.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/packet/Packet.cc	(revision 11068)
@@ -157,5 +157,5 @@
   }
 #ifndef NDEBUG
-  switch( *(Type::Value *)(data_ + _PACKETID) )
+  switch( *(Type *)(data_ + _PACKETID) )
   {
     case Type::Acknowledgement:
@@ -191,6 +191,6 @@
 //     peerID = NETWORK_PEER_ID_SERVER;
   Packet *p = nullptr;
-//   orxout(verbose_ultra, context::packets) << "packet type: " << *(Type::Value *)&data[_PACKETID] << endl;
-  switch( *(Type::Value *)(data + _PACKETID) )
+//   orxout(verbose_ultra, context::packets) << "packet type: " << *(Type *)&data[_PACKETID] << endl;
+  switch( *(Type *)(data + _PACKETID) )
   {
     case Type::Acknowledgement:
Index: code/branches/cpp11_v3/src/libraries/network/packet/Packet.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/packet/Packet.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/packet/Packet.h	(revision 11068)
@@ -38,27 +38,21 @@
 {
 
-namespace Direction
+enum class Direction
 {
-  enum Value
-  {
-    Incoming,
-    Outgoing,
-    Bidirectional
-  };
-}
-namespace Type
+  Incoming,
+  Outgoing,
+  Bidirectional
+};
+enum class Type : uint8_t
 {
-  enum Value
-  {
-    Acknowledgement,
-    Chat,
-    ClassID,
-    DeleteObjects,
-    FunctionIDs,
-    FunctionCalls,
-    Gamestate,
-    Welcome
-  };
-}
+  Acknowledgement,
+  Chat,
+  ClassID,
+  DeleteObjects,
+  FunctionIDs,
+  FunctionCalls,
+  Gamestate,
+  Welcome
+};
 
 /**
@@ -98,5 +92,5 @@
     unsigned int peerID_;
     uint32_t requiredGamestateID_;
-    Direction::Value packetDirection_;
+    Direction packetDirection_;
     /** Pointer to the data. Be careful when deleting it because it might
         point to a location that was allocated by ENet.
Index: code/branches/cpp11_v3/src/libraries/network/packet/Welcome.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/packet/Welcome.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/packet/Welcome.cc	(revision 11068)
@@ -41,5 +41,5 @@
 #define PACKET_FLAGS_CLASSID  PacketFlag::Reliable
 #define _PACKETID             0
-#define _CLIENTID             _PACKETID + sizeof(Type::Value)
+#define _CLIENTID             _PACKETID + sizeof(Type)
 #define _ENDIANTEST           _CLIENTID + sizeof(uint32_t)
 
@@ -51,5 +51,5 @@
   data_=new uint8_t[ getSize() ];
   assert(data_);
-  *(packet::Type::Value *)(data_ + _PACKETID ) = packet::Type::Welcome;
+  *(packet::Type *)(data_ + _PACKETID ) = packet::Type::Welcome;
   *(uint32_t *)(data_ + _CLIENTID ) = static_cast<uint32_t>(clientID);
   *(uint32_t *)(data_ + _ENDIANTEST ) = 0xFEDC4321;
@@ -70,5 +70,5 @@
 
 unsigned int Welcome::getSize() const{
-  return sizeof(packet::Type::Value) + 2*sizeof(uint32_t);
+  return sizeof(packet::Type) + 2*sizeof(uint32_t);
 }
 
Index: code/branches/cpp11_v3/src/libraries/network/synchronisable/Synchronisable.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/network/synchronisable/Synchronisable.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/network/synchronisable/Synchronisable.h	(revision 11068)
@@ -38,4 +38,5 @@
 #include <queue>
 #include <set>
+#include <type_traits>
 
 #include "util/mbool.h"
@@ -203,14 +204,26 @@
   };
 
-  template <class T> void Synchronisable::registerVariable(T& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional)
-  {
+  namespace detail
+  {
+    template <class T, bool = std::is_enum<T>::value>
+    struct UnderlyingType;
+    template <class T>
+    struct UnderlyingType<T, true> { typedef typename std::underlying_type<T>::type type; };
+    template <class T>
+    struct UnderlyingType<T, false> { typedef T type; };
+  }
+
+  template <class T>
+  void Synchronisable::registerVariable(T& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional)
+  {
+    typedef typename detail::UnderlyingType<T>::type UnderlyingType;
     if (bidirectional)
     {
-      syncList_.push_back(new SynchronisableVariableBidirectional<T>(variable, mode, cb));
+      syncList_.push_back(new SynchronisableVariableBidirectional<UnderlyingType>(reinterpret_cast<UnderlyingType&>(variable), mode, cb));
       this->dataSize_ += syncList_.back()->getSize(state_);
     }
     else
     {
-      syncList_.push_back(new SynchronisableVariable<T>(variable, mode, cb));
+      syncList_.push_back(new SynchronisableVariable<UnderlyingType>(reinterpret_cast<UnderlyingType&>(variable), mode, cb));
       if ( this->state_ == mode )
         this->dataSize_ += syncList_.back()->getSize(state_);
@@ -218,5 +231,6 @@
   }
   
-  template <class T> void Synchronisable::unregisterVariable(T& variable)
+  template <class T>
+  void Synchronisable::unregisterVariable(T& variable)
   {
     std::vector<SynchronisableVariableBase*>::iterator it = syncList_.begin();
@@ -238,11 +252,13 @@
   }
 
-  template <class T> void Synchronisable::registerVariable( std::set<T>& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional)
-  {
+  template <class T>
+  void Synchronisable::registerVariable( std::set<T>& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional)
+  {
+    typedef typename detail::UnderlyingType<T>::type UnderlyingType;
     SynchronisableVariableBase* sv;
     if (bidirectional)
-      sv = new SynchronisableVariableBidirectional<std::set<T>>(variable, mode, cb);
+      sv = new SynchronisableVariableBidirectional<std::set<UnderlyingType>>(reinterpret_cast<std::set<UnderlyingType>&>(variable), mode, cb);
     else
-      sv = new SynchronisableVariable<std::set<T>>(variable, mode, cb);
+      sv = new SynchronisableVariable<std::set<UnderlyingType>>(reinterpret_cast<std::set<UnderlyingType>&>(variable), mode, cb);
     syncList_.push_back(sv);
     stringList_.push_back(sv);
Index: code/branches/cpp11_v3/src/libraries/util/Math.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/util/Math.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/util/Math.h	(revision 11068)
@@ -47,4 +47,5 @@
 #include <cstdlib>
 #include <random>
+#include <type_traits>
 
 #include <OgreMath.h>
@@ -178,9 +179,15 @@
         @c Vector3 you get <tt>Vector3(0, 0, 0)</tt>.
     */
-    template <typename T>
-    inline T zeroise()
+    template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, T>::type
+    inline /*T*/ zeroise()
     {
         // If you reach this code, you abused zeroise()!
         static_assert(sizeof(T) != sizeof(T), "No template specialization available for T");
+    }
+    /// Implementation for enum classes: uses the underlying type to create a zero value.
+    template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, T>::type
+    inline /*T*/ zeroise()
+    {
+        return static_cast<T>(zeroise<typename std::underlying_type<T>::type>());
     }
 
Index: code/branches/cpp11_v3/src/libraries/util/MultiType.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/util/MultiType.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/util/MultiType.cc	(revision 11068)
@@ -43,5 +43,5 @@
         @param type The type
     */
-    bool MultiType::convert(Type::Enum type)
+    bool MultiType::convert(Type type)
     {
         switch (type)
@@ -106,5 +106,5 @@
     std::string MultiType::getTypename() const
     {
-        Type::Enum type = (this->value_) ? this->value_->type_ : Type::Null;
+        Type type = (this->value_) ? this->value_->type_ : Type::Null;
 
         switch (type)
Index: code/branches/cpp11_v3/src/libraries/util/MultiType.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/util/MultiType.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/util/MultiType.h	(revision 11068)
@@ -132,36 +132,33 @@
         template <typename T> friend class MT_Value;
 
-        struct Type
+        /**
+            @brief Enum of all possible types of a MultiType.
+        */
+        enum class Type : uint8_t
         {
-            /**
-                @brief Enum of all possible types of a MultiType.
-            */
-            enum Enum
-            {
-                Null,
-                Char,
-                UnsignedChar,
-                Short,
-                UnsignedShort,
-                Int,
-                UnsignedInt,
-                Long,
-                UnsignedLong,
-                LongLong,
-                UnsignedLongLong,
-                Float,
-                Double,
-                LongDouble,
-                Bool,
-                VoidPointer,
-                String,
-                Vector2,
-                Vector3,
-                Vector4,
-                ColourValue,
-                Quaternion,
-                Radian,
-                Degree
-            };
+            Null,
+            Char,
+            UnsignedChar,
+            Short,
+            UnsignedShort,
+            Int,
+            UnsignedInt,
+            Long,
+            UnsignedLong,
+            LongLong,
+            UnsignedLongLong,
+            Float,
+            Double,
+            LongDouble,
+            Bool,
+            VoidPointer,
+            String,
+            Vector2,
+            Vector3,
+            Vector4,
+            ColourValue,
+            Quaternion,
+            Radian,
+            Degree
         };
 
@@ -174,5 +171,5 @@
         {
         public:
-            inline MT_ValueBase(void* data, Type::Enum type) : type_(type), bLastConversionSuccessful(true), data_(data) {}
+            inline MT_ValueBase(void* data, Type type) : type_(type), bLastConversionSuccessful(true), data_(data) {}
             virtual inline ~MT_ValueBase() {}
 
@@ -182,7 +179,20 @@
 
             /// Returns the type of the current value.
-            inline const Type::Enum& getType() const { return this->type_; }
-            /// Returns true if the type of the stored value is T.
-            template <typename T> inline bool isType() const { return false; }
+            inline const Type& getType() const { return this->type_; }
+
+            /// Returns true if the type of the stored value is T. Note: the actual implementations for all supported types are defined outside of the class.
+            template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, bool>::type
+            inline /*bool*/ isType() const
+            {
+                // If you reach this code, you used MultiType with an unsupported type T
+                static_assert(sizeof(T) != sizeof(T), "No template specialization available for T");
+                return false;
+            }
+            /// Implementation for enum classes: Returns true if the type of the stored value is the underlying type of T.
+            template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, bool>::type
+            inline /*bool*/ isType() const
+            {
+                return this->isType<typename std::underlying_type<T>::type>();
+            }
 
             /// Checks whether the value is a default one.
@@ -215,4 +225,18 @@
             virtual bool setValue(const MultiType& other)            = 0;
 
+            template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, bool>::type
+            inline /*bool*/ setValue(const T& value)
+            {
+                // If you reach this code, you used MultiType with an unsupported type T
+                static_assert(sizeof(T) != sizeof(T), "No template specialization available for T");
+                return false;
+            }
+            template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, bool>::type
+            inline /*bool*/ setValue(const T& value)
+            {
+                typedef typename std::underlying_type<T>::type UnderlyingType;
+                return this->setValue(reinterpret_cast<const UnderlyingType&>(value));
+            }
+
             virtual bool getValue(char*                 value) const = 0;
             virtual bool getValue(unsigned char*        value) const = 0;
@@ -239,4 +263,18 @@
             virtual bool getValue(orxonox::Degree*      value) const = 0;
 
+            template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value, bool>::type
+            inline /*bool*/ getValue(T* value) const
+            {
+                // If you reach this code, you used MultiType with an unsupported type T
+                static_assert(sizeof(T) != sizeof(T), "No template specialization available for T");
+                return false;
+            }
+            template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value, bool>::type
+            inline /*bool*/ getValue(T* value) const
+            {
+                typedef typename std::underlying_type<T>::type UnderlyingType;
+                return this->getValue(reinterpret_cast<UnderlyingType*>(value));
+            }
+
             template <typename T> T get() const
             {
@@ -257,5 +295,5 @@
             virtual uint8_t getSize() const = 0;
 
-            Type::Enum type_;               ///< The type of the current value
+            Type type_;                     ///< The type of the current value
             bool bLastConversionSuccessful; ///< True if the last conversion was successful
             void* data_;                    ///< For direct access to the value if the type is known
@@ -354,7 +392,10 @@
             template <typename T> inline bool getValue(T* value) const { if (this->value_) { return this->value_->getValue(value); } return false; }
 
-            /// Returns the current value, converted to the requested type. This base implementation works only for pointers. All other supported types are
-            /// implemented in  specialized functions at the bottom of this file.
-            template <typename T> inline T get() const { return static_cast<T>(this->get<void*>()); }
+            /// Returns the current value, converted to the requested type.
+            template <typename T> /* for normal types */ typename std::enable_if<!std::is_pointer<T>::value, T>::type
+            inline /*T*/ get() const { return (this->value_ ? this->value_->get<T>() : NilValue<T>()); }
+            /// Returns the current value, converted to a pointer of the requested type.
+            template <typename T> /* for pointers */ typename std::enable_if<std::is_pointer<T>::value, T>::type
+            inline /*T*/ get() const { return this->value_ ? static_cast<T>(this->value_->get<void*>()) : nullptr; }
 
 
@@ -365,6 +406,6 @@
             inline void exportData(uint8_t*& mem) const
             {
-                assert(sizeof(Type::Enum) <= 8);
-                *static_cast<uint8_t*>(mem) = this->getType();
+                assert(sizeof(Type) <= 8);
+                *static_cast<uint8_t*>(mem) = static_cast<uint8_t>(this->getType());
                 mem += sizeof(uint8_t);
                 this->value_->exportData(mem);
@@ -373,6 +414,6 @@
             inline void importData(uint8_t*& mem)
             {
-                assert(sizeof(Type::Enum) <= 8);
-                this->setType(static_cast<Type::Enum>(*static_cast<uint8_t*>(mem)));
+                assert(sizeof(Type) <= 8);
+                this->setType(static_cast<Type>(*static_cast<uint8_t*>(mem)));
                 mem += sizeof(uint8_t);
                 this->value_->importData(mem);
@@ -414,9 +455,9 @@
 
             /// Resets the value and changes the internal type to the given type.
-            inline void setType(Type::Enum type) { this->reset(); this->convert(type); this->resetValue(); }
+            inline void setType(Type type) { this->reset(); this->convert(type); this->resetValue(); }
             /// Returns the current type.
-            inline Type::Enum getType() const { return (this->value_) ? this->value_->type_ : Type::Null; }
+            inline Type getType() const { return (this->value_) ? this->value_->type_ : Type::Null; }
             /// Converts the current value to the given type.
-            bool convert(Type::Enum type);
+            bool convert(Type type);
 
             /// Changes the value container.
@@ -428,8 +469,16 @@
             }
             /// Creates a new value container (works only with specialized types).
-            template <typename T> inline void createNewValueContainer(const T& value)
+            template <typename T> /* for normal classes */ typename std::enable_if<!std::is_enum<T>::value>::type
+            inline /*void*/ createNewValueContainer(const T& value)
             { 
                 // If you reach this code, you used MultiType with an unsupported type T
                 static_assert(sizeof(T) != sizeof(T), "No template specialization available for T");
+            }
+            /// Creates a new value container (implementation for enum classes that must be cast to the underlying type).
+            template <typename T> /* for enum classes */ typename std::enable_if<std::is_enum<T>::value>::type
+            inline /*void*/ createNewValueContainer(const T& value)
+            {
+                typedef typename std::underlying_type<T>::type UnderlyingType;
+                this->createNewValueContainer<UnderlyingType>(reinterpret_cast<const UnderlyingType&>(value));
             }
 
@@ -475,28 +524,4 @@
     template <> inline bool MultiType::isType<void>() const { return this->null(); }
     template <> inline bool MultiType::convert<void>() { this->reset(); return true; }
-
-    template <> inline char                 MultiType::get() const { return (this->value_ ? this->value_->get<char>()                 : 0); }
-    template <> inline unsigned char        MultiType::get() const { return (this->value_ ? this->value_->get<unsigned char>()        : 0); }
-    template <> inline short                MultiType::get() const { return (this->value_ ? this->value_->get<short>()                : 0); }
-    template <> inline unsigned short       MultiType::get() const { return (this->value_ ? this->value_->get<unsigned short>()       : 0); }
-    template <> inline int                  MultiType::get() const { return (this->value_ ? this->value_->get<int>()                  : 0); }
-    template <> inline unsigned int         MultiType::get() const { return (this->value_ ? this->value_->get<unsigned int>()         : 0); }
-    template <> inline long                 MultiType::get() const { return (this->value_ ? this->value_->get<long>()                 : 0); }
-    template <> inline unsigned long        MultiType::get() const { return (this->value_ ? this->value_->get<unsigned long>()        : 0); }
-    template <> inline long long            MultiType::get() const { return (this->value_ ? this->value_->get<long long>()            : 0); }
-    template <> inline unsigned long long   MultiType::get() const { return (this->value_ ? this->value_->get<unsigned long long>()   : 0); }
-    template <> inline float                MultiType::get() const { return (this->value_ ? this->value_->get<float>()                : 0); }
-    template <> inline double               MultiType::get() const { return (this->value_ ? this->value_->get<double>()               : 0); }
-    template <> inline long double          MultiType::get() const { return (this->value_ ? this->value_->get<long double>()          : 0); }
-    template <> inline bool                 MultiType::get() const { return (this->value_ ? this->value_->get<bool>()                 : 0); }
-    template <> inline void*                MultiType::get() const { return (this->value_ ? this->value_->get<void*>()                : nullptr); }
-    template <> inline std::string          MultiType::get() const { return (this->value_ ? this->value_->get<std::string>()          : NilValue<std::string>()); }
-    template <> inline orxonox::Vector2     MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::Vector2>()     : NilValue<orxonox::Vector2>()); }
-    template <> inline orxonox::Vector3     MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::Vector3>()     : NilValue<orxonox::Vector3>()); }
-    template <> inline orxonox::Vector4     MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::Vector4>()     : NilValue<orxonox::Vector4>()); }
-    template <> inline orxonox::ColourValue MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::ColourValue>() : NilValue<orxonox::ColourValue>()); }
-    template <> inline orxonox::Quaternion  MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::Quaternion>()  : NilValue<orxonox::Quaternion>()); }
-    template <> inline orxonox::Radian      MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::Radian>()      : NilValue<orxonox::Radian>()); }
-    template <> inline orxonox::Degree      MultiType::get() const { return (this->value_ ? this->value_->get<orxonox::Degree>()      : NilValue<orxonox::Degree>()); }
 
     template <> _UtilExport void MultiType::createNewValueContainer(const char& value);
Index: code/branches/cpp11_v3/src/libraries/util/MultiTypeValue.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/util/MultiTypeValue.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/util/MultiTypeValue.h	(revision 11068)
@@ -55,5 +55,5 @@
     public:
         /// Constructor: Assigns the value and the type identifier.
-        MT_Value(const T& value, MultiType::Type::Enum type) : MT_ValueBase(&this->value_, type), value_(value) {}
+        MT_Value(const T& value, MultiType::Type type) : MT_ValueBase(&this->value_, type), value_(value) {}
 
         /// Creates a copy of itself.
Index: code/branches/cpp11_v3/src/libraries/util/SubString.cc
===================================================================
--- code/branches/cpp11_v3/src/libraries/util/SubString.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/util/SubString.cc	(revision 11068)
@@ -265,10 +265,10 @@
         bool inSafemode = false;
 
-        if(start_state != SL_NORMAL && tokens.size() > 0)
+        if(start_state != SPLIT_LINE_STATE::NORMAL && tokens.size() > 0)
         {
             token = tokens[tokens.size()-1];
             tokens.pop_back();
         }
-        if(start_state != SL_NORMAL && bTokenInSafemode.size() > 0)
+        if(start_state != SPLIT_LINE_STATE::NORMAL && bTokenInSafemode.size() > 0)
         {
             inSafemode = bTokenInSafemode[bTokenInSafemode.size()-1];
@@ -280,8 +280,8 @@
             switch(state)
             {
-            case SL_NORMAL:
+            case SPLIT_LINE_STATE::NORMAL:
                 if(line[i] == escapeChar)
                 {
-                    state = SL_ESCAPE;
+                    state = SPLIT_LINE_STATE::ESCAPE;
                     if (!bRemoveEscapeChar)
                         token += line[i];
@@ -290,5 +290,5 @@
                 else if(line[i] == safemodeChar)
                 {
-                    state = SL_SAFEMODE;
+                    state = SPLIT_LINE_STATE::SAFEMODE;
                     inSafemode = true;
                     if (!bRemoveSafemodeChar)
@@ -298,5 +298,5 @@
                 else if(line[i] == openparenthesisChar)
                 {
-                    state = SL_PARENTHESES;
+                    state = SPLIT_LINE_STATE::PARENTHESES;
                     inSafemode = true;
                     if (!bRemoveParenthesisChars)
@@ -318,5 +318,5 @@
                     }
                     token += line[i];       // EAT
-                    state = SL_COMMENT;
+                    state = SPLIT_LINE_STATE::COMMENT;
                 }
                 else if(delimiters.find(line[i]) != std::string::npos)
@@ -334,5 +334,5 @@
                         inSafemode = false;
                     }
-                    state = SL_NORMAL;
+                    state = SPLIT_LINE_STATE::NORMAL;
                 }
                 else
@@ -353,5 +353,5 @@
                 }
                 break;
-            case SL_ESCAPE:
+            case SPLIT_LINE_STATE::ESCAPE:
                 if (!bRemoveSafemodeChar)
                     token += line[i];
@@ -368,10 +368,10 @@
                     else token += line[i];  // EAT
                 }
-                state = SL_NORMAL;
-                break;
-            case SL_SAFEMODE:
+                state = SPLIT_LINE_STATE::NORMAL;
+                break;
+            case SPLIT_LINE_STATE::SAFEMODE:
                 if(line[i] == safemodeChar)
                 {
-                    state = SL_NORMAL;
+                    state = SPLIT_LINE_STATE::NORMAL;
                     if (!bRemoveSafemodeChar)
                         token += line[i];
@@ -379,5 +379,5 @@
                 else if(line[i] == escapeChar)
                 {
-                    state = SL_SAFEESCAPE;
+                    state = SPLIT_LINE_STATE::SAFEESCAPE;
                 }
                 else
@@ -387,5 +387,5 @@
                 break;
 
-            case SL_SAFEESCAPE:
+            case SPLIT_LINE_STATE::SAFEESCAPE:
                 if(line[i] == 'n') token += '\n';
                 else if(line[i] == 't') token += '\t';
@@ -397,11 +397,11 @@
                 else if(line[i] == '?') token += '\?';
                 else token += line[i];  // EAT
-                state = SL_SAFEMODE;
-                break;
-
-            case SL_PARENTHESES:
+                state = SPLIT_LINE_STATE::SAFEMODE;
+                break;
+
+            case SPLIT_LINE_STATE::PARENTHESES:
                 if(line[i] == closeparenthesisChar)
                 {
-                    state = SL_NORMAL;
+                    state = SPLIT_LINE_STATE::NORMAL;
                     if (!bRemoveParenthesisChars)
                         token += line[i];
@@ -409,5 +409,5 @@
                 else if(line[i] == escapeChar)
                 {
-                    state = SL_PARENTHESESESCAPE;
+                    state = SPLIT_LINE_STATE::PARENTHESESESCAPE;
                 }
                 else
@@ -417,5 +417,5 @@
                 break;
 
-            case SL_PARENTHESESESCAPE:
+            case SPLIT_LINE_STATE::PARENTHESESESCAPE:
                 if(line[i] == 'n') token += '\n';
                 else if(line[i] == 't') token += '\t';
@@ -427,8 +427,8 @@
                 else if(line[i] == '?') token += '\?';
                 else token += line[i];  // EAT
-                state = SL_PARENTHESES;
-                break;
-
-            case SL_COMMENT:
+                state = SPLIT_LINE_STATE::PARENTHESES;
+                break;
+
+            case SPLIT_LINE_STATE::COMMENT:
                 if(line[i] == '\n')
                 {
@@ -441,5 +441,5 @@
                         inSafemode = false;
                     }
-                    state = SL_NORMAL;
+                    state = SPLIT_LINE_STATE::NORMAL;
                 }
                 else
Index: code/branches/cpp11_v3/src/libraries/util/SubString.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/util/SubString.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/util/SubString.h	(revision 11068)
@@ -102,13 +102,13 @@
     {
         /// An enumerator for the internal state of the parser
-        enum SPLIT_LINE_STATE
+        enum class SPLIT_LINE_STATE
         {
-            SL_NORMAL,            //!< Normal state
-            SL_ESCAPE,            //!< After an escape character
-            SL_SAFEMODE,          //!< In safe mode (usually between quotation marks).
-            SL_SAFEESCAPE,        //!< In safe mode with the internal escape character, that escapes even the savemode character.
-            SL_COMMENT,           //!< In Comment mode.
-            SL_PARENTHESES,       //!< Between parentheses (usually '{' and '}')
-            SL_PARENTHESESESCAPE, //!< Between parentheses with the internal escape character, that escapes even the closing parenthesis character.
+            NORMAL,            //!< Normal state
+            ESCAPE,            //!< After an escape character
+            SAFEMODE,          //!< In safe mode (usually between quotation marks).
+            SAFEESCAPE,        //!< In safe mode with the internal escape character, that escapes even the savemode character.
+            COMMENT,           //!< In Comment mode.
+            PARENTHESES,       //!< Between parentheses (usually '{' and '}')
+            PARENTHESESESCAPE, //!< Between parentheses with the internal escape character, that escapes even the closing parenthesis character.
         };
 
@@ -204,5 +204,5 @@
                                           bool bRemoveParenthesisChars = true,
                                           char commentChar = '\0',
-                                          SPLIT_LINE_STATE start_state = SL_NORMAL);
+                                          SPLIT_LINE_STATE start_state = SPLIT_LINE_STATE::NORMAL);
 
         std::vector<std::string>  tokens_;              ///< The tokens after splitting the input line
Index: code/branches/cpp11_v3/src/libraries/util/UtilPrereqs.h
===================================================================
--- code/branches/cpp11_v3/src/libraries/util/UtilPrereqs.h	(revision 11067)
+++ code/branches/cpp11_v3/src/libraries/util/UtilPrereqs.h	(revision 11068)
@@ -37,4 +37,5 @@
 
 #include "OrxonoxConfig.h"
+#include <string>
 
 //-----------------------------------------------------------------------
Index: code/branches/cpp11_v3/src/modules/gametypes/OldRaceCheckPoint.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/gametypes/OldRaceCheckPoint.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/gametypes/OldRaceCheckPoint.cc	(revision 11068)
@@ -49,5 +49,5 @@
 
         this->setRadarObjectColour(ColourValue::Blue);
-        this->setRadarObjectShape(RadarViewable::Triangle);
+        this->setRadarObjectShape(RadarViewable::Shape::Triangle);
         this->setRadarVisibility(false);
     }
Index: code/branches/cpp11_v3/src/modules/gametypes/RaceCheckPoint.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/gametypes/RaceCheckPoint.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/gametypes/RaceCheckPoint.cc	(revision 11068)
@@ -53,5 +53,5 @@
 
         this->setRadarObjectColour(ColourValue::Blue);
-        this->setRadarObjectShape(RadarViewable::Triangle);
+        this->setRadarObjectShape(RadarViewable::Shape::Triangle);
         this->setRadarVisibility(false);
         this->settingsChanged();
Index: code/branches/cpp11_v3/src/modules/jump/Jump.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/jump/Jump.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/jump/Jump.cc	(revision 11068)
@@ -610,12 +610,12 @@
         const int numJ = 4;
 
-        enum PlatformType
-        {
-            PLATFORM_EMPTY, PLATFORM_STATIC, PLATFORM_HMOVE, PLATFORM_VMOVE, PLATFORM_DISAPPEAR, PLATFORM_TIMER, PLATFORM_FAKE
+        enum class PlatformType
+        {
+            EMPTY, STATIC, HMOVE, VMOVE, DISAPPEAR, TIMER, FAKE
         };
 
-        enum ItemType
-        {
-            ITEM_NOTHING, ITEM_SPRING, ITEM_PROPELLER, ITEM_ROCKET, ITEM_BOOTS, ITEM_SHIELD
+        enum class ItemType
+        {
+            NOTHING, SPRING, PROPELLER, ROCKET, BOOTS, SHIELD
         };
 
@@ -631,5 +631,5 @@
             for (int j = 0; j < numJ; ++j)
             {
-                matrix[i][j].type = PLATFORM_EMPTY;
+                matrix[i][j].type = PlatformType::EMPTY;
                 matrix[i][j].done = false;
             }
@@ -637,9 +637,9 @@
         PlatformType platformtype1;
         PlatformType platformtype2;
-        ItemType itemType = ITEM_NOTHING;
+        ItemType itemType = ItemType::NOTHING;
 
         if (rand()%2 == 0)
         {
-            itemType = ITEM_SPRING;
+            itemType = ItemType::SPRING;
         }
         else if (rand()%2 == 0 && sectionNumber_ > 3)
@@ -648,14 +648,14 @@
             {
             case 0:
-                itemType = ITEM_PROPELLER;
+                itemType = ItemType::PROPELLER;
                 break;
             case 1:
-                itemType = ITEM_ROCKET;
+                itemType = ItemType::ROCKET;
                 break;
             case 2:
-                itemType = ITEM_BOOTS;
+                itemType = ItemType::BOOTS;
                 break;
             case 3:
-                itemType = ITEM_SHIELD;
+                itemType = ItemType::SHIELD;
                 break;
             default:
@@ -667,122 +667,122 @@
         {
         case 0:
-            platformtype1 = PLATFORM_STATIC;
-            platformtype2 = PLATFORM_STATIC;
+            platformtype1 = PlatformType::STATIC;
+            platformtype2 = PlatformType::STATIC;
             break;
         case 1:
-            platformtype1 = PLATFORM_STATIC;
-            platformtype2 = PLATFORM_STATIC;
+            platformtype1 = PlatformType::STATIC;
+            platformtype2 = PlatformType::STATIC;
             break;
         case 2:
-            platformtype1 = PLATFORM_STATIC;
-            platformtype2 = PLATFORM_HMOVE;
+            platformtype1 = PlatformType::STATIC;
+            platformtype2 = PlatformType::HMOVE;
             break;
         case 3:
-            platformtype1 = PLATFORM_STATIC;
-            platformtype2 = PLATFORM_DISAPPEAR;
+            platformtype1 = PlatformType::STATIC;
+            platformtype2 = PlatformType::DISAPPEAR;
             break;
         case 4:
-            platformtype1 = PLATFORM_STATIC;
-            platformtype2 = PLATFORM_VMOVE;
+            platformtype1 = PlatformType::STATIC;
+            platformtype2 = PlatformType::VMOVE;
             break;
         case 5:
-            platformtype1 = PLATFORM_STATIC;
-            platformtype2 = PLATFORM_TIMER;
+            platformtype1 = PlatformType::STATIC;
+            platformtype2 = PlatformType::TIMER;
             break;
         case 6:
-            platformtype1 = PLATFORM_HMOVE;
-            platformtype2 = PLATFORM_STATIC;
+            platformtype1 = PlatformType::HMOVE;
+            platformtype2 = PlatformType::STATIC;
             break;
         case 7:
-            platformtype1 = PLATFORM_HMOVE;
-            platformtype2 = PLATFORM_HMOVE;
+            platformtype1 = PlatformType::HMOVE;
+            platformtype2 = PlatformType::HMOVE;
             break;
         case 8:
-            platformtype1 = PLATFORM_HMOVE;
-            platformtype2 = PLATFORM_HMOVE;
+            platformtype1 = PlatformType::HMOVE;
+            platformtype2 = PlatformType::HMOVE;
             break;
         case 9:
-            platformtype1 = PLATFORM_HMOVE;
-            platformtype2 = PLATFORM_DISAPPEAR;
+            platformtype1 = PlatformType::HMOVE;
+            platformtype2 = PlatformType::DISAPPEAR;
             break;
         case 10:
-            platformtype1 = PLATFORM_HMOVE;
-            platformtype2 = PLATFORM_VMOVE;
+            platformtype1 = PlatformType::HMOVE;
+            platformtype2 = PlatformType::VMOVE;
             break;
         case 11:
-            platformtype1 = PLATFORM_HMOVE;
-            platformtype2 = PLATFORM_TIMER;
+            platformtype1 = PlatformType::HMOVE;
+            platformtype2 = PlatformType::TIMER;
             break;
         case 12:
-            platformtype1 = PLATFORM_DISAPPEAR;
-            platformtype2 = PLATFORM_STATIC;
+            platformtype1 = PlatformType::DISAPPEAR;
+            platformtype2 = PlatformType::STATIC;
             break;
         case 13:
-            platformtype1 = PLATFORM_DISAPPEAR;
-            platformtype2 = PLATFORM_HMOVE;
+            platformtype1 = PlatformType::DISAPPEAR;
+            platformtype2 = PlatformType::HMOVE;
             break;
         case 14:
-            platformtype1 = PLATFORM_DISAPPEAR;
-            platformtype2 = PLATFORM_DISAPPEAR;
+            platformtype1 = PlatformType::DISAPPEAR;
+            platformtype2 = PlatformType::DISAPPEAR;
             break;
         case 15:
-            platformtype1 = PLATFORM_DISAPPEAR;
-            platformtype2 = PLATFORM_DISAPPEAR;
+            platformtype1 = PlatformType::DISAPPEAR;
+            platformtype2 = PlatformType::DISAPPEAR;
             break;
         case 16:
-            platformtype1 = PLATFORM_DISAPPEAR;
-            platformtype2 = PLATFORM_VMOVE;
+            platformtype1 = PlatformType::DISAPPEAR;
+            platformtype2 = PlatformType::VMOVE;
             break;
         case 17:
-            platformtype1 = PLATFORM_DISAPPEAR;
-            platformtype2 = PLATFORM_TIMER;
+            platformtype1 = PlatformType::DISAPPEAR;
+            platformtype2 = PlatformType::TIMER;
             break;
         case 18:
-            platformtype1 = PLATFORM_VMOVE;
-            platformtype2 = PLATFORM_STATIC;
+            platformtype1 = PlatformType::VMOVE;
+            platformtype2 = PlatformType::STATIC;
             break;
         case 19:
-            platformtype1 = PLATFORM_VMOVE;
-            platformtype2 = PLATFORM_HMOVE;
+            platformtype1 = PlatformType::VMOVE;
+            platformtype2 = PlatformType::HMOVE;
             break;
         case 20:
-            platformtype1 = PLATFORM_VMOVE;
-            platformtype2 = PLATFORM_DISAPPEAR;
+            platformtype1 = PlatformType::VMOVE;
+            platformtype2 = PlatformType::DISAPPEAR;
             break;
         case 21:
-            platformtype1 = PLATFORM_VMOVE;
-            platformtype2 = PLATFORM_VMOVE;
+            platformtype1 = PlatformType::VMOVE;
+            platformtype2 = PlatformType::VMOVE;
             break;
         case 22:
-            platformtype1 = PLATFORM_VMOVE;
-            platformtype2 = PLATFORM_VMOVE;
+            platformtype1 = PlatformType::VMOVE;
+            platformtype2 = PlatformType::VMOVE;
             break;
         case 23:
-            platformtype1 = PLATFORM_VMOVE;
-            platformtype2 = PLATFORM_TIMER;
+            platformtype1 = PlatformType::VMOVE;
+            platformtype2 = PlatformType::TIMER;
             break;
         case 24:
-            platformtype1 = PLATFORM_TIMER;
-            platformtype2 = PLATFORM_STATIC;
+            platformtype1 = PlatformType::TIMER;
+            platformtype2 = PlatformType::STATIC;
             break;
         case 25:
-            platformtype1 = PLATFORM_TIMER;
-            platformtype2 = PLATFORM_HMOVE;
+            platformtype1 = PlatformType::TIMER;
+            platformtype2 = PlatformType::HMOVE;
             break;
         case 26:
-            platformtype1 = PLATFORM_TIMER;
-            platformtype2 = PLATFORM_DISAPPEAR;
+            platformtype1 = PlatformType::TIMER;
+            platformtype2 = PlatformType::DISAPPEAR;
             break;
         case 27:
-            platformtype1 = PLATFORM_TIMER;
-            platformtype2 = PLATFORM_VMOVE;
+            platformtype1 = PlatformType::TIMER;
+            platformtype2 = PlatformType::VMOVE;
             break;
         case 28:
-            platformtype1 = PLATFORM_TIMER;
-            platformtype2 = PLATFORM_TIMER;
+            platformtype1 = PlatformType::TIMER;
+            platformtype2 = PlatformType::TIMER;
             break;
         default:
-            platformtype1 = PLATFORM_TIMER;
-            platformtype2 = PLATFORM_TIMER;
+            platformtype1 = PlatformType::TIMER;
+            platformtype2 = PlatformType::TIMER;
             break;
         }
@@ -807,6 +807,6 @@
         if (platformtype1 == platformtype2 && sectionNumber_ > 10 && rand()%2 == 0)
         {
-            matrix[rand()%numI][rand()%numJ].type = PLATFORM_EMPTY;
-            matrix[rand()%numI][rand()%numJ].type = PLATFORM_EMPTY;
+            matrix[rand()%numI][rand()%numJ].type = PlatformType::EMPTY;
+            matrix[rand()%numI][rand()%numJ].type = PlatformType::EMPTY;
         }
 
@@ -816,9 +816,9 @@
             if (rand()%2 == 0)
             {
-                matrix[rand()%numI][rand()%numJ].type = PLATFORM_EMPTY;
-            }
-            else
-            {
-                matrix[rand()%numI][rand()%numJ].type = PLATFORM_FAKE;
+                matrix[rand()%numI][rand()%numJ].type = PlatformType::EMPTY;
+            }
+            else
+            {
+                matrix[rand()%numI][rand()%numJ].type = PlatformType::FAKE;
             }
         }
@@ -827,17 +827,17 @@
             if (rand()%2 == 0)
             {
-                matrix[rand()%numI][rand()%numJ].type = PLATFORM_EMPTY;
-            }
-            else
-            {
-                matrix[rand()%numI][rand()%numJ].type = PLATFORM_FAKE;
+                matrix[rand()%numI][rand()%numJ].type = PlatformType::EMPTY;
+            }
+            else
+            {
+                matrix[rand()%numI][rand()%numJ].type = PlatformType::FAKE;
             }
             if (rand()%2 == 0)
             {
-                matrix[rand()%numI][rand()%numJ].type = PLATFORM_EMPTY;
-            }
-            else
-            {
-                matrix[rand()%numI][rand()%numJ].type = PLATFORM_FAKE;
+                matrix[rand()%numI][rand()%numJ].type = PlatformType::EMPTY;
+            }
+            else
+            {
+                matrix[rand()%numI][rand()%numJ].type = PlatformType::FAKE;
             }
         }
@@ -846,25 +846,25 @@
             if (rand()%2 == 0)
             {
-                matrix[rand()%numI][rand()%numJ].type = PLATFORM_EMPTY;
-            }
-            else
-            {
-                matrix[rand()%numI][rand()%numJ].type = PLATFORM_FAKE;
+                matrix[rand()%numI][rand()%numJ].type = PlatformType::EMPTY;
+            }
+            else
+            {
+                matrix[rand()%numI][rand()%numJ].type = PlatformType::FAKE;
             }
             if (rand()%2 == 0)
             {
-                matrix[rand()%numI][rand()%numJ].type = PLATFORM_EMPTY;
-            }
-            else
-            {
-                matrix[rand()%numI][rand()%numJ].type = PLATFORM_FAKE;
+                matrix[rand()%numI][rand()%numJ].type = PlatformType::EMPTY;
+            }
+            else
+            {
+                matrix[rand()%numI][rand()%numJ].type = PlatformType::FAKE;
             }
             if (rand()%2 == 0)
             {
-                matrix[rand()%numI][rand()%numJ].type = PLATFORM_EMPTY;
-            }
-            else
-            {
-                matrix[rand()%numI][rand()%numJ].type = PLATFORM_FAKE;
+                matrix[rand()%numI][rand()%numJ].type = PlatformType::EMPTY;
+            }
+            else
+            {
+                matrix[rand()%numI][rand()%numJ].type = PlatformType::FAKE;
             }
         }
@@ -889,8 +889,8 @@
                     switch(matrix[i][j].type)
                     {
-                    case PLATFORM_EMPTY:
+                    case PlatformType::EMPTY:
                         matrix[i][j].done = true;
                         break;
-                    case PLATFORM_STATIC:
+                    case PlatformType::STATIC:
                         xPosition = randomXPosition(numJ, j);
                         zPosition = sectionBegin + i*sectionLength/numI;
@@ -898,5 +898,5 @@
                         matrix[i][j].done = true;
                         break;
-                    case PLATFORM_FAKE:
+                    case PlatformType::FAKE:
                         xPosition = randomXPosition(numJ, j);
                         zPosition = sectionBegin + i*sectionLength/numI;
@@ -904,5 +904,5 @@
                         matrix[i][j].done = true;
                         break;
-                    case PLATFORM_TIMER:
+                    case PlatformType::TIMER:
                         xPosition = randomXPosition(numJ, j);
                         zPosition = sectionBegin + i*sectionLength/numI;
@@ -910,5 +910,5 @@
                         matrix[i][j].done = true;
                         break;
-                    case PLATFORM_DISAPPEAR:
+                    case PlatformType::DISAPPEAR:
                         xPosition = randomXPosition(numJ, j);
                         zPosition = sectionBegin + i*sectionLength/numI;
@@ -916,7 +916,7 @@
                         matrix[i][j].done = true;
                         break;
-                    case PLATFORM_HMOVE:
+                    case PlatformType::HMOVE:
                         xVelocity = randomSpeed();
-                        if (j <= numJ-3 && matrix[i][j+1].type == PLATFORM_HMOVE && matrix[i][j+2].type == PLATFORM_HMOVE && rand()%2 == 0)
+                        if (j <= numJ-3 && matrix[i][j+1].type == PlatformType::HMOVE && matrix[i][j+2].type == PlatformType::HMOVE && rand()%2 == 0)
                         {
                             leftBoundary = randomXPositionLeft(numJ, j);
@@ -929,5 +929,5 @@
                             matrix[i][j+2].done = true;
                         }
-                        else if (j <= numJ-2 && matrix[i][j+1].type == PLATFORM_HMOVE && rand()%2 == 0)
+                        else if (j <= numJ-2 && matrix[i][j+1].type == PlatformType::HMOVE && rand()%2 == 0)
                         {
                             leftBoundary = randomXPositionLeft(numJ, j);
@@ -949,7 +949,7 @@
                         }
                         break;
-                    case PLATFORM_VMOVE:
+                    case PlatformType::VMOVE:
                         zVelocity = randomSpeed();
-                        if (i <= numI-3 && matrix[i+1][j].type == PLATFORM_VMOVE && matrix[i+2][j].type == PLATFORM_VMOVE && rand()%2 == 0)
+                        if (i <= numI-3 && matrix[i+1][j].type == PlatformType::VMOVE && matrix[i+2][j].type == PlatformType::VMOVE && rand()%2 == 0)
                         {
                             lowerBoundary = randomZPositionLower(numI, i, sectionBegin, sectionEnd);
@@ -962,5 +962,5 @@
                             matrix[i+2][j].done = true;
                         }
-                        else if (i <= numI-2 && matrix[i+1][j].type == PLATFORM_VMOVE && rand()%2 == 0)
+                        else if (i <= numI-2 && matrix[i+1][j].type == PlatformType::VMOVE && rand()%2 == 0)
                         {
                             lowerBoundary = randomZPositionLower(numI, i, sectionBegin, sectionEnd);
@@ -1000,14 +1000,14 @@
                 switch (itemType)
                 {
-                case ITEM_ROCKET:
+                case ItemType::ROCKET:
                     addRocket(0.0, randomPosition(sectionBegin, sectionBegin + sectionLength), -fieldWidth/2, fieldWidth/2, 0.0, 0.0, randomSpeed(), 0.0);
                     break;
-                case ITEM_PROPELLER:
+                case ItemType::PROPELLER:
                     addPropeller(0.0, randomPosition(sectionBegin, sectionBegin + sectionLength), -fieldWidth/2, fieldWidth/2, 0.0, 0.0, randomSpeed(), 0.0);
                     break;
-                case ITEM_BOOTS:
+                case ItemType::BOOTS:
                     addBoots(0.0, randomPosition(sectionBegin, sectionBegin + sectionLength), -fieldWidth/2, fieldWidth/2, 0.0, 0.0, randomSpeed(), 0.0);
                     break;
-                case ITEM_SHIELD:
+                case ItemType::SHIELD:
                     addShield(0.0, randomPosition(sectionBegin, sectionBegin + sectionLength), -fieldWidth/2, fieldWidth/2, 0.0, 0.0, randomSpeed(), 0.0);
                     break;
@@ -1020,14 +1020,14 @@
                 switch (itemType)
                 {
-                case ITEM_ROCKET:
+                case ItemType::ROCKET:
                     addRocket(randomPosition(-fieldWidth/2, fieldWidth/2), sectionBegin + sectionLength/2, 0.0, 0.0, sectionBegin, sectionEnd, 0.0, randomSpeed());
                     break;
-                case ITEM_PROPELLER:
+                case ItemType::PROPELLER:
                     addPropeller(randomPosition(-fieldWidth/2, fieldWidth/2), sectionBegin + sectionLength/2, 0.0, 0.0, sectionBegin, sectionEnd, 0.0, randomSpeed());
                     break;
-                case ITEM_BOOTS:
+                case ItemType::BOOTS:
                     addBoots(randomPosition(-fieldWidth/2, fieldWidth/2), sectionBegin + sectionLength/2, 0.0, 0.0, sectionBegin, sectionEnd, 0.0, randomSpeed());
                     break;
-                case ITEM_SHIELD:
+                case ItemType::SHIELD:
                     addShield(randomPosition(-fieldWidth/2, fieldWidth/2), sectionBegin + sectionLength/2, 0.0, 0.0, sectionBegin, sectionEnd, 0.0, randomSpeed());
                     break;
@@ -1045,17 +1045,17 @@
                 switch (itemType)
                 {
-                case ITEM_SPRING:
+                case ItemType::SPRING:
                     addSpring(itemPlatform);
                     break;
-                case ITEM_ROCKET:
+                case ItemType::ROCKET:
                     addRocket(itemPlatform);
                     break;
-                case ITEM_PROPELLER:
+                case ItemType::PROPELLER:
                     addPropeller(itemPlatform);
                     break;
-                case ITEM_BOOTS:
+                case ItemType::BOOTS:
                     addBoots(itemPlatform);
                     break;
-                case ITEM_SHIELD:
+                case ItemType::SHIELD:
                     addShield(itemPlatform);
                     break;
Index: code/branches/cpp11_v3/src/modules/mini4dgame/Mini4Dgame.h
===================================================================
--- code/branches/cpp11_v3/src/modules/mini4dgame/Mini4Dgame.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/mini4dgame/Mini4Dgame.h	(revision 11068)
@@ -41,16 +41,4 @@
 namespace orxonox
 {
-
-    namespace mini4DgamePlayerColor
-    {
-        enum color
-        {
-            none,
-            red,
-            blue,
-            green
-        };
-    }
-
     /**
     @brief
Index: code/branches/cpp11_v3/src/modules/mini4dgame/Mini4DgameAI.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/mini4dgame/Mini4DgameAI.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/mini4dgame/Mini4DgameAI.cc	(revision 11068)
@@ -104,5 +104,5 @@
                 for(int k=0;k<4;k++){
                     for(int l=0;l<4;l++){
-                        if (this->board_[i][j][k][l]==mini4DgamePlayerColor::none)
+                        if (this->board_[i][j][k][l]==Mini4DgamePlayerColor::none)
                             possibleMoves.push_back(Vector4(i,j,k,l));
                     }
Index: code/branches/cpp11_v3/src/modules/mini4dgame/Mini4DgameAI.h
===================================================================
--- code/branches/cpp11_v3/src/modules/mini4dgame/Mini4DgameAI.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/mini4dgame/Mini4DgameAI.h	(revision 11068)
@@ -83,5 +83,5 @@
             std::list<Vector4> getPossibleMoves();
             void copyBoard();
-            mini4DgamePlayerColor::color board_[4][4][4][4];
+            Mini4DgamePlayerColor board_[4][4][4][4];
     };
 }
Index: code/branches/cpp11_v3/src/modules/mini4dgame/Mini4DgameBoard.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/mini4dgame/Mini4DgameBoard.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/mini4dgame/Mini4DgameBoard.cc	(revision 11068)
@@ -61,5 +61,5 @@
                 for(int k=0;k<4;k++){
                     for(int l=0;l<4;l++){
-                        this->board[i][j][k][l]=mini4DgamePlayerColor::none;
+                        this->board[i][j][k][l]=Mini4DgamePlayerColor::none;
                         this->blinkingBillboards[i][j][k][l] = nullptr;
                     }
@@ -79,5 +79,5 @@
         return (move.x<4 && move.y<4 && move.z<4 && move.w<4
                 && move.x>=0 && move.y>=0 && move.z>=0 && move.w>=0
-                && this->board[move.x][move.y][move.z][move.w] == mini4DgamePlayerColor::none);
+                && this->board[move.x][move.y][move.z][move.w] == Mini4DgamePlayerColor::none);
     }
 
@@ -86,5 +86,5 @@
         const Mini4DgamePosition& move = moves.back();
         moves.pop_back();
-        this->board[move.x][move.y][move.z][move.w] = mini4DgamePlayerColor::none;
+        this->board[move.x][move.y][move.z][move.w] = Mini4DgamePlayerColor::none;
         this->blinkingBillboards[move.x][move.y][move.z][move.w]->destroy();
         this->blinkingBillboards[move.x][move.y][move.z][move.w] = nullptr;
@@ -115,14 +115,14 @@
 
             moves.push_back(move);
-            mini4DgamePlayerColor::color playerColor = mini4DgamePlayerColor::none;
+            Mini4DgamePlayerColor playerColor = Mini4DgamePlayerColor::none;
             if(player_toggle_){
-                playerColor = mini4DgamePlayerColor::blue;
+                playerColor = Mini4DgamePlayerColor::blue;
                 this->player_toggle_ = false;
             }else{
-                playerColor = mini4DgamePlayerColor::green;
+                playerColor = Mini4DgamePlayerColor::green;
                 this->player_toggle_ = true;
             }
 
-            this->board[move.x][move.y][move.z][move.w] = (mini4DgamePlayerColor::color) playerColor;
+            this->board[move.x][move.y][move.z][move.w] = playerColor;
 
             BlinkingBillboard* bb = new BlinkingBillboard(this->getContext());
@@ -146,9 +146,9 @@
 
             switch(playerColor){
-            case mini4DgamePlayerColor::red:
+            case Mini4DgamePlayerColor::red:
                 bb->setColour(ColourValue(1,0,0)); break;
-            case mini4DgamePlayerColor::green:
+            case Mini4DgamePlayerColor::green:
                 bb->setColour(ColourValue(0,1,0)); break;
-            case mini4DgamePlayerColor::blue:
+            case Mini4DgamePlayerColor::blue:
                 bb->setColour(ColourValue(0,0,1)); break;
             default: break;
@@ -160,5 +160,5 @@
 
             Mini4DgameWinner winner = this->getWinner();
-            if(winner.color_ != mini4DgamePlayerColor::none)
+            if(winner.color_ != Mini4DgamePlayerColor::none)
             {
                 orxout(user_status) << "Mini4Dgame: win!!!!!!!" << endl;
@@ -188,10 +188,10 @@
     {
         Mini4DgameWinner winner;
-        winner.color_ = mini4DgamePlayerColor::none;
+        winner.color_ = Mini4DgamePlayerColor::none;
 
         //check diagonals rows-columns-height-numbers
         for(int i=1; i<4; i++)
         {
-            if(this->board[i][i][i][i]==mini4DgamePlayerColor::none || this->board[0][0][0][0] != this->board[i][i][i][i])
+            if(this->board[i][i][i][i]==Mini4DgamePlayerColor::none || this->board[0][0][0][0] != this->board[i][i][i][i])
                 break;
             if(i==3)
@@ -209,5 +209,5 @@
         for(int i=1; i<4; i++)
         {
-            if(this->board[3-i][i][i][i]==mini4DgamePlayerColor::none || this->board[3][0][0][0] != this->board[3-i][i][i][i])
+            if(this->board[3-i][i][i][i]==Mini4DgamePlayerColor::none || this->board[3][0][0][0] != this->board[3-i][i][i][i])
                 break;
             if(i==3)
@@ -225,5 +225,5 @@
         for(int i=1; i<4; i++)
         {
-            if(this->board[i][3-i][i][i]==mini4DgamePlayerColor::none || this->board[0][3][0][0] != this->board[i][3-i][i][i])
+            if(this->board[i][3-i][i][i]==Mini4DgamePlayerColor::none || this->board[0][3][0][0] != this->board[i][3-i][i][i])
                 break;
             if(i==3)
@@ -241,5 +241,5 @@
         for(int i=1; i<4; i++)
         {
-            if(this->board[i][i][3-i][i]==mini4DgamePlayerColor::none || this->board[0][0][3][0] != this->board[i][i][3-i][i])
+            if(this->board[i][i][3-i][i]==Mini4DgamePlayerColor::none || this->board[0][0][3][0] != this->board[i][i][3-i][i])
                 break;
             if(i==3)
@@ -257,5 +257,5 @@
         for(int i=1; i<4; i++)
         {
-            if(this->board[i][i][i][3-i]==mini4DgamePlayerColor::none || this->board[0][0][0][3] != this->board[i][i][i][3-i])
+            if(this->board[i][i][i][3-i]==Mini4DgamePlayerColor::none || this->board[0][0][0][3] != this->board[i][i][i][3-i])
                 break;
             if(i==3)
@@ -273,5 +273,5 @@
         for(int i=1; i<4; i++)
         {
-            if(this->board[3-i][3-i][i][i]==mini4DgamePlayerColor::none || this->board[3][3][0][0] != this->board[3-i][3-i][i][i])
+            if(this->board[3-i][3-i][i][i]==Mini4DgamePlayerColor::none || this->board[3][3][0][0] != this->board[3-i][3-i][i][i])
                 break;
             if(i==3)
@@ -289,5 +289,5 @@
         for(int i=1; i<4; i++)
         {
-            if(this->board[3-i][i][3-i][i]==mini4DgamePlayerColor::none || this->board[3][0][3][0] != this->board[3-i][i][3-i][i])
+            if(this->board[3-i][i][3-i][i]==Mini4DgamePlayerColor::none || this->board[3][0][3][0] != this->board[3-i][i][3-i][i])
                 break;
             if(i==3)
@@ -305,5 +305,5 @@
         for(int i=1; i<4; i++)
         {
-            if(this->board[3-i][i][i][3-i]==mini4DgamePlayerColor::none || this->board[3][0][0][3] != this->board[3-i][i][i][3-i])
+            if(this->board[3-i][i][i][3-i]==Mini4DgamePlayerColor::none || this->board[3][0][0][3] != this->board[3-i][i][i][3-i])
                 break;
             if(i==3)
@@ -325,5 +325,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[i][i][i][l]==mini4DgamePlayerColor::none || this->board[0][0][0][l] != this->board[i][i][i][l])
+                if(this->board[i][i][i][l]==Mini4DgamePlayerColor::none || this->board[0][0][0][l] != this->board[i][i][i][l])
                     break;
                 if(i==3)
@@ -341,5 +341,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[3-i][i][i][l]==mini4DgamePlayerColor::none || this->board[3][0][0][l] != this->board[3-i][i][i][l])
+                if(this->board[3-i][i][i][l]==Mini4DgamePlayerColor::none || this->board[3][0][0][l] != this->board[3-i][i][i][l])
                     break;
                 if(i==3)
@@ -357,5 +357,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[i][3-i][i][l]==mini4DgamePlayerColor::none || this->board[0][3][0][l] != this->board[i][3-i][i][l])
+                if(this->board[i][3-i][i][l]==Mini4DgamePlayerColor::none || this->board[0][3][0][l] != this->board[i][3-i][i][l])
                     break;
                 if(i==3)
@@ -373,5 +373,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[i][i][3-i][l]==mini4DgamePlayerColor::none || this->board[0][0][3][l] != this->board[i][i][3-i][l])
+                if(this->board[i][i][3-i][l]==Mini4DgamePlayerColor::none || this->board[0][0][3][l] != this->board[i][i][3-i][l])
                     break;
                 if(i==3)
@@ -394,5 +394,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[i][i][l][i]==mini4DgamePlayerColor::none || this->board[0][0][l][0] != this->board[i][i][l][i])
+                if(this->board[i][i][l][i]==Mini4DgamePlayerColor::none || this->board[0][0][l][0] != this->board[i][i][l][i])
                     break;
                 if(i==3)
@@ -410,5 +410,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[3-i][i][l][i]==mini4DgamePlayerColor::none || this->board[3][0][l][0] != this->board[3-i][i][l][i])
+                if(this->board[3-i][i][l][i]==Mini4DgamePlayerColor::none || this->board[3][0][l][0] != this->board[3-i][i][l][i])
                     break;
                 if(i==3)
@@ -426,5 +426,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[i][3-i][l][i]==mini4DgamePlayerColor::none || this->board[0][3][l][0] != this->board[i][3-i][l][i])
+                if(this->board[i][3-i][l][i]==Mini4DgamePlayerColor::none || this->board[0][3][l][0] != this->board[i][3-i][l][i])
                     break;
                 if(i==3)
@@ -442,5 +442,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[i][i][l][3-i]==mini4DgamePlayerColor::none || this->board[0][0][l][3] != this->board[i][i][l][3-i])
+                if(this->board[i][i][l][3-i]==Mini4DgamePlayerColor::none || this->board[0][0][l][3] != this->board[i][i][l][3-i])
                     break;
                 if(i==3)
@@ -463,5 +463,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[i][l][i][i]==mini4DgamePlayerColor::none || this->board[0][l][0][0] != this->board[i][l][i][i])
+                if(this->board[i][l][i][i]==Mini4DgamePlayerColor::none || this->board[0][l][0][0] != this->board[i][l][i][i])
                     break;
                 if(i==3)
@@ -479,5 +479,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[3-i][l][i][i]==mini4DgamePlayerColor::none || this->board[3][l][0][0] != this->board[3-i][l][i][i])
+                if(this->board[3-i][l][i][i]==Mini4DgamePlayerColor::none || this->board[3][l][0][0] != this->board[3-i][l][i][i])
                     break;
                 if(i==3)
@@ -495,5 +495,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[i][l][3-i][i]==mini4DgamePlayerColor::none || this->board[0][l][3][0] != this->board[i][l][3-i][i])
+                if(this->board[i][l][3-i][i]==Mini4DgamePlayerColor::none || this->board[0][l][3][0] != this->board[i][l][3-i][i])
                     break;
                 if(i==3)
@@ -511,5 +511,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[i][l][i][3-i]==mini4DgamePlayerColor::none || this->board[0][l][0][3] != this->board[i][l][i][3-i])
+                if(this->board[i][l][i][3-i]==Mini4DgamePlayerColor::none || this->board[0][l][0][3] != this->board[i][l][i][3-i])
                     break;
                 if(i==3)
@@ -532,5 +532,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[l][i][i][i]==mini4DgamePlayerColor::none || this->board[l][0][0][0] != this->board[l][i][i][i])
+                if(this->board[l][i][i][i]==Mini4DgamePlayerColor::none || this->board[l][0][0][0] != this->board[l][i][i][i])
                     break;
                 if(i==3)
@@ -548,5 +548,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[l][3-i][i][i]==mini4DgamePlayerColor::none || this->board[l][3][0][0] != this->board[l][3-i][i][i])
+                if(this->board[l][3-i][i][i]==Mini4DgamePlayerColor::none || this->board[l][3][0][0] != this->board[l][3-i][i][i])
                     break;
                 if(i==3)
@@ -564,5 +564,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[l][i][3-i][i]==mini4DgamePlayerColor::none || this->board[l][0][3][0] != this->board[l][i][3-i][i])
+                if(this->board[l][i][3-i][i]==Mini4DgamePlayerColor::none || this->board[l][0][3][0] != this->board[l][i][3-i][i])
                     break;
                 if(i==3)
@@ -580,5 +580,5 @@
             for(int i=1; i<4; i++)
             {
-                if(this->board[l][i][i][3-i]==mini4DgamePlayerColor::none || this->board[l][0][0][3] != this->board[l][i][i][3-i])
+                if(this->board[l][i][i][3-i]==Mini4DgamePlayerColor::none || this->board[l][0][0][3] != this->board[l][i][i][3-i])
                     break;
                 if(i==3)
@@ -602,5 +602,5 @@
                 for(int i=1; i<4; i++)
                 {
-                    if(this->board[i][i][k][l]==mini4DgamePlayerColor::none || this->board[0][0][k][l] != this->board[i][i][k][l])
+                    if(this->board[i][i][k][l]==Mini4DgamePlayerColor::none || this->board[0][0][k][l] != this->board[i][i][k][l])
                         break;
                     if(i==3)
@@ -618,5 +618,5 @@
                 for(int i=1; i<4; i++)
                 {
-                    if(this->board[3-i][i][k][l]==mini4DgamePlayerColor::none || this->board[3][0][k][l] != this->board[3-i][i][k][l])
+                    if(this->board[3-i][i][k][l]==Mini4DgamePlayerColor::none || this->board[3][0][k][l] != this->board[3-i][i][k][l])
                         break;
                     if(i==3)
@@ -635,5 +635,5 @@
                 for(int i=1; i<4; i++)
                 {
-                    if(this->board[i][k][i][l]==mini4DgamePlayerColor::none || this->board[0][k][0][l] != this->board[i][k][i][l])
+                    if(this->board[i][k][i][l]==Mini4DgamePlayerColor::none || this->board[0][k][0][l] != this->board[i][k][i][l])
                         break;
                     if(i==3)
@@ -651,5 +651,5 @@
                 for(int i=1; i<4; i++)
                 {
-                    if(this->board[3-i][k][i][l]==mini4DgamePlayerColor::none || this->board[3][k][0][l] != this->board[3-i][k][i][l])
+                    if(this->board[3-i][k][i][l]==Mini4DgamePlayerColor::none || this->board[3][k][0][l] != this->board[3-i][k][i][l])
                         break;
                     if(i==3)
@@ -668,5 +668,5 @@
                 for(int i=1; i<4; i++)
                 {
-                    if(this->board[i][k][l][i]==mini4DgamePlayerColor::none || this->board[0][k][l][0] != this->board[i][k][l][i])
+                    if(this->board[i][k][l][i]==Mini4DgamePlayerColor::none || this->board[0][k][l][0] != this->board[i][k][l][i])
                         break;
                     if(i==3)
@@ -684,5 +684,5 @@
                 for(int i=1; i<4; i++)
                 {
-                    if(this->board[3-i][k][l][i]==mini4DgamePlayerColor::none || this->board[3][k][l][0] != this->board[3-i][k][l][i])
+                    if(this->board[3-i][k][l][i]==Mini4DgamePlayerColor::none || this->board[3][k][l][0] != this->board[3-i][k][l][i])
                         break;
                     if(i==3)
@@ -701,5 +701,5 @@
                 for(int i=1; i<4; i++)
                 {
-                    if(this->board[k][i][i][l]==mini4DgamePlayerColor::none || this->board[k][0][0][l] != this->board[k][i][i][l])
+                    if(this->board[k][i][i][l]==Mini4DgamePlayerColor::none || this->board[k][0][0][l] != this->board[k][i][i][l])
                         break;
                     if(i==3)
@@ -717,5 +717,5 @@
                 for(int i=1; i<4; i++)
                 {
-                    if(this->board[k][3-i][i][l]==mini4DgamePlayerColor::none || this->board[k][3][0][l] != this->board[k][3-i][i][l])
+                    if(this->board[k][3-i][i][l]==Mini4DgamePlayerColor::none || this->board[k][3][0][l] != this->board[k][3-i][i][l])
                         break;
                     if(i==3)
@@ -734,5 +734,5 @@
                 for(int i=1; i<4; i++)
                 {
-                    if(this->board[k][i][l][i]==mini4DgamePlayerColor::none || this->board[k][0][l][0] != this->board[k][i][l][i])
+                    if(this->board[k][i][l][i]==Mini4DgamePlayerColor::none || this->board[k][0][l][0] != this->board[k][i][l][i])
                         break;
                     if(i==3)
@@ -750,5 +750,5 @@
                 for(int i=1; i<4; i++)
                 {
-                    if(this->board[k][3-i][l][i]==mini4DgamePlayerColor::none || this->board[k][3][l][0] != this->board[k][3-i][l][i])
+                    if(this->board[k][3-i][l][i]==Mini4DgamePlayerColor::none || this->board[k][3][l][0] != this->board[k][3-i][l][i])
                         break;
                     if(i==3)
@@ -767,5 +767,5 @@
                 for(int i=1; i<4; i++)
                 {
-                    if(this->board[k][l][i][i]==mini4DgamePlayerColor::none || this->board[k][l][0][0] != this->board[k][l][i][i])
+                    if(this->board[k][l][i][i]==Mini4DgamePlayerColor::none || this->board[k][l][0][0] != this->board[k][l][i][i])
                         break;
                     if(i==3)
@@ -783,5 +783,5 @@
                 for(int i=1; i<4; i++)
                 {
-                    if(this->board[k][l][3-i][i]==mini4DgamePlayerColor::none || this->board[k][l][3][0] != this->board[k][l][3-i][i])
+                    if(this->board[k][l][3-i][i]==Mini4DgamePlayerColor::none || this->board[k][l][3][0] != this->board[k][l][3-i][i])
                         break;
                     if(i==3)
@@ -804,5 +804,5 @@
             for(int k=0;k<4;k++){
                 for(int l=0;l<4;l++){
-                    if(this->board[0][j][k][l]!= mini4DgamePlayerColor::none
+                    if(this->board[0][j][k][l]!= Mini4DgamePlayerColor::none
                        && this->board[0][j][k][l]==this->board[1][j][k][l]
                        && this->board[1][j][k][l]==this->board[2][j][k][l]
@@ -826,5 +826,5 @@
             for(int k=0;k<4;k++){
                 for(int l=0;l<4;l++){
-                    if(this->board[i][0][k][l]!= mini4DgamePlayerColor::none
+                    if(this->board[i][0][k][l]!= Mini4DgamePlayerColor::none
                                && this->board[i][0][k][l]==this->board[i][1][k][l]
                                && this->board[i][1][k][l]==this->board[i][2][k][l]
@@ -848,5 +848,5 @@
             for(int j=0;j<4;j++){
                 for(int l=0;l<4;l++){
-                    if(this->board[i][j][0][l]!= mini4DgamePlayerColor::none
+                    if(this->board[i][j][0][l]!= Mini4DgamePlayerColor::none
                                        && this->board[i][j][0][l]==this->board[i][j][1][l]
                                        && this->board[i][j][1][l]==this->board[i][j][2][l]
@@ -870,5 +870,5 @@
             for(int j=0;j<4;j++){
                 for(int k=0;k<4;k++){
-                    if(this->board[i][j][k][0]!= mini4DgamePlayerColor::none
+                    if(this->board[i][j][k][0]!= Mini4DgamePlayerColor::none
                                        && this->board[i][j][k][0]==this->board[i][j][k][1]
                                        && this->board[i][j][k][1]==this->board[i][j][k][2]
Index: code/branches/cpp11_v3/src/modules/mini4dgame/Mini4DgameBoard.h
===================================================================
--- code/branches/cpp11_v3/src/modules/mini4dgame/Mini4DgameBoard.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/mini4dgame/Mini4DgameBoard.h	(revision 11068)
@@ -42,4 +42,11 @@
 namespace orxonox
 {
+    enum class Mini4DgamePlayerColor
+    {
+        none,
+        red,
+        blue,
+        green
+    };
 
     struct Mini4DgamePosition
@@ -58,5 +65,5 @@
         int winningHeight[4];
         int winningNumber[4];
-        int color_;
+        Mini4DgamePlayerColor color_;
     };
 
@@ -86,5 +93,5 @@
             bool player_toggle_;
             BlinkingBillboard* blinkingBillboards[4][4][4][4];
-            int board[4][4][4][4]; //!< The logical board where the game takes place. board[row][column][height][number]
+            Mini4DgamePlayerColor board[4][4][4][4]; //!< The logical board where the game takes place. board[row][column][height][number]
     };
 }
Index: code/branches/cpp11_v3/src/modules/notifications/NotificationDispatcher.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/notifications/NotificationDispatcher.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/notifications/NotificationDispatcher.cc	(revision 11068)
@@ -113,5 +113,5 @@
         // TODO: Needed?
         const std::string message = this->createNotificationMessage();
-        NotificationListener::sendNotification(message, this->getSender(), notificationMessageType::info, notificationSendMode::local);
+        NotificationListener::sendNotification(message, this->getSender(), NotificationMessageType::info, NotificationSendMode::local);
 
         // Broadcast
@@ -144,5 +144,5 @@
             const std::string message = this->createNotificationMessage();
             // TODO: Make the type configurable.
-            NotificationListener::sendNotification(message, this->getSender(), notificationMessageType::info, notificationSendMode::network, clientId);
+            NotificationListener::sendNotification(message, this->getSender(), NotificationMessageType::info, NotificationSendMode::network, clientId);
         }
         else if(GameMode::isServer())
Index: code/branches/cpp11_v3/src/modules/notifications/NotificationManager.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/notifications/NotificationManager.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/notifications/NotificationManager.cc	(revision 11068)
@@ -106,5 +106,5 @@
         Returns true if successful.
     */
-    bool NotificationManager::registerNotification(const std::string& message, const std::string& sender, notificationMessageType::Value type)
+    bool NotificationManager::registerNotification(const std::string& message, const std::string& sender, NotificationMessageType type)
     {
         // TODO: Do something with the type.
@@ -124,8 +124,8 @@
         Returns true if the command was successfully executed.
     */
-    bool NotificationManager::executeCommand(notificationCommand::Value command, const std::string& sender)
+    bool NotificationManager::executeCommand(NotificationCommand command, const std::string& sender)
     {
         bool commandExecuted = false;
-        if(command == notificationCommand::clear)
+        if(command == NotificationCommand::clear)
         {
             if(this->commandClear(sender))
@@ -437,5 +437,5 @@
 
     */
-    Notification::Notification(const std::string& message, const std::string& sender, notificationMessageType::Value type)
+    Notification::Notification(const std::string& message, const std::string& sender, NotificationMessageType type)
     {
         this->initialize();
Index: code/branches/cpp11_v3/src/modules/notifications/NotificationManager.h
===================================================================
--- code/branches/cpp11_v3/src/modules/notifications/NotificationManager.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/notifications/NotificationManager.h	(revision 11068)
@@ -62,5 +62,5 @@
     {
         public:
-            Notification(const std::string& message, const std::string& sender, notificationMessageType::Value type);
+            Notification(const std::string& message, const std::string& sender, NotificationMessageType type);
             virtual ~Notification();
 
@@ -89,5 +89,5 @@
             @return Returns an enum with the type of the Notification.
             */
-            inline notificationMessageType::Value getType(void) const
+            inline NotificationMessageType getType(void) const
                 { return this->type_; }
 
@@ -95,5 +95,5 @@
             std::string message_; //!< The Notification message.
             std::string sender_; //!< The sender of the notification.
-            notificationMessageType::Value type_; //!< The type of the notification.
+            NotificationMessageType type_; //!< The type of the notification.
 
             void initialize(void); //!< Registers the object and sets some default values.
@@ -128,6 +128,6 @@
             static NotificationManager& getInstance() { return Singleton<NotificationManager>::getInstance(); } // tolua_export
 
-            virtual bool registerNotification(const std::string& message, const std::string& sender, notificationMessageType::Value type) override;
-            virtual bool executeCommand(notificationCommand::Value command, const std::string& sender) override;
+            virtual bool registerNotification(const std::string& message, const std::string& sender, NotificationMessageType type) override;
+            virtual bool executeCommand(NotificationCommand command, const std::string& sender) override;
 
             bool registerNotification(Notification* notification); // Registers a Notification within the NotificationManager.
Index: code/branches/cpp11_v3/src/modules/objects/ForceField.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/ForceField.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/ForceField.cc	(revision 11068)
@@ -67,5 +67,5 @@
         this->setMassDiameter(0);   //! We allow point-masses
         this->setLength(2000);
-        this->mode_ = forceFieldMode::tube;
+        this->mode_ = ForceFieldMode::tube;
         
         this->registerVariables();
@@ -115,5 +115,5 @@
     void ForceField::tick(float dt)
     {
-        if(this->mode_ == forceFieldMode::tube)
+        if(this->mode_ == ForceFieldMode::tube)
         {
             // Iterate over all objects that could possibly be affected by the ForceField.
@@ -143,5 +143,5 @@
             }
         }
-        else if(this->mode_ == forceFieldMode::sphere)
+        else if(this->mode_ == ForceFieldMode::sphere)
         {
             // Iterate over all objects that could possibly be affected by the ForceField.
@@ -159,5 +159,5 @@
             }
         }
-        else if(this->mode_ == forceFieldMode::invertedSphere)
+        else if(this->mode_ == ForceFieldMode::invertedSphere)
         {
             // Iterate over all objects that could possibly be affected by the ForceField.
@@ -176,5 +176,5 @@
             }
         }
-        else if(this->mode_ == forceFieldMode::newtonianGravity)
+        else if(this->mode_ == ForceFieldMode::newtonianGravity)
         {
             // Iterate over all objects that could possibly be affected by the ForceField.
@@ -201,5 +201,5 @@
             }
         }
-        else if(this->mode_ == forceFieldMode::homogen)
+        else if(this->mode_ == ForceFieldMode::homogen)
         {
             // Iterate over all objects that could possibly be affected by the ForceField.
@@ -227,19 +227,19 @@
     {
         if(mode == ForceField::modeTube_s)
-            this->mode_ = forceFieldMode::tube;
+            this->mode_ = ForceFieldMode::tube;
         else if(mode == ForceField::modeSphere_s)
-            this->mode_ = forceFieldMode::sphere;
+            this->mode_ = ForceFieldMode::sphere;
         else if(mode == ForceField::modeInvertedSphere_s)
-            this->mode_ = forceFieldMode::invertedSphere;
+            this->mode_ = ForceFieldMode::invertedSphere;
         else if(mode == ForceField::modeNewtonianGravity_s)
-            this->mode_ = forceFieldMode::newtonianGravity;
+            this->mode_ = ForceFieldMode::newtonianGravity;
 
         else if(mode == ForceField::modeHomogen_s)
-            this->mode_ = forceFieldMode::homogen;
+            this->mode_ = ForceFieldMode::homogen;
 
         else
         {
             orxout(internal_warning) << "Wrong mode '" << mode << "' in ForceField. Setting to 'tube'." << endl;
-            this->mode_ = forceFieldMode::tube;
+            this->mode_ = ForceFieldMode::tube;
         }
     }
@@ -255,14 +255,14 @@
         switch(this->mode_)
         {
-            case forceFieldMode::tube:
+            case ForceFieldMode::tube:
                 return ForceField::modeTube_s;
-            case forceFieldMode::sphere:
+            case ForceFieldMode::sphere:
                 return ForceField::modeSphere_s;
-            case forceFieldMode::invertedSphere:
+            case ForceFieldMode::invertedSphere:
                 return ForceField::modeInvertedSphere_s;
-            case forceFieldMode::newtonianGravity:
+            case ForceFieldMode::newtonianGravity:
                 return ForceField::modeNewtonianGravity_s;
 
-            case forceFieldMode::homogen:
+            case ForceFieldMode::homogen:
                 return ForceField::modeHomogen_s;
 
Index: code/branches/cpp11_v3/src/modules/objects/ForceField.h
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/ForceField.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/ForceField.h	(revision 11068)
@@ -52,14 +52,11 @@
     @ingroup Objects
     */
-    namespace forceFieldMode
-    {
-        enum Value {
-            tube, //!< The ForceField has a tube shape.
-            sphere, //!< The ForceField has a spherical shape.
-            invertedSphere, //!< The ForceField has a spherical shape but "inverted" behavior.
-            newtonianGravity, //!< The ForceField imitates Newtonian gravitation for use in stellar bodies.
-            homogen //!< Local homogenous Force field with changeable direction for the Space Station
-        };
-    }
+    enum class ForceFieldMode {
+        tube, //!< The ForceField has a tube shape.
+        sphere, //!< The ForceField has a spherical shape.
+        invertedSphere, //!< The ForceField has a spherical shape but "inverted" behavior.
+        newtonianGravity, //!< The ForceField imitates Newtonian gravitation for use in stellar bodies.
+        homogen //!< Local homogenous Force field with changeable direction for the Space Station
+    };
 
     /**
@@ -172,5 +169,5 @@
             float massRadius_; //!< The radius of the stellar body for the Newtonian ForceField.
             float halfLength_; //!< Half of the length of the ForceField.
-            int mode_; //!< The mode of the ForceField.
+            ForceFieldMode mode_; //!< The mode of the ForceField.
             
             //! Gravitational constant for Newtonian ForceFields.
Index: code/branches/cpp11_v3/src/modules/objects/Script.h
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/Script.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/Script.h	(revision 11068)
@@ -51,12 +51,9 @@
     @brief The mode a specific @ref orxonox::Script "Script" is in.
     */
-    namespace ScriptMode
+    enum class ScriptMode
     {
-        enum Value
-        {
-            normal, //!< The @ref orxonox::Script "Scripts'" code is executed through the @ref orxonox::CommandExecutor "CommandExecutor".
-            lua //!< The @ref orxonox::Script "Scripts'" code is executed through lua.
-        };
-    }
+        normal, //!< The @ref orxonox::Script "Scripts'" code is executed through the @ref orxonox::CommandExecutor "CommandExecutor".
+        lua //!< The @ref orxonox::Script "Scripts'" code is executed through lua.
+    };
 
     /**
@@ -178,5 +175,5 @@
 
             std::string code_; //!< The code that is executed by this Script.
-            ScriptMode::Value mode_; //!< The mode the Script is in. Determines whether the code is executed the normal way or in lua.
+            ScriptMode mode_; //!< The mode the Script is in. Determines whether the code is executed the normal way or in lua.
             std::string modeStr_; //!< The mode the Script is in, as a string. Is used for networking purposes.
             bool onLoad_; //!< Whether the Scripts code is executed upon loading (creation) of this Script.
@@ -193,5 +190,5 @@
             @param mode The mode of the Script.
             */
-            inline void setMode(ScriptMode::Value mode)
+            inline void setMode(ScriptMode mode)
                 { this->mode_ = mode; }
     };
Index: code/branches/cpp11_v3/src/modules/objects/Turret.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/Turret.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/Turret.cc	(revision 11068)
@@ -278,5 +278,5 @@
             //slower the closer it is to the destination
             Quaternion drot = Quaternion::nlerp(dt*this->rotationThrust_/20.f, Quaternion::IDENTITY, this->rotation_);
-            this->rotate(drot, WorldEntity::World);
+            this->rotate(drot, WorldEntity::TransformSpace::World);
             this->rotation_ = Quaternion::IDENTITY;
         }
Index: code/branches/cpp11_v3/src/modules/objects/triggers/CheckPoint.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/triggers/CheckPoint.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/triggers/CheckPoint.cc	(revision 11068)
@@ -56,5 +56,5 @@
 
         this->setRadarObjectColour(ColourValue::Green);
-        this->setRadarObjectShape(RadarViewable::Dot);
+        this->setRadarObjectShape(RadarViewable::Shape::Dot);
         this->setRadarVisibility(false);
 
Index: code/branches/cpp11_v3/src/modules/objects/triggers/DistanceMultiTrigger.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/triggers/DistanceMultiTrigger.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/triggers/DistanceMultiTrigger.cc	(revision 11068)
@@ -58,5 +58,5 @@
 
         this->distance_ = 100.0f;
-        this->setBeaconModeDirect(distanceMultiTriggerBeaconMode::off);
+        this->setBeaconModeDirect(DistanceMultiTriggerBeaconMode::off);
         this->targetName_ = "";
         this->beaconMask_.exclude(Class(BaseObject));
@@ -136,5 +136,5 @@
         ClassTreeMask targetMask = this->getTargetMask();
         // If we are in identify-mode another target mask has to be applies to find the DistanceTriggerBeacons.
-        if(this->beaconMode_ == distanceMultiTriggerBeaconMode::identify)
+        if(this->beaconMode_ == DistanceMultiTriggerBeaconMode::identify)
             targetMask = this->beaconMask_;
 
@@ -145,5 +145,5 @@
 
             // If the DistanceMultiTrigger is in identify-mode and the DistanceTriggerBeacon attached to the object has the wrong name we ignore it.
-            if(this->beaconMode_ == distanceMultiTriggerBeaconMode::identify)
+            if(this->beaconMode_ == DistanceMultiTriggerBeaconMode::identify)
             {
                 if(entity->getName() != this->targetName_)
@@ -155,5 +155,5 @@
             
             // If the DistanceMultiTrigger is in exclude mode and the DistanceTriggerBeacon attached to the object has the right name, we ignore it.
-            if(this->beaconMode_ == distanceMultiTriggerBeaconMode::exclude)
+            if(this->beaconMode_ == DistanceMultiTriggerBeaconMode::exclude)
             {
                 
@@ -182,5 +182,5 @@
 
                 // Change the entity to the parent of the DistanceTriggerBeacon (if in identify-mode), which is the entity to which the beacon is attached.
-                if(this->beaconMode_ == distanceMultiTriggerBeaconMode::identify)
+                if(this->beaconMode_ == DistanceMultiTriggerBeaconMode::identify)
                     entity = entity->getParent();
 
@@ -206,5 +206,5 @@
         The mode as an enum.
     */
-    void DistanceMultiTrigger::setBeaconModeDirect(distanceMultiTriggerBeaconMode::Value mode)
+    void DistanceMultiTrigger::setBeaconModeDirect(DistanceMultiTriggerBeaconMode mode)
     {
         this->beaconMode_ = mode;
@@ -221,9 +221,9 @@
         switch(this->getBeaconModeDirect())
         {
-            case distanceMultiTriggerBeaconMode::off :
+            case DistanceMultiTriggerBeaconMode::off :
                 return DistanceMultiTrigger::beaconModeOff_s;
-            case distanceMultiTriggerBeaconMode::identify:
+            case DistanceMultiTriggerBeaconMode::identify:
                 return DistanceMultiTrigger::beaconModeIdentify_s;
-            case distanceMultiTriggerBeaconMode::exclude:
+            case DistanceMultiTriggerBeaconMode::exclude:
                 return DistanceMultiTrigger::beaconModeExlcude_s;
             default :
@@ -242,9 +242,9 @@
     {
         if(mode == DistanceMultiTrigger::beaconModeOff_s)
-            this->setBeaconModeDirect(distanceMultiTriggerBeaconMode::off);
+            this->setBeaconModeDirect(DistanceMultiTriggerBeaconMode::off);
         else if(mode == DistanceMultiTrigger::beaconModeIdentify_s)
-            this->setBeaconModeDirect(distanceMultiTriggerBeaconMode::identify);
+            this->setBeaconModeDirect(DistanceMultiTriggerBeaconMode::identify);
         else if(mode == DistanceMultiTrigger::beaconModeExlcude_s)
-            this->setBeaconModeDirect(distanceMultiTriggerBeaconMode::exclude);
+            this->setBeaconModeDirect(DistanceMultiTriggerBeaconMode::exclude);
         else
             orxout(internal_error, context::triggers) << "Invalid beacon mode in DistanceMultiTrigger." << endl;
Index: code/branches/cpp11_v3/src/modules/objects/triggers/DistanceMultiTrigger.h
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/triggers/DistanceMultiTrigger.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/triggers/DistanceMultiTrigger.h	(revision 11068)
@@ -55,12 +55,9 @@
     @ingroup MultiTrigger
     */
-    namespace distanceMultiTriggerBeaconMode
-    {
-        enum Value {
-            off, //!< The DistanceMultiTrigger is not in <em>beacon-mode</em>.
-            identify, //!< The DistanceTrigger is in <em>identify-mode</em>.
-            exclude //!< The DistanceTrigger is in <em>exclude-mode</em>.
-        };
-    }
+    enum class DistanceMultiTriggerBeaconMode {
+        off, //!< The DistanceMultiTrigger is not in <em>beacon-mode</em>.
+        identify, //!< The DistanceTrigger is in <em>identify-mode</em>.
+        exclude //!< The DistanceTrigger is in <em>exclude-mode</em>.
+    };
 
     /**
@@ -113,10 +110,10 @@
                 { return this->distance_; }
             
-            void setBeaconModeDirect(distanceMultiTriggerBeaconMode::Value mode); // Set the beacon mode.
+            void setBeaconModeDirect(DistanceMultiTriggerBeaconMode mode); // Set the beacon mode.
             /**
             @brief Get the beacon mode.
             @return Returns the mode as an enum.
             */
-            inline distanceMultiTriggerBeaconMode::Value getBeaconModeDirect(void) const
+            inline DistanceMultiTriggerBeaconMode getBeaconModeDirect(void) const
                 { return this->beaconMode_; }
             void setBeaconMode(const std::string& mode); // Set the beacon mode.
@@ -149,5 +146,5 @@
             float distance_; //!< The distance at which the DistanceMultiTrigger triggers.
 
-            distanceMultiTriggerBeaconMode::Value beaconMode_; //!< The beacon mode, the DistanceMultiTrigger is in.
+            DistanceMultiTriggerBeaconMode beaconMode_; //!< The beacon mode, the DistanceMultiTrigger is in.
             std::string targetName_; //!< The target name, used in <em>single-target</em> mode.
             ClassTreeMask beaconMask_; //!< A mask, that only accepts DistanceTriggerBeacons.
Index: code/branches/cpp11_v3/src/modules/objects/triggers/DistanceTrigger.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/triggers/DistanceTrigger.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/triggers/DistanceTrigger.cc	(revision 11068)
@@ -158,5 +158,5 @@
         ClassTreeMask targetMask = this->targetMask_;
         // If we are in identify-mode another target mask has to be applies to find the DistanceTriggerBeacons.
-        if(this->beaconMode_ == distanceTriggerBeaconMode::identify)
+        if(this->beaconMode_ == DistanceTriggerBeaconMode::identify)
             targetMask = this->beaconMask_;
 
@@ -167,5 +167,5 @@
 
             // If the DistanceTrigger is in identify-mode and the DistanceTriggerBeacon attached to the object has the wrong name we ignore it.
-            if(this->beaconMode_ == distanceTriggerBeaconMode::identify)
+            if(this->beaconMode_ == DistanceTriggerBeaconMode::identify)
             {
                 if(entity->getName() != this->targetName_)
@@ -177,5 +177,5 @@
 
             // If the DistanceTrigger is in exclude mode and the DistanceTriggerBeacon attached to the object has the right name, we ignore it.
-            if(this->beaconMode_ == distanceTriggerBeaconMode::exclude)
+            if(this->beaconMode_ == DistanceTriggerBeaconMode::exclude)
             {
 
@@ -202,5 +202,5 @@
                 {
                     // Change the entity to the parent of the DistanceTriggerBeacon (if in identify-mode), which is the entity to which the beacon is attached.
-                    if(this->beaconMode_ == distanceTriggerBeaconMode::identify)
+                    if(this->beaconMode_ == DistanceTriggerBeaconMode::identify)
                         entity = entity->getParent();
 
@@ -228,5 +228,5 @@
         The mode as an enum.
     */
-    void DistanceTrigger::setBeaconModeDirect(distanceTriggerBeaconMode::Value mode)
+    void DistanceTrigger::setBeaconModeDirect(DistanceTriggerBeaconMode mode)
     {
         this->beaconMode_ = mode;
@@ -243,9 +243,9 @@
         switch(this->getBeaconModeDirect())
         {
-            case distanceTriggerBeaconMode::off :
+            case DistanceTriggerBeaconMode::off :
                 return DistanceTrigger::beaconModeOff_s;
-            case distanceTriggerBeaconMode::identify:
+            case DistanceTriggerBeaconMode::identify:
                 return DistanceTrigger::beaconModeIdentify_s;
-            case distanceTriggerBeaconMode::exclude:
+            case DistanceTriggerBeaconMode::exclude:
                 return DistanceTrigger::beaconModeExlcude_s;
             default :
@@ -264,9 +264,9 @@
     {
         if(mode == DistanceTrigger::beaconModeOff_s)
-            this->setBeaconModeDirect(distanceTriggerBeaconMode::off);
+            this->setBeaconModeDirect(DistanceTriggerBeaconMode::off);
         else if(mode == DistanceTrigger::beaconModeIdentify_s)
-            this->setBeaconModeDirect(distanceTriggerBeaconMode::identify);
+            this->setBeaconModeDirect(DistanceTriggerBeaconMode::identify);
         else if(mode == DistanceTrigger::beaconModeExlcude_s)
-            this->setBeaconModeDirect(distanceTriggerBeaconMode::exclude);
+            this->setBeaconModeDirect(DistanceTriggerBeaconMode::exclude);
         else
             orxout(internal_error, context::triggers) << "Invalid beacon mode in DistanceTrigger." << endl;
@@ -282,5 +282,5 @@
         Returns true if it is triggered ,false if not.
     */
-    bool DistanceTrigger::isTriggered(TriggerMode::Value mode)
+    bool DistanceTrigger::isTriggered(TriggerMode mode)
     {
         if (Trigger::isTriggered(mode))
Index: code/branches/cpp11_v3/src/modules/objects/triggers/DistanceTrigger.h
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/triggers/DistanceTrigger.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/triggers/DistanceTrigger.h	(revision 11068)
@@ -55,12 +55,9 @@
   @ingroup NormalTrigger
   */
-  namespace distanceTriggerBeaconMode
-  {
-      enum Value {
-          off,
-          identify,
-          exclude
-      };
-  }
+  enum class DistanceTriggerBeaconMode {
+      off,
+      identify,
+      exclude
+  };
 
     /**
@@ -118,10 +115,10 @@
                 { return this->distance_; }
 
-            void setBeaconModeDirect(distanceTriggerBeaconMode::Value mode); // Set the beacon mode.
+            void setBeaconModeDirect(DistanceTriggerBeaconMode mode); // Set the beacon mode.
             /**
             @brief Get the beacon mode.
             @return Returns the mode as an enum.
             */
-            inline distanceTriggerBeaconMode::Value getBeaconModeDirect(void) const
+            inline DistanceTriggerBeaconMode getBeaconModeDirect(void) const
             { return this->beaconMode_; }
             void setBeaconMode(const std::string& mode); // Set the beacon mode.
@@ -144,5 +141,5 @@
 
         protected:
-            virtual bool isTriggered(TriggerMode::Value mode); // Check whether the DistanceTrigger is triggered.
+            virtual bool isTriggered(TriggerMode mode) override; // Check whether the DistanceTrigger is triggered.
             /**
             @brief Notifies interested parties about a change of the DistanceTrigger's target mask.
@@ -160,5 +157,5 @@
             float distance_; //!< The range of the DistanceTrigger.
             
-            distanceTriggerBeaconMode::Value beaconMode_; //!< The beacon mode.
+            DistanceTriggerBeaconMode beaconMode_; //!< The beacon mode.
             std::string targetName_; //!< The name a DistanceTriggerBeacon needs to have to make the DistanceTrigger react to it if in beacon-mode.
             ClassTreeMask beaconMask_; //!< A mask, that only accepts DistanceTriggerBeacons.
Index: code/branches/cpp11_v3/src/modules/objects/triggers/EventTrigger.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/triggers/EventTrigger.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/triggers/EventTrigger.cc	(revision 11068)
@@ -79,5 +79,5 @@
         It should be triggered if it is triggered according just to its sub-triggers and if the last event that came in was an event that changed from not triggered to triggered.
     */
-    bool EventTrigger::isTriggered(TriggerMode::Value mode)
+    bool EventTrigger::isTriggered(TriggerMode mode)
     {
         if (Trigger::isTriggered(mode))
Index: code/branches/cpp11_v3/src/modules/objects/triggers/EventTrigger.h
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/triggers/EventTrigger.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/triggers/EventTrigger.h	(revision 11068)
@@ -84,5 +84,5 @@
 
         protected:
-            virtual bool isTriggered(TriggerMode::Value mode); // Check whether the EventTrigger should be triggered.
+            virtual bool isTriggered(TriggerMode mode) override; // Check whether the EventTrigger should be triggered.
 
         private:
Index: code/branches/cpp11_v3/src/modules/objects/triggers/Trigger.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/triggers/Trigger.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/triggers/Trigger.cc	(revision 11068)
@@ -193,5 +193,5 @@
         Returns true if the Trigger should be triggered and false if not.
     */
-    bool Trigger::isTriggered(TriggerMode::Value mode)
+    bool Trigger::isTriggered(TriggerMode mode)
     {
         // If the trigger has sub-triggers.
Index: code/branches/cpp11_v3/src/modules/objects/triggers/Trigger.h
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/triggers/Trigger.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/triggers/Trigger.h	(revision 11068)
@@ -104,5 +104,5 @@
             inline bool isTriggered()
                 { return this->isTriggered(this->mode_); }
-            virtual bool isTriggered(TriggerMode::Value mode); // Check whether the Trigger should be triggered, given only its sub-triggers, given a specific mode.
+            virtual bool isTriggered(TriggerMode mode); // Check whether the Trigger should be triggered, given only its sub-triggers, given a specific mode.
             virtual void triggered(bool bIsTriggered); // Fires an event with the input triggered state.
 
Index: code/branches/cpp11_v3/src/modules/objects/triggers/TriggerBase.h
===================================================================
--- code/branches/cpp11_v3/src/modules/objects/triggers/TriggerBase.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/objects/triggers/TriggerBase.h	(revision 11068)
@@ -52,13 +52,10 @@
     @ingroup Triggers
     */
-    namespace TriggerMode
+    enum class TriggerMode
     {
-        enum Value
-        {
-            EventTriggerAND, //!< The <em>and</em> mode. The trigger can only trigger if all the children are active. 
-            EventTriggerOR, //!< The <em>or</em> mode. The trigger can only trigger if at least one child is active.
-            EventTriggerXOR, //!< The <em>xor</em> mode. The trigger can only trigger if exactly one child is active. 
-        };
-    }
+        EventTriggerAND, //!< The <em>and</em> mode. The trigger can only trigger if all the children are active.
+        EventTriggerOR, //!< The <em>or</em> mode. The trigger can only trigger if at least one child is active.
+        EventTriggerXOR, //!< The <em>xor</em> mode. The trigger can only trigger if exactly one child is active.
+    };
 
     /**
@@ -157,5 +154,5 @@
             @param mode The mode of the trigger.
             */
-            inline void setMode(TriggerMode::Value mode) //!< Get the mode of the trigger.
+            inline void setMode(TriggerMode mode) //!< Get the mode of the trigger.
                 { this->mode_ = mode; }
             const std::string& getModeString(void) const;
@@ -164,5 +161,5 @@
             @return Returns and Enum for the mode of the trigger.
             */
-            inline TriggerMode::Value getMode(void) const
+            inline TriggerMode getMode(void) const
                 { return mode_; }
 
@@ -210,5 +207,5 @@
 
             bool bInvertMode_; //!< Bool for the invert-mode, if true the trigger is inverted.
-            TriggerMode::Value mode_; //!< The mode of the trigger.
+            TriggerMode mode_; //!< The mode of the trigger.
 
             TriggerBase* parent_; //!< The parent of this trigger.
Index: code/branches/cpp11_v3/src/modules/overlays/OverlayText.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/overlays/OverlayText.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/overlays/OverlayText.cc	(revision 11068)
@@ -42,7 +42,7 @@
     RegisterClass(OverlayText);
 
-    static_assert((int)Ogre::TextAreaOverlayElement::Left   == (int)OverlayText::Left,   "check enum");
-    static_assert((int)Ogre::TextAreaOverlayElement::Center == (int)OverlayText::Center, "check enum");
-    static_assert((int)Ogre::TextAreaOverlayElement::Right  == (int)OverlayText::Right,  "check enum");
+    static_assert((int)Ogre::TextAreaOverlayElement::Left   == (int)OverlayText::Alignment::Left,   "check enum");
+    static_assert((int)Ogre::TextAreaOverlayElement::Center == (int)OverlayText::Alignment::Center, "check enum");
+    static_assert((int)Ogre::TextAreaOverlayElement::Right  == (int)OverlayText::Alignment::Right,  "check enum");
 
     OverlayText::OverlayText(Context* context)
@@ -85,9 +85,9 @@
     {
         if (alignment == "right")
-            this->setAlignment(OverlayText::Right);
+            this->setAlignment(OverlayText::Alignment::Right);
         else if (alignment == "center")
-            this->setAlignment(OverlayText::Center);
+            this->setAlignment(OverlayText::Alignment::Center);
         else // "left" and default
-            this->setAlignment(OverlayText::Left);
+            this->setAlignment(OverlayText::Alignment::Left);
     }
 
@@ -111,7 +111,7 @@
     void OverlayText::sizeChanged()
     {
-        if (this->rotState_ == Horizontal)
+        if (this->rotState_ == RotationState::Horizontal)
             this->overlay_->setScale(size_.y * sizeCorrection_.y, size_.y * sizeCorrection_.y);
-        else if (this->rotState_ == Vertical)
+        else if (this->rotState_ == RotationState::Vertical)
             this->overlay_->setScale(size_.y / (sizeCorrection_.y * sizeCorrection_.y), size_.y * sizeCorrection_.y);
         else
Index: code/branches/cpp11_v3/src/modules/overlays/OverlayText.h
===================================================================
--- code/branches/cpp11_v3/src/modules/overlays/OverlayText.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/overlays/OverlayText.h	(revision 11068)
@@ -42,5 +42,5 @@
     {
     public:
-        enum Alignment
+        enum class Alignment
         {
             Left,
Index: code/branches/cpp11_v3/src/modules/overlays/hud/HUDRadar.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/overlays/hud/HUDRadar.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/overlays/hud/HUDRadar.cc	(revision 11068)
@@ -65,7 +65,7 @@
         this->setMaximumDotSize3D(0.07f);
 
-        this->shapeMaterials_[RadarViewable::Dot]      = "RadarDot.png";
-        this->shapeMaterials_[RadarViewable::Triangle] = "RadarTriangle.png";
-        this->shapeMaterials_[RadarViewable::Square]   = "RadarSquare.png";
+        this->shapeMaterials_[RadarViewable::Shape::Dot]      = "RadarDot.png";
+        this->shapeMaterials_[RadarViewable::Shape::Triangle] = "RadarTriangle.png";
+        this->shapeMaterials_[RadarViewable::Shape::Square]   = "RadarSquare.png";
         this->owner_ = nullptr;
 
Index: code/branches/cpp11_v3/src/modules/overlays/stats/CreateLines.h
===================================================================
--- code/branches/cpp11_v3/src/modules/overlays/stats/CreateLines.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/overlays/stats/CreateLines.h	(revision 11068)
@@ -29,4 +29,6 @@
 
 #include "overlays/OverlaysPrereqs.h"
+
+#include <string>
 
 namespace orxonox
Index: code/branches/cpp11_v3/src/modules/pickup/Pickup.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/pickup/Pickup.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/pickup/Pickup.cc	(revision 11068)
@@ -78,6 +78,6 @@
     void Pickup::initialize(void)
     {
-        this->activationType_ = pickupActivationType::immediate;
-        this->durationType_ = pickupDurationType::once;
+        this->activationType_ = PickupActivationType::immediate;
+        this->durationType_ = PickupDurationType::once;
     }
 
@@ -105,7 +105,7 @@
         switch(this->getActivationType())
         {
-            case pickupActivationType::immediate:
+            case PickupActivationType::immediate:
                 return activationTypeImmediate_s;
-            case pickupActivationType::onUse:
+            case PickupActivationType::onUse:
                 return activationTypeOnUse_s;
             default:
@@ -124,7 +124,7 @@
         switch(this->getDurationType())
         {
-            case pickupDurationType::once:
+            case PickupDurationType::once:
                 return durationTypeOnce_s;
-            case pickupDurationType::continuous:
+            case PickupDurationType::continuous:
                 return durationTypeContinuous_s;
             default:
@@ -142,7 +142,7 @@
     {
         if(type == Pickup::activationTypeImmediate_s)
-            this->setActivationType(pickupActivationType::immediate);
+            this->setActivationType(PickupActivationType::immediate);
         else if(type == Pickup::activationTypeOnUse_s)
-            this->setActivationType(pickupActivationType::onUse);
+            this->setActivationType(PickupActivationType::onUse);
         else
             orxout(internal_error, context::pickups) << "Invalid activationType '" << type << "' in " << this->getIdentifier()->getName() << "." << endl;
@@ -158,7 +158,7 @@
     {
         if(type == Pickup::durationTypeOnce_s)
-            this->setDurationType(pickupDurationType::once);
+            this->setDurationType(PickupDurationType::once);
         else if(type == Pickup::durationTypeContinuous_s)
-            this->setDurationType(pickupDurationType::continuous);
+            this->setDurationType(PickupDurationType::continuous);
         else
             orxout(internal_error, context::pickups) << "Invalid durationType '" << type << "' in " << this->getIdentifier()->getName() << "." << endl;
Index: code/branches/cpp11_v3/src/modules/pickup/Pickup.h
===================================================================
--- code/branches/cpp11_v3/src/modules/pickup/Pickup.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/pickup/Pickup.h	(revision 11068)
@@ -53,12 +53,9 @@
     @ingroup Pickup
     */
-    namespace pickupActivationType
+    enum class PickupActivationType
     {
-        enum Value
-        {
-            immediate, //!< Means that the @ref orxonox::Pickup "Pickup" will be used immediately after pickup.
-            onUse, //!< Means that the @ref orxonox::Pickup "Pickup" will be used at a later point trough some external influence.
-        };
-    }
+        immediate, //!< Means that the @ref orxonox::Pickup "Pickup" will be used immediately after pickup.
+        onUse, //!< Means that the @ref orxonox::Pickup "Pickup" will be used at a later point trough some external influence.
+    };
 
     /**
@@ -68,12 +65,9 @@
     @ingroup Pickup
     */
-    namespace pickupDurationType
+    enum class PickupDurationType
     {
-        enum Value
-        {
-            once, //!< Means that the @ref orxonox::Pickup "Pickup" will be used only once at a singular time instant.
-            continuous, //!< Means that the @ref orxonox::Pickup "Pickup" will be used over a continuous timespan.
-        };
-    }
+        once, //!< Means that the @ref orxonox::Pickup "Pickup" will be used only once at a singular time instant.
+        continuous, //!< Means that the @ref orxonox::Pickup "Pickup" will be used over a continuous timespan.
+    };
 
     /**
@@ -112,5 +106,5 @@
             @return Returns the activation type of the Pickup.
             */
-            inline pickupActivationType::Value getActivationType(void) const
+            inline PickupActivationType getActivationType(void) const
                 { return this->activationType_; }
             /**
@@ -118,5 +112,5 @@
             @return Returns the duration type of the Pickup.
             */
-            inline pickupDurationType::Value getDurationType(void) const
+            inline PickupDurationType getDurationType(void) const
                 { return this->durationType_; }
 
@@ -129,5 +123,5 @@
             */
             inline bool isImmediate(void) const
-                { return this->getActivationType() == pickupActivationType::immediate; }
+                { return this->getActivationType() == PickupActivationType::immediate; }
             /**
             @brief Get whether the activation type is 'onUse'.
@@ -135,5 +129,5 @@
             */
             inline bool isOnUse(void) const
-                { return this->getActivationType() == pickupActivationType::onUse; }
+                { return this->getActivationType() == PickupActivationType::onUse; }
             /**
             @brief Get whether the duration type is 'once'.
@@ -141,5 +135,5 @@
             */
             inline bool isOnce(void) const
-                { return this->getDurationType() == pickupDurationType::once; }
+                { return this->getDurationType() == PickupDurationType::once; }
             /**
             @brief Get whether the duration type is 'continuous'.
@@ -147,5 +141,5 @@
             */
             inline bool isContinuous(void) const
-                { return this->getDurationType() == pickupDurationType::continuous; }
+                { return this->getDurationType() == PickupDurationType::continuous; }
 
             virtual void changedPickedUp(void) override; //!< Should be called when the pickup has transited from picked up to dropped or the other way around.
@@ -164,5 +158,5 @@
             @param type The activation type of the Pickup.
             */
-            inline void setActivationType(pickupActivationType::Value type)
+            inline void setActivationType(PickupActivationType type)
                 { this->activationType_ = type; }
             /**
@@ -170,5 +164,5 @@
             @param type The duration type of the Pickup.
             */
-            inline void setDurationType(pickupDurationType::Value type)
+            inline void setDurationType(PickupDurationType type)
                 { this->durationType_ = type; }
 
@@ -180,6 +174,6 @@
 
             std::string representationName_; //!< The name of the associated PickupRepresentation.
-            pickupActivationType::Value activationType_; //!< The activation type of the Pickup.
-            pickupDurationType::Value durationType_; //!< The duration type of the Pickup.
+            PickupActivationType activationType_; //!< The activation type of the Pickup.
+            PickupDurationType durationType_; //!< The duration type of the Pickup.
 
             //! Strings for the activation and duration types.
Index: code/branches/cpp11_v3/src/modules/pickup/items/DronePickup.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/pickup/items/DronePickup.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/pickup/items/DronePickup.cc	(revision 11068)
@@ -74,5 +74,5 @@
     {
         this->addTarget(ClassIdentifier<Pawn>::getIdentifier());
-        this->setDurationType(pickupDurationType::once);
+        this->setDurationType(PickupDurationType::once);
         this->droneTemplate_ = "";
     }
Index: code/branches/cpp11_v3/src/modules/pickup/items/HealthPickup.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/pickup/items/HealthPickup.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/pickup/items/HealthPickup.cc	(revision 11068)
@@ -77,5 +77,5 @@
         this->health_ = 0.0f;
         this->healthRate_ = 0.0f;
-        this->healthType_ = pickupHealthType::limited;
+        this->healthType_ = PickupHealthType::limited;
         this->maxHealthSave_ = 0.0f;
         this->maxHealthOverwrite_ = 0.0f;
@@ -127,11 +127,11 @@
             switch(this->getHealthType())
             {
-                case pickupHealthType::permanent:
+                case PickupHealthType::permanent:
                     if(pawn->getMaxHealth() < fullHealth)
                         pawn->setMaxHealth(fullHealth);
-                case pickupHealthType::limited:
+                case PickupHealthType::limited:
                     pawn->addHealth(health);
                     break;
-                case pickupHealthType::temporary:
+                case PickupHealthType::temporary:
                     if(pawn->getMaxHealth() > fullHealth)
                     {
@@ -174,12 +174,12 @@
                 switch(this->getHealthType())
                 {
-                    case pickupHealthType::permanent:
+                    case PickupHealthType::permanent:
                         health = pawn->getHealth()+this->getHealth();
                         if(pawn->getMaxHealth() < health)
                             pawn->setMaxHealth(health);
-                    case pickupHealthType::limited:
+                    case PickupHealthType::limited:
                         pawn->addHealth(this->getHealth());
                         break;
-                    case pickupHealthType::temporary:
+                    case PickupHealthType::temporary:
                         health = pawn->getHealth()+this->getHealth();
                         if(pawn->getMaxHealth() < health)
@@ -201,5 +201,5 @@
         else
         {
-            if(this->getHealthType() == pickupHealthType::temporary)
+            if(this->getHealthType() == PickupHealthType::temporary)
             {
                 PickupCarrier* carrier = this->getCarrier();
@@ -256,9 +256,9 @@
         switch(this->getHealthType())
         {
-            case pickupHealthType::limited:
+            case PickupHealthType::limited:
                 return HealthPickup::healthTypeLimited_s;
-            case pickupHealthType::temporary:
+            case PickupHealthType::temporary:
                 return HealthPickup::healthTypeTemporary_s;
-            case pickupHealthType::permanent:
+            case PickupHealthType::permanent:
                 return HealthPickup::healthTypePermanent_s;
             default:
@@ -308,9 +308,9 @@
     {
         if(type == HealthPickup::healthTypeLimited_s)
-            this->setHealthType(pickupHealthType::limited);
+            this->setHealthType(PickupHealthType::limited);
         else if(type == HealthPickup::healthTypeTemporary_s)
-            this->setHealthType(pickupHealthType::temporary);
+            this->setHealthType(PickupHealthType::temporary);
         else if(type == HealthPickup::healthTypePermanent_s)
-            this->setHealthType(pickupHealthType::permanent);
+            this->setHealthType(PickupHealthType::permanent);
         else
             orxout(internal_error, context::pickups) << "Invalid healthType '" << type << "' in HealthPickup." << endl;
Index: code/branches/cpp11_v3/src/modules/pickup/items/HealthPickup.h
===================================================================
--- code/branches/cpp11_v3/src/modules/pickup/items/HealthPickup.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/pickup/items/HealthPickup.h	(revision 11068)
@@ -51,13 +51,10 @@
     @ingroup PickupItems
     */
-    namespace pickupHealthType
+    enum class PickupHealthType
     {
-        enum Value
-        {
-            limited, //!< Means that the @ref orxonox::HealthPickup "HealthPickup" only increases the users health to its maximum health.
-            temporary, //!< Means that the @ref orxonox::HealthPickup "HealthPickup" temporarily increases the users health even above its maximum health, but only as long as it is in use.
-            permanent //!< Means that the @ref orxonox::HealthPickup "HealthPickup" increases the users health even above its maximum health and increases the maximum health permanently such that it matches the new health.
-        };
-    }
+        limited, //!< Means that the @ref orxonox::HealthPickup "HealthPickup" only increases the users health to its maximum health.
+        temporary, //!< Means that the @ref orxonox::HealthPickup "HealthPickup" temporarily increases the users health even above its maximum health, but only as long as it is in use.
+        permanent //!< Means that the @ref orxonox::HealthPickup "HealthPickup" increases the users health even above its maximum health and increases the maximum health permanently such that it matches the new health.
+    };
 
     /**
@@ -115,5 +112,5 @@
             @return Returns the health type as an enum.
             */
-            inline pickupHealthType::Value getHealthType(void) const
+            inline PickupHealthType getHealthType(void) const
                 { return this->healthType_; }
             const std::string& getHealthTypeAsString(void) const; //!< Get the health type of this pickup.
@@ -127,5 +124,5 @@
             @param type The type of this pickup as an enum.
             */
-            inline void setHealthType(pickupHealthType::Value type)
+            inline void setHealthType(PickupHealthType type)
                 { this->healthType_ = type; }
             void setHealthTypeAsString(const std::string& type); //!< Set the type of the HealthPickup.
@@ -139,5 +136,5 @@
             float maxHealthSave_; //!< Helper to remember what the actual maxHealth of the Pawn was before we changed it.
             float maxHealthOverwrite_; //!< Helper to remember with which value we overwrote the maxHealh, to detect if someone else changed it as well.
-            pickupHealthType::Value healthType_; //!< The type of the HealthPickup.
+            PickupHealthType healthType_; //!< The type of the HealthPickup.
 
             //! Strings for the health types.
Index: code/branches/cpp11_v3/src/modules/pickup/items/MetaPickup.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/pickup/items/MetaPickup.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/pickup/items/MetaPickup.cc	(revision 11068)
@@ -79,6 +79,6 @@
         this->addTarget(ClassIdentifier<PickupCarrier>::getIdentifier());
 
-        this->setDurationType(pickupDurationType::once);
-        this->metaType_ = pickupMetaType::none;
+        this->setDurationType(PickupDurationType::once);
+        this->metaType_ = PickupMetaType::none;
     }
 
@@ -104,11 +104,11 @@
 
         // If the MetaPickup transited to used, and the metaType is not none.
-        if(this->isUsed() && this->metaType_ != pickupMetaType::none)
+        if(this->isUsed() && this->metaType_ != PickupMetaType::none)
         {
             PickupCarrier* carrier = this->getCarrier();
-            if(this->getMetaType() != pickupMetaType::none && carrier != nullptr)
+            if(this->getMetaType() != PickupMetaType::none && carrier != nullptr)
             {
                 // If the metaType is destroyCarrier, then the PickupCarrier is destroyed.
-                if(this->getMetaType() == pickupMetaType::destroyCarrier)
+                if(this->getMetaType() == PickupMetaType::destroyCarrier)
                 {
                     Pawn* pawn = orxonox_cast<Pawn*>(carrier);
@@ -124,15 +124,15 @@
 
                     // If the metaType is use, then the Pickupable is set to used.
-                    if(this->getMetaType() == pickupMetaType::use && !pickup->isUsed())
+                    if(this->getMetaType() == PickupMetaType::use && !pickup->isUsed())
                     {
                         pickup->setUsed(true);
                     }
                     // If the metaType is drop, then the Pickupable is dropped.
-                    else if(this->getMetaType() == pickupMetaType::drop)
+                    else if(this->getMetaType() == PickupMetaType::drop)
                     {
                         pickup->drop();
                     }
                     // If the metaType is destroy, then the Pickupable is destroyed.
-                    else if(this->getMetaType() == pickupMetaType::destroy)
+                    else if(this->getMetaType() == PickupMetaType::destroy)
                     {
                         pickup->Pickupable::destroy();
@@ -154,13 +154,13 @@
         switch(this->getMetaType())
         {
-            case pickupMetaType::none:
+            case PickupMetaType::none:
                 return MetaPickup::metaTypeNone_s;
-            case pickupMetaType::use:
+            case PickupMetaType::use:
                 return MetaPickup::metaTypeUse_s;
-            case pickupMetaType::drop:
+            case PickupMetaType::drop:
                 return MetaPickup::metaTypeDrop_s;
-            case pickupMetaType::destroy:
+            case PickupMetaType::destroy:
                 return MetaPickup::metaTypeDestroy_s;
-            case pickupMetaType::destroyCarrier:
+            case PickupMetaType::destroyCarrier:
                 return MetaPickup::metaTypeDestroyCarrier_s;
             default:
@@ -179,21 +179,21 @@
         if(type == MetaPickup::metaTypeNone_s)
         {
-            this->setMetaType(pickupMetaType::none);
+            this->setMetaType(PickupMetaType::none);
         }
         else if(type == MetaPickup::metaTypeUse_s)
         {
-            this->setMetaType(pickupMetaType::use);
+            this->setMetaType(PickupMetaType::use);
         }
         else if(type == MetaPickup::metaTypeDrop_s)
         {
-            this->setMetaType(pickupMetaType::drop);
+            this->setMetaType(PickupMetaType::drop);
         }
         else if(type == MetaPickup::metaTypeDestroy_s)
         {
-            this->setMetaType(pickupMetaType::destroy);
+            this->setMetaType(PickupMetaType::destroy);
         }
         else if(type == MetaPickup::metaTypeDestroyCarrier_s)
         {
-            this->setMetaType(pickupMetaType::destroyCarrier);
+            this->setMetaType(PickupMetaType::destroyCarrier);
         }
         else
Index: code/branches/cpp11_v3/src/modules/pickup/items/MetaPickup.h
===================================================================
--- code/branches/cpp11_v3/src/modules/pickup/items/MetaPickup.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/pickup/items/MetaPickup.h	(revision 11068)
@@ -48,15 +48,12 @@
     @ingroup PickupItems
     */
-    namespace pickupMetaType
+    enum class PickupMetaType
     {
-        enum Value
-        {
-            none, //!< The @ref orxonox::MetaPickup "MetaPickup" does nothing.
-            use, //!< The @ref orxonox::MetaPickup "MetaPickup" uses all the @ref orxonox::PickupCarrier "PickupCarriers'" @ref orxonox::Pickupable "Pickupables".
-            drop, //!< The @ref orxonox::MetaPickup "MetaPickup" drops all the @ref orxonox::PickupCarrier "PickupCarriers'" @ref orxonox::Pickupable "Pickupables".
-            destroy, //!< The @ref orxonox::MetaPickup "MetaPickup" destroys all the @ref orxonox::PickupCarrier "PickupCarriers'" @ref orxonox::Pickupable "Pickupables".
-            destroyCarrier //!< The @ref orxonox::MetaPickup "MetaPickup" destroys the @ref orxonox::PickupCarrier "PickupCarrier".
-        };
-    }
+        none, //!< The @ref orxonox::MetaPickup "MetaPickup" does nothing.
+        use, //!< The @ref orxonox::MetaPickup "MetaPickup" uses all the @ref orxonox::PickupCarrier "PickupCarriers'" @ref orxonox::Pickupable "Pickupables".
+        drop, //!< The @ref orxonox::MetaPickup "MetaPickup" drops all the @ref orxonox::PickupCarrier "PickupCarriers'" @ref orxonox::Pickupable "Pickupables".
+        destroy, //!< The @ref orxonox::MetaPickup "MetaPickup" destroys all the @ref orxonox::PickupCarrier "PickupCarriers'" @ref orxonox::Pickupable "Pickupables".
+        destroyCarrier //!< The @ref orxonox::MetaPickup "MetaPickup" destroys the @ref orxonox::PickupCarrier "PickupCarrier".
+    };
 
     /**
@@ -100,5 +97,5 @@
             @return Returns an enum with the meta type of the MetaPickup.
             */
-            inline pickupMetaType::Value getMetaType(void) const
+            inline PickupMetaType getMetaType(void) const
                 { return this->metaType_; }
             const std::string& getMetaTypeAsString(void) const; //!< Get the meta type of this MetaPickup.
@@ -109,5 +106,5 @@
             @param type The meta type as an enum.
             */
-            inline void setMetaType(pickupMetaType::Value type)
+            inline void setMetaType(PickupMetaType type)
                 { this->metaType_ =  type; }
             void setMetaTypeAsString(const std::string& type); //!< Set the meta type of this MetaPickup.
@@ -116,5 +113,5 @@
             void initialize(void); //!< Initializes the member variables.
 
-            pickupMetaType::Value metaType_; //!< The meta type of the MetaPickup, determines which actions are taken.
+            PickupMetaType metaType_; //!< The meta type of the MetaPickup, determines which actions are taken.
 
             //! Static strings for the meta types.
Index: code/branches/cpp11_v3/src/modules/portals/PortalEndPoint.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/portals/PortalEndPoint.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/portals/PortalEndPoint.cc	(revision 11068)
@@ -57,5 +57,5 @@
 
         this->setRadarObjectColour(ColourValue::White);
-        this->setRadarObjectShape(RadarViewable::Dot);
+        this->setRadarObjectShape(RadarViewable::Shape::Dot);
         this->setRadarVisibility(true);
         if( GameMode::isMaster() )
Index: code/branches/cpp11_v3/src/modules/questsystem/GlobalQuest.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/questsystem/GlobalQuest.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/questsystem/GlobalQuest.cc	(revision 11068)
@@ -177,5 +177,5 @@
         The player.
     */
-    QuestStatus::Value GlobalQuest::getStatus(const PlayerInfo* player) const
+    QuestStatus GlobalQuest::getStatus(const PlayerInfo* player) const
     {
         assert(player);
@@ -200,5 +200,5 @@
         Returns false if player is nullptr.
     */
-    bool GlobalQuest::setStatus(PlayerInfo* player, const QuestStatus::Value & status)
+    bool GlobalQuest::setStatus(PlayerInfo* player, const QuestStatus & status)
     {
         assert(player);
Index: code/branches/cpp11_v3/src/modules/questsystem/GlobalQuest.h
===================================================================
--- code/branches/cpp11_v3/src/modules/questsystem/GlobalQuest.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/questsystem/GlobalQuest.h	(revision 11068)
@@ -103,11 +103,11 @@
             virtual bool isCompletable(const PlayerInfo* player) const override; //!< Checks whether the Quest can be completed.
 
-            virtual QuestStatus::Value getStatus(const PlayerInfo* player) const override; //!< Returns the status of the Quest for a specific player.
+            virtual QuestStatus getStatus(const PlayerInfo* player) const override; //!< Returns the status of the Quest for a specific player.
 
-            virtual bool setStatus(PlayerInfo* player, const QuestStatus::Value & status) override; //!< Sets the status for a specific player.
+            virtual bool setStatus(PlayerInfo* player, const QuestStatus & status) override; //!< Sets the status for a specific player.
 
         private:
             std::set<PlayerInfo*> players_; //!< The set of players which possess this Quest.
-            QuestStatus::Value status_; //!< The status of this Quest.
+            QuestStatus status_; //!< The status of this Quest.
             std::list<QuestEffect*> rewards_; //!< Reward QuestEffects only invoked on the player completing the Quest.
 
Index: code/branches/cpp11_v3/src/modules/questsystem/LocalQuest.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/questsystem/LocalQuest.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/questsystem/LocalQuest.cc	(revision 11068)
@@ -168,9 +168,9 @@
         Returns the status of the Quest for the input player.
     */
-    QuestStatus::Value LocalQuest::getStatus(const PlayerInfo* player) const
+    QuestStatus LocalQuest::getStatus(const PlayerInfo* player) const
     {
         assert(player);
 
-        std::map<const PlayerInfo*, QuestStatus::Value>::const_iterator it = this->playerStatus_.find(player);
+        std::map<const PlayerInfo*, QuestStatus>::const_iterator it = this->playerStatus_.find(player);
         if (it != this->playerStatus_.end()) // If there is a player in the map.
             return it->second;
@@ -190,5 +190,5 @@
         Returns false if player is nullptr.
     */
-    bool LocalQuest::setStatus(PlayerInfo* player, const QuestStatus::Value & status)
+    bool LocalQuest::setStatus(PlayerInfo* player, const QuestStatus & status)
     {
         assert(player);
Index: code/branches/cpp11_v3/src/modules/questsystem/LocalQuest.h
===================================================================
--- code/branches/cpp11_v3/src/modules/questsystem/LocalQuest.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/questsystem/LocalQuest.h	(revision 11068)
@@ -97,9 +97,9 @@
             virtual bool isCompletable(const PlayerInfo* player) const override; //!< Checks whether the Quest can be completed.
 
-            virtual QuestStatus::Value getStatus(const PlayerInfo* player) const override; //!< Returns the status of the Quest for a specific player.
-            virtual bool setStatus(PlayerInfo* player, const QuestStatus::Value & status) override; //!< Sets the status for a specific player.
+            virtual QuestStatus getStatus(const PlayerInfo* player) const override; //!< Returns the status of the Quest for a specific player.
+            virtual bool setStatus(PlayerInfo* player, const QuestStatus & status) override; //!< Sets the status for a specific player.
 
         private:
-            std::map<const PlayerInfo*, QuestStatus::Value> playerStatus_; //!< List of the status for each player, with the Player-pointer as key.
+            std::map<const PlayerInfo*, QuestStatus> playerStatus_; //!< List of the status for each player, with the Player-pointer as key.
 
     };
Index: code/branches/cpp11_v3/src/modules/questsystem/Quest.h
===================================================================
--- code/branches/cpp11_v3/src/modules/questsystem/Quest.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/questsystem/Quest.h	(revision 11068)
@@ -51,14 +51,11 @@
     @ingroup Questsystem
     */
-    namespace QuestStatus
+    enum class QuestStatus
     {
-        enum Value
-        {
-            Inactive, //!< The @ref orxonox::Quest "Quest" is inactive.
-            Active, //!< The @ref orxonox::Quest "Quest" is active.
-            Failed, //!< The @ref orxonox::Quest "Quest" has been failed.
-            Completed //!< The @ref orxonox::Quest "Quest" has been completed.
-        };
-    }
+        Inactive, //!< The @ref orxonox::Quest "Quest" is inactive.
+        Active, //!< The @ref orxonox::Quest "Quest" is active.
+        Failed, //!< The @ref orxonox::Quest "Quest" has been failed.
+        Completed //!< The @ref orxonox::Quest "Quest" has been completed.
+    };
 
     /**
@@ -143,6 +140,6 @@
                 { return this->completeEffects_; }
 
-            virtual QuestStatus::Value getStatus(const PlayerInfo* player) const = 0; //!< Returns the status of the Quest for a specific player.
-            virtual bool setStatus(PlayerInfo* player, const QuestStatus::Value & status) = 0; //!< Changes the status for a specific player.
+            virtual QuestStatus getStatus(const PlayerInfo* player) const = 0; //!< Returns the status of the Quest for a specific player.
+            virtual bool setStatus(PlayerInfo* player, const QuestStatus & status) = 0; //!< Changes the status for a specific player.
 
         private:
Index: code/branches/cpp11_v3/src/modules/questsystem/QuestDescription.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/questsystem/QuestDescription.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/questsystem/QuestDescription.cc	(revision 11068)
@@ -119,5 +119,5 @@
         }
 
-        NotificationListener::sendNotification(message, QuestDescription::SENDER, notificationMessageType::info, notificationSendMode::network, player->getClientID());
+        NotificationListener::sendNotification(message, QuestDescription::SENDER, NotificationMessageType::info, NotificationSendMode::network, player->getClientID());
         return true;
     }
Index: code/branches/cpp11_v3/src/modules/questsystem/QuestEffectBeacon.h
===================================================================
--- code/branches/cpp11_v3/src/modules/questsystem/QuestEffectBeacon.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/questsystem/QuestEffectBeacon.h	(revision 11068)
@@ -50,12 +50,9 @@
     @ingroup Questsystem
     */
-    namespace QuestEffectBeaconStatus
+    enum class QuestEffectBeaconStatus
     {
-        enum Value
-        {
-            Inactive, //!< The @ref orxonox::QuestEffectBeacon "QuestEffectBeacon" is inactive.
-            Active //!< The @ref orxonox::QuestEffectBeacon "QuestEffectBeacon" is active.
-        };
-    }
+        Inactive, //!< The @ref orxonox::QuestEffectBeacon "QuestEffectBeacon" is inactive.
+        Active //!< The @ref orxonox::QuestEffectBeacon "QuestEffectBeacon" is active.
+    };
 
     /**
@@ -125,5 +122,5 @@
             std::list<QuestEffect*> effects_; //!< The list of QuestEffects to be invoked on the executing player.
             int times_; //!< Number of times the beacon can be exectued.
-            QuestEffectBeaconStatus::Value status_; //!< The status of the QuestEffectBeacon, Can be eighter active or inactive.
+            QuestEffectBeaconStatus status_; //!< The status of the QuestEffectBeacon, Can be eighter active or inactive.
 
             bool setTimes(const int & n); //!< Set the number of times the QuestEffectBeacon can be executed.
Index: code/branches/cpp11_v3/src/modules/questsystem/QuestHint.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/questsystem/QuestHint.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/questsystem/QuestHint.cc	(revision 11068)
@@ -92,9 +92,9 @@
 
         // Find the player.
-        std::map<const PlayerInfo*, QuestHintStatus::Value>::const_iterator it = this->playerStatus_.find(player);
+        std::map<const PlayerInfo*, QuestHintStatus>::const_iterator it = this->playerStatus_.find(player);
         if (it != this->playerStatus_.end()) // If the player is in the map.
-            return it->second;
+            return (it->second == QuestHintStatus::Active);
 
-        return QuestStatus::Inactive;
+        return false;
     }
 
Index: code/branches/cpp11_v3/src/modules/questsystem/QuestHint.h
===================================================================
--- code/branches/cpp11_v3/src/modules/questsystem/QuestHint.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/questsystem/QuestHint.h	(revision 11068)
@@ -50,12 +50,9 @@
     @ingroup Questsystem
     */
-    namespace QuestHintStatus
+    enum class QuestHintStatus
     {
-        enum Value
-        {
-            Inactive, //!< The @ref orxonox::QuestHint "QuestHint" is inactive.
-            Active //!< The @ref orxonox::QuestHint "QuestHint" is active.
-        };
-    }
+        Inactive, //!< The @ref orxonox::QuestHint "QuestHint" is inactive.
+        Active //!< The @ref orxonox::QuestHint "QuestHint" is active.
+    };
 
     /**
@@ -101,5 +98,5 @@
         private:
             Quest* quest_; //!< The Quest the QuestHint belongs to.
-            std::map<const PlayerInfo*, QuestHintStatus::Value> playerStatus_; //!< List of the states for each player, with the Player-pointer as key.
+            std::map<const PlayerInfo*, QuestHintStatus> playerStatus_; //!< List of the states for each player, with the Player-pointer as key.
 
     }; // tolua_export
Index: code/branches/cpp11_v3/src/modules/questsystem/QuestListener.h
===================================================================
--- code/branches/cpp11_v3/src/modules/questsystem/QuestListener.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/questsystem/QuestListener.h	(revision 11068)
@@ -50,14 +50,11 @@
     @ingroup Questsystem
     */
-    namespace QuestListenerMode
+    enum class QuestListenerMode
     {
-        enum Value
-        {
-            All, //!< Listens to all events.
-            Start, //!< Only listens to events pertaining the starting of @ref orxonox::Quest "Quests".
-            Fail, //!< Only listens to events pertaining the failing of @ref orxonox::Quest "Quests".
-            Complete //!< Only listens to events pertaining the completing of @ref orxonox::Quest "Quests".
-        };
-    }
+        All, //!< Listens to all events.
+        Start, //!< Only listens to events pertaining the starting of @ref orxonox::Quest "Quests".
+        Fail, //!< Only listens to events pertaining the failing of @ref orxonox::Quest "Quests".
+        Complete //!< Only listens to events pertaining the completing of @ref orxonox::Quest "Quests".
+    };
 
     /**
@@ -103,5 +100,5 @@
 
         private:
-            QuestListenerMode::Value mode_; //!< The mode of the QuestListener.
+            QuestListenerMode mode_; //!< The mode of the QuestListener.
             Quest* quest_; //!< A pointer to the Quest the QuestListener is reacting to.
 
Index: code/branches/cpp11_v3/src/modules/towerdefense/TowerDefense.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/towerdefense/TowerDefense.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/towerdefense/TowerDefense.cc	(revision 11068)
@@ -355,5 +355,5 @@
                 fields_[i][j]->create(fields.at(pos), fields.at(pos+1));
                 pos += 2;
-                if (fields_[i][j]->getType() == START)
+                if (fields_[i][j]->getType() == TowerDefenseFieldType::START)
                 {
                     startCoord.Set(i,j);
@@ -379,5 +379,5 @@
         TDCoordinate* nextCoord = new TDCoordinate(0,0);
 
-        if (thisField->getType() != STREET && thisField->getType() != START)
+        if (thisField->getType() != TowerDefenseFieldType::STREET && thisField->getType() != TowerDefenseFieldType::START)
         {
             return nullptr;
Index: code/branches/cpp11_v3/src/modules/towerdefense/TowerDefenseEnemy.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/towerdefense/TowerDefenseEnemy.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/towerdefense/TowerDefenseEnemy.cc	(revision 11068)
@@ -27,5 +27,5 @@
         RegisterObject(TowerDefenseEnemy);
 
-        this->setCollisionType(WorldEntity::Dynamic);
+        this->setCollisionType(WorldEntity::CollisionType::Dynamic);
         //needed to keep track of the PlayerStats coded in TowerDefense.h
         this->td = orxonox_cast<TowerDefense*>(this->getGametype());
Index: code/branches/cpp11_v3/src/modules/towerdefense/TowerDefenseField.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/towerdefense/TowerDefenseField.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/towerdefense/TowerDefenseField.cc	(revision 11068)
@@ -50,5 +50,5 @@
 
         tower_ = nullptr;
-        type_ = FREE;
+        type_ = TowerDefenseFieldType::FREE;
         center_ = nullptr;
         upgrade_ = 0;
@@ -186,5 +186,5 @@
         modelGround_->setMeshSource("TD_F1.mesh");
         tower_ = nullptr;
-        type_ = FREE;
+        type_ = TowerDefenseFieldType::FREE;
         setUpgrade(0);
         setAngle(orientation);
@@ -195,5 +195,5 @@
         modelGround_->setMeshSource("TD_S5.mesh");
         tower_ = nullptr;
-        type_ = START;
+        type_ = TowerDefenseFieldType::START;
         setUpgrade(0);
         setAngle(orientation);    
@@ -205,5 +205,5 @@
         modelGround_->setMeshSource("TD_S4.mesh");
         tower_ = nullptr;
-        type_ = END;
+        type_ = TowerDefenseFieldType::END;
         setUpgrade(0);
         setAngle(orientation);
@@ -214,5 +214,5 @@
         modelGround_->setMeshSource("TD_S1.mesh");
         tower_ = nullptr;
-        type_ = STREET;
+        type_ = TowerDefenseFieldType::STREET;
         setUpgrade(0);
         setAngle(orientation);
@@ -223,5 +223,5 @@
         modelGround_->setMeshSource("TD_S2.mesh");
         tower_ = nullptr;
-        type_ = STREET;
+        type_ = TowerDefenseFieldType::STREET;
         setUpgrade(0);
         setAngle(orientation);
@@ -232,5 +232,5 @@
         modelGround_->setMeshSource("TD_S3.mesh");
         tower_ = nullptr;
-        type_ = STREET;
+        type_ = TowerDefenseFieldType::STREET;
         setUpgrade(0);
         setAngle(orientation);
@@ -242,5 +242,5 @@
         modelObject_->setMeshSource("TD_O1.mesh");
         tower_ = nullptr;
-        type_ = OBSTACLE;
+        type_ = TowerDefenseFieldType::OBSTACLE;
         setUpgrade(0);
         setAngle(orientation);
@@ -254,5 +254,5 @@
             tower_ = new TowerDefenseTower(center_->getContext());
             attach(tower_);
-            type_ = TOWER;
+            type_ = TowerDefenseFieldType::TOWER;
             setUpgrade(upgrade);
             if (upgrade_ > 0 && modelObject_ != nullptr)
Index: code/branches/cpp11_v3/src/modules/towerdefense/TowerDefenseField.h
===================================================================
--- code/branches/cpp11_v3/src/modules/towerdefense/TowerDefenseField.h	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/towerdefense/TowerDefenseField.h	(revision 11068)
@@ -46,5 +46,5 @@
 namespace orxonox
 {
-    enum TowerDefenseFieldType
+    enum class TowerDefenseFieldType
     { 
         FREE,
@@ -64,5 +64,5 @@
             virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode) override;
             const bool isFree() const
-                { return type_==FREE; }
+                { return type_==TowerDefenseFieldType::FREE; }
             virtual void create(char object, char param);
             virtual void setCenterpoint(TowerDefenseCenterpoint* center);
Index: code/branches/cpp11_v3/src/modules/towerdefense/TowerDefenseTower.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/towerdefense/TowerDefenseTower.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/towerdefense/TowerDefenseTower.cc	(revision 11068)
@@ -26,5 +26,5 @@
         RegisterObject(TowerDefenseTower);
         game_ =nullptr;
-        this->setCollisionType(WorldEntity::None);
+        this->setCollisionType(WorldEntity::CollisionType::None);
         upgrade = 1;
 
Index: code/branches/cpp11_v3/src/modules/weapons/projectiles/GravityBomb.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/weapons/projectiles/GravityBomb.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/weapons/projectiles/GravityBomb.cc	(revision 11068)
@@ -28,5 +28,5 @@
                 this->timeToLife_= LIFETIME;
                 this->setCollisionResponse(false);
-                this->setCollisionType(WorldEntity::Dynamic);
+                this->setCollisionType(WorldEntity::CollisionType::Dynamic);
                 this->enableCollisionCallback();
 
Index: code/branches/cpp11_v3/src/modules/weapons/projectiles/GravityBombField.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/weapons/projectiles/GravityBombField.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/weapons/projectiles/GravityBombField.cc	(revision 11068)
@@ -41,5 +41,5 @@
         //Make the Field visible on Radar and minimap.
         this->setRadarObjectColour(ColourValue(1.0, 0.0, 0.2,1)); // Red
-        this->setRadarObjectShape(RadarViewable::Dot);
+        this->setRadarObjectShape(RadarViewable::Shape::Dot);
         this->setRadarObjectScale(1.0f);
         
Index: code/branches/cpp11_v3/src/modules/weapons/projectiles/IceGunProjectile.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/weapons/projectiles/IceGunProjectile.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/weapons/projectiles/IceGunProjectile.cc	(revision 11068)
@@ -120,5 +120,5 @@
             Vector3 offset = this->getWorldPosition() - otherObject->getWorldPosition();
             freezer->setPosition(Vector3(0,0,0));
-            freezer->translate(offset, WorldEntity::World);
+            freezer->translate(offset, WorldEntity::TransformSpace::World);
             // Start the freezing effect.
             freezer->startFreezing();
Index: code/branches/cpp11_v3/src/modules/weapons/projectiles/LightningGunProjectile.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/weapons/projectiles/LightningGunProjectile.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/weapons/projectiles/LightningGunProjectile.cc	(revision 11068)
@@ -48,5 +48,5 @@
         this->textureIndex_ = 1;
         this->setMass(2);
-        this->setCollisionType(Dynamic);
+        this->setCollisionType(CollisionType::Dynamic);
         this->maxTextureIndex_ = 8;
         this->textureTimer_.setTimer(0.01f, true, createExecutor(createFunctor(&LightningGunProjectile::changeTexture, this)));
Index: code/branches/cpp11_v3/src/modules/weapons/projectiles/Projectile.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/weapons/projectiles/Projectile.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/weapons/projectiles/Projectile.cc	(revision 11068)
@@ -57,5 +57,5 @@
             this->enableCollisionCallback();
             this->setCollisionResponse(false);
-            this->setCollisionType(Dynamic);
+            this->setCollisionType(CollisionType::Dynamic);
 
             // Create a sphere collision shape and attach it to the projectile.
Index: code/branches/cpp11_v3/src/modules/weapons/projectiles/Rocket.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/weapons/projectiles/Rocket.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/weapons/projectiles/Rocket.cc	(revision 11068)
@@ -70,5 +70,5 @@
         if (GameMode::isMaster())
         {
-            this->setCollisionType(WorldEntity::Kinematic);
+            this->setCollisionType(WorldEntity::CollisionType::Kinematic);
             this->setVelocity(0,0,-100);
 
@@ -92,5 +92,5 @@
             this->enableCollisionCallback();
             this->setCollisionResponse(false);
-            this->setCollisionType(Kinematic);
+            this->setCollisionType(CollisionType::Kinematic);
 
             // Add collision shape
@@ -128,5 +128,5 @@
 
         this->setRadarObjectColour(ColourValue(1.0, 0.5, 0.0)); // orange
-        this->setRadarObjectShape(RadarViewable::Triangle);
+        this->setRadarObjectShape(RadarViewable::Shape::Triangle);
         this->setRadarObjectScale(0.5f);
     }
Index: code/branches/cpp11_v3/src/modules/weapons/projectiles/RocketOld.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/weapons/projectiles/RocketOld.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/weapons/projectiles/RocketOld.cc	(revision 11068)
@@ -70,5 +70,5 @@
         if (GameMode::isMaster())
         {
-            this->setCollisionType(WorldEntity::Kinematic);
+            this->setCollisionType(WorldEntity::CollisionType::Kinematic);
             this->setVelocity(0,0,-100);
 
@@ -92,5 +92,5 @@
             this->enableCollisionCallback();
             this->setCollisionResponse(false);
-            this->setCollisionType(Kinematic);
+            this->setCollisionType(CollisionType::Kinematic);
 
             // Add collision shape
@@ -128,5 +128,5 @@
 
         this->setRadarObjectColour(ColourValue(1.0, 0.5, 0.0)); // orange
-        this->setRadarObjectShape(RadarViewable::Triangle);
+        this->setRadarObjectShape(RadarViewable::Shape::Triangle);
         this->setRadarObjectScale(0.5f);
     }
Index: code/branches/cpp11_v3/src/modules/weapons/projectiles/SimpleRocket.cc
===================================================================
--- code/branches/cpp11_v3/src/modules/weapons/projectiles/SimpleRocket.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/modules/weapons/projectiles/SimpleRocket.cc	(revision 11068)
@@ -70,5 +70,5 @@
         if (GameMode::isMaster())
         {
-            this->setCollisionType(WorldEntity::Kinematic);
+            this->setCollisionType(WorldEntity::CollisionType::Kinematic);
             this->fuel_ = true;
 
@@ -87,5 +87,5 @@
             this->enableCollisionCallback();
             this->setCollisionResponse(false);
-            this->setCollisionType(Kinematic);
+            this->setCollisionType(CollisionType::Kinematic);
 
             // Add collision shape.
@@ -101,5 +101,5 @@
 
         this->setRadarObjectColour(ColourValue(1.0, 1.0, 0.0)); // yellow
-        this->setRadarObjectShape(RadarViewable::Triangle);
+        this->setRadarObjectShape(RadarViewable::Shape::Triangle);
         this->setRadarObjectScale(0.5f);
     }
Index: code/branches/cpp11_v3/src/orxonox/Main.h
===================================================================
--- code/branches/cpp11_v3/src/orxonox/Main.h	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/Main.h	(revision 11068)
@@ -33,4 +33,6 @@
 #include "OrxonoxPrereqs.h"
 
+#include <string>
+
 namespace orxonox
 {
Index: code/branches/cpp11_v3/src/orxonox/Radar.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/Radar.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/Radar.cc	(revision 11068)
@@ -55,7 +55,7 @@
         // TODO: make this mapping configurable. Maybe there's a possibility with self configured
         //       configValues..
-        this->objectTypes_["Asteroid"] = RadarViewable::Dot;
-        this->objectTypes_["SpaceShip"] = RadarViewable::Square;
-        this->objectTypes_["AsdfQwerty"] = RadarViewable::Triangle;
+        this->objectTypes_["Asteroid"] = RadarViewable::Shape::Dot;
+        this->objectTypes_["SpaceShip"] = RadarViewable::Shape::Square;
+        this->objectTypes_["AsdfQwerty"] = RadarViewable::Shape::Triangle;
 
         /*WorldEntity* object;
@@ -113,5 +113,5 @@
         std::map<std::string, RadarViewable::Shape>::iterator it = this->objectTypes_.find(name);
         if (it == this->objectTypes_.end())
-            return this->objectTypes_[name] = RadarViewable::Square; // default, configure!!
+            return this->objectTypes_[name] = RadarViewable::Shape::Square; // default, configure!!
         else
             return this->objectTypes_[name];
Index: code/branches/cpp11_v3/src/orxonox/gametypes/Gametype.h
===================================================================
--- code/branches/cpp11_v3/src/orxonox/gametypes/Gametype.h	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/gametypes/Gametype.h	(revision 11068)
@@ -45,19 +45,16 @@
 namespace orxonox
 {
-    namespace PlayerState
-    {
-        enum Value
-        {
-            Uninitialized,
-            Joined,
-            Alive,
-            Dead
-        };
-    }
+    enum class PlayerState
+    {
+        Uninitialized,
+        Joined,
+        Alive,
+        Dead
+    };
 
     struct Player
     {
         PlayerInfo* info_;
-        PlayerState::Value state_;
+        PlayerState state_;
         int frags_;
         int killed_;
Index: code/branches/cpp11_v3/src/orxonox/graphics/Light.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/graphics/Light.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/graphics/Light.cc	(revision 11068)
@@ -44,7 +44,7 @@
 
     // Be sure we don't do bad conversions
-    static_assert((int)Ogre::Light::LT_POINT       == (int)Light::Point,       "check enum");
-    static_assert((int)Ogre::Light::LT_DIRECTIONAL == (int)Light::Directional, "check enum");
-    static_assert((int)Ogre::Light::LT_SPOTLIGHT   == (int)Light::Spotlight,   "check enum");
+    static_assert((int)Ogre::Light::LT_POINT       == (int)Light::Type::Point,       "check enum");
+    static_assert((int)Ogre::Light::LT_DIRECTIONAL == (int)Light::Type::Directional, "check enum");
+    static_assert((int)Ogre::Light::LT_SPOTLIGHT   == (int)Light::Type::Spotlight,   "check enum");
 
     Light::Light(Context* context) : StaticEntity(context)
@@ -55,5 +55,5 @@
         this->diffuse_ = ColourValue::White;
         this->specular_ = ColourValue::White;
-        this->type_ = Light::Point;
+        this->type_ = Type::Point;
         this->attenuation_ = Vector4(100000, 1, 0, 0);
         this->spotlightRange_ = Vector3(40.0f, 30.0f, 1.0f);
@@ -105,5 +105,5 @@
     void Light::registerVariables()
     {
-        registerVariable((int&)this->type_,     VariableDirection::ToClient, new NetworkCallback<Light>(this, &Light::updateType));
+        registerVariable(this->type_,           VariableDirection::ToClient, new NetworkCallback<Light>(this, &Light::updateType));
         registerVariable(this->diffuse_,        VariableDirection::ToClient, new NetworkCallback<Light>(this, &Light::updateDiffuseColour));
         registerVariable(this->specular_,       VariableDirection::ToClient, new NetworkCallback<Light>(this, &Light::updateSpecularColour));
@@ -126,5 +126,5 @@
     void Light::updateAttenuation()
     {
-        if (this->light_ && this->type_ != Light::Directional)
+        if (this->light_ && this->type_ != Type::Directional)
             this->light_->setAttenuation(this->attenuation_.x, this->attenuation_.y, this->attenuation_.z, this->attenuation_.w);
     }
@@ -132,5 +132,5 @@
     void Light::updateSpotlightRange()
     {
-        if (this->light_ && this->type_ == Light::Spotlight)
+        if (this->light_ && this->type_ == Type::Spotlight)
             this->light_->setSpotlightRange(Degree(this->spotlightRange_.x), Degree(this->spotlightRange_.y), this->spotlightRange_.z);
     }
@@ -139,11 +139,11 @@
     {
         if (type == "point")
-            this->setType(Light::Point);
+            this->setType(Type::Point);
         else if (type == "directional")
-            this->setType(Light::Directional);
+            this->setType(Type::Directional);
         else if (type == "spotlight")
-            this->setType(Light::Spotlight);
+            this->setType(Type::Spotlight);
         else
-            this->setType(Light::Point);
+            this->setType(Type::Point);
     }
 
@@ -152,9 +152,9 @@
         switch (this->type_)
         {
-            case Light::Directional:
+            case Type::Directional:
                 return "directional";
-            case Light::Spotlight:
+            case Type::Spotlight:
                 return "spotlight";
-            case Light::Point:
+            case Type::Point:
             default:
                 return "point";
@@ -168,7 +168,7 @@
             this->light_->setType(static_cast<Ogre::Light::LightTypes>(this->type_));
 
-            if (this->type_ != Light::Directional)
+            if (this->type_ != Type::Directional)
                 this->updateAttenuation();
-            if (this->type_ == Light::Spotlight)
+            if (this->type_ == Type::Spotlight)
                 this->updateSpotlightRange();
         }
Index: code/branches/cpp11_v3/src/orxonox/graphics/Light.h
===================================================================
--- code/branches/cpp11_v3/src/orxonox/graphics/Light.h	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/graphics/Light.h	(revision 11068)
@@ -42,5 +42,5 @@
     {
         public:
-            enum LightTypes // Copy from the Ogre enum
+            enum class Type // Copy from the Ogre enum
             {
                 /// Point light sources give off light equally in all directions, so require only position not direction
@@ -63,7 +63,7 @@
                 { return this->light_; }
 
-            inline void setType(Light::LightTypes type)
+            inline void setType(Light::Type type)
                 { this->type_ = type; this->updateType(); }
-            inline Light::LightTypes getType() const
+            inline Light::Type getType() const
                 { return this->type_; }
 
@@ -144,5 +144,5 @@
 
             Ogre::Light* light_;
-            LightTypes type_;
+            Light::Type type_;
             ColourValue diffuse_;
             ColourValue specular_;
Index: code/branches/cpp11_v3/src/orxonox/infos/GametypeInfo.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/infos/GametypeInfo.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/infos/GametypeInfo.cc	(revision 11068)
@@ -291,5 +291,5 @@
         if(GameMode::isMaster())
         {
-            NotificationListener::sendNotification("Press [Fire] to respawn", GametypeInfo::NOTIFICATION_SENDER, notificationMessageType::info, notificationSendMode::network, player->getClientID());
+            NotificationListener::sendNotification("Press [Fire] to respawn", GametypeInfo::NOTIFICATION_SENDER, NotificationMessageType::info, NotificationSendMode::network, player->getClientID());
             // Remove the player from the list of players that have spawned, since it currently is not.
             this->spawnedPlayers_.erase(player);
@@ -346,8 +346,8 @@
                 // Display "Press [Fire] to start the match" if the game has not yet ended.
                 if(!this->hasEnded())
-                    NotificationListener::sendNotification("Press [Fire] to start the match", GametypeInfo::NOTIFICATION_SENDER, notificationMessageType::info, notificationSendMode::network, player->getClientID());
+                    NotificationListener::sendNotification("Press [Fire] to start the match", GametypeInfo::NOTIFICATION_SENDER, NotificationMessageType::info, NotificationSendMode::network, player->getClientID());
                 // Else display "Game has ended".
                 else
-                    NotificationListener::sendNotification("Game has ended", GametypeInfo::NOTIFICATION_SENDER, notificationMessageType::info, notificationSendMode::network, player->getClientID());
+                    NotificationListener::sendNotification("Game has ended", GametypeInfo::NOTIFICATION_SENDER, NotificationMessageType::info, NotificationSendMode::network, player->getClientID());
             }
         }
Index: code/branches/cpp11_v3/src/orxonox/interfaces/NotificationListener.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/interfaces/NotificationListener.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/interfaces/NotificationListener.cc	(revision 11068)
@@ -74,20 +74,20 @@
         The type of the notification, can be either 'info' or 'important'.
     */
-    /*static*/ void NotificationListener::sendNetworkHelper(const std::string& message, const std::string& sender, notificationSendMode::Value sendMode, unsigned int clientId, bool isCommand, notificationMessageType::Value messageType)
+    /*static*/ void NotificationListener::sendNetworkHelper(const std::string& message, const std::string& sender, NotificationSendMode sendMode, unsigned int clientId, bool isCommand, NotificationMessageType messageType)
     {
         // If we're in standalone mode or we're already no the right client we create and send the notification/command.
-        if(GameMode::isStandalone() || sendMode == notificationSendMode::local || (sendMode ==  notificationSendMode::network && Host::getPlayerID() == clientId))
+        if(GameMode::isStandalone() || sendMode == NotificationSendMode::local || (sendMode ==  NotificationSendMode::network && Host::getPlayerID() == clientId))
         {
             sendHelper(message, sender, isCommand, messageType);
         }
         // If we're on the server (and the server is not the intended recipient of the notification/command) we send it over the network.
-        else if(GameMode::isServer() && sendMode == notificationSendMode::network && Host::getPlayerID() != clientId)
+        else if(GameMode::isServer() && sendMode == NotificationSendMode::network && Host::getPlayerID() != clientId)
         {
-            callStaticNetworkFunction(&NotificationListener::sendHelper, clientId, message, sender, isCommand, (unsigned int)messageType);
+            callStaticNetworkFunction(&NotificationListener::sendHelper, clientId, message, sender, isCommand, messageType);
         }
-        else if(GameMode::isServer() && sendMode == notificationSendMode::broadcast)
+        else if(GameMode::isServer() && sendMode == NotificationSendMode::broadcast)
         {
             // TODO: Works as intended?
-            callStaticNetworkFunction(&NotificationListener::sendHelper, NETWORK_PEER_ID_BROADCAST, message, sender, isCommand, (unsigned int)messageType);
+            callStaticNetworkFunction(&NotificationListener::sendHelper, NETWORK_PEER_ID_BROADCAST, message, sender, isCommand, messageType);
         }
     }
@@ -105,5 +105,5 @@
         The type of the notification.
     */
-    /*static*/ void NotificationListener::sendHelper(const std::string& message, const std::string& sender, bool isCommand, unsigned int messageType)
+    /*static*/ void NotificationListener::sendHelper(const std::string& message, const std::string& sender, bool isCommand, NotificationMessageType type)
     {
         // Iterate through all NotificationListeners and notify them by calling the method they overloaded.
@@ -112,11 +112,11 @@
             // If the notification is a message.
             if(!isCommand)
-                listener->registerNotification(message, sender, notificationMessageType::Value(messageType));
+                listener->registerNotification(message, sender, type);
 
             // If the notification is a command.
             if(isCommand)
             {
-                notificationCommand::Value command = str2Command(message);
-                if(command != notificationCommand::none)
+                NotificationCommand command = str2Command(message);
+                if(command != NotificationCommand::none)
                     listener->executeCommand(command, sender);
             }
@@ -130,12 +130,12 @@
         The string to be converted.
     @return
-        Returns the corresponding enum, notificationCommand::none if the command doesn't exist.
+        Returns the corresponding enum, NotificationCommand::none if the command doesn't exist.
     */
-    /*static*/ notificationCommand::Value NotificationListener::str2Command(const std::string& string)
+    /*static*/ NotificationCommand NotificationListener::str2Command(const std::string& string)
     {
-        notificationCommand::Value command = notificationCommand::none;
+        NotificationCommand command = NotificationCommand::none;
 
         if(string == NotificationListener::COMMAND_CLEAR)
-            command = notificationCommand::clear;
+            command = NotificationCommand::clear;
 
         return command;
@@ -150,9 +150,9 @@
         Returns the corresponding string.
     */
-    /*static*/ const std::string& NotificationListener::command2Str(notificationCommand::Value command)
+    /*static*/ const std::string& NotificationListener::command2Str(NotificationCommand command)
     {
         switch(command)
         {
-            case notificationCommand::clear:
+            case NotificationCommand::clear:
                 return NotificationListener::COMMAND_CLEAR;
             default:
Index: code/branches/cpp11_v3/src/orxonox/interfaces/NotificationListener.h
===================================================================
--- code/branches/cpp11_v3/src/orxonox/interfaces/NotificationListener.h	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/interfaces/NotificationListener.h	(revision 11068)
@@ -49,28 +49,19 @@
 {
     // TODO: Document.
-    namespace notificationMessageType
-    {
-        enum Value {
-            info,
-            important
-        };
-    }
+    enum class NotificationMessageType {
+        info,
+        important
+    };
     
-    namespace notificationSendMode
-    {
-        enum Value {
-            local,
-            network,
-            broadcast
-        };
-    }
+    enum class NotificationSendMode {
+        local,
+        network,
+        broadcast
+    };
     
-    namespace notificationCommand
-    {
-        enum Value {
-            none,
-            clear
-        };
-    }
+    enum class NotificationCommand {
+        none,
+        clear
+    };
 
     // TODO: Update doc.
@@ -101,8 +92,8 @@
             @param sender The sender that sent the notification. Default is 'none'.
             @param messageType The type of the message, can be either 'info' or 'important'. Default is 'info'.
-            @param sendMode The mode in which the notification is sent, can be 'local' to send the notification to the client where this function is executed, 'network' if the notification is to be sent to the client with the specified clientID, or 'broadcast' if the notification should be sent to all hosts. Default is notificationSendMode::local.
+            @param sendMode The mode in which the notification is sent, can be 'local' to send the notification to the client where this function is executed, 'network' if the notification is to be sent to the client with the specified clientID, or 'broadcast' if the notification should be sent to all hosts. Default is NotificationSendMode::local.
             @param clientId The id of the client the notification should be sent to. Default is 0.
             */
-            static void sendNotification(const std::string& message, const std::string& sender = NotificationListener::NONE, notificationMessageType::Value messageType = notificationMessageType::info, notificationSendMode::Value sendMode = notificationSendMode::local, unsigned int clientId = 0)
+            static void sendNotification(const std::string& message, const std::string& sender = NotificationListener::NONE, NotificationMessageType messageType = NotificationMessageType::info, NotificationSendMode sendMode = NotificationSendMode::local, unsigned int clientId = 0)
                 { NotificationListener::sendNetworkHelper(message, sender, sendMode, clientId, false, messageType); }
             /**
@@ -110,11 +101,11 @@
             @param command The command that should be sent (and later executed).
             @param sender The sender that sent the notification. Default is 'none'.
-            @param sendMode The mode in which the command is sent, can be 'local' to send the command to the client where this function is executed, 'network' if the command is to be sent to the client with the specified clientID, or 'broadcast' if the command should be sent to all hosts. Default is notificationSendMode::local.
+            @param sendMode The mode in which the command is sent, can be 'local' to send the command to the client where this function is executed, 'network' if the command is to be sent to the client with the specified clientID, or 'broadcast' if the command should be sent to all hosts. Default is NotificationSendMode::local.
             @param clientId The id of the client the command should be sent to. Default is 0.
             */
-            static void sendCommand(const std::string& command, const std::string& sender = NotificationListener::NONE, notificationSendMode::Value sendMode = notificationSendMode::local, unsigned int clientId = 0)
+            static void sendCommand(const std::string& command, const std::string& sender = NotificationListener::NONE, NotificationSendMode sendMode = NotificationSendMode::local, unsigned int clientId = 0)
                 { NotificationListener::sendNetworkHelper(command, sender, sendMode, clientId, true); }
 
-            static void sendHelper(const std::string& message, const std::string& sender, bool isCommand = false, unsigned int messageMode = 0); // Helper method to register a notification/execute a command with all NotificationListeners after it has been sent over the network.
+            static void sendHelper(const std::string& message, const std::string& sender, bool isCommand, NotificationMessageType type); // Helper method to register a notification/execute a command with all NotificationListeners after it has been sent over the network.
 
             //TODO: Make protected?
@@ -128,5 +119,5 @@
             @return Returns true if the notification was successfully registered, false if not.
             */
-            virtual bool registerNotification(const std::string& message, const std::string& sender, notificationMessageType::Value type)
+            virtual bool registerNotification(const std::string& message, const std::string& sender, NotificationMessageType type)
                 { return false; }
             /**
@@ -137,5 +128,5 @@
             @return Returns true if the command was successfully executed, false if not.
             */
-            virtual bool executeCommand(notificationCommand::Value command, const std::string& sender) { return false; }
+            virtual bool executeCommand(NotificationCommand command, const std::string& sender) { return false; }
 
         public:
@@ -149,8 +140,8 @@
             
         protected:
-            static void sendNetworkHelper(const std::string& message, const std::string& sender, notificationSendMode::Value sendMode, unsigned int clientId, bool isCommand = false, notificationMessageType::Value messageType = notificationMessageType::info); // Helper method to send both notifications and commands over the network.
+            static void sendNetworkHelper(const std::string& message, const std::string& sender, NotificationSendMode sendMode, unsigned int clientId, bool isCommand = false, NotificationMessageType messageType = NotificationMessageType::info); // Helper method to send both notifications and commands over the network.
 
-            static notificationCommand::Value str2Command(const std::string& string); // Helper method. Converts a string into the enum for a command.
-            static const std::string& command2Str(notificationCommand::Value command); // Helper method. Converts a command enum into its corresponding string.
+            static NotificationCommand str2Command(const std::string& string); // Helper method. Converts a string into the enum for a command.
+            static const std::string& command2Str(NotificationCommand command); // Helper method. Converts a command enum into its corresponding string.
     };
 }
Index: code/branches/cpp11_v3/src/orxonox/interfaces/RadarViewable.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/interfaces/RadarViewable.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/interfaces/RadarViewable.cc	(revision 11068)
@@ -49,5 +49,5 @@
         , wePtr_(wePtr)
         , radarObjectCamouflage_(0.0f)
-        , radarObjectShape_(Dot)
+        , radarObjectShape_(Shape::Dot)
         , radarObjectDescription_("staticObject")
         , scale_(1.0f)
Index: code/branches/cpp11_v3/src/orxonox/interfaces/RadarViewable.h
===================================================================
--- code/branches/cpp11_v3/src/orxonox/interfaces/RadarViewable.h	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/interfaces/RadarViewable.h	(revision 11068)
@@ -49,5 +49,5 @@
     {
     public:
-        enum Shape
+        enum class Shape
         {
             Square,
Index: code/branches/cpp11_v3/src/orxonox/items/MultiStateEngine.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/items/MultiStateEngine.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/items/MultiStateEngine.cc	(revision 11068)
@@ -124,14 +124,14 @@
                 this->state_ = 0;
                 if (this->getShip()->isBoosting() && forward)
-                    this->state_ = Boost;
+                    this->state_ = EngineState::Boost;
                 else if (forward && !this->state_) // this->state_ == Boost
-                    this->state_ = Normal;
+                    this->state_ = EngineState::Normal;
                 else if (direction.z > 0.0 && velocity.z < 0.0)
-                    this->state_ = Brake;
+                    this->state_ = EngineState::Brake;
                 else
-                    this->state_ = Idle;
-
-                if (this->state_ == Idle && this->getSpeedAdd() > 0)
-                    this->state_ = Normal;
+                    this->state_ = EngineState::Idle;
+
+                if (this->state_ == EngineState::Idle && this->getSpeedAdd() > 0)
+                    this->state_ = EngineState::Normal;
             }
 
@@ -141,33 +141,33 @@
 
                 float pitch = velocity.length();
-                if (this->state_ & Normal)
+                if (this->state_ & EngineState::Normal)
                     defEngineSndNormal_->setPitch(clamp(pitch/MAX_VELOCITY_NORMAL + 1, 0.5f, 2.0f));
-                if (this->state_ & Boost)
+                if (this->state_ & EngineState::Boost)
                     defEngineSndBoost_->setPitch(clamp(pitch/MAX_VELOCITY_BOOST + 1, 0.5f, 2.0f));
 
-                if (changes & Idle)
-                {
-                    lua_pushboolean(this->lua_->getInternalLuaState(), this->state_ & Idle);
+                if (changes & EngineState::Idle)
+                {
+                    lua_pushboolean(this->lua_->getInternalLuaState(), this->state_ & EngineState::Idle);
                     lua_setglobal(this->lua_->getInternalLuaState(), "idle");
                 }
-                if (changes & Normal)
-                {
-                    lua_pushboolean(this->lua_->getInternalLuaState(), this->state_ & Normal);
+                if (changes & EngineState::Normal)
+                {
+                    lua_pushboolean(this->lua_->getInternalLuaState(), this->state_ & EngineState::Normal);
                     lua_setglobal(this->lua_->getInternalLuaState(), "normal");
-                    if (this->state_ & Normal)
+                    if (this->state_ & EngineState::Normal)
                         defEngineSndNormal_->play();
                     else
                         defEngineSndNormal_->stop();
                 }
-                if (changes & Brake)
-                {
-                    lua_pushboolean(this->lua_->getInternalLuaState(), this->state_ & Brake);
+                if (changes & EngineState::Brake)
+                {
+                    lua_pushboolean(this->lua_->getInternalLuaState(), this->state_ & EngineState::Brake);
                     lua_setglobal(this->lua_->getInternalLuaState(), "brake");
                 }
-                if (changes & Boost)
-                {
-                    lua_pushboolean(this->lua_->getInternalLuaState(), this->state_ & Boost);
+                if (changes & EngineState::Boost)
+                {
+                    lua_pushboolean(this->lua_->getInternalLuaState(), this->state_ & EngineState::Boost);
                     lua_setglobal(this->lua_->getInternalLuaState(), "boost");
-                    if (this->state_ & Boost)
+                    if (this->state_ & EngineState::Boost)
                         defEngineSndBoost_->play();
                     else
Index: code/branches/cpp11_v3/src/orxonox/items/MultiStateEngine.h
===================================================================
--- code/branches/cpp11_v3/src/orxonox/items/MultiStateEngine.h	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/items/MultiStateEngine.h	(revision 11068)
@@ -41,10 +41,10 @@
     {
         public:
-            enum EngineState
+            struct EngineState
             {
-                Idle    = 1,
-                Normal  = 2,
-                Brake   = 4,
-                Boost   = 8
+                static constexpr int Idle    = 1;
+                static constexpr int Normal  = 2;
+                static constexpr int Brake   = 4;
+                static constexpr int Boost   = 8;
             };
 
Index: code/branches/cpp11_v3/src/orxonox/items/PartDestructionEvent.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/items/PartDestructionEvent.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/items/PartDestructionEvent.cc	(revision 11068)
@@ -98,14 +98,14 @@
         {
             switch (this->targetParam_) {
-            case shieldhealth:
+            case TargetParam::shieldhealth:
                 this->parent_->getParent()->setShieldHealth(operate(this->parent_->getParent()->getShieldHealth()));
                 break;
-            case boostpower:
+            case TargetParam::boostpower:
                 this->parent_->getParent()->setInitialBoostPower(operate(this->parent_->getParent()->getInitialBoostPower()));
                 break;
-            case boostpowerrate:
+            case TargetParam::boostpowerrate:
                 this->parent_->getParent()->setBoostPowerRate(operate(this->parent_->getParent()->getBoostPowerRate()));
                 break;
-            case rotationthrust:
+            case TargetParam::rotationthrust:
                 this->parent_->getParent()->setRotationThrust(operate(this->parent_->getParent()->getRotationThrust()));
                 break;
@@ -120,14 +120,14 @@
         {
             switch (this->targetParam_) {
-            case null:
+            case TargetParam::null:
                 this->parent_->getParent()->getEngineByName(targetName_)->destroy();
                 break;
-            case boostfactor:
+            case TargetParam::boostfactor:
                 this->parent_->getParent()->getEngineByName(targetName_)->setBoostFactor(operate(this->parent_->getParent()->getEngineByName(targetName_)->getBoostFactor()));
                 break;
-            case speedfront:
+            case TargetParam::speedfront:
                 this->parent_->getParent()->getEngineByName(targetName_)->setMaxSpeedFront(operate(this->parent_->getParent()->getEngineByName(targetName_)->getMaxSpeedFront()));
                 break;
-            case accelerationfront:
+            case TargetParam::accelerationfront:
                 this->parent_->getParent()->getEngineByName(targetName_)->setAccelerationFront(operate(this->parent_->getParent()->getEngineByName(targetName_)->getAccelerationFront()));
                 break;
@@ -142,5 +142,5 @@
         {
             switch (this->targetParam_) {
-            case null:
+            case TargetParam::null:
                 if (!this->parent_->getParent()->getShipPartByName(targetName_))
                     return;
@@ -214,20 +214,20 @@
             if (param == "NULL")
             {
-                this->targetParam_ = null;
+                this->targetParam_ = TargetParam::null;
                 return;
             }
             if (param == "boostfactor")
             {
-                this->targetParam_ = boostfactor;
+                this->targetParam_ = TargetParam::boostfactor;
                 return;
             }
             if (param == "speedfront")
             {
-                this->targetParam_ = speedfront;
+                this->targetParam_ = TargetParam::speedfront;
                 return;
             }
             if (param == "accelerationfront")
             {
-                this->targetParam_ = accelerationfront;
+                this->targetParam_ = TargetParam::accelerationfront;
                 return;
             }
@@ -244,20 +244,20 @@
             if (param == "shieldhealth")
             {
-                this->targetParam_ = shieldhealth;
+                this->targetParam_ = TargetParam::shieldhealth;
                 return;
             }
             if (param == "boostpower")
             {
-                this->targetParam_ = boostpower;
+                this->targetParam_ = TargetParam::boostpower;
                 return;
             }
             if (param == "boostpowerrate")
             {
-                this->targetParam_ = boostpowerrate;
+                this->targetParam_ = TargetParam::boostpowerrate;
                 return;
             }
             if (param == "rotationthrust")
             {
-                this->targetParam_ = rotationthrust;
+                this->targetParam_ = TargetParam::rotationthrust;
                 return;
             }
@@ -271,5 +271,5 @@
             if (param == "NULL")
             {
-                this->targetParam_ = null;
+                this->targetParam_ = TargetParam::null;
                 return;
             }
Index: code/branches/cpp11_v3/src/orxonox/items/PartDestructionEvent.h
===================================================================
--- code/branches/cpp11_v3/src/orxonox/items/PartDestructionEvent.h	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/items/PartDestructionEvent.h	(revision 11068)
@@ -82,5 +82,5 @@
                     List of all allowed parameters.
                 */
-            enum TargetParam
+            enum class TargetParam
             {
                 shieldhealth,
Index: code/branches/cpp11_v3/src/orxonox/overlays/InGameConsole.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/overlays/InGameConsole.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/overlays/InGameConsole.cc	(revision 11068)
@@ -292,5 +292,5 @@
 
         for (int i = LINES - 1; i > max; --i)
-            this->print("", Shell::DebugOutput, i, true);
+            this->print("", Shell::LineType::DebugOutput, i, true);
 
         for (int i = max; i >= 1; --i)
@@ -318,5 +318,5 @@
     {
         if (LINES > 0)
-            this->print(this->shell_->getInput(), Shell::Input, 0);
+            this->print(this->shell_->getInput(), Shell::LineType::Input, 0);
 
         if (this->shell_->getInput().empty())
@@ -342,5 +342,5 @@
     void InGameConsole::executed()
     {
-        this->shell_->addOutput(this->shell_->getInput(), Shell::Command);
+        this->shell_->addOutput(this->shell_->getInput(), Shell::LineType::Command);
     }
 
@@ -562,26 +562,26 @@
         switch (type)
         {
-            case Shell::Message:
-            case Shell::DebugOutput:     colourTop = ColourValue(0.9f, 0.9f, 0.9f); break;
-
-            case Shell::UserError:       colourTop = ColourValue(0.9f, 0.0f, 0.0f); break;
-            case Shell::UserWarning:     colourTop = ColourValue(0.9f, 0.5f, 0.0f); break;
-            case Shell::UserStatus:      colourTop = ColourValue(0.0f, 0.9f, 0.0f); break;
-            case Shell::UserInfo:        colourTop = ColourValue(0.0f, 0.8f, 0.8f); break;
-
-            case Shell::InternalError:   colourTop = ColourValue(0.5f, 0.0f, 0.0f); break;
-            case Shell::InternalWarning: colourTop = ColourValue(0.5f, 0.2f, 0.0f); break;
-            case Shell::InternalStatus:  colourTop = ColourValue(0.0f, 0.5f, 0.0f); break;
-            case Shell::InternalInfo:    colourTop = ColourValue(0.0f, 0.4f, 0.4f); break;
-
-            case Shell::Verbose:         colourTop = ColourValue(0.3f, 0.3f, 0.9f); break;
-            case Shell::VerboseMore:     colourTop = ColourValue(0.2f, 0.2f, 0.7f); break;
-            case Shell::VerboseUltra:    colourTop = ColourValue(0.1f, 0.1f, 0.5f); break;
-
-            case Shell::Command:         colourTop = ColourValue(0.8f, 0.2f, 0.8f); break;
-            case Shell::Hint:            colourTop = ColourValue(0.4f, 0.0f, 0.4f); break;
-            case Shell::Input:           colourTop = ColourValue(0.9f, 0.9f, 0.9f); break;
-
-            default:                     colourTop = ColourValue(0.5f, 0.5f, 0.5f); break;
+            case Shell::LineType::Message:
+            case Shell::LineType::DebugOutput:     colourTop = ColourValue(0.9f, 0.9f, 0.9f); break;
+
+            case Shell::LineType::UserError:       colourTop = ColourValue(0.9f, 0.0f, 0.0f); break;
+            case Shell::LineType::UserWarning:     colourTop = ColourValue(0.9f, 0.5f, 0.0f); break;
+            case Shell::LineType::UserStatus:      colourTop = ColourValue(0.0f, 0.9f, 0.0f); break;
+            case Shell::LineType::UserInfo:        colourTop = ColourValue(0.0f, 0.8f, 0.8f); break;
+
+            case Shell::LineType::InternalError:   colourTop = ColourValue(0.5f, 0.0f, 0.0f); break;
+            case Shell::LineType::InternalWarning: colourTop = ColourValue(0.5f, 0.2f, 0.0f); break;
+            case Shell::LineType::InternalStatus:  colourTop = ColourValue(0.0f, 0.5f, 0.0f); break;
+            case Shell::LineType::InternalInfo:    colourTop = ColourValue(0.0f, 0.4f, 0.4f); break;
+
+            case Shell::LineType::Verbose:         colourTop = ColourValue(0.3f, 0.3f, 0.9f); break;
+            case Shell::LineType::VerboseMore:     colourTop = ColourValue(0.2f, 0.2f, 0.7f); break;
+            case Shell::LineType::VerboseUltra:    colourTop = ColourValue(0.1f, 0.1f, 0.5f); break;
+
+            case Shell::LineType::Command:         colourTop = ColourValue(0.8f, 0.2f, 0.8f); break;
+            case Shell::LineType::Hint:            colourTop = ColourValue(0.4f, 0.0f, 0.4f); break;
+            case Shell::LineType::Input:           colourTop = ColourValue(0.9f, 0.9f, 0.9f); break;
+
+            default:                               colourTop = ColourValue(0.5f, 0.5f, 0.5f); break;
         }
 
Index: code/branches/cpp11_v3/src/orxonox/overlays/OrxonoxOverlay.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/overlays/OrxonoxOverlay.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/overlays/OrxonoxOverlay.cc	(revision 11068)
@@ -94,5 +94,5 @@
         this->angle_ = Degree(0.0);
         this->bCorrectAspect_ = false;
-        this->rotState_ = Horizontal;
+        this->rotState_ = RotationState::Horizontal;
         this->angleChanged(); // updates all other values as well
 
@@ -259,15 +259,15 @@
             {
                 tempAspect = 1.0f / this->windowAspectRatio_;
-                rotState_ = Vertical;
+                rotState_ = RotationState::Vertical;
             }
             else if (angle > 179 || angle < 1)
             {
                 tempAspect = this->windowAspectRatio_;
-                rotState_ = Horizontal;
+                rotState_ = RotationState::Horizontal;
             }
             else
             {
                 tempAspect = 1.0f;
-                rotState_ = Inbetween;
+                rotState_ = RotationState::Inbetween;
             }
 
Index: code/branches/cpp11_v3/src/orxonox/overlays/OrxonoxOverlay.h
===================================================================
--- code/branches/cpp11_v3/src/orxonox/overlays/OrxonoxOverlay.h	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/overlays/OrxonoxOverlay.h	(revision 11068)
@@ -79,5 +79,5 @@
             and in between is everything else.
         */
-        enum RotationState
+        enum class RotationState
         {
             Horizontal,
Index: code/branches/cpp11_v3/src/orxonox/sound/BaseSound.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/sound/BaseSound.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/sound/BaseSound.cc	(revision 11068)
@@ -49,5 +49,5 @@
         , volume_(0.7)
         , bLooping_(false)
-        , state_(Stopped)
+        , state_(State::Stopped)
         , pitch_ (1.0)
     {
@@ -63,5 +63,5 @@
     BaseSound::~BaseSound()
     {
-        if (this->state_ != Stopped)
+        if (this->state_ != State::Stopped)
             this->stop();
         // Release buffer
@@ -83,5 +83,5 @@
     void BaseSound::doPlay()
     {
-        this->state_ = Playing;
+        this->state_ = State::Playing;
         if (GameMode::playsSound() && this->getSourceState() != AL_PLAYING && this->soundBuffer_ != nullptr)
         {
@@ -102,5 +102,5 @@
     bool BaseSound::doStop()
     {
-        this->state_ = Stopped;
+        this->state_ = State::Stopped;
         if (alIsSource(this->audioSource_))
         {
@@ -123,5 +123,5 @@
         if (this->isStopped())
             return;
-        this->state_ = Paused;
+        this->state_ = State::Paused;
         if (alIsSource(this->audioSource_))
             alSourcePause(this->audioSource_);
@@ -256,10 +256,10 @@
         else // No source acquired so far, but might be set to playing or paused
         {
-            State state = static_cast<State>(this->state_); // save
+            State state = this->state_; // save
             if (this->isPlaying() || this->isPaused())
                 doPlay();
-            if (state == Paused)
-            {
-                this->state_ = Paused;
+            if (state == State::Paused)
+            {
+                this->state_ = State::Paused;
                 doPause();
             }
@@ -271,11 +271,11 @@
         switch (this->state_)
         {
-            case Playing:
+            case State::Playing:
                 this->play();
                 break;
-            case Paused:
+            case State::Paused:
                 this->pause();
                 break;
-            case Stopped:
+            case State::Stopped:
             default:
                 this->stop();
Index: code/branches/cpp11_v3/src/orxonox/sound/BaseSound.h
===================================================================
--- code/branches/cpp11_v3/src/orxonox/sound/BaseSound.h	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/sound/BaseSound.h	(revision 11068)
@@ -54,7 +54,7 @@
         virtual void pause() { this->doPause(); }
 
-        bool isPlaying() const { return this->state_ == Playing; }
-        bool isPaused()  const { return this->state_ == Paused; }
-        bool isStopped() const { return this->state_ == Stopped; }
+        bool isPlaying() const { return this->state_ == State::Playing; }
+        bool isPaused()  const { return this->state_ == State::Paused; }
+        bool isStopped() const { return this->state_ == State::Stopped; }
 
         virtual void setSource(const std::string& source);
@@ -76,5 +76,5 @@
 
     protected:
-        enum State
+        enum class State
         {
             Stopped,
@@ -111,5 +111,5 @@
         float           volume_;
         bool            bLooping_;
-        uint8_t         state_;       // This Variable is actually of type State
+        State           state_;       // This Variable is actually of type State
         float           pitch_;
 
Index: code/branches/cpp11_v3/src/orxonox/sound/WorldSound.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/sound/WorldSound.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/sound/WorldSound.cc	(revision 11068)
@@ -58,5 +58,5 @@
         registerVariable(bLooping_, ObjectDirection::ToClient, new NetworkCallback<WorldSound>(this, &WorldSound::loopingChanged));
         registerVariable(pitch_,    ObjectDirection::ToClient, new NetworkCallback<WorldSound>(this, &WorldSound::pitchChanged));
-        registerVariable((uint8_t&)(BaseSound::state_), ObjectDirection::ToClient, new NetworkCallback<WorldSound>(this, &WorldSound::stateChanged));
+        registerVariable(BaseSound::state_, ObjectDirection::ToClient, new NetworkCallback<WorldSound>(this, &WorldSound::stateChanged));
     }
 
Index: code/branches/cpp11_v3/src/orxonox/worldentities/Drone.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/worldentities/Drone.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/worldentities/Drone.cc	(revision 11068)
@@ -49,5 +49,5 @@
         this->localAngularAcceleration_.setValue(0, 0, 0);
         this->setRadarVisibility(false);
-        this->setCollisionType(WorldEntity::Dynamic);
+        this->setCollisionType(WorldEntity::CollisionType::Dynamic);
 
         myController_ = new DroneController(this->getContext()); //!< Creates a new controller and passes our this pointer to it as creator.
Index: code/branches/cpp11_v3/src/orxonox/worldentities/MobileEntity.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/worldentities/MobileEntity.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/worldentities/MobileEntity.cc	(revision 11068)
@@ -189,5 +189,5 @@
     bool MobileEntity::isCollisionTypeLegal(WorldEntity::CollisionType type) const
     {
-        if (type == WorldEntity::Static)
+        if (type == WorldEntity::CollisionType::Static)
         {
             orxout(internal_warning) << "Cannot tell a MobileEntity to have static collision type! Ignoring." << endl;
Index: code/branches/cpp11_v3/src/orxonox/worldentities/StaticEntity.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/worldentities/StaticEntity.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/worldentities/StaticEntity.cc	(revision 11068)
@@ -95,5 +95,5 @@
     bool StaticEntity::isCollisionTypeLegal(WorldEntity::CollisionType type) const
     {
-        if (type == WorldEntity::Kinematic || type == WorldEntity::Dynamic)
+        if (type == WorldEntity::CollisionType::Kinematic || type == WorldEntity::CollisionType::Dynamic)
         {
             orxout(internal_warning) << "Cannot tell a StaticEntity to have kinematic or dynamic collision type! Ignoring." << endl;
Index: code/branches/cpp11_v3/src/orxonox/worldentities/WorldEntity.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/worldentities/WorldEntity.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/worldentities/WorldEntity.cc	(revision 11068)
@@ -56,7 +56,7 @@
 
     // Be sure we don't do bad conversions
-    static_assert((int)Ogre::Node::TS_LOCAL  == (int)WorldEntity::Local,  "check enum");
-    static_assert((int)Ogre::Node::TS_PARENT == (int)WorldEntity::Parent, "check enum");
-    static_assert((int)Ogre::Node::TS_WORLD  == (int)WorldEntity::World,  "check enum");
+    static_assert((int)Ogre::Node::TS_LOCAL  == (int)WorldEntity::TransformSpace::Local,  "check enum");
+    static_assert((int)Ogre::Node::TS_PARENT == (int)WorldEntity::TransformSpace::Parent, "check enum");
+    static_assert((int)Ogre::Node::TS_WORLD  == (int)WorldEntity::TransformSpace::World,  "check enum");
 
     RegisterAbstractClass(WorldEntity).inheritsFrom<BaseObject>().inheritsFrom<Synchronisable>();
@@ -95,6 +95,6 @@
         this->collisionShape_ = new WorldEntityCollisionShape(this->getContext());
         this->collisionShape_->setWorldEntityOwner(this);
-        this->collisionType_             = None;
-        this->collisionTypeSynchronised_ = None;
+        this->collisionType_             = CollisionType::None;
+        this->collisionTypeSynchronised_ = CollisionType::None;
         this->mass_                 = 1.0f;
         this->childrenMass_         = 0;
@@ -207,5 +207,5 @@
         registerVariable(this->bCollisionResponseActive_,
                                                 VariableDirection::ToClient, new NetworkCallback<WorldEntity>(this, &WorldEntity::collisionResponseActivityChanged));
-        registerVariable((int&)this->collisionTypeSynchronised_,
+        registerVariable(this->collisionTypeSynchronised_,
                                                 VariableDirection::ToClient, new NetworkCallback<WorldEntity>(this, &WorldEntity::collisionTypeChanged));
         registerVariable(this->bPhysicsActiveSynchronised_,
@@ -322,8 +322,8 @@
     void WorldEntity::collisionTypeChanged()
     {
-        if (this->collisionTypeSynchronised_ != Dynamic &&
-            this->collisionTypeSynchronised_ != Kinematic &&
-            this->collisionTypeSynchronised_ != Static &&
-            this->collisionTypeSynchronised_ != None)
+        if (this->collisionTypeSynchronised_ != CollisionType::Dynamic &&
+            this->collisionTypeSynchronised_ != CollisionType::Kinematic &&
+            this->collisionTypeSynchronised_ != CollisionType::Static &&
+            this->collisionTypeSynchronised_ != CollisionType::None)
         {
             orxout(internal_error) << "Error when collsion Type was received over network. Unknown enum value:" << this->collisionTypeSynchronised_ << endl;
@@ -681,12 +681,12 @@
         switch (relativeTo)
         {
-        case WorldEntity::Local:
+        case TransformSpace::Local:
             // position is relative to parent so transform downwards
             this->setPosition(this->getPosition() + this->getOrientation() * distance);
             break;
-        case WorldEntity::Parent:
+        case TransformSpace::Parent:
             this->setPosition(this->getPosition() + distance);
             break;
-        case WorldEntity::World:
+        case TransformSpace::World:
             // position is relative to parent so transform upwards
             if (this->node_->getParent())
@@ -711,12 +711,12 @@
         switch(relativeTo)
         {
-        case WorldEntity::Local:
+        case TransformSpace::Local:
             this->setOrientation(this->getOrientation() * rotation);
             break;
-        case WorldEntity::Parent:
+        case TransformSpace::Parent:
             // Rotations are normally relative to local axes, transform up
             this->setOrientation(rotation * this->getOrientation());
             break;
-        case WorldEntity::World:
+        case TransformSpace::World:
             // Rotations are normally relative to local axes, transform up
             this->setOrientation(this->getOrientation() * this->getWorldOrientation().Inverse()
@@ -741,11 +741,11 @@
         switch (relativeTo)
         {
-        case WorldEntity::Local:
+        case TransformSpace::Local:
             origin = Vector3::ZERO;
             break;
-        case WorldEntity::Parent:
+        case TransformSpace::Parent:
             origin = this->getPosition();
             break;
-        case WorldEntity::World:
+        case TransformSpace::World:
             origin = this->getWorldPosition();
             break;
@@ -831,5 +831,5 @@
 
         // Check whether we have to create or destroy.
-        if (type != None && this->collisionType_ == None)
+        if (type != CollisionType::None && this->collisionType_ == CollisionType::None)
         {
 /*
@@ -849,5 +849,5 @@
             this->physicalBody_->setActivationState(DISABLE_DEACTIVATION);
         }
-        else if (type == None && this->collisionType_ != None)
+        else if (type == CollisionType::None && this->collisionType_ != CollisionType::None)
         {
             // Destroy rigid body
@@ -856,6 +856,6 @@
             delete this->physicalBody_;
             this->physicalBody_ = nullptr;
-            this->collisionType_ = None;
-            this->collisionTypeSynchronised_ = None;
+            this->collisionType_ = CollisionType::None;
+            this->collisionTypeSynchronised_ = CollisionType::None;
             return;
         }
@@ -864,14 +864,14 @@
         switch (type)
         {
-        case Dynamic:
+        case CollisionType::Dynamic:
             this->physicalBody_->setCollisionFlags(this->physicalBody_->getCollisionFlags() & !btCollisionObject::CF_STATIC_OBJECT & !btCollisionObject::CF_KINEMATIC_OBJECT);
             break;
-        case Kinematic:
+        case CollisionType::Kinematic:
             this->physicalBody_->setCollisionFlags((this->physicalBody_->getCollisionFlags() & !btCollisionObject::CF_STATIC_OBJECT) | btCollisionObject::CF_KINEMATIC_OBJECT);
             break;
-        case Static:
+        case CollisionType::Static:
             this->physicalBody_->setCollisionFlags((this->physicalBody_->getCollisionFlags() & !btCollisionObject::CF_KINEMATIC_OBJECT) | btCollisionObject::CF_STATIC_OBJECT);
             break;
-        case None:
+        case CollisionType::None:
             assert(false); // Doesn't happen
             return;
@@ -895,11 +895,11 @@
         CollisionType type;
         if (typeStrLower == "dynamic")
-            type = Dynamic;
+            type = CollisionType::Dynamic;
         else if (typeStrLower == "static")
-            type = Static;
+            type = CollisionType::Static;
         else if (typeStrLower == "kinematic")
-            type = Kinematic;
+            type = CollisionType::Kinematic;
         else if (typeStrLower == "none")
-            type = None;
+            type = CollisionType::None;
         else
             ThrowException(ParseError, std::string("Attempting to set an unknown collision type: '") + typeStr + "'.");
@@ -912,11 +912,11 @@
         switch (this->getCollisionType())
         {
-            case Dynamic:
+            case CollisionType::Dynamic:
                 return "dynamic";
-            case Kinematic:
+            case CollisionType::Kinematic:
                 return "kinematic";
-            case Static:
+            case CollisionType::Static:
                 return "static";
-            case None:
+            case CollisionType::None:
                 return "none";
             default:
Index: code/branches/cpp11_v3/src/orxonox/worldentities/WorldEntity.h
===================================================================
--- code/branches/cpp11_v3/src/orxonox/worldentities/WorldEntity.h	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/worldentities/WorldEntity.h	(revision 11068)
@@ -82,5 +82,5 @@
                 Enumeration denoting the spaces which a transform can be relative to.
             */
-            enum TransformSpace
+            enum class TransformSpace
             {
                 //! Transform is relative to the local space
@@ -117,6 +117,6 @@
             const Vector3& getWorldPosition() const;
 
-            void translate(const Vector3& distance, TransformSpace relativeTo = WorldEntity::Parent);
-            inline void translate(float x, float y, float z, TransformSpace relativeTo = WorldEntity::Parent)
+            void translate(const Vector3& distance, TransformSpace relativeTo = TransformSpace::Parent);
+            inline void translate(float x, float y, float z, TransformSpace relativeTo = TransformSpace::Parent)
                 { this->translate(Vector3(x, y, z), relativeTo); }
 
@@ -134,18 +134,18 @@
             const Quaternion& getWorldOrientation() const;
 
-            void rotate(const Quaternion& rotation, TransformSpace relativeTo = WorldEntity::Local);
-            inline void rotate(const Vector3& axis, const Degree& angle, TransformSpace relativeTo = WorldEntity::Local)
+            void rotate(const Quaternion& rotation, TransformSpace relativeTo = TransformSpace::Local);
+            inline void rotate(const Vector3& axis, const Degree& angle, TransformSpace relativeTo = TransformSpace::Local)
                 { this->rotate(Quaternion(angle, axis), relativeTo); }
 
-            inline void yaw(const Degree& angle, TransformSpace relativeTo = WorldEntity::Local)
+            inline void yaw(const Degree& angle, TransformSpace relativeTo = TransformSpace::Local)
                 { this->rotate(Quaternion(angle, Vector3::UNIT_Y), relativeTo); }
-            inline void pitch(const Degree& angle, TransformSpace relativeTo = WorldEntity::Local)
+            inline void pitch(const Degree& angle, TransformSpace relativeTo = TransformSpace::Local)
                 { this->rotate(Quaternion(angle, Vector3::UNIT_X), relativeTo); }
-            inline void roll(const Degree& angle, TransformSpace relativeTo = WorldEntity::Local)
+            inline void roll(const Degree& angle, TransformSpace relativeTo = TransformSpace::Local)
                 { this->rotate(Quaternion(angle, Vector3::UNIT_Z), relativeTo); }
 
-            void lookAt(const Vector3& target, TransformSpace relativeTo = WorldEntity::Parent, const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z);
-            void setDirection(const Vector3& direction, TransformSpace relativeTo = WorldEntity::Local, const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z);
-            inline void setDirection(float x, float y, float z, TransformSpace relativeTo = WorldEntity::Local, const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z)
+            void lookAt(const Vector3& target, TransformSpace relativeTo = TransformSpace::Parent, const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z);
+            void setDirection(const Vector3& direction, TransformSpace relativeTo = TransformSpace::Local, const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z);
+            inline void setDirection(float x, float y, float z, TransformSpace relativeTo = TransformSpace::Local, const Vector3& localDirectionVector = Vector3::NEGATIVE_UNIT_Z)
                 { this->setDirection(Vector3(x, y, z), relativeTo, localDirectionVector); }
 
@@ -257,5 +257,5 @@
                 None:      The object has no physics at all.
             */
-            enum CollisionType
+            enum class CollisionType
             {
                 Dynamic,
@@ -266,11 +266,11 @@
 
             //! Tells whether the object has any connection to the Bullet physics engine. If hasPhysics() is false, the object may still have a velocity.
-            bool hasPhysics()       const { return getCollisionType() != None     ; }
+            bool hasPhysics()       const { return getCollisionType() != CollisionType::None     ; }
             //! @see CollisionType
-            bool isStatic()         const { return getCollisionType() == Static   ; }
+            bool isStatic()         const { return getCollisionType() == CollisionType::Static   ; }
             //! @see CollisionType
-            bool isKinematic()      const { return getCollisionType() == Kinematic; }
+            bool isKinematic()      const { return getCollisionType() == CollisionType::Kinematic; }
             //! @see CollisionType
-            bool isDynamic()        const { return getCollisionType() == Dynamic  ; }
+            bool isDynamic()        const { return getCollisionType() == CollisionType::Dynamic  ; }
             //! Tells whether physics has been activated (you can temporarily deactivate it)
             bool isPhysicsActive()  const { return this->bPhysicsActive_; }
Index: code/branches/cpp11_v3/src/orxonox/worldentities/pawns/FpsPlayer.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/worldentities/pawns/FpsPlayer.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/worldentities/pawns/FpsPlayer.cc	(revision 11068)
@@ -79,5 +79,5 @@
         // FpsPlayer is always a physical object per default
         // Be aware of this call: The collision type legality check will not reach derived classes!
-        this->setCollisionType(WorldEntity::Dynamic);
+        this->setCollisionType(WorldEntity::CollisionType::Dynamic);
         // Get notification about collisions
         this->enableCollisionCallback();
@@ -130,5 +130,5 @@
     bool FpsPlayer::isCollisionTypeLegal(WorldEntity::CollisionType type) const
     {
-        if (type != WorldEntity::Dynamic)
+        if (type != WorldEntity::CollisionType::Dynamic)
         {
             orxout(internal_warning) << "Cannot tell a FpsPlayer not to be dynamic! Ignoring." << endl;
@@ -168,5 +168,5 @@
             if (!this->isInMouseLook())
             {
-                this->yaw(Radian(this->yaw_ * this->getMouseLookSpeed()), WorldEntity::Parent);
+                this->yaw(Radian(this->yaw_ * this->getMouseLookSpeed()), WorldEntity::TransformSpace::Parent);
 
                 Radian pitch = this->cameraPositionRootNode_->getOrientation().getPitch();
Index: code/branches/cpp11_v3/src/orxonox/worldentities/pawns/Pawn.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/worldentities/pawns/Pawn.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/worldentities/pawns/Pawn.cc	(revision 11068)
@@ -97,5 +97,5 @@
 
         this->setRadarObjectColour(ColourValue::Red);
-        this->setRadarObjectShape(RadarViewable::Dot);
+        this->setRadarObjectShape(RadarViewable::Shape::Dot);
 
         this->registerVariables();
Index: code/branches/cpp11_v3/src/orxonox/worldentities/pawns/SpaceShip.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/worldentities/pawns/SpaceShip.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/worldentities/pawns/SpaceShip.cc	(revision 11068)
@@ -80,5 +80,5 @@
         // SpaceShip is always a physical object per default
         // Be aware of this call: The collision type legality check will not reach derived classes!
-        this->setCollisionType(WorldEntity::Dynamic);
+        this->setCollisionType(WorldEntity::CollisionType::Dynamic);
         // Get notification about collisions
         this->enableCollisionCallback();
@@ -145,5 +145,5 @@
     bool SpaceShip::isCollisionTypeLegal(WorldEntity::CollisionType type) const
     {
-        if (type != WorldEntity::Dynamic)
+        if (type != WorldEntity::CollisionType::Dynamic)
         {
             orxout(internal_warning) << "Cannot tell a SpaceShip not to be dynamic! Ignoring." << endl;
Index: code/branches/cpp11_v3/src/orxonox/worldentities/pawns/TeamBaseMatchBase.cc
===================================================================
--- code/branches/cpp11_v3/src/orxonox/worldentities/pawns/TeamBaseMatchBase.cc	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/worldentities/pawns/TeamBaseMatchBase.cc	(revision 11068)
@@ -51,5 +51,5 @@
         }
 
-        this->setRadarObjectShape(RadarViewable::Triangle);
+        this->setRadarObjectShape(RadarViewable::Shape::Triangle);
     }
 
Index: code/branches/cpp11_v3/src/orxonox/worldentities/pawns/TeamBaseMatchBase.h
===================================================================
--- code/branches/cpp11_v3/src/orxonox/worldentities/pawns/TeamBaseMatchBase.h	(revision 11067)
+++ code/branches/cpp11_v3/src/orxonox/worldentities/pawns/TeamBaseMatchBase.h	(revision 11068)
@@ -36,13 +36,10 @@
 namespace orxonox
 {
-    namespace BaseState
+    enum class BaseState
     {
-        enum Value
-        {
-            Uncontrolled,
-            ControlTeam1,
-            ControlTeam2,
-        };
-    }
+        Uncontrolled,
+        ControlTeam1,
+        ControlTeam2,
+    };
 
 
@@ -58,5 +55,5 @@
 
             // Set the state of a base to whatever the argument of the function is
-            void setState(BaseState::Value state)
+            void setState(BaseState state)
             {
                 this->state_ = state;
@@ -66,5 +63,5 @@
 
             // Get the state of a base as a return value
-            BaseState::Value getState() const
+            BaseState getState() const
             {
                 return this->state_;
@@ -75,5 +72,5 @@
             void changeTeamColour();
 
-            BaseState::Value state_;
+            BaseState state_;
     };
 }
Index: code/branches/cpp11_v3/test/util/MultiTypeTest.cc
===================================================================
--- code/branches/cpp11_v3/test/util/MultiTypeTest.cc	(revision 11067)
+++ code/branches/cpp11_v3/test/util/MultiTypeTest.cc	(revision 11068)
@@ -697,3 +697,242 @@
         EXPECT_TRUE(mt.null());
     }
+
+    ///////////////////////////////
+    // Strongly typed enum class //
+    ///////////////////////////////
+    enum class EnumWithChar : unsigned char
+    {
+        ValueA = 'A',
+        ValueB = 'B',
+        ValueC = 'C',
+    };
+    enum class EnumWithInt
+    {
+        Value1 = 50,
+        Value2 = 0,
+        Value3,
+    };
+
+    TEST(MultiType, Enum_Constructor)
+    {
+        // Constructor:
+        {
+            MultiType mt = EnumWithChar::ValueA;
+
+            EXPECT_TRUE(mt.isType<EnumWithChar>());
+            EXPECT_EQ(EnumWithChar::ValueA, mt.get<EnumWithChar>());
+        }
+        {
+            MultiType mt = MultiType(EnumWithInt::Value1);
+
+            EXPECT_TRUE(mt.isType<EnumWithInt>());
+            EXPECT_EQ(EnumWithInt::Value1, mt.get<EnumWithInt>());
+        }
+    }
+
+    TEST(MultiType, Enum_Assignment)
+    {
+        // operator=:
+        MultiType mt;
+        mt = EnumWithChar::ValueB;
+
+        EXPECT_TRUE(mt.isType<EnumWithChar>());
+        EXPECT_EQ(EnumWithChar::ValueB, mt.get<EnumWithChar>());
+    }
+
+    TEST(MultiType, Enum_Set)
+    {
+        // set(value):
+        {
+            MultiType mt;
+            mt.set(EnumWithInt::Value2); // assign enum to an empty MultiType
+
+            EXPECT_TRUE(mt.isType<EnumWithInt>());
+            EXPECT_EQ(EnumWithInt::Value2, mt.get<EnumWithInt>());
+        }
+        {
+            MultiType mt = "string";
+            mt.set(EnumWithChar::ValueC); // assign enum to a MultiType with type std::string
+
+            EXPECT_TRUE(mt.isType<std::string>());
+            EXPECT_EQ("C", mt.get<std::string>());
+        }
+        {
+            MultiType mt = EnumWithChar::ValueA;
+            mt.set(EnumWithChar::ValueB); // assign enum to a MultiType with type std::string
+
+            EXPECT_TRUE(mt.isType<EnumWithChar>());
+            EXPECT_EQ(EnumWithChar::ValueB, mt.get<EnumWithChar>());
+        }
+        {
+            MultiType mt = EnumWithInt::Value3;
+            mt.set("50"); // assign enum to a MultiType with type std::string
+
+            EXPECT_TRUE(mt.isType<EnumWithInt>());
+            EXPECT_EQ(EnumWithInt::Value1, mt.get<EnumWithInt>());
+        }
+    }
+
+    TEST(MultiType, Enum_Force)
+    {
+        // force(value):
+        {
+            MultiType mt = "string";
+            EXPECT_TRUE(mt.isType<std::string>());
+            EXPECT_EQ("string", mt.get<std::string>());
+
+            mt.force<EnumWithChar>("C");
+
+            EXPECT_TRUE(mt.isType<EnumWithChar>());
+            EXPECT_EQ(EnumWithChar::ValueC, mt.get<EnumWithChar>());
+        }
+        {
+            MultiType mt = EnumWithChar::ValueA;
+            EXPECT_TRUE(mt.isType<EnumWithChar>());
+            EXPECT_EQ(EnumWithChar::ValueA, mt.get<EnumWithChar>());
+
+            mt.force<std::string>(EnumWithChar::ValueB);
+
+            EXPECT_TRUE(mt.isType<std::string>());
+            EXPECT_EQ("B", mt.get<std::string>());
+        }
+    }
+
+    TEST(MultiType, Enum_Convert)
+    {
+        // convert():
+        {
+            MultiType mt = "C";
+            mt.convert<EnumWithChar>();
+
+            EXPECT_TRUE(mt.isType<EnumWithChar>());
+            EXPECT_EQ(EnumWithChar::ValueC, mt.get<EnumWithChar>());
+        }
+        {
+            MultiType mt = EnumWithChar::ValueA;
+            mt.convert<std::string>();
+
+            EXPECT_TRUE(mt.isType<std::string>());
+            EXPECT_EQ("A", mt.get<std::string>());
+        }
+    }
+
+    TEST(MultiType, Enum_Reset)
+    {
+        // reset():
+        {
+            MultiType mt = EnumWithChar::ValueA;
+            mt.reset<EnumWithChar>();
+
+            EXPECT_TRUE(mt.isType<EnumWithChar>());
+            EXPECT_TRUE(mt.isType<unsigned char>());
+            EXPECT_EQ('\0', mt.get<unsigned char>());
+        }
+        {
+            MultiType mt = "string";
+            mt.reset<EnumWithInt>();
+
+            EXPECT_TRUE(mt.isType<EnumWithInt>());
+            EXPECT_TRUE(mt.isType<int>());
+            EXPECT_EQ(0, mt.get<int>());
+        }
+    }
+
+    TEST(MultiType, Enum_IsType)
+    {
+        // isType():
+        {
+            MultiType mt = EnumWithChar::ValueB;
+            EXPECT_TRUE(mt.isType<EnumWithChar>());
+            EXPECT_TRUE(mt.isType<unsigned char>());
+            EXPECT_FALSE(mt.isType<char>());
+            EXPECT_FALSE(mt.isType<int>());
+            EXPECT_FALSE(mt.isType<bool>());
+            EXPECT_FALSE(mt.isType<std::string>());
+        }
+        {
+            MultiType mt = EnumWithInt::Value3;
+            EXPECT_TRUE(mt.isType<EnumWithInt>());
+            EXPECT_TRUE(mt.isType<int>());
+            EXPECT_FALSE(mt.isType<unsigned char>());
+            EXPECT_FALSE(mt.isType<char>());
+            EXPECT_FALSE(mt.isType<bool>());
+            EXPECT_FALSE(mt.isType<std::string>());
+        }
+    }
+
+    TEST(MultiType, Enum_ConversionOperator)
+    {
+        // conversion operator:
+        {
+            MultiType mt = EnumWithChar::ValueA;
+            EnumWithChar value = mt;
+            EXPECT_EQ(EnumWithChar::ValueA, value);
+        }
+        {
+            MultiType mt = 'B';
+            EnumWithChar value = mt;
+            EXPECT_EQ(EnumWithChar::ValueB, value);
+        }
+        {
+            MultiType mt = EnumWithInt::Value1;
+            std::string value = mt;
+            EXPECT_EQ("50", value);
+        }
+    }
+
+    TEST(MultiType, Enum_GetValue)
+    {
+        // getValue():
+        {
+            MultiType mt = EnumWithChar::ValueA;
+            EnumWithChar value;
+            mt.getValue(&value);
+            EXPECT_EQ(EnumWithChar::ValueA, value);
+        }
+        {
+            MultiType mt = 'B';
+            EnumWithChar value;
+            mt.getValue(&value);
+            EXPECT_EQ(EnumWithChar::ValueB, value);
+        }
+        {
+            MultiType mt = EnumWithInt::Value1;
+            std::string value;
+            mt.getValue(&value);
+            EXPECT_EQ("50", value);
+        }
+    }
+
+    TEST(MultiType, Enum_Get)
+    {
+        // get():
+        {
+            MultiType mt = EnumWithChar::ValueB;
+            EXPECT_EQ(EnumWithChar::ValueB, mt.get<EnumWithChar>());
+
+            EXPECT_EQ('B', mt.get<unsigned char>());
+            EXPECT_EQ("B", mt.get<std::string>());
+            EXPECT_EQ(66, mt.get<int>());
+            EXPECT_TRUE(mt.get<bool>());
+        }
+        {
+            MultiType mt = EnumWithInt::Value1;
+            EXPECT_EQ(EnumWithInt::Value1, mt.get<EnumWithInt>());
+
+            EXPECT_EQ('2', mt.get<unsigned char>());
+            EXPECT_EQ("50", mt.get<std::string>());
+            EXPECT_EQ(50, mt.get<int>());
+            EXPECT_TRUE(mt.get<bool>());
+        }
+        {
+            MultiType mt = EnumWithInt::Value2;
+            EXPECT_EQ(EnumWithInt::Value2, mt.get<EnumWithInt>());
+
+            EXPECT_EQ('\0', mt.get<unsigned char>());
+            EXPECT_EQ("0", mt.get<std::string>());
+            EXPECT_EQ(0, mt.get<int>());
+            EXPECT_FALSE(mt.get<bool>());
+        }
+    }
 }
