Index: de/branches/core2/bin/translation_german.lang
===================================================================
--- /code/branches/core2/bin/translation_german.lang	(revision 1029)
+++ 	(revision )
@@ -1,7 +1,0 @@
-ConfigValueDescription::DebugLevel::softDebugLevelConsole_=Der maximale Output-Level, der in der Konsole ausgegeben wird
-ConfigValueDescription::DebugLevel::softDebugLevelLogfile_=Der maximale Output-Level, der im Logfile gespeichert wird
-ConfigValueDescription::DebugLevel::softDebugLevelShell_=Der maximale Output-Level, der in der ingame-Shell angezeigt wird
-ConfigValueDescription::Projectile::lifetime_=Die die das Projektil am Leben bleibt in Sekunden
-ConfigValueDescription::Projectile::speed_=Die Geschwindigkeit des Projektils in Units pro Sekunde
-ConfigValueDescription::SpaceShip::bInvertYAxis_=Falls dies true ist, verhält sich die Maus wie ein Joystick (Maus hoch = Schiff runter)
-ConfigValueDescription::SpaceShip::reloadTime_=Die Nachladezeit der Waffe in Sekunden
Index: /code/branches/core2/src/orxonox/Orxonox.cc
===================================================================
--- /code/branches/core2/src/orxonox/Orxonox.cc	(revision 1029)
+++ /code/branches/core2/src/orxonox/Orxonox.cc	(revision 1030)
@@ -1196,4 +1196,7 @@
         ib->registerListener(testlistener, &Testlistener::removeLast, '\b', true);
 
+        Test3* test16_1 = new Test3;
+        test16_1->configOutput();
+
     startRenderLoop();
   }
Index: /code/branches/core2/src/orxonox/core/CommandExecutor.cc
===================================================================
--- /code/branches/core2/src/orxonox/core/CommandExecutor.cc	(revision 1029)
+++ /code/branches/core2/src/orxonox/core/CommandExecutor.cc	(revision 1030)
@@ -29,4 +29,5 @@
 #include "ConsoleCommand.h"
 #include "util/String.h"
+#include "util/Convert.h"
 #include "Identifier.h"
 #include "Language.h"
@@ -1313,5 +1314,8 @@
     {
         AddLanguageEntry("CommandExecutor::oldvalue", "old value");
-        return "{" + container->getTypename() + "} (" + GetLocalisation("CommandExecutor::oldvalue") + ": " + container->toString() + ")";
+        if (!container->isVector())
+            return ("{" + container->getTypename() + "} (" + GetLocalisation("CommandExecutor::oldvalue") + ": " + container->toString() + ")");
+        else
+            return ("(vector<" + container->getTypename() + ">) (size: " + getConvertedValue<unsigned int, std::string>(container->getVectorSize()) + ")");
     }
 
Index: /code/branches/core2/src/orxonox/core/ConfigFileManager.cc
===================================================================
--- /code/branches/core2/src/orxonox/core/ConfigFileManager.cc	(revision 1029)
+++ /code/branches/core2/src/orxonox/core/ConfigFileManager.cc	(revision 1030)
@@ -49,5 +49,5 @@
     void cleanConfig()
     {
-        ConfigFileManager::getSingleton()->clean();
+        ConfigFileManager::getSingleton()->clean(false);
     }
 
@@ -76,12 +76,12 @@
 
     ///////////////////////////////
-    // ConfigFileEntryArrayValue //
+    // ConfigFileEntryVectorValue //
     ///////////////////////////////
-    std::string ConfigFileEntryArrayValue::getFileEntry() const
+    std::string ConfigFileEntryVectorValue::getFileEntry() const
     {
         if (this->additionalComment_ == "" || this->additionalComment_.size() == 0)
-            return (this->name_ + "[" + getConvertedValue<unsigned int, std::string>(this->index_, 0) + "]" + "=" + this->value_);
+            return (this->name_ + "[" + getConvertedValue<unsigned int, std::string>(this->index_, "0") + "]" + "=" + this->value_);
         else
-            return (this->name_ + "[" + getConvertedValue<unsigned int, std::string>(this->index_, 0) + "]=" + this->value_ + " " + this->additionalComment_);
+            return (this->name_ + "[" + getConvertedValue<unsigned int, std::string>(this->index_, "0") + "]=" + this->value_ + " " + this->additionalComment_);
     }
 
@@ -96,4 +96,30 @@
     }
 
+    void ConfigFileSection::deleteVectorEntries(const std::string& name, unsigned int startindex)
+    {
+        for (std::list<ConfigFileEntry*>::iterator it = this->entries_.begin(); it != this->entries_.end(); )
+        {
+            if (((*it)->getName() == name) && ((*it)->getIndex() >= startindex))
+            {
+                delete (*it);
+                this->entries_.erase(it++);
+            }
+            else
+            {
+                ++it;
+            }
+        }
+    }
+
+    unsigned int ConfigFileSection::getVectorSize(const std::string& name)
+    {
+        unsigned int size = 0;
+        for (std::list<ConfigFileEntry*>::const_iterator it = this->entries_.begin(); it != this->entries_.end(); ++it)
+            if ((*it)->getName() == name)
+                if ((*it)->getIndex() > size)
+                    size = (*it)->getIndex();
+        return (size + 1);
+    }
+
     std::string ConfigFileSection::getFileEntry() const
     {
@@ -124,7 +150,7 @@
 
         if (index == 0)
-            return this->entries_.insert(this->entries_.end(), (ConfigFileEntry*)(new ConfigFileEntryArrayValue(name, index, fallback)));
+            return this->entries_.insert(this->entries_.end(), (ConfigFileEntry*)(new ConfigFileEntryVectorValue(name, index, fallback)));
         else
-            return this->entries_.insert(this->getEntryIterator(name, index - 1), (ConfigFileEntry*)(new ConfigFileEntryArrayValue(name, index, fallback)));
+            return this->entries_.insert(++this->getEntryIterator(name, index - 1), (ConfigFileEntry*)(new ConfigFileEntryVectorValue(name, index, fallback)));
     }
 
@@ -173,11 +199,12 @@
             if (!isEmpty(temp) && !isComment(temp))
             {
-                unsigned int pos1 = line.find('[');
-                unsigned int pos2 = line.find(']');
+                unsigned int   pos1 = temp.find('[');
+                if (pos1 == 0) pos1 = line.find('['); else pos1 = std::string::npos;
+                unsigned int   pos2 = line.find(']');
 
                 if (pos1 != std::string::npos && pos2 != std::string::npos && pos2 > pos1 + 1)
                 {
                     // New section
-                    std::string comment = temp.substr(pos2 + 1);
+                    std::string comment = line.substr(pos2 + 1);
                     if (isComment(comment))
                         newsection = new ConfigFileSection(line.substr(pos1 + 1, pos2 - pos1 - 1), comment);
@@ -232,5 +259,7 @@
                             {
                                 // New array
-                                newsection->getEntries().insert(newsection->getEntries().end(), new ConfigFileEntryArrayValue(getStripped(line.substr(0, pos2)), index, value, comment));
+                                std::list<ConfigFileEntry*>::iterator it = newsection->getEntryIterator(getStripped(line.substr(0, pos2)), index, value);
+                                (*it)->setValue(value);
+                                (*it)->setComment(comment);
                                 continue;
                             }
@@ -284,5 +313,5 @@
     }
 
-    void ConfigFile::clean()
+    void ConfigFile::clean(bool bCleanComments)
     {
         for (std::list<ConfigFileSection*>::iterator it1 = this->sections_.begin(); it1 != this->sections_.end(); )
@@ -292,5 +321,6 @@
             {
                 // The section exists, delete comment
-                (*it1)->setComment("");
+                if (bCleanComments)
+                    (*it1)->setComment("");
                 for (std::list<ConfigFileEntry*>::iterator it3 = (*it1)->entries_.begin(); it3 != (*it1)->entries_.end(); )
                 {
@@ -299,5 +329,6 @@
                     {
                         // The config-value exists, delete comment
-                        (*it3)->setComment("");
+                        if (bCleanComments)
+                            (*it3)->setComment("");
                         ++it3;
                     }
@@ -331,5 +362,5 @@
         this->bUpdated_ = true;
 
-        return (*this->sections_.insert(this->sections_.begin(), new ConfigFileSection(section)));
+        return (*this->sections_.insert(this->sections_.end(), new ConfigFileSection(section)));
     }
 
@@ -400,8 +431,8 @@
     }
 
-    void ConfigFileManager::clean()
+    void ConfigFileManager::clean(bool bCleanComments)
     {
         for(std::map<ConfigFileType, ConfigFile*>::const_iterator it = this->configFiles_.begin(); it != this->configFiles_.end(); ++it)
-            this->clean((*it).first);
+            this->clean((*it).first, bCleanComments);
     }
 
@@ -417,8 +448,7 @@
     }
 
-    void ConfigFileManager::clean(ConfigFileType type)
-    {
-        this->getFile(type)->clean();
-        this->getFile(type)->save();
+    void ConfigFileManager::clean(ConfigFileType type, bool bCleanComments)
+    {
+        this->getFile(type)->clean(bCleanComments);
     }
 
Index: /code/branches/core2/src/orxonox/core/ConfigFileManager.h
===================================================================
--- /code/branches/core2/src/orxonox/core/ConfigFileManager.h	(revision 1029)
+++ /code/branches/core2/src/orxonox/core/ConfigFileManager.h	(revision 1030)
@@ -107,11 +107,11 @@
 
     ///////////////////////////////
-    // ConfigFileEntryArrayValue //
+    // ConfigFileEntryVectorValue //
     ///////////////////////////////
-    class _CoreExport ConfigFileEntryArrayValue : public ConfigFileEntryValue
-    {
-        public:
-            inline ConfigFileEntryArrayValue(const std::string& name, unsigned int index, const std::string& value = "", const std::string& additionalComment = "") : ConfigFileEntryValue(name, value, additionalComment), index_(index) {}
-            inline virtual ~ConfigFileEntryArrayValue() {}
+    class _CoreExport ConfigFileEntryVectorValue : public ConfigFileEntryValue
+    {
+        public:
+            inline ConfigFileEntryVectorValue(const std::string& name, unsigned int index, const std::string& value = "", const std::string& additionalComment = "") : ConfigFileEntryValue(name, value, additionalComment), index_(index) {}
+            inline virtual ~ConfigFileEntryVectorValue() {}
 
             inline virtual unsigned int getIndex() const
@@ -179,4 +179,7 @@
             inline const std::string& getValue(const std::string& name, unsigned int index, const std::string& fallback)
                 { return this->getEntry(name, index, fallback)->getValue(); }
+
+            void deleteVectorEntries(const std::string& name, unsigned int startindex = 0);
+            unsigned int getVectorSize(const std::string& name);
 
             std::string getFileEntry() const;
@@ -216,5 +219,5 @@
             void load(bool bCreateIfNotExisting = true);
             void save() const;
-            void clean();
+            void clean(bool bCleanComments = false);
 
             inline void setValue(const std::string& section, const std::string& name, const std::string& value)
@@ -228,4 +231,9 @@
                 { const std::string& output = this->getSection(section)->getValue(name, index, fallback); this->saveIfUpdated(); return output; }
 
+            inline void deleteVectorEntries(const std::string& section, const std::string& name, unsigned int startindex = 0)
+                { this->getSection(section)->deleteVectorEntries(name, startindex); }
+            inline unsigned int getVectorSize(const std::string& section, const std::string& name)
+                { return this->getSection(section)->getVectorSize(name); }
+
         private:
             ConfigFileSection* getSection(const std::string& section);
@@ -250,9 +258,9 @@
             void load(bool bCreateIfNotExisting = true);
             void save();
-            void clean();
+            void clean(bool bCleanComments = false);
 
             void load(ConfigFileType type, bool bCreateIfNotExisting = true);
             void save(ConfigFileType type);
-            void clean(ConfigFileType type);
+            void clean(ConfigFileType type, bool bCleanComments = false);
 
             inline void setValue(ConfigFileType type, const std::string& section, const std::string& name, const std::string& value)
@@ -266,4 +274,9 @@
                 { return this->getFile(type)->getValue(section, name, index, fallback); }
 
+            inline void deleteVectorEntries(ConfigFileType type, const std::string& section, const std::string& name, unsigned int startindex = 0)
+                { this->getFile(type)->deleteVectorEntries(section, name, startindex); }
+            inline unsigned int getVectorSize(ConfigFileType type, const std::string& section, const std::string& name)
+                { return this->getFile(type)->getVectorSize(section, name); }
+
             void updateConfigValues() const;
             void updateConfigValues(ConfigFileType type) const;
Index: /code/branches/core2/src/orxonox/core/ConfigValueContainer.cc
===================================================================
--- /code/branches/core2/src/orxonox/core/ConfigValueContainer.cc	(revision 1029)
+++ /code/branches/core2/src/orxonox/core/ConfigValueContainer.cc	(revision 1030)
@@ -35,4 +35,8 @@
 #include "ConfigValueContainer.h"
 #include "Language.h"
+#include "util/SubString.h"
+#include "util/Convert.h"
+
+#define MAX_VECTOR_INDEX 255 // to avoid up to 4*10^9 vector entries in the config file after accidentally using a wrong argument
 
 
@@ -41,10 +45,10 @@
     /**
         @brief Constructor: Converts the default-value to a string, checks the config-file for a changed value, sets the intern value variable.
-        @param value This is only needed to determine the right type.
-        @param classname The name of the class the variable belongs to
+        @param type The type of the corresponding config-file
+        @param identifier The identifier of the class the variable belongs to
         @param varname The name of the variable
         @param defvalue The default-value
     */
-    ConfigValueContainer::ConfigValueContainer(ConfigFileType type, Identifier* identifier, const std::string& varname, MultiTypeMath defvalue)
+    ConfigValueContainer::ConfigValueContainer(ConfigFileType type, Identifier* identifier, const std::string& varname, const MultiTypeMath& defvalue)
     {
         this->type_ = type;
@@ -55,7 +59,77 @@
         this->value_ = defvalue;
         this->bAddedDescription_ = false;
+        this->bIsVector_ = false;
 
         this->defvalueString_ = defvalue.toString();
         this->update();
+    }
+
+    /**
+        @brief Constructor: Converts the default-value to a string, checks the config-file for a changed value, sets the intern value variable.
+        @param type The type of the corresponding config-file
+        @param identifier The identifier of the class the variable belongs to
+        @param varname The name of the variable
+        @param defvalue The default-value
+    */
+    ConfigValueContainer::ConfigValueContainer(ConfigFileType type, Identifier* identifier, const std::string& varname, const std::vector<MultiTypeMath>& defvalue)
+    {
+        this->type_ = type;
+        this->identifier_ = identifier;
+        this->sectionname_ = identifier->getName();
+        this->varname_ = varname;
+
+        this->valueVector_ = defvalue;
+        this->bAddedDescription_ = false;
+        this->bIsVector_ = true;
+
+        if (defvalue.size() > 0)
+            this->value_ = defvalue[0];
+
+        for (unsigned int i = 0; i < defvalue.size(); i++)
+            ConfigFileManager::getSingleton()->getValue(this->type_, this->sectionname_, this->varname_, i, defvalue[i].toString());
+
+        for (unsigned int i = 0; i < defvalue.size(); i++)
+            this->defvalueStringVector_.push_back(defvalue[i].toString());
+
+        this->update();
+    }
+
+    /**
+        @brief Adds a new entry to the end of the vector.
+        @param input The new entry
+        @return True if the new entry was successfully added
+    */
+    bool ConfigValueContainer::add(const std::string& input)
+    {
+        if (this->bIsVector_)
+            return this->set(this->valueVector_.size(), input);
+
+        COUT(1) << "Error: Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << std::endl;
+        return false;
+    }
+
+    /**
+        @brief Removes an existing entry from the vector.
+        @param index The index of the entry
+        @return True if the entry was removed
+    */
+    bool ConfigValueContainer::remove(unsigned int index)
+    {
+        if (this->bIsVector_)
+        {
+            if (index < this->valueVector_.size())
+            {
+                this->valueVector_.erase(this->valueVector_.begin() + index);
+                for (unsigned int i = index; i < this->valueVector_.size(); i++)
+                    ConfigFileManager::getSingleton()->setValue(this->type_, this->sectionname_, this->varname_, i, this->valueVector_[i]);
+                ConfigFileManager::getSingleton()->deleteVectorEntries(this->type_, this->sectionname_, this->varname_, this->valueVector_.size());
+
+                return true;
+            }
+            COUT(1) << "Error: Invalid vector-index." << std::endl;
+        }
+
+        COUT(1) << "Error: Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << std::endl;
+        return false;
     }
 
@@ -67,7 +141,50 @@
     bool ConfigValueContainer::set(const std::string& input)
     {
+        if (this->bIsVector_)
+        {
+            SubString token(input, " ", "", true, '"', false, '(', ')', false, '\0');
+            int index = -1;
+            bool success = false;
+
+            if (token.size() > 0)
+                success = ConvertValue(&index, token[0]);
+
+            if (!success || index < 0 || index > MAX_VECTOR_INDEX)
+            {
+                if (!success)
+                    COUT(1) << "Error: Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is a vector." << std::endl;
+                else
+                    COUT(1) << "Error: Invalid vector-index." << std::endl;
+                return false;
+            }
+
+            if (token.size() >= 2)
+                return this->set(index, token.subSet(1).join());
+            else
+                return this->set(index, "");
+        }
+
         bool success = this->tset(input);
-        this->setLineInConfigFile(input);
+        ConfigFileManager::getSingleton()->setValue(this->type_, this->sectionname_, this->varname_, input);
         return success;
+    }
+
+    /**
+        @brief Assigns a new value to the config-value of all objects and writes the change into the config-file.
+        @param index The index in the vector
+        @param input The new value
+        @return True if the new value was successfully assigned
+    */
+    bool ConfigValueContainer::set(unsigned int index, const std::string& input)
+    {
+        if (this->bIsVector_)
+        {
+            bool success = this->tset(index, input);
+            ConfigFileManager::getSingleton()->setValue(this->type_, this->sectionname_, this->varname_, index, input);
+            return success;
+        }
+
+        COUT(1) << "Error: Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << std::endl;
+        return false;
     }
 
@@ -86,9 +203,39 @@
 
     /**
+        @brief Assigns a new value to the config-value of all objects, but doesn't change the config-file (t stands for temporary).
+        @param index The index in the vector
+        @param input The new value
+        @return True if the new value was successfully assigned
+    */
+    bool ConfigValueContainer::tset(unsigned int index, const std::string& input)
+    {
+        if (this->bIsVector_)
+        {
+            bool success = this->parse(index, input);
+            if (this->identifier_)
+                this->identifier_->updateConfigValues();
+            return success;
+        }
+
+        COUT(1) << "Error: Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << std::endl;
+        return false;
+    }
+
+    /**
         @brief Sets the value of the variable back to the default value and resets the config-file entry.
     */
     bool ConfigValueContainer::reset()
     {
-        return this->set(this->defvalueString_);
+        if (!this->bIsVector_)
+            return this->set(this->defvalueString_);
+        else
+        {
+            bool success = true;
+            for (unsigned int i = 0; i < this->defvalueStringVector_.size(); i++)
+                if (!this->set(i, this->defvalueStringVector_[i]))
+                    success = false;
+            ConfigFileManager::getSingleton()->deleteVectorEntries(this->type_, this->sectionname_, this->varname_, this->defvalueStringVector_.size());
+            return success;
+        }
     }
 
@@ -98,5 +245,15 @@
     void ConfigValueContainer::update()
     {
-        this->value_.fromString(ConfigFileManager::getSingleton()->getValue(this->type_, this->sectionname_, this->varname_, this->defvalueString_));
+        if (!this->bIsVector_)
+            this->value_.fromString(ConfigFileManager::getSingleton()->getValue(this->type_, this->sectionname_, this->varname_, this->defvalueString_));
+        else
+        {
+            this->valueVector_.clear();
+            for (unsigned int i = 0; i < ConfigFileManager::getSingleton()->getVectorSize(this->type_, this->sectionname_, this->varname_); i++)
+            {
+                this->value_.fromString(ConfigFileManager::getSingleton()->getValue(this->type_, this->sectionname_, this->varname_, i, this->defvalueStringVector_[i]));
+                this->valueVector_.push_back(this->value_);
+            }
+        }
     }
 
@@ -108,4 +265,22 @@
     bool ConfigValueContainer::parse(const std::string& input)
     {
+        if (this->bIsVector_)
+        {
+            SubString token(input, " ", "", true, '"', false, '(', ')', false, '\0');
+            int index = -1;
+            bool success = false;
+
+            if (token.size() > 0)
+                success = ConvertValue(&index, token[0]);
+
+            if (!success || index < 0 || index > MAX_VECTOR_INDEX)
+                return false;
+
+            if (token.size() >= 2)
+                return this->parse(index, token.subSet(1).join());
+            else
+                return this->parse(index, "");
+        }
+
         MultiTypeMath temp = this->value_;
         if (temp.fromString(input))
@@ -114,4 +289,36 @@
             return true;
         }
+        return false;
+    }
+
+    /**
+        @brief Parses a given std::string into a value of the type of the associated variable and assigns it.
+        @param index The index in the vector
+        @param input The string to convert
+        @return True if the string was successfully parsed
+    */
+    bool ConfigValueContainer::parse(unsigned int index, const std::string& input)
+    {
+        if (this->bIsVector_)
+        {
+            if (index >= this->valueVector_.size())
+            {
+                for (unsigned int i = this->valueVector_.size(); i <= index; i++)
+                {
+                    this->valueVector_.push_back(MultiTypeMath());
+                    ConfigFileManager::getSingleton()->setValue(this->type_, this->sectionname_, this->varname_, i, this->valueVector_[i]);
+                }
+            }
+
+            MultiTypeMath temp = this->value_;
+            if (temp.fromString(input))
+            {
+                this->valueVector_[index] = temp;
+                return true;
+            }
+            return false;
+        }
+
+        COUT(1) << "Error: Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << std::endl;
         return false;
     }
@@ -125,31 +332,31 @@
     bool ConfigValueContainer::parse(const std::string& input, const MultiTypeMath& defvalue)
     {
-        MultiTypeMath temp = defvalue;
-        if (temp.fromString(input))
-        {
-            this->value_ = temp;
+        if (this->parse(input))
             return true;
-        }
-        else
-        {
-            this->value_ = defvalue;
+
+        this->value_ = defvalue;
+        return false;
+    }
+
+    /**
+        @brief Parses a given std::string into a value of the type of the associated variable and assigns it.
+        @param index The index in the vector
+        @param input The string to convert
+        @param defvalue The default value to assign if the parsing fails
+        @return True if the string was successfully parsed
+    */
+    bool ConfigValueContainer::parse(unsigned int index, const std::string& input, const MultiTypeMath& defvalue)
+    {
+        if (this->bIsVector_)
+        {
+            if (this->parse(index, input))
+                return true;
+
+            this->valueVector_[index] = defvalue;
             return false;
         }
-    }
-
-    /**
-        @brief Sets the corresponding entry in the config-file to a given value.
-    */
-    void ConfigValueContainer::setLineInConfigFile(const std::string& input)
-    {
-        ConfigFileManager::getSingleton()->setValue(this->type_, this->sectionname_, this->varname_, input);
-    }
-
-    /**
-        @brief Sets the corresponding entry in the config-file back to the default value.
-    */
-    void ConfigValueContainer::resetLineInConfigFile()
-    {
-        this->setLineInConfigFile(this->value_.toString());
+
+        COUT(1) << "Error: Config-value '" << this->varname_ << "' in " << this->sectionname_ << " is not a vector." << std::endl;
+        return false;
     }
 
Index: /code/branches/core2/src/orxonox/core/ConfigValueContainer.h
===================================================================
--- /code/branches/core2/src/orxonox/core/ConfigValueContainer.h	(revision 1029)
+++ /code/branches/core2/src/orxonox/core/ConfigValueContainer.h	(revision 1030)
@@ -43,6 +43,6 @@
 #define _ConfigValueContainer_H__
 
-#include <list>
 #include <string>
+#include <vector>
 
 #include "CorePrereqs.h"
@@ -73,5 +73,6 @@
     {
         public:
-            ConfigValueContainer(ConfigFileType type, Identifier* identifier, const std::string& varname, MultiTypeMath defvalue);
+            ConfigValueContainer(ConfigFileType type, Identifier* identifier, const std::string& varname, const MultiTypeMath& defvalue);
+            ConfigValueContainer(ConfigFileType type, Identifier* identifier, const std::string& varname, const std::vector<MultiTypeMath>& defvalue);
 
             /** @brief Returns the configured value. @param value This is only needed to determine the right type. @return The value */
@@ -79,11 +80,25 @@
             inline ConfigValueContainer& getValue(T* value)
                 { this->value_.getValue(value); return *this; }
+            template <typename T>
+            inline ConfigValueContainer& getValue(std::vector<T>* value)
+            {
+                value->clear();
+                for (unsigned int i = 0; i < this->valueVector_.size(); i++)
+                    value->push_back(this->valueVector_[i]);
+                return *this;
+            }
 
-            inline const std::string& getName()
+            inline const std::string& getName() const
                 { return this->varname_; }
+            inline bool isVector() const
+                { return this->bIsVector_; }
+            inline unsigned int getVectorSize() const
+                { return this->valueVector_.size(); }
 
             void description(const std::string& description);
             const std::string& getDescription() const;
 
+            bool add(const std::string& input);
+            bool remove(unsigned int index);
             bool set(const std::string& input);
             bool tset(const std::string& input);
@@ -102,19 +117,23 @@
             bool parse(const std::string& input, const MultiTypeMath& defvalue);
 
-            void setLineInConfigFile(const std::string& input);
-            void resetLineInConfigFile();
+            bool set(unsigned int index, const std::string& input);
+            bool tset(unsigned int index, const std::string& input);
+            bool parse(unsigned int index, const std::string& input);
+            bool parse(unsigned int index, const std::string& input, const MultiTypeMath& defvalue);
 
-            ConfigFileType      type_;                          //!< The type of the corresponding config-file
-            Identifier*         identifier_;                    //!< The identifier of the class
-            std::string         sectionname_;                   //!< The name of the class the variable belongs to
-            std::string         varname_;                       //!< The name of the variable
-            std::string         defvalueString_;                //!< The string of the default-variable
+            bool                       bIsVector_;                  //!< True if the container contains a std::vector
 
-            MultiTypeMath       value_;                         //!< The value
+            ConfigFileType             type_;                       //!< The type of the corresponding config-file
+            Identifier*                identifier_;                 //!< The identifier of the class
+            std::string                sectionname_;                //!< The name of the class the variable belongs to
+            std::string                varname_;                    //!< The name of the variable
+            std::string                defvalueString_;             //!< The string of the default-value
+            std::vector<std::string>   defvalueStringVector_;       //!< A vector, containg the strings of the default-values in case we're storing a vector
 
-            std::list<std::string>::iterator configFileLine_;   //!< An iterator, pointing to the entry of the variable in the config-file
+            MultiTypeMath              value_;                      //!< The value
+            std::vector<MultiTypeMath> valueVector_;                //!< A vector, containg the values in case we're storing a vector
 
-            bool bAddedDescription_;                            //!< True if a description was added
-            LanguageEntryLabel description_;                    //!< The description
+            bool                       bAddedDescription_;          //!< True if a description was added
+            LanguageEntryLabel         description_;                //!< The description
     };
 }
Index: /code/branches/core2/src/orxonox/core/ConfigValueIncludes.h
===================================================================
--- /code/branches/core2/src/orxonox/core/ConfigValueIncludes.h	(revision 1030)
+++ /code/branches/core2/src/orxonox/core/ConfigValueIncludes.h	(revision 1030)
@@ -0,0 +1,99 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *
+ *
+ *   License notice:
+ *
+ *   This program is free software; you can redistribute it and/or
+ *   modify it under the terms of the GNU General Public License
+ *   as published by the Free Software Foundation; either version 2
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Fabian 'x3n' Landau
+ *   Co-authors:
+ *      ...
+ *
+ */
+
+/**
+    @file ConfigValueIncludes.h
+    @brief Definition of macros for config-values.
+*/
+
+#ifndef _ConfigValueIncludes_H__
+#define _ConfigValueIncludes_H__
+
+#include "Identifier.h"
+#include "ConfigValueContainer.h"
+#include "ConfigFileManager.h"
+
+
+/**
+    @brief Assigns the value, defined in the config-file, to the variable (or the default-value, if there is no entry in the file).
+    @param varname The name of the variable
+    @param defvalue The default-value of the variable
+*/
+#define SetConfigValue(varname, defvalue) \
+    orxonox::ConfigValueContainer* container##varname = this->getIdentifier()->getConfigValueContainer(#varname); \
+    if (!container##varname) \
+    { \
+        container##varname = new orxonox::ConfigValueContainer(CFT_Settings, this->getIdentifier(), #varname, varname = defvalue); \
+        this->getIdentifier()->addConfigValueContainer(#varname, container##varname); \
+    } \
+    container##varname->getValue(&varname)
+
+/**
+    @brief Assigns the vector-values, defined in the config-file, to the vector (or the default-value, if there are no entries in the file).
+    @param varname The name of the std::vector
+    @param defvalue The default-value
+*/
+#define SetConfigValueVector(varname, defvalue) \
+    orxonox::ConfigValueContainer* container##varname = this->getIdentifier()->getConfigValueContainer(#varname); \
+    if (!container##varname) \
+    { \
+        std::vector<MultiTypeMath> temp; \
+        for (unsigned int i = 0; i < defvalue.size(); i++) \
+            temp.push_back(MultiTypeMath(defvalue[i])); \
+        container##varname = new orxonox::ConfigValueContainer(CFT_Settings, this->getIdentifier(), #varname, temp); \
+        this->getIdentifier()->addConfigValueContainer(#varname, container##varname); \
+    } \
+    container##varname->getValue(&varname)
+
+/**
+    @brief Sets the variable and the config-file entry back to the previously defined default-value.
+    @param varname The name of the variable
+*/
+#define ResetConfigValue(varname) \
+    orxonox::ConfigValueContainer* container##varname##reset = this->getIdentifier()->getConfigValueContainer(#varname); \
+    if (container##varname##reset) \
+    { \
+        container##varname##reset->reset(); \
+        container##varname##reset->getValue(&varname); \
+    } \
+    else \
+        COUT(2) << "Warning: Couldn't reset variable " << #varname << ", corresponding container doesn't exist." << std::endl
+
+/**
+    @brief Assigns the command, defined in the keybind-file, to the key-variable (or an empty string, if there is no entry in the file).
+    @param varname The name of the key-variable
+*/
+#define SetKeybind(keyname) \
+    orxonox::ConfigValueContainer* container##keyname = this->getIdentifier()->getConfigValueContainer(#keyname); \
+    if (!container##keyname) \
+    { \
+        container##keyname = new orxonox::ConfigValueContainer(CFT_Keybindings, this->getIdentifier(), #keyname, keyname = ""); \
+        this->getIdentifier()->addConfigValueContainer(#keyname, container##keyname); \
+    } \
+    container##keyname->getValue(&varname)
+
+#endif /* _ConfigValueIncludes_H__ */
Index: /code/branches/core2/src/orxonox/core/CoreIncludes.h
===================================================================
--- /code/branches/core2/src/orxonox/core/CoreIncludes.h	(revision 1029)
+++ /code/branches/core2/src/orxonox/core/CoreIncludes.h	(revision 1030)
@@ -28,5 +28,5 @@
 /**
     @file CoreIncludes.h
-    @brief Definition of macros and typedefs.
+    @brief Definition of macros for Identifier and Factory.
 
     Every class needs the RegisterObject(class) macro in its constructor. If the class is an interface
@@ -40,19 +40,11 @@
 #define _CoreIncludes_H__
 
-#include "CorePrereqs.h"
-
-// All needed header-files
 #include "Identifier.h"
 #include "ClassManager.h"
 #include "Factory.h"
 #include "ClassFactory.h"
-#include "Iterator.h"
-#include "OrxonoxClass.h"
-#include "ConfigValueContainer.h"
-#include "ConfigFileManager.h"
 #include "Debug.h"
 
 
-// All needed macros
 /**
     @brief Intern macro, containing the common parts of RegisterObject and RegisterRootObject.
@@ -112,44 +104,3 @@
     orxonox::Factory::getIdentifier(StringOrInt)
 
-/**
-    @brief Assigns the value, defined in the config-file, to the variable (or the default-value, if there is no entry in the file).
-    @param varname The name of the variable
-    @param defvalue The default-value of the variable
-*/
-#define SetConfigValue(varname, defvalue) \
-    orxonox::ConfigValueContainer* container##varname = this->getIdentifier()->getConfigValueContainer(#varname); \
-    if (!container##varname) \
-    { \
-        container##varname = new orxonox::ConfigValueContainer(CFT_Settings, this->getIdentifier(), #varname, varname = defvalue); \
-        this->getIdentifier()->addConfigValueContainer(#varname, container##varname); \
-    } \
-    container##varname->getValue(&varname)
-
-/**
-    @brief Sets the variable and the config-file entry back to the previously defined default-value.
-    @param varname The name of the variable
-*/
-#define ResetConfigValue(varname) \
-    orxonox::ConfigValueContainer* container##varname##reset = this->getIdentifier()->getConfigValueContainer(#varname); \
-    if (container##varname##reset) \
-    { \
-        container##varname##reset->reset(); \
-        container##varname##reset->getValue(&varname); \
-    } \
-    else \
-        COUT(2) << "Warning: Couldn't reset variable " << #varname << ", corresponding container doesn't exist." << std::endl
-
-/**
-    @brief Assigns the command, defined in the keybind-file, to the key-variable (or an empty string, if there is no entry in the file).
-    @param varname The name of the key-variable
-*/
-#define SetKeybind(keyname) \
-    orxonox::ConfigValueContainer* container##keyname = this->getIdentifier()->getConfigValueContainer(#keyname); \
-    if (!container##keyname) \
-    { \
-        container##keyname = new orxonox::ConfigValueContainer(CFT_Keybindings, this->getIdentifier(), #keyname, keyname = ""); \
-        this->getIdentifier()->addConfigValueContainer(#keyname, container##keyname); \
-    } \
-    container##keyname->getValue(&varname)
-
 #endif /* _CoreIncludes_H__ */
Index: /code/branches/core2/src/orxonox/core/DebugLevel.cc
===================================================================
--- /code/branches/core2/src/orxonox/core/DebugLevel.cc	(revision 1029)
+++ /code/branches/core2/src/orxonox/core/DebugLevel.cc	(revision 1030)
@@ -33,4 +33,5 @@
 #include "DebugLevel.h"
 #include "CoreIncludes.h"
+#include "ConfigValueIncludes.h"
 
 namespace orxonox
Index: /code/branches/core2/src/orxonox/core/Language.cc
===================================================================
--- /code/branches/core2/src/orxonox/core/Language.cc	(revision 1029)
+++ /code/branches/core2/src/orxonox/core/Language.cc	(revision 1030)
@@ -35,4 +35,5 @@
 #include "CoreIncludes.h"
 #include "Language.h"
+#include "ConfigValueIncludes.h"
 
 namespace orxonox
Index: /code/branches/core2/src/orxonox/core/OutputHandler.cc
===================================================================
--- /code/branches/core2/src/orxonox/core/OutputHandler.cc	(revision 1029)
+++ /code/branches/core2/src/orxonox/core/OutputHandler.cc	(revision 1030)
@@ -47,5 +47,5 @@
         this->logfilename_ = logfilename;
         this->logfile_.open(this->logfilename_.c_str(), std::fstream::out);
-        this->logfile_ << "Started log" << std::endl;
+        this->logfile_ << "Started log at yyyy/mm/dd hh:mm:ss" << std::endl;
         this->logfile_.flush();
     }
Index: /code/branches/core2/src/orxonox/objects/Fighter.cc
===================================================================
--- /code/branches/core2/src/orxonox/objects/Fighter.cc	(revision 1029)
+++ /code/branches/core2/src/orxonox/objects/Fighter.cc	(revision 1030)
@@ -37,5 +37,6 @@
 #include "util/tinyxml/tinyxml.h"
 #include "util/String2Number.h"
-#include "../core/CoreIncludes.h"
+#include "core/CoreIncludes.h"
+#include "core/ConfigValueIncludes.h"
 #include "../Orxonox.h"
 #include "../particle/ParticleInterface.h"
Index: /code/branches/core2/src/orxonox/objects/Projectile.cc
===================================================================
--- /code/branches/core2/src/orxonox/objects/Projectile.cc	(revision 1029)
+++ /code/branches/core2/src/orxonox/objects/Projectile.cc	(revision 1030)
@@ -30,4 +30,5 @@
 #include "core/CoreIncludes.h"
 #include "core/Executor.h"
+#include "core/ConfigValueIncludes.h"
 
 #include "SpaceShip.h"
Index: /code/branches/core2/src/orxonox/objects/SpaceShip.cc
===================================================================
--- /code/branches/core2/src/orxonox/objects/SpaceShip.cc	(revision 1029)
+++ /code/branches/core2/src/orxonox/objects/SpaceShip.cc	(revision 1030)
@@ -39,6 +39,7 @@
 #include "util/String2Number.h"
 #include "util/Math.h"
-#include "../core/CoreIncludes.h"
-#include "../core/Debug.h"
+#include "core/CoreIncludes.h"
+#include "core/ConfigValueIncludes.h"
+#include "core/Debug.h"
 #include "../Orxonox.h"
 #include "../particle/ParticleInterface.h"
Index: /code/branches/core2/src/orxonox/objects/test3.cc
===================================================================
--- /code/branches/core2/src/orxonox/objects/test3.cc	(revision 1029)
+++ /code/branches/core2/src/orxonox/objects/test3.cc	(revision 1030)
@@ -30,4 +30,5 @@
 #include "test3.h"
 #include "core/CoreIncludes.h"
+#include "core/ConfigValueIncludes.h"
 
 namespace orxonox
@@ -56,4 +57,7 @@
         SetConfigValue(value_vector3_, Vector3(13, 26, 39));
         SetConfigValue(value_colourvalue_, ColourValue(1.0, 0.5, 0.25, 0.887));
+        SetConfigValueVector(vector_int_, std::vector<int>(1, 13));
+        SetConfigValueVector(vector_string_, std::vector<std::string>(3, "nothing"));
+        SetConfigValueVector(vector_vector3_, std::vector<Vector3>(1, Vector3(3, 2, 1)));
     }
 
@@ -64,16 +68,23 @@
     void Test3::configOutput()
     {
-        std::cout << "int:         " << this->value_int_ << std::endl;
-        std::cout << "uint:        " << this->value_uint_ << std::endl;
-        std::cout << "char:        " << (int)this->value_char_ << std::endl;
-        std::cout << "uchar:       " << (int)this->value_uchar_ << std::endl;
-        std::cout << "float:       " << this->value_float_ << std::endl;
-        std::cout << "double:      " << this->value_double_ << std::endl;
-        std::cout << "bool:        " << this->value_bool_ << std::endl;
-        std::cout << "string:      " << this->value_string_ << std::endl;
-        std::cout << "constchar:   " << this->value_constchar_ << std::endl;
-        std::cout << "vector2:     " << this->value_vector2_ << std::endl;
-        std::cout << "vector3:     " << this->value_vector3_ << std::endl;
-        std::cout << "colourvalue: " << this->value_colourvalue_ << std::endl;
+        std::cout << "int:             " << this->value_int_ << std::endl;
+        std::cout << "uint:            " << this->value_uint_ << std::endl;
+        std::cout << "char:            " << (int)this->value_char_ << std::endl;
+        std::cout << "uchar:           " << (int)this->value_uchar_ << std::endl;
+        std::cout << "float:           " << this->value_float_ << std::endl;
+        std::cout << "double:          " << this->value_double_ << std::endl;
+        std::cout << "bool:            " << this->value_bool_ << std::endl;
+        std::cout << "string:         >" << this->value_string_ << "<" << std::endl;
+        std::cout << "constchar:      >" << this->value_constchar_ << "<" << std::endl;
+        std::cout << "vector2:         " << this->value_vector2_ << std::endl;
+        std::cout << "vector3:         " << this->value_vector3_ << std::endl;
+        std::cout << "colourvalue:     " << this->value_colourvalue_ << std::endl;
+        std::cout << std::endl;
+        for (unsigned int i = 0; i < this->vector_int_.size(); i++)
+        std::cout << "vector<int>:     " << i << ": " << this->vector_int_[i] << std::endl;
+        for (unsigned int i = 0; i < this->vector_string_.size(); i++)
+        std::cout << "vector<string>:  " << i << ": " << this->vector_string_[i] << std::endl;
+        for (unsigned int i = 0; i < this->vector_vector3_.size(); i++)
+        std::cout << "vector<vector3>: " << i << ": " << this->vector_vector3_[i] << std::endl;
     }
 
Index: /code/branches/core2/src/orxonox/objects/test3.h
===================================================================
--- /code/branches/core2/src/orxonox/objects/test3.h	(revision 1029)
+++ /code/branches/core2/src/orxonox/objects/test3.h	(revision 1030)
@@ -1,4 +1,6 @@
 #ifndef _Test3_H__
 #define _Test3_H__
+
+#include <vector>
 
 #include "core/BaseObject.h"
@@ -36,4 +38,8 @@
             Vector3             value_vector3_;
             ColourValue         value_colourvalue_;
+
+            std::vector<int>         vector_int_;
+            std::vector<std::string> vector_string_;
+            std::vector<Vector3>     vector_vector3_;
     };
 }
