Index: /trunk/src/lib/util/executor/executor_specials.h
===================================================================
--- /trunk/src/lib/util/executor/executor_specials.h	(revision 5651)
+++ /trunk/src/lib/util/executor/executor_specials.h	(revision 5651)
@@ -0,0 +1,78 @@
+/*!
+ * @file executor.h
+ * Definition of a on-screen-shell
+ */
+
+#ifndef _EXECUTOR_SPECIALS_H
+#define _EXECUTOR_SPECIALS_H
+
+#include "executor.h"
+
+#include "tinyxml.h"
+// FORWARD DECLARATION
+
+//! Executes a Function with a const TiXmlElement* parameter.
+/**
+ * This is a Special Executor, that finds ParamName in root as XML-sub-element
+ * This is especially usefull, if you have to Load a SubElement from root in a new Function
+ * What must be defined is a XML-root to search the ParameterName under an  a Function to call.
+ */
+template<class T> class ExecutorXML : public Executor
+{
+  public:
+    /**
+     * Constructor of a ExecutorXML
+     * @param function a Function to call
+     * @param root The XML root to search paramName under
+     * @param paramName the ParameterName the search in root, and lookup the TiXmlElement from
+     */
+    ExecutorXML(void(T::*function)(const TiXmlElement*), const TiXmlElement* root, const char* paramName)
+      : Executor(1)
+    {
+      PRINTF(4)("Loading %s from XML-element %p\n", paramName, root);
+
+      if (likely(root != NULL && paramName != NULL))
+        this->element = root->FirstChildElement(paramName);
+      else
+        this->element = NULL;
+
+      this->functionPointer = function;
+    }
+
+    /**
+     * clones an ExecutorXML, used to copy this Element.
+     * @returns a _new_ Copy of this Executor
+     */
+    virtual Executor* clone () const
+    {
+      ExecutorXML<T>* executor = new ExecutorXML<T>();
+      this->cloning(executor);
+      executor->functionPointer = this->functionPointer;
+      executor->element = this->element;
+      return executor;
+    }
+
+    /**
+     * executes the Command on BaseObject
+     * @param object the BaseObject to execute this Executor on
+     * @param loadString ignored in this case
+     */
+    virtual void execute(BaseObject* object, const char* loadString)
+    {
+      if (object != NULL && this->element != NULL)
+        (dynamic_cast<T*>(object)->*(functionPointer))(this->element);
+    }
+
+  private:
+    /**
+     * used for the copy-constructor
+     */
+    ExecutorXML() : Executor() { };
+
+
+  private:
+    void    (T::*functionPointer)(const TiXmlElement*);  //!< The functionPointer to the function to be called
+    const   TiXmlElement* element;                       //!< The XML-element to call.
+};
+
+#endif /* _EXECUTOR_SPECIALS_H */
Index: /trunk/src/story_entities/campaign.cc
===================================================================
--- /trunk/src/story_entities/campaign.cc	(revision 5650)
+++ /trunk/src/story_entities/campaign.cc	(revision 5651)
@@ -28,4 +28,5 @@
 
 #include "load_param.h"
+
 
 using namespace std;
@@ -74,8 +75,10 @@
   static_cast<BaseObject*>(this)->loadParams(root);
 
-  LoadParam<Campaign>(root, "identifier", this, &Campaign::setStoryID)
-      .describe("A Unique Identifier for this Campaign");
-
-  LoadParam<Campaign>(root, "WorldList", this, &Campaign::loadWorldListParams)
+  //LoadParam<Campaign>(root, "identifier", this, &Campaign::setStoryID)
+  LoadParamNEW(root, "identifier", this, Campaign, setStoryID)
+     .describe("A Unique Identifier for this Campaign");
+
+//  LoadParam<Campaign>(root, "WorldList", this, &Campaign::loadWorldListParams)
+   LoadParamXML(root, "WorldList", this, Campaign, loadWorldListParams)
       .describe("A List of Worlds to be loaded in this Campaign");
 }
@@ -87,4 +90,7 @@
 void Campaign::loadWorldListParams(const TiXmlElement* root)
 {
+  if (root == NULL)
+    return;
+
   const TiXmlElement* element = root->FirstChildElement();
   // load Worlds/Subcampaigns/Whatever
Index: /trunk/src/util/loading/load_param.cc
===================================================================
--- /trunk/src/util/loading/load_param.cc	(revision 5650)
+++ /trunk/src/util/loading/load_param.cc	(revision 5651)
@@ -111,5 +111,5 @@
   this->loadString = grabParameter(root, paramName);
   this->object = object;
-  if (loadString != NULL && root != NULL)
+  if (root != NULL)
   {
     this->executor = executor.clone();
@@ -119,11 +119,14 @@
     this->executor = NULL;
   }
+
 }
+
+
 LoadParamBase::~LoadParamBase()
 {
   if (likely(this->executor != NULL))
   {
-    if (this->loadString!= NULL && likely(this->object != NULL))
-    this->executor->execute(this->object, this->loadString);
+   if (likely(this->object != NULL))
+     this->executor->execute(this->object, this->loadString);
 
     delete this->executor;
@@ -175,5 +178,5 @@
   const TiXmlNode* node;
 
-  if (root == NULL)
+  if (root == NULL || parameterName == NULL)
     return NULL;
   assert( parameterName != NULL);
Index: /trunk/src/util/loading/load_param.h
===================================================================
--- /trunk/src/util/loading/load_param.h	(revision 5650)
+++ /trunk/src/util/loading/load_param.h	(revision 5651)
@@ -30,4 +30,5 @@
 #include "tinyxml.h"
 #include "executor/executor.h"
+#include "executor/executor_specials.h"
 
 #include "helper_functions.h"
@@ -51,4 +52,7 @@
 #define LoadParamNEW(ROOT, PARAMETER_NAME, OBJECT, CLASS, FUNCTION) \
          LoadParamBase(ROOT, PARAMETER_NAME, OBJECT, ExecutorObjective<CLASS>(&CLASS::FUNCTION))
+
+#define LoadParamXML(ROOT, PARAMETER_NAME, OBJECT, CLASS, FUNCTION) \
+         LoadParamBase(ROOT, PARAMETER_NAME, OBJECT, ExecutorXML<CLASS>(&CLASS::FUNCTION, ROOT, PARAMETER_NAME))
 
 
