Index: code/branches/core3/src/core/ConfigValueContainer.cc
===================================================================
--- code/branches/core3/src/core/ConfigValueContainer.cc	(revision 1594)
+++ code/branches/core3/src/core/ConfigValueContainer.cc	(revision 1596)
@@ -59,4 +59,5 @@
         this->sectionname_ = identifier->getName();
         this->varname_ = varname;
+        this->callback_ = 0;
 
         this->value_ = defvalue;
@@ -98,4 +99,13 @@
             this->update();
         }
+    }
+
+    /**
+        @brief Destructor: Deletes the callback object if necessary.
+    */
+    ConfigValueContainer::~ConfigValueContainer()
+    {
+        if (this->callback_)
+            delete this->callback_;
     }
 
@@ -335,5 +345,5 @@
         @param description The description
     */
-    void ConfigValueContainer::description(const std::string& description)
+    ConfigValueContainer& ConfigValueContainer::description(const std::string& description)
     {
         if (!this->bAddedDescription_)
@@ -343,4 +353,5 @@
             this->bAddedDescription_ = true;
         }
+        return (*this);
     }
 
Index: code/branches/core3/src/core/ConfigValueContainer.h
===================================================================
--- code/branches/core3/src/core/ConfigValueContainer.h	(revision 1594)
+++ code/branches/core3/src/core/ConfigValueContainer.h	(revision 1596)
@@ -55,4 +55,25 @@
 namespace orxonox
 {
+    class ConfigValueCallbackBase
+    {
+        public:
+            virtual void call(void* object) = 0;
+            inline virtual ~ConfigValueCallbackBase() {}
+    };
+
+    template <class T>
+    class ConfigValueCallback: public ConfigValueCallbackBase
+    {
+        public:
+            inline ConfigValueCallback(void (T::*function) (void)) : function_(function) {}
+            inline virtual ~ConfigValueCallback() {}
+            inline virtual void call(void* object)
+                { (((T*)object)->*this->function_)(); }
+
+        private:
+            void (T::*function_) (void);
+    };
+
+
     //! The ConfigValuecontainer contains all needed informations about a configurable variable.
     /**
@@ -76,15 +97,58 @@
             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 */
-            template <typename T>
-            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]);
+            ~ConfigValueContainer();
+
+            /** @brief Returns the configured value. @param value A pointer to the variable to store the value. @return The ConfigValueContainer */
+            template <typename T, class C>
+            ConfigValueContainer& getValue(T* value, C* object)
+            {
+                if (this->callback_ && object)
+                {
+                    T temp = *value;
+                    this->value_.getValue(value);
+                    if ((*value) != temp)
+                        this->callback_->call(object);
+                }
+                else
+                {
+                    this->value_.getValue(value);
+                }
+                return *this;
+            }
+
+            /** @brief Returns the configured vector. @param value A pointer to the vector to store the values. @return The ConfigValueContainer */
+            template <typename T, class C>
+            ConfigValueContainer& getValue(std::vector<T>* value, C* object)
+            {
+                if (this->callback_ && object)
+                {
+                    std::vector<T> temp = *value;
+
+                    value->clear();
+                    for (unsigned int i = 0; i < this->valueVector_.size(); ++i)
+                        value->push_back(this->valueVector_[i]);
+
+                    if (value->size() != temp.size())
+                    {
+                        this->callback_->call(object);
+                    }
+                    else
+                    {
+                        for (unsigned int i = 0; i < value->size(); ++i)
+                        {
+                            if ((*value)[i] != temp[i])
+                            {
+                                this->callback_->call(object);
+                                break;
+                            }
+                        }
+                    }
+                }
+                else
+                {
+                    value->clear();
+                    for (unsigned int i = 0; i < this->valueVector_.size(); ++i)
+                        value->push_back(this->valueVector_[i]);
+                }
                 return *this;
             }
@@ -104,6 +168,14 @@
                 { return this->valueVector_.size(); }
 
-            void description(const std::string& description);
+            ConfigValueContainer& description(const std::string& description);
             const std::string& getDescription() const;
+
+            template <class T>
+            inline ConfigValueContainer& callback(void (T::*function) (void))
+            {
+                if (!this->callback_)
+                    this->callback_ = new ConfigValueCallback<T>(function);
+                return (*this);
+            }
 
             bool set(const MultiTypeMath& input);
@@ -142,4 +214,5 @@
             bool                       bAddedDescription_;          //!< True if a description was added
             LanguageEntryLabel         description_;                //!< The description
+            ConfigValueCallbackBase*   callback_;                   //!< A callback function to call after getValue if the value changed
     };
 }
Index: code/branches/core3/src/core/ConfigValueIncludes.h
===================================================================
--- code/branches/core3/src/core/ConfigValueIncludes.h	(revision 1594)
+++ code/branches/core3/src/core/ConfigValueIncludes.h	(revision 1596)
@@ -48,11 +48,12 @@
 */
 #define SetConfigValue(varname, defvalue) \
-    orxonox::ConfigValueContainer* container##varname = this->getIdentifier()->getConfigValueContainer(#varname); \
+    static orxonox::Identifier* identifier##varname = this->getIdentifier(); \
+    orxonox::ConfigValueContainer* container##varname = identifier##varname->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 = new orxonox::ConfigValueContainer(CFT_Settings, identifier##varname, #varname, varname = defvalue); \
+        identifier##varname->addConfigValueContainer(#varname, container##varname); \
     } \
-    container##varname->getValue(&varname)
+    container##varname->getValue(&varname, this)
 
 /**
@@ -63,11 +64,12 @@
 */
 #define SetConfigValueGeneric(classname, varname, defvalue) \
-    orxonox::ConfigValueContainer* container##varname = ClassIdentifier<classname>::getIdentifier()->getConfigValueContainer(#varname); \
+    static orxonox::Identifier* identifier##varname = ClassIdentifier<classname>::getIdentifier(); \
+    orxonox::ConfigValueContainer* container##varname = identifier##varname->getConfigValueContainer(#varname); \
     if (!container##varname) \
     { \
-        container##varname = new orxonox::ConfigValueContainer(CFT_Settings, ClassIdentifier<classname>::getIdentifier(), #varname, varname = defvalue); \
-        ClassIdentifier<classname>::getIdentifier()->addConfigValueContainer(#varname, container##varname); \
+        container##varname = new orxonox::ConfigValueContainer(CFT_Settings, identifier##varname, #varname, varname = defvalue); \
+        identifier##varname->addConfigValueContainer(#varname, container##varname); \
     } \
-    container##varname->getValue(&varname)
+    container##varname->getValue(&varname, this)
 
 /**
@@ -77,5 +79,6 @@
 */
 #define SetConfigValueVector(varname, defvalue) \
-    orxonox::ConfigValueContainer* container##varname = this->getIdentifier()->getConfigValueContainer(#varname); \
+    static orxonox::Identifier* identifier##varname = this->getIdentifier(); \
+    orxonox::ConfigValueContainer* container##varname = identifier##varname->getConfigValueContainer(#varname); \
     if (!container##varname) \
     { \
@@ -83,9 +86,9 @@
         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); \
+        container##varname = new orxonox::ConfigValueContainer(CFT_Settings, identifier##varname, #varname, temp); \
         container##varname->setVectorType(varname); \
-        this->getIdentifier()->addConfigValueContainer(#varname, container##varname); \
+        identifier##varname->addConfigValueContainer(#varname, container##varname); \
     } \
-    container##varname->getValue(&varname)
+    container##varname->getValue(&varname, this)
 
 /**
@@ -98,5 +101,5 @@
     { \
         container##varname##reset->reset(); \
-        container##varname##reset->getValue(&varname); \
+        container##varname##reset->getValue(&varname, this); \
     } \
     else \
@@ -115,5 +118,5 @@
     { \
         container##varname##modify##modifier->modifier(__VA_ARGS__); \
-        container##varname##modify##modifier->getValue(&varname); \
+        container##varname##modify##modifier->getValue(&varname, this); \
     } \
     else \
Index: code/branches/core3/src/core/Core.cc
===================================================================
--- code/branches/core3/src/core/Core.cc	(revision 1594)
+++ code/branches/core3/src/core/Core.cc	(revision 1596)
@@ -96,8 +96,15 @@
     void Core::setConfigValues()
     {
-        SetConfigValue(softDebugLevelConsole_, 3).description("The maximal level of debug output shown in the console");
-        SetConfigValue(softDebugLevelLogfile_, 3).description("The maximal level of debug output shown in the logfile");
-        SetConfigValue(softDebugLevelShell_, 1).description("The maximal level of debug output shown in the ingame shell");
-
+        SetConfigValue(softDebugLevelConsole_, 3).description("The maximal level of debug output shown in the console").callback(&Core::debugLevelChanged);
+        SetConfigValue(softDebugLevelLogfile_, 3).description("The maximal level of debug output shown in the logfile").callback(&Core::debugLevelChanged);
+        SetConfigValue(softDebugLevelShell_, 1).description("The maximal level of debug output shown in the ingame shell").callback(&Core::debugLevelChanged);
+        SetConfigValue(language_, Language::getLanguage().defaultLanguage_).description("The language of the ingame text").callback(&Core::languageChanged);
+    }
+
+    /**
+        @brief Callback function if the debug level has changed.
+    */
+    void Core::debugLevelChanged()
+    {
         // softDebugLevel_ is the maximum of the 3 variables
         this->softDebugLevel_ = this->softDebugLevelConsole_;
@@ -111,13 +118,13 @@
         OutputHandler::setSoftDebugLevel(OutputHandler::LD_Logfile, this->softDebugLevelLogfile_);
         OutputHandler::setSoftDebugLevel(OutputHandler::LD_Shell,   this->softDebugLevelShell_);
-
-        std::string temp = this->language_;
-        SetConfigValue(language_, Language::getLanguage().defaultLanguage_).description("The language of the ingame text");
-
-        if (this->language_ != temp)
-        {
-            // Read the translation file after the language was configured
-            Language::getLanguage().readTranslatedLanguageFile();
-        }
+    }
+
+    /**
+        @brief Callback function if the language has changed.
+    */
+    void Core::languageChanged()
+    {
+        // Read the translation file after the language was configured
+        Language::getLanguage().readTranslatedLanguageFile();
     }
 
Index: code/branches/core3/src/core/Core.h
===================================================================
--- code/branches/core3/src/core/Core.h	(revision 1594)
+++ code/branches/core3/src/core/Core.h	(revision 1596)
@@ -52,4 +52,6 @@
             static bool& isCreatingCoreSettings();
             void setConfigValues();
+            void debugLevelChanged();
+            void languageChanged();
 
             static int getSoftDebugLevel(OutputHandler::OutputDevice device = OutputHandler::LD_All);
Index: code/branches/core3/src/core/Identifier.cc
===================================================================
--- code/branches/core3/src/core/Identifier.cc	(revision 1594)
+++ code/branches/core3/src/core/Identifier.cc	(revision 1596)
@@ -39,7 +39,4 @@
 #include "ConsoleCommand.h"
 #include "CommandExecutor.h"
-#include "Iterator.h"
-#include "ObjectList.h"
-#include "OrxonoxClass.h"
 #include "XMLPort.h"
 
@@ -198,13 +195,4 @@
 
     /**
-        @brief Updates the config-values of all existing objects of this class by calling their setConfigValues() function.
-    */
-    void Identifier::updateConfigValues() const
-    {
-        for (BaseIterator it = this->getObjects()->begin(); it; ++it)
-            (*it)->setConfigValues();
-    }
-
-    /**
         @brief Tells the container to which Identifier it belongs to.
     */
Index: code/branches/core3/src/core/Identifier.h
===================================================================
--- code/branches/core3/src/core/Identifier.h	(revision 1594)
+++ code/branches/core3/src/core/Identifier.h	(revision 1596)
@@ -61,5 +61,5 @@
 
 #include "MetaObjectList.h"
-#include "ObjectListBase.h"
+#include "Iterator.h"
 #include "util/Debug.h"
 #include "util/String.h"
@@ -112,5 +112,5 @@
             void setName(const std::string& name);
 
-            void updateConfigValues() const;
+            virtual void updateConfigValues(bool updateChildren = true) const = 0;
 
             /** @brief Returns the parents of the class the Identifier belongs to. @return The list of all parents */
@@ -301,4 +301,6 @@
             static bool isFirstCall();
             void addObject(T* object);
+
+            void updateConfigValues(bool updateChildren = true) const;
 
             XMLPortParamContainer* getXMLPortParamContainer(const std::string& paramname);
@@ -417,4 +419,21 @@
         COUT(5) << "*** ClassIdentifier: Added object to " << this->getName() << "-list." << std::endl;
         object->getMetaList().add(this->objects_, this->objects_->add(new ObjectListElement<T>(object)));
+    }
+
+    /**
+        @brief Updates the config-values of all existing objects of this class by calling their setConfigValues() function.
+    */
+    template <class T>
+    void ClassIdentifier<T>::updateConfigValues(bool updateChildren) const
+    {
+        if (!this->hasConfigValues())
+            return;
+
+        for (ObjectListIterator<T> it = ObjectList<T>::begin(); it; ++it)
+            it->setConfigValues();
+
+        if (updateChildren)
+            for (std::set<const Identifier*>::const_iterator it = this->getChildrenBegin(); it != this->getChildrenEnd(); ++it)
+                (*it)->updateConfigValues(false);
     }
 
Index: code/branches/core3/src/core/ObjectListIterator.h
===================================================================
--- code/branches/core3/src/core/ObjectListIterator.h	(revision 1594)
+++ code/branches/core3/src/core/ObjectListIterator.h	(revision 1596)
@@ -36,5 +36,5 @@
 
     Usage:
-    for (Iterator<myClass> it = ObjectList<myClass>::begin(); it != ObjectList<myClass>::end(); ++it)
+    for (ObjectListIterator<myClass> it = ObjectList<myClass>::begin(); it != ObjectList<myClass>::end(); ++it)
     {
         it->someFunction(...);
Index: code/branches/core3/src/core/OrxonoxClass.cc
===================================================================
--- code/branches/core3/src/core/OrxonoxClass.cc	(revision 1594)
+++ code/branches/core3/src/core/OrxonoxClass.cc	(revision 1596)
@@ -44,6 +44,4 @@
         this->parents_ = 0;
         this->metaList_ = new MetaObjectList();
-
-        this->setConfigValues();
     }
 
Index: code/branches/core3/src/core/Shell.cc
===================================================================
--- code/branches/core3/src/core/Shell.cc	(revision 1594)
+++ code/branches/core3/src/core/Shell.cc	(revision 1596)
@@ -90,10 +90,18 @@
     void Shell::setConfigValues()
     {
-        SetConfigValue(maxHistoryLength_, 100);
-        SetConfigValue(historyOffset_, 0);
+        SetConfigValue(maxHistoryLength_, 100).callback(&Shell::commandHistoryLengthChanged);
+        SetConfigValue(historyOffset_, 0).callback(&Shell::commandHistoryOffsetChanged);
         SetConfigValueVector(commandHistory_, std::vector<std::string>());
-
+    }
+
+    void Shell::commandHistoryOffsetChanged()
+    {
         if (this->historyOffset_ >= this->maxHistoryLength_)
             this->historyOffset_ = 0;
+    }
+
+    void Shell::commandHistoryLengthChanged()
+    {
+        this->commandHistoryOffsetChanged();
 
         while (this->commandHistory_.size() > this->maxHistoryLength_)
Index: code/branches/core3/src/core/Shell.h
===================================================================
--- code/branches/core3/src/core/Shell.h	(revision 1594)
+++ code/branches/core3/src/core/Shell.h	(revision 1596)
@@ -67,4 +67,6 @@
 
             virtual void setConfigValues();
+            void commandHistoryOffsetChanged();
+            void commandHistoryLengthChanged();
 
             void registerListener(ShellListener* listener);
Index: code/branches/core3/src/core/input/InputManager.cc
===================================================================
--- code/branches/core3/src/core/input/InputManager.cc	(revision 1594)
+++ code/branches/core3/src/core/input/InputManager.cc	(revision 1596)
@@ -340,5 +340,5 @@
           getIdentifier()->addConfigValueContainer("CoeffPos", cont);
       }
-      cont->getValue(&coeffPos);
+      cont->getValue(&coeffPos, this);
 
       cont = getIdentifier()->getConfigValueContainer("CoeffNeg");
@@ -348,5 +348,5 @@
           getIdentifier()->addConfigValueContainer("CoeffNeg", cont);
       }
-      cont->getValue(&coeffNeg);
+      cont->getValue(&coeffNeg, this);
 
       cont = getIdentifier()->getConfigValueContainer("Zero");
@@ -356,5 +356,5 @@
           getIdentifier()->addConfigValueContainer("Zero", cont);
       }
-      cont->getValue(&zero);
+      cont->getValue(&zero, this);
 
       // copy values to our own variables
Index: code/branches/core3/src/core/input/KeyBinder.cc
===================================================================
--- code/branches/core3/src/core/input/KeyBinder.cc	(revision 1594)
+++ code/branches/core3/src/core/input/KeyBinder.cc	(revision 1596)
@@ -234,13 +234,13 @@
   void KeyBinder::setConfigValues()
   {
-    SetConfigValueGeneric(KeyBinder, analogThreshold_, 0.05f)  .description("Threshold for analog axes until which the state is 0.");
-    SetConfigValueGeneric(KeyBinder, mouseSensitivity_, 1.0f)  .description("Mouse sensitivity.");
-    SetConfigValueGeneric(KeyBinder, bDeriveMouseInput_, false).description("Whether or not to derive moues movement for the absolute value.");
-    SetConfigValueGeneric(KeyBinder, derivePeriod_, 0.05f).description("Accuracy of the mouse input deriver. The higher the more precise, but laggier.");
-    SetConfigValueGeneric(KeyBinder, mouseSensitivityDerived_, 1.0f).description("Mouse sensitivity if mouse input is derived.");
-    SetConfigValueGeneric(KeyBinder, bClipMouse_, true).description("Whether or not to clip absolute value of mouse in non derive mode.");
+    SetConfigValue(/*Generic(KeyBinder, */analogThreshold_, 0.05f)  .description("Threshold for analog axes until which the state is 0.");
+    SetConfigValue(/*Generic(KeyBinder, */mouseSensitivity_, 1.0f)  .description("Mouse sensitivity.");
+    SetConfigValue(/*Generic(KeyBinder, */bDeriveMouseInput_, false).description("Whether or not to derive moues movement for the absolute value.");
+    SetConfigValue(/*Generic(KeyBinder, */derivePeriod_, 0.05f).description("Accuracy of the mouse input deriver. The higher the more precise, but laggier.");
+    SetConfigValue(/*Generic(KeyBinder, */mouseSensitivityDerived_, 1.0f).description("Mouse sensitivity if mouse input is derived.");
+    SetConfigValue(/*Generic(KeyBinder, */bClipMouse_, true).description("Whether or not to clip absolute value of mouse in non derive mode.");
 
     float oldThresh = buttonThreshold_;
-    SetConfigValueGeneric(KeyBinder, buttonThreshold_, 0.80f).description("Threshold for analog axes until which the button is not pressed.");
+    SetConfigValue(/*Generic(KeyBinder, */buttonThreshold_, 0.80f).description("Threshold for analog axes until which the button is not pressed.");
     if (oldThresh != buttonThreshold_)
       for (unsigned int i = 0; i < nHalfAxes_s; i++)
@@ -272,5 +272,5 @@
     }
     std::string old = button.bindingString_;
-    cont->getValue(&button.bindingString_);
+    cont->getValue(&button.bindingString_, this);
 
     // keybinder stuff
Index: code/branches/core3/src/orxonox/GraphicsEngine.cc
===================================================================
--- code/branches/core3/src/orxonox/GraphicsEngine.cc	(revision 1594)
+++ code/branches/core3/src/orxonox/GraphicsEngine.cc	(revision 1596)
@@ -97,10 +97,11 @@
     SetConfigValue(ogreLogLevelCritical_, 2).description("Corresponding orxonox debug level for ogre Critical");
 
-    unsigned int old = this->detailLevelParticle_;
-    SetConfigValue(detailLevelParticle_, 2).description("O: off, 1: low, 2: normal, 3: high");
-
-    if (this->detailLevelParticle_ != old)
-      for (ObjectList<ParticleInterface>::iterator it = ObjectList<ParticleInterface>::begin(); it; ++it)
-        it->detailLevelChanged(this->detailLevelParticle_);
+    SetConfigValue(detailLevelParticle_, 2).description("O: off, 1: low, 2: normal, 3: high").callback(&GraphicsEngine::detailLevelParticleChanged);
+  }
+
+  void GraphicsEngine::detailLevelParticleChanged()
+  {
+    for (ObjectList<ParticleInterface>::iterator it = ObjectList<ParticleInterface>::begin(); it; ++it)
+      it->detailLevelChanged(this->detailLevelParticle_);
   }
 
Index: code/branches/core3/src/orxonox/GraphicsEngine.h
===================================================================
--- code/branches/core3/src/orxonox/GraphicsEngine.h	(revision 1594)
+++ code/branches/core3/src/orxonox/GraphicsEngine.h	(revision 1596)
@@ -56,4 +56,5 @@
         public:
             void setConfigValues();
+            void detailLevelParticleChanged();
             bool setup();
             bool declareRessourceLocations();
Index: code/branches/core3/src/orxonox/Settings.cc
===================================================================
--- code/branches/core3/src/orxonox/Settings.cc	(revision 1594)
+++ code/branches/core3/src/orxonox/Settings.cc	(revision 1596)
@@ -68,5 +68,12 @@
   void Settings::setConfigValues()
   {
-    SetConfigValue(dataPath_, "../../Media/").description("Relative path to the game data.");
+    SetConfigValue(dataPath_, "../../Media/").description("Relative path to the game data.").callback(&Settings::dataPathChanged);
+  }
+
+  /**
+    @brief Callback function if the datapath has changed.
+  */
+  void Settings::dataPathChanged()
+  {
     if (dataPath_ != "" && dataPath_[dataPath_.size() - 1] != '/')
     {
Index: code/branches/core3/src/orxonox/Settings.h
===================================================================
--- code/branches/core3/src/orxonox/Settings.h	(revision 1594)
+++ code/branches/core3/src/orxonox/Settings.h	(revision 1596)
@@ -48,4 +48,5 @@
     public:
       void setConfigValues();
+      void dataPathChanged();
 
       static const std::string& getDataPath();
Index: code/branches/core3/src/orxonox/objects/ParticleProjectile.cc
===================================================================
--- code/branches/core3/src/orxonox/objects/ParticleProjectile.cc	(revision 1594)
+++ code/branches/core3/src/orxonox/objects/ParticleProjectile.cc	(revision 1596)
@@ -32,5 +32,5 @@
 #include "SpaceShip.h"
 #include "core/CoreIncludes.h"
-
+#include "core/ConfigValueIncludes.h"
 namespace orxonox
 {
@@ -52,4 +52,6 @@
             this->particles_ = 0;
         }
+
+        this->setConfigValues();
     }
 
@@ -60,4 +62,16 @@
     }
 
+    void ParticleProjectile::setConfigValues()
+    {
+        SetConfigValue(speed_, 5000.0).description("The speed of a projectile in units per second").callback(&ParticleProjectile::speedChanged);
+    }
+
+    void ParticleProjectile::speedChanged()
+    {
+        Projectile::speed_s = this->speed_;
+        if (this->owner_)
+            this->setVelocity(this->owner_->getInitialDir() * this->speed_);
+    }
+
     void ParticleProjectile::changedVisibility()
     {
Index: code/branches/core3/src/orxonox/objects/ParticleProjectile.h
===================================================================
--- code/branches/core3/src/orxonox/objects/ParticleProjectile.h	(revision 1594)
+++ code/branches/core3/src/orxonox/objects/ParticleProjectile.h	(revision 1596)
@@ -44,4 +44,6 @@
             virtual ~ParticleProjectile();
             virtual void changedVisibility();
+            void setConfigValues();
+            void speedChanged();
 
         private:
Index: code/branches/core3/src/orxonox/objects/Projectile.cc
===================================================================
--- code/branches/core3/src/orxonox/objects/Projectile.cc	(revision 1594)
+++ code/branches/core3/src/orxonox/objects/Projectile.cc	(revision 1596)
@@ -44,5 +44,5 @@
 namespace orxonox
 {
-    float Projectile::speed_ = 5000;
+    float Projectile::speed_s = 5000;
 
     Projectile::Projectile(SpaceShip* owner) : owner_(owner)
@@ -74,6 +74,10 @@
         SetConfigValue(damage_, 15.0).description("The damage caused by the projectile");
         SetConfigValue(lifetime_, 4.0).description("The time in seconds a projectile stays alive");
-        SetConfigValue(speed_, 5000.0).description("The speed of a projectile in units per second");
+        SetConfigValue(speed_, 5000.0).description("The speed of a projectile in units per second").callback(&Projectile::speedChanged);
+    }
 
+    void Projectile::speedChanged()
+    {
+        Projectile::speed_s = this->speed_;
         if (this->owner_)
             this->setVelocity(this->owner_->getInitialDir() * this->speed_);
Index: code/branches/core3/src/orxonox/objects/Projectile.h
===================================================================
--- code/branches/core3/src/orxonox/objects/Projectile.h	(revision 1594)
+++ code/branches/core3/src/orxonox/objects/Projectile.h	(revision 1596)
@@ -42,9 +42,10 @@
             virtual ~Projectile();
             void setConfigValues();
+            void speedChanged();
             void destroyObject();
             virtual void tick(float dt);
 
             static float getSpeed()
-                { return Projectile::speed_; }
+                { return Projectile::speed_s; }
 
         protected:
@@ -55,5 +56,8 @@
             std::string explosionTemplateName_;
             std::string smokeTemplateName_;
-            static float speed_;
+        protected:
+            static float speed_s;
+            float speed_;
+        private:
             float lifetime_;
             float damage_;
Index: code/branches/core3/src/orxonox/objects/RotatingProjectile.cc
===================================================================
--- code/branches/core3/src/orxonox/objects/RotatingProjectile.cc	(revision 1594)
+++ code/branches/core3/src/orxonox/objects/RotatingProjectile.cc	(revision 1596)
@@ -65,6 +65,9 @@
     void RotatingProjectile::setConfigValues()
     {
-        SetConfigValue(colour_, ColourValue(1.0, 0.0, 0.0));
+        SetConfigValue(colour_, ColourValue(1.0, 0.0, 0.0)).callback(&RotatingProjectile::colourChanged);
+    }
 
+    void RotatingProjectile::colourChanged()
+    {
         if (this->isInitialized())
         {
Index: code/branches/core3/src/orxonox/objects/RotatingProjectile.h
===================================================================
--- code/branches/core3/src/orxonox/objects/RotatingProjectile.h	(revision 1594)
+++ code/branches/core3/src/orxonox/objects/RotatingProjectile.h	(revision 1596)
@@ -14,4 +14,5 @@
             virtual ~RotatingProjectile();
             void setConfigValues();
+            void colourChanged();
             virtual void tick(float dt);
             virtual void changedVisibility();
