Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/Camera.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/Camera.cc	(revision 2161)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/Camera.cc	(revision 2162)
@@ -53,5 +53,5 @@
 
         if (!this->getScene() || !this->getScene()->getSceneManager())
-            throw AbortLoadingException("Can't create Camera, no scene or no scene manager given.");
+            ThrowException(AbortLoading, "Can't create Camera, no scene or no scene manager given.");
 
         this->camera_ = this->getScene()->getSceneManager()->createCamera(getUniqueNumberString());
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/ParticleEmitter.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/ParticleEmitter.cc	(revision 2161)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/ParticleEmitter.cc	(revision 2162)
@@ -51,5 +51,5 @@
 
         if (!this->getScene() || !this->getScene()->getSceneManager())
-            throw AbortLoadingException("Can't create Camera, no scene or no scene manager given.");
+            ThrowException(AbortLoading, "Can't create Camera, no scene or no scene manager given.");
 
         this->particles_ = 0;
Index: code/branches/objecthierarchy/src/orxonox/objects/worldentities/WorldEntity.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2161)
+++ code/branches/objecthierarchy/src/orxonox/objects/worldentities/WorldEntity.cc	(revision 2162)
@@ -54,5 +54,5 @@
 
         if (!this->getScene() || !this->getScene()->getRootSceneNode())
-            throw AbortLoadingException("Can't create WorldEntity, no scene or no root-scenenode given.");
+            ThrowException(AbortLoading, "Can't create WorldEntity, no scene or no root-scenenode given.");
 
         this->node_ = this->getScene()->getRootSceneNode()->createChildSceneNode();
Index: code/branches/objecthierarchy/src/orxonox/overlays/OrxonoxOverlay.cc
===================================================================
--- code/branches/objecthierarchy/src/orxonox/overlays/OrxonoxOverlay.cc	(revision 2161)
+++ code/branches/objecthierarchy/src/orxonox/overlays/OrxonoxOverlay.cc	(revision 2162)
@@ -62,5 +62,5 @@
 
         if (!Core::showsGraphics())
-            throw NoGraphicsException("Can't create OrxonoxOverlay, graphics engine not initialized");
+            ThrowException(NoGraphics, "Can't create OrxonoxOverlay, graphics engine not initialized");
 
         // add this overlay to the static map of OrxonoxOverlays
Index: code/branches/objecthierarchy/src/util/Exception.h
===================================================================
--- code/branches/objecthierarchy/src/util/Exception.h	(revision 2161)
+++ code/branches/objecthierarchy/src/util/Exception.h	(revision 2162)
@@ -43,11 +43,4 @@
 #include "Debug.h"
 
-// Define some ugly macros to make things more clear
-#define CREATE_ORXONOX_EXCEPTION(name) typedef SpecificException<Exception::name> name##Exception;
-#define RETURN_EXCEPTION_CODE(name) \
-    case Exception::name:           \
-        return #name;
-
-
 namespace orxonox
 {
@@ -55,16 +48,4 @@
     {
     public:
-        enum ExceptionType
-        {
-            General,
-            FileNotFound,
-            Argument,
-            PluginsNotFound,
-            InitialisationFailed,
-            NotImplemented,
-            GameState,
-            NoGraphics,
-            AbortLoading
-        };
 
         Exception(const std::string& description, int lineNumber,
@@ -76,5 +57,4 @@
 
         virtual const std::string& getFullDescription() const;
-        virtual ExceptionType      getType()            const = 0;
         virtual std::string        getTypeName()        const = 0;
         virtual const std::string& getDescription()     const { return this->description_; }
@@ -95,47 +75,29 @@
 
 
-    template <Exception::ExceptionType Type>
-    class SpecificException : public Exception
-    {
-    public:
-        SpecificException(const std::string& description, int lineNumber,
-                  const char* filename, const char* functionName)
-                  : Exception(description, lineNumber, filename, functionName)
-        {
-            // let the catcher decide whether to display the message below level 4
-            COUT(4) << this->getFullDescription() << std::endl;
-        }
-
-        SpecificException(const std::string& description)
-            : Exception(description)
-        {
-            // let the catcher decide whether to display the message below level 4
-            COUT(4) << this->getFullDescription() << std::endl;
-        }
-
-        ~SpecificException() throw() { }
-
-        ExceptionType getType() const { return Type; }
-        std::string getTypeName() const
-        {
-            // note: break is not necessary due to the return in the macros.
-            switch (Type)
-            {
-            RETURN_EXCEPTION_CODE(General)
-            RETURN_EXCEPTION_CODE(FileNotFound);
-            RETURN_EXCEPTION_CODE(Argument);
-            RETURN_EXCEPTION_CODE(PluginsNotFound);
-            RETURN_EXCEPTION_CODE(InitialisationFailed);
-            RETURN_EXCEPTION_CODE(NotImplemented);
-            RETURN_EXCEPTION_CODE(GameState);
-            RETURN_EXCEPTION_CODE(NoGraphics);
-            RETURN_EXCEPTION_CODE(AbortLoading);
-            default:
-                return "";
-            }
-        }
+#define CREATE_ORXONOX_EXCEPTION(ExceptionName)                                     \
+    class ExceptionName##Exception : public Exception                               \
+    {                                                                               \
+    public:                                                                         \
+        ExceptionName##Exception(const std::string& description, int lineNumber,    \
+                  const char* filename, const char* functionName)                   \
+                  : Exception(description, lineNumber, filename, functionName)      \
+        {                                                                           \
+            /* Let the catcher decide whether to display the message below level 4  \
+               Note: Don't place this code in Exception c'tor because getTypeName() \
+               is still pure virtual at that time. */                               \
+            COUT(4) << this->getFullDescription() << std::endl;                     \
+        }                                                                           \
+                                                                                    \
+        ExceptionName##Exception(const std::string& description)                    \
+                  : Exception(description)                                          \
+        { COUT(4) << this->getFullDescription() << std::endl; }                     \
+                                                                                    \
+        ~ExceptionName##Exception() throw() { }                                     \
+                                                                                    \
+        std::string getTypeName() const { return #ExceptionName; }                  \
     };
 
-    // define the template spcialisations
+    // Creates all possible exception types.
+    // If you want to add a new type, simply copy and adjust a new line here.
     CREATE_ORXONOX_EXCEPTION(General);
     CREATE_ORXONOX_EXCEPTION(FileNotFound);
@@ -149,12 +111,12 @@
 }
 
-#define ThrowException(type, description) \
-    throw SpecificException<Exception::type>(description, __LINE__, __FILE__, __FUNCTIONNAME__)
+#define ThrowException(Type, Description) \
+    throw Type##Exception(Description, __LINE__, __FILE__, __FUNCTIONNAME__)
 
     // define an assert macro that can display a message
 #ifndef NDEBUG
-#define OrxAssert(assertion, errorMessage) \
-    assertion ? ((void)0) : (void)(orxonox::OutputHandler::getOutStream().setOutputLevel(ORX_ERROR) << errorMessage << std::endl); \
-    assert(assertion)
+#define OrxAssert(Assertion, ErrorMessage) \
+    Assertion ? ((void)0) : (void)(orxonox::OutputHandler::getOutStream().setOutputLevel(ORX_ERROR) << ErrorMessage << std::endl); \
+    assert(Assertion)
 #else
 #define OrxAssert(condition, errorMessage)  ((void)0)
