Index: /code/branches/consolecommands3/src/libraries/core/ConsoleCommand.cc
===================================================================
--- /code/branches/consolecommands3/src/libraries/core/ConsoleCommand.cc	(revision 7185)
+++ /code/branches/consolecommands3/src/libraries/core/ConsoleCommand.cc	(revision 7186)
@@ -29,4 +29,6 @@
 #include "ConsoleCommand.h"
 #include <cassert>
+
+#include "Language.h"
 
 namespace orxonox
@@ -71,4 +73,46 @@
             this->argumentList_.clear();
     }
+
+    ConsoleCommand& ConsoleCommand::description(const std::string& description)
+    {
+        this->description_ = std::string("ConsoleCommandDescription::" + this->name_ + "::function");
+        AddLanguageEntry(this->description_, description);
+        return (*this);
+    }
+
+    const std::string& ConsoleCommand::getDescription() const
+    {
+        return GetLocalisation_noerror(this->description_);
+    }
+
+    ConsoleCommand& ConsoleCommand::descriptionParam(unsigned int param, const std::string& description)
+    {
+        if (param < MAX_FUNCTOR_ARGUMENTS)
+        {
+            this->descriptionParam_[param] = std::string("ConsoleCommandDescription::" + this->name_ + "::param" + multi_cast<std::string>(param));
+            AddLanguageEntry(this->descriptionParam_[param], description);
+        }
+        return (*this);
+    }
+
+    const std::string& ConsoleCommand::getDescriptionParam(unsigned int param) const
+    {
+        if (param < MAX_FUNCTOR_ARGUMENTS)
+            return GetLocalisation_noerror(this->descriptionParam_[param]);
+
+        return this->descriptionParam_[0];
+    }
+
+    ConsoleCommand& ConsoleCommand::descriptionReturnvalue(const std::string& description)
+    {
+        this->descriptionReturnvalue_ = std::string("ConsoleCommandDescription::" + this->name_ + "::returnvalue");
+        AddLanguageEntry(this->descriptionReturnvalue_, description);
+        return (*this);
+    }
+
+    const std::string& ConsoleCommand::getDescriptionReturnvalue(int param) const
+    {
+        return GetLocalisation_noerror(this->descriptionReturnvalue_);
+    }
 }
 
Index: /code/branches/consolecommands3/src/libraries/core/ConsoleCommand.h
===================================================================
--- /code/branches/consolecommands3/src/libraries/core/ConsoleCommand.h	(revision 7185)
+++ /code/branches/consolecommands3/src/libraries/core/ConsoleCommand.h	(revision 7186)
@@ -90,10 +90,13 @@
             ConsoleCommand(Functor* functor, const std::string& name = "");
 
-            inline ConsoleCommand& description(const std::string& description)
-                { this->Executor::setDescription(description); return (*this); }
-            inline ConsoleCommand& descriptionParam(int param, const std::string& description)
-                { this->Executor::setDescriptionParam(param, description); return (*this); }
-            inline ConsoleCommand& descriptionReturnvalue(const std::string& description)
-                { this->Executor::setDescriptionReturnvalue(description); return (*this); }
+            ConsoleCommand& description(const std::string& description);
+            const std::string& getDescription() const;
+
+            ConsoleCommand& descriptionParam(unsigned int param, const std::string& description);
+            const std::string& getDescriptionParam(unsigned int param) const;
+
+            ConsoleCommand& descriptionReturnvalue(const std::string& description);
+            const std::string& getDescriptionReturnvalue(int param) const;
+
             inline ConsoleCommand& defaultValues(const MultiType& param1)
                 { this->Executor::setDefaultValues(param1); return (*this); }
@@ -150,4 +153,8 @@
             KeybindMode::Value keybindMode_;
             int inputConfiguredParam_;
+
+            LanguageEntryLabel description_;
+            LanguageEntryLabel descriptionReturnvalue_;
+            LanguageEntryLabel descriptionParam_[MAX_FUNCTOR_ARGUMENTS];
     };
 
Index: /code/branches/consolecommands3/src/libraries/core/Executor.cc
===================================================================
--- /code/branches/consolecommands3/src/libraries/core/Executor.cc	(revision 7185)
+++ /code/branches/consolecommands3/src/libraries/core/Executor.cc	(revision 7186)
@@ -36,5 +36,4 @@
 #include "util/StringUtils.h"
 #include "util/SubString.h"
-#include "Language.h"
 
 namespace orxonox
@@ -44,13 +43,4 @@
         this->functor_ = functor;
         this->name_ = name;
-
-        this->bAddedDescription_ = false;
-        this->bAddedDescriptionReturnvalue_ = false;
-
-        this->bAddedDescriptionParam_[0] = false;
-        this->bAddedDescriptionParam_[1] = false;
-        this->bAddedDescriptionParam_[2] = false;
-        this->bAddedDescriptionParam_[3] = false;
-        this->bAddedDescriptionParam_[4] = false;
 
         this->bAddedDefaultValue_[0] = false;
@@ -69,5 +59,5 @@
     {
         unsigned int paramCount = this->functor_->getParamCount();
-       
+
         if (paramCount == 0)
         {
@@ -97,5 +87,5 @@
         {
             SubString tokens(params, delimiter, SubString::WhiteSpaces, false, '\\', true, '"', true, '(', ')', true, '\0');
-           
+
             for (unsigned int i = tokens.size(); i < this->functor_->getParamCount(); i++)
             {
@@ -106,5 +96,5 @@
                 }
             }
-           
+
             MultiType param[MAX_FUNCTOR_ARGUMENTS];
             COUT(5) << "Calling Executor " << this->name_ << " through parser with " << paramCount << " parameters, using " << tokens.size() << " tokens (";
@@ -129,8 +119,8 @@
             }
             COUT(5) << ")." << std::endl;
-           
+
             if ((tokens.size() > paramCount) && (this->functor_->getTypenameParam(paramCount - 1) == "string"))
                 param[paramCount - 1] = tokens.subSet(paramCount - 1).join();
-           
+
             switch(paramCount)
             {
@@ -198,62 +188,4 @@
             return true;
         }
-    }
-
-    Executor& Executor::setDescription(const std::string& description)
-    {
-        if (!this->bAddedDescription_)
-        {
-            this->description_ = std::string("ExecutorDescription::" + this->name_ + "::function");
-            AddLanguageEntry(this->description_, description);
-            this->bAddedDescription_ = true;
-        }
-        return (*this);
-    }
-
-    const std::string& Executor::getDescription() const
-    {
-        return GetLocalisation(this->description_);
-    }
-
-    Executor& Executor::setDescriptionParam(unsigned int param, const std::string& description)
-    {
-        if (param < MAX_FUNCTOR_ARGUMENTS)
-        {
-            if (!this->bAddedDescriptionParam_[param])
-            {
-                std::string paramnumber;
-                if (!convertValue(&paramnumber, param))
-                    return (*this);
-
-                this->descriptionParam_[param] = std::string("ExecutorDescription::" + this->name_ + "::param" + paramnumber);
-                AddLanguageEntry(this->descriptionParam_[param], description);
-                this->bAddedDescriptionParam_[param] = true;
-            }
-        }
-        return (*this);
-    }
-
-    const std::string& Executor::getDescriptionParam(unsigned int param) const
-    {
-        if (param < MAX_FUNCTOR_ARGUMENTS)
-            return GetLocalisation(this->descriptionParam_[param]);
-
-        return this->descriptionParam_[0];
-    }
-
-    Executor& Executor::setDescriptionReturnvalue(const std::string& description)
-    {
-        if (!this->bAddedDescriptionReturnvalue_)
-        {
-            this->descriptionReturnvalue_ = std::string("ExecutorDescription::" + this->name_ + "::returnvalue");
-            AddLanguageEntry(this->descriptionReturnvalue_, description);
-            this->bAddedDescriptionReturnvalue_ = true;
-        }
-        return (*this);
-    }
-
-    const std::string& Executor::getDescriptionReturnvalue(int param) const
-    {
-        return GetLocalisation(this->descriptionReturnvalue_);
     }
 
Index: /code/branches/consolecommands3/src/libraries/core/Executor.h
===================================================================
--- /code/branches/consolecommands3/src/libraries/core/Executor.h	(revision 7185)
+++ /code/branches/consolecommands3/src/libraries/core/Executor.h	(revision 7186)
@@ -61,13 +61,4 @@
 
             bool evaluate(const std::string& params, MultiType param[5], const std::string& delimiter = " ") const;
-
-            Executor& setDescription(const std::string& description);
-            const std::string& getDescription() const;
-
-            Executor& setDescriptionParam(unsigned int param, const std::string& description);
-            const std::string& getDescriptionParam(unsigned int param) const;
-
-            Executor& setDescriptionReturnvalue(const std::string& description);
-            const std::string& getDescriptionReturnvalue(int param) const;
 
             inline Functor* getFunctor() const
@@ -120,13 +111,4 @@
             MultiType defaultValue_[MAX_FUNCTOR_ARGUMENTS];
             bool bAddedDefaultValue_[MAX_FUNCTOR_ARGUMENTS];
-
-        private:
-            LanguageEntryLabel description_;
-            LanguageEntryLabel descriptionReturnvalue_;
-            LanguageEntryLabel descriptionParam_[MAX_FUNCTOR_ARGUMENTS];
-
-            bool bAddedDescription_;
-            bool bAddedDescriptionReturnvalue_;
-            bool bAddedDescriptionParam_[MAX_FUNCTOR_ARGUMENTS];
     };
 
Index: /code/branches/consolecommands3/src/libraries/core/Language.cc
===================================================================
--- /code/branches/consolecommands3/src/libraries/core/Language.cc	(revision 7185)
+++ /code/branches/consolecommands3/src/libraries/core/Language.cc	(revision 7186)
@@ -36,4 +36,5 @@
 #include <fstream>
 #include "util/Debug.h"
+#include "util/StringUtils.h"
 #include "Core.h"
 #include "PathConfig.h"
@@ -169,10 +170,10 @@
         @return The localisation
     */
-    const std::string& Language::getLocalisation(const LanguageEntryLabel& label) const
+    const std::string& Language::getLocalisation(const LanguageEntryLabel& label, bool bError) const
     {
         std::map<std::string, LanguageEntry*>::const_iterator it = this->languageEntries_.find(label);
         if (it != this->languageEntries_.end())
             return it->second->getLocalisation();
-        else
+        else if (bError)
         {
             // Uh, oh, an undefined entry was requested: return the default string
@@ -180,4 +181,6 @@
             return this->defaultLocalisation_;
         }
+        else
+            return BLANKSTRING;
     }
 
Index: /code/branches/consolecommands3/src/libraries/core/Language.h
===================================================================
--- /code/branches/consolecommands3/src/libraries/core/Language.h	(revision 7185)
+++ /code/branches/consolecommands3/src/libraries/core/Language.h	(revision 7186)
@@ -116,5 +116,5 @@
 
             void addEntry(const LanguageEntryLabel& label, const std::string& entry);
-            const std::string& getLocalisation(const LanguageEntryLabel& label) const;
+            const std::string& getLocalisation(const LanguageEntryLabel& label, bool bError = true) const;
 
         private:
@@ -145,4 +145,10 @@
         return Language::getInstance().getLocalisation(label);
     }
+
+    //! Shortcut function for Language::getLocalisation without printing an error in case the label doesn't exist
+    inline const std::string& GetLocalisation_noerror(const LanguageEntryLabel& label)
+    {
+        return Language::getInstance().getLocalisation(label, false);
+    }
 }
 
Index: /code/branches/consolecommands3/src/libraries/core/XMLPort.h
===================================================================
--- /code/branches/consolecommands3/src/libraries/core/XMLPort.h	(revision 7185)
+++ /code/branches/consolecommands3/src/libraries/core/XMLPort.h	(revision 7186)
@@ -317,6 +317,8 @@
                 { return this->paramname_; }
 
-            virtual XMLPortParamContainer& description(const std::string& description) = 0;
-            virtual const std::string& getDescription() = 0;
+            inline XMLPortParamContainer& description(const std::string& description)
+                { this->description_ = description; return *this; }
+            inline const std::string& getDescription() const
+                { return this->description_; }
 
             virtual XMLPortParamContainer& defaultValue(unsigned int index, const MultiType& param) = 0;
@@ -332,4 +334,5 @@
             Identifier* identifier_;
             BaseObject* owner_;
+            std::string description_;
     };
 
@@ -436,9 +439,4 @@
             }
 
-            virtual XMLPortParamContainer& description(const std::string& description)
-                { this->loadexecutor_->setDescription(description); return (*this); }
-            virtual const std::string& getDescription()
-                { return this->loadexecutor_->getDescription(); }
-
             virtual XMLPortParamContainer& defaultValue(unsigned int index, const MultiType& param)
             {
@@ -502,6 +500,8 @@
                 { return this->sectionname_; }
 
-            virtual XMLPortObjectContainer& description(const std::string& description) = 0;
-            virtual const std::string& getDescription() = 0;
+            inline XMLPortObjectContainer& description(const std::string& description)
+                { this->description_ = description; return *this; }
+            const std::string& getDescription() const
+                { return this->description_; }
 
             bool identifierIsIncludedInLoaderMask(const Identifier* identifier);
@@ -513,4 +513,5 @@
             Identifier* identifier_;
             Identifier* objectIdentifier_;
+            std::string description_;
     };
 
@@ -548,9 +549,4 @@
                 (*this->loadexecutor_)(castedObject, castedNewObject);
             }
-
-            virtual XMLPortObjectContainer& description(const std::string& description)
-                { this->loadexecutor_->setDescription(description); return (*this); }
-            virtual const std::string& getDescription()
-                { return this->loadexecutor_->getDescription(); }
 
         private:
