Index: /branches/network/src/story_entities/campaign.cc
===================================================================
--- /branches/network/src/story_entities/campaign.cc	(revision 6386)
+++ /branches/network/src/story_entities/campaign.cc	(revision 6387)
@@ -38,6 +38,7 @@
   assert( root != NULL);
 
-  this->campaignData = new CampaignData();
+  this->campaignData = new CampaignData(root);
   this->loadParams(root);
+
 }
 
@@ -47,5 +48,8 @@
  */
 Campaign::~Campaign ()
-{}
+{
+  if( this->campaignData)
+    delete this->campaignData;
+}
 
 
@@ -58,37 +62,6 @@
   static_cast<StoryEntity*>(this)->loadParams(root);
 
-  LoadParamXML(root, "WorldList", this, Campaign, loadWorldListParams)
-  .describe("A List of Worlds to be loaded in this Campaign");
-
   PRINTF(4)("Loaded Campaign specific stuff\n");
-}
-
-
-/**
- *  loads a WorldList
- * @param root: the XML-element to load from
- */
-void Campaign::loadWorldListParams(const TiXmlElement* root)
-{
-  if( root == NULL)
-    return;
-
-  LOAD_PARAM_START_CYCLE(root, element);
-  {
-    StoryEntity* created = (StoryEntity*) Factory::fabricate(element);
-    if( created != NULL)
-      this->campaignData->addStoryEntity(created);
-  }
-  LOAD_PARAM_END_CYCLE(element);
-
-}
-
-
-/**
- *  initializes the class
- */
-ErrorMessage Campaign::init()
-{
-  this->isInit = true;
+
 }
 
@@ -98,8 +71,53 @@
  * @param storyID the id of the StoryEntity
  */
-ErrorMessage Campaign::start()
+bool Campaign::start()
 {
   PRINTF(2)("Starting Campaign nr. %i\n", this->getStoryID());
 
+  this->isRunning = true;
+  this->run();
+
+  PRINTF(2)("There is no StoryEnity left to play, quitting\n");
+}
+
+
+/**
+ *  pauses the campaign
+ */
+bool Campaign::pause()
+{
+  this->isPaused = true;
+}
+
+
+/**
+ *  resumes the campaign after a pause
+ */
+bool Campaign::resume()
+{
+  PRINTF(4)("Resuming the current Campaign\n");
+  this->isPaused = false;
+}
+
+
+/**
+ *  stops the campaign
+ */
+bool Campaign::stop()
+{
+  PRINTF(4)("Stopping the current Campaign\n");
+  this->isRunning = false;
+  if( this->currentEntity != NULL)
+  {
+    this->currentEntity->stop();
+  }
+}
+
+
+/**
+ *  runs the campaign
+ */
+void Campaign::run()
+{
   ErrorMessage       errorCode;
   int                storyID = WORLD_ID_0;
@@ -116,39 +134,4 @@
     this->currentEntity->unloadData();
   }
-
-  PRINTF(2)("There is no StoryEnity left to play, quitting\n");
-}
-
-
-/**
- *  pauses the campaign
- */
-ErrorMessage Campaign::pause()
-{
-  if( this->currentEntity != NULL)
-    this->isPaused = true;
-}
-
-
-/**
- *  resumes the campaign after a pause
- */
-ErrorMessage Campaign::resume()
-{
-  if( this->currentEntity != NULL)
-    this->isPaused = false;
-}
-
-
-/**
- *  stops the campaign
- */
-ErrorMessage Campaign::stop()
-{
-  this->isRunning = false;
-  if( this->currentEntity != NULL)
-  {
-    this->currentEntity->stop();
-  }
 }
 
@@ -159,5 +142,5 @@
 void Campaign::switchToNextLevel()
 {
-  PRINTF(4)("Campaign:nextLevel()\n");
+  PRINTF(4)("Switching to the next StoryEntity\n");
   this->currentEntity->stop();
 }
@@ -165,13 +148,18 @@
 
 
-/* CampaignData */
+/* ==========================================================================================================
+   CampaignData
+   ==========================================================================================================
+*/
 
 /**
  * constructor for CampaignData
  */
-CampaignData::CampaignData()
+CampaignData::CampaignData(const TiXmlElement* root)
 {
   this->setClassID(CL_CAMPAIGN_DATA, "CampaignData");
   this->currentEntity = NULL;
+
+  this->loadParams(root);
 }
 
@@ -180,6 +168,46 @@
  * destructor for CampaignData
  */
-CampaignData::~ CampaignData()
-{}
+CampaignData::~CampaignData()
+{
+  PRINTF(0)("Deleting CampaignData\n");
+  while( !this->storyEntities.empty())
+  {
+    StoryEntity* bo = this->storyEntities.front();
+    PRINTF(0)("CampaignData is been deleted: nr %i\n", bo->getStoryID());
+    delete bo;
+  }
+}
+
+
+
+/**
+ *  loads the Parameters of a Campaign
+ * @param root: The XML-element to load from
+ */
+void CampaignData::loadParams(const TiXmlElement* root)
+{
+  LoadParamXML(root, "WorldList", this, CampaignData, loadParamsWorldList)
+      .describe("A List of Worlds to be loaded in this Campaign");
+
+}
+
+
+/**
+ *  loads a WorldList
+ * @param root: the XML-element to load from
+ */
+void CampaignData::loadParamsWorldList(const TiXmlElement* root)
+{
+  if( root == NULL)
+    return;
+
+  LOAD_PARAM_START_CYCLE(root, element);
+  {
+    StoryEntity* created = (StoryEntity*) Factory::fabricate(element);
+    if( created != NULL)
+      this->addStoryEntity(created);
+  }
+  LOAD_PARAM_END_CYCLE(element);
+}
 
 
Index: /branches/network/src/story_entities/campaign.h
===================================================================
--- /branches/network/src/story_entities/campaign.h	(revision 6386)
+++ /branches/network/src/story_entities/campaign.h	(revision 6387)
@@ -25,11 +25,10 @@
 
     void loadParams(const TiXmlElement* root);
-    void loadWorldListParams(const TiXmlElement* root);
 
-    virtual ErrorMessage init();
-    virtual ErrorMessage start();
-    virtual ErrorMessage pause();
-    virtual ErrorMessage resume();
-    virtual ErrorMessage stop();
+    virtual bool start();
+    virtual bool stop();
+    virtual bool pause();
+    virtual bool resume();
+    virtual void run();
 
     void switchToNextLevel();
@@ -44,10 +43,12 @@
 
 //! A class that contains the data of the Campaign object
-class CampaignData : virtual public BaseObject
+class CampaignData : public BaseObject
 {
 
   public:
-    CampaignData();
+    CampaignData(const TiXmlElement* root);
     virtual ~CampaignData();
+
+    void loadParams(const TiXmlElement* root);
 
     void addStoryEntity(StoryEntity* se);
@@ -58,4 +59,8 @@
 
   private:
+    void loadParamsWorldList(const TiXmlElement* root);
+
+
+  private:
     StoryEntity*                  currentEntity;                //!< reference to the currently used StoryEntity
     std::list<StoryEntity*>       storyEntities;                //!< list of story entities
Index: /branches/network/src/story_entities/game_world.cc
===================================================================
--- /branches/network/src/story_entities/game_world.cc	(revision 6386)
+++ /branches/network/src/story_entities/game_world.cc	(revision 6387)
@@ -91,6 +91,4 @@
   this->music = NULL;
   this->shell = NULL;
-  this->localPlayer = NULL;
-  this->localCamera = NULL;
 
   this->showPNodes = false;
@@ -98,4 +96,6 @@
 
   this->path = NULL;
+
+  this->gameWorldData = new GameWorldData();
 }
 
@@ -108,35 +108,6 @@
 GameWorld::~GameWorld ()
 {
-  delete this->shell;
-  PRINTF(3)("GameWorld::~GameWorld() - deleting current world\n");
-
-  delete this->localPlayer;
-
-  // delete all the initialized Engines.
-  FastFactory::flushAll(true);
-  delete LightManager::getInstance();
-  delete ParticleEngine::getInstance();
-  delete AnimationPlayer::getInstance();
-  delete PhysicsEngine::getInstance();
-
-  // external engines initialized by the orxonox-class get deleted
-  SoundEngine::getInstance()->flushAllBuffers();
-  SoundEngine::getInstance()->flushAllSources();
-
-  if (State::getObjectManager() == &this->objectManager)
-    State::setObjectManager(NULL);
-  // erease everything that is left.
-  delete PNode::getNullParent();
-
-  //secondary cleanup of PNodes;
-  const std::list<BaseObject*>* nodeList = ClassList::getList(CL_PARENT_NODE);
-  if (nodeList != NULL)
-    while (!nodeList->empty())
-      delete nodeList->front();
-
-  Shader::suspendShader();
-
-  // unload the resources !!
-  ResourceManager::getInstance()->unloadAllByPriority(RP_LEVEL);
+  if( this->gameWorldData)
+    delete this->gameWorldData;
 }
 
@@ -179,8 +150,8 @@
   PhysicsEngine::getInstance();
 
-  this->localCamera = new Camera();
-  this->localCamera->setName ("GameWorld-Camera");
-
-  State::setCamera(this->localCamera, this->localCamera->getTarget());
+  this->gameWorldData->localCamera = new Camera();
+  this->gameWorldData->localCamera->setName ("GameWorld-Camera");
+
+  State::setCamera(this->gameWorldData->localCamera, this->gameWorldData->localCamera->getTarget());
 
   GraphicsEngine::getInstance()->displayFPS(true);
@@ -240,58 +211,10 @@
     }
 
-  ////////////////
-  // LOADSCREEN //
-  ////////////////
-  element = root->FirstChildElement("LoadScreen");
-  if (element == NULL)
-    {
-      PRINTF(2)("no LoadScreen specified, loading default\n");
-
-      glmis->setBackgroundImage("pictures/load_screen.jpg");
-      this->glmis->setMaximum(8);
-      this->glmis->draw();
-    }
-  else
-    {
-      this->glmis->loadParams(element);
-      this->glmis->draw();
-    }
-  this->glmis->draw();
-
-  ////////////////////////
-  // find WorldEntities //
-  ////////////////////////
-
-  element = root->FirstChildElement("WorldEntities");
-
-  if( element == NULL)
-    {
-      PRINTF(1)("GameWorld is missing 'WorldEntities'\n");
-    }
-  else
-    {
-      element = element->FirstChildElement();
-      // load Players/Objects/Whatever
-      PRINTF(4)("Loading WorldEntities\n");
-      while( element != NULL)
-        {
-          BaseObject* created = Factory::fabricate(element);
-          if( created != NULL )
-            printf("Created a %s: %s\n", created->getClassName(), created->getName());
-
-
-          //todo do this more elegant
-          if( element->Value() != NULL && !strcmp( element->Value(), "SkyBox"))
-            this->sky = dynamic_cast<WorldEntity*>(created);
-          if( element->Value() != NULL && !strcmp( element->Value(), "Terrain"))
-          {
-            terrain = dynamic_cast<Terrain*>(created);
-            CDEngine::getInstance()->setTerrain(terrain);
-          }
-          element = element->NextSiblingElement();
-          glmis->step(); //! @todo temporary
-        }
-      PRINTF(4)("Done loading WorldEntities\n");
-    }
+
+
+    this->gameWorldData->loadGUI(root);
+
+
+    this->gameWorldData->loadWorldEntities(root);
 
     //////////////////////////////
@@ -310,26 +233,17 @@
 
 
-  // Create a Player
-  this->localPlayer = new Player();
-
-  Playable* playable;
-  const list<BaseObject*>* playableList = ClassList::getList(CL_PLAYABLE);
-  if (playableList != NULL)
-  {
-    playable = dynamic_cast<Playable*>(playableList->front());
-    this->localPlayer->setControllable(playable);
-  }
+
 
 
 //   //localCamera->setParent(TrackNode::getInstance());
 //  tn->addChild(this->localCamera);
-  localCamera->setClipRegion(1, 10000.0);
+  this->gameWorldData->localCamera->setClipRegion(1, 10000.0);
 //  localCamera->lookAt(playable);
 //  this->localPlayer->setParentMode(PNODE_ALL);
-  if (this->sky != NULL)
-  {
-    this->localCamera->addChild(sky);
-  }
-  SoundEngine::getInstance()->setListener(this->localCamera);
+  if (this->gameWorldData->sky != NULL)
+  {
+    this->gameWorldData->localCamera->addChild(this->gameWorldData->sky);
+  }
+  SoundEngine::getInstance()->setListener(this->gameWorldData->localCamera);
 
   /* some static stuff*/
@@ -348,11 +262,49 @@
 
 /**
+ *  unload the data of this GameWorld
+ */
+ErrorMessage GameWorld::unloadData()
+{
+  delete this->shell;
+  PRINTF(3)("GameWorld::~GameWorld() - unloading the current GameWorld\n");
+
+  // delete all the initialized Engines.
+  FastFactory::flushAll(true);
+  delete LightManager::getInstance();
+  delete ParticleEngine::getInstance();
+  delete AnimationPlayer::getInstance();
+  delete PhysicsEngine::getInstance();
+
+  // external engines initialized by the orxonox-class get deleted
+  SoundEngine::getInstance()->flushAllBuffers();
+  SoundEngine::getInstance()->flushAllSources();
+
+  if (State::getObjectManager() == &this->objectManager)
+    State::setObjectManager(NULL);
+  // erease everything that is left.
+  delete PNode::getNullParent();
+
+  //secondary cleanup of PNodes;
+  const std::list<BaseObject*>* nodeList = ClassList::getList(CL_PARENT_NODE);
+  if (nodeList != NULL)
+    while (!nodeList->empty())
+      delete nodeList->front();
+
+  Shader::suspendShader();
+
+  // unload the resources !!
+  ResourceManager::getInstance()->unloadAllByPriority(RP_LEVEL);
+}
+
+
+/**
  *  starts the GameWorld
  */
-ErrorMessage GameWorld::start()
+bool GameWorld::start()
 {
   this->isPaused = false;
   this->isRunning = true;
-  this->mainLoop();
+
+  this->run();
 }
 
@@ -362,5 +314,5 @@
    This happens, when the player decides to end the Level.
 */
-ErrorMessage GameWorld::stop()
+bool GameWorld::stop()
 {
   PRINTF(3)("GameWorld::stop() - got stop signal\n");
@@ -371,5 +323,5 @@
  *  pauses the Game
 */
-ErrorMessage GameWorld::pause()
+bool GameWorld::pause()
 {
   this->isPaused = true;
@@ -379,5 +331,5 @@
  *  ends the pause Phase
 */
-ErrorMessage GameWorld::resume()
+bool GameWorld::resume()
 {
   this->isPaused = false;
@@ -391,6 +343,6 @@
 {
   PRINTF(3)("GameWorld::displayLoadScreen - start\n");
-  this->glmis = new GLMenuImageScreen();
-  this->glmis->setMaximum(8);
+  this->gameWorldData->glmis = new GLMenuImageScreen();
+  this->gameWorldData->glmis->setMaximum(8);
   PRINTF(3)("GameWorld::displayLoadScreen - end\n");
 }
@@ -405,7 +357,7 @@
 {
   PRINTF(3)("GameWorld::releaseLoadScreen - start\n");
-  this->glmis->setValue(this->glmis->getMaximum());
+  this->gameWorldData->glmis->setValue(this->gameWorldData->glmis->getMaximum());
   PRINTF(3)("GameWorld::releaseLoadScreen - end\n");
-  delete this->glmis;
+  delete this->gameWorldData->glmis;
 }
 
@@ -485,5 +437,5 @@
 
       /* update tick the rest */
-      this->localCamera->tick(this->dtS);
+      this->gameWorldData->localCamera->tick(this->dtS);
       // tick the engines
       AnimationPlayer::getInstance()->tick(this->dtS);
@@ -541,5 +493,5 @@
   glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
   // set camera
-  this->localCamera->apply ();
+  this->gameWorldData->localCamera->apply ();
   // draw world
   this->draw();
@@ -600,5 +552,5 @@
  * collisions drawing everything to the screen.
  */
-void GameWorld::mainLoop()
+void GameWorld::run()
 {
   this->lastFrame = SDL_GetTicks ();
@@ -659,2 +611,115 @@
 }
 
+
+
+
+
+
+
+GameWorldData::GameWorldData()
+{
+  this->localPlayer = NULL;
+  this->localCamera = NULL;
+
+  this->glmis = NULL;
+
+  this->localCamera = NULL;
+  this->localPlayer = NULL;
+  this->sky = NULL;
+  this->terrain = NULL;
+
+}
+
+
+GameWorldData::~GameWorldData()
+{
+  if( this->localPlayer)
+    delete this->localPlayer;
+}
+
+
+
+ErrorMessage GameWorldData::loadData(TiXmlElement* root)
+{}
+
+
+
+
+ErrorMessage GameWorldData::loadGUI(TiXmlElement* root)
+{
+  ////////////////
+  // LOADSCREEN //
+  ////////////////
+  TiXmlElement* element = root->FirstChildElement("LoadScreen");
+  if( element == NULL)
+  {
+    PRINTF(2)("no LoadScreen specified, loading default\n");
+
+    glmis->setBackgroundImage("pictures/load_screen.jpg");
+    this->glmis->setMaximum(8);
+    this->glmis->draw();
+  }
+  else
+  {
+    this->glmis->loadParams(element);
+    this->glmis->draw();
+  }
+  this->glmis->draw();
+
+}
+
+
+ErrorMessage GameWorldData::loadWorldEntities(TiXmlElement* root)
+{
+  ////////////////////////
+  // find WorldEntities //
+  ////////////////////////
+
+  TiXmlElement* element = root->FirstChildElement("WorldEntities");
+
+  if( element == NULL)
+  {
+    PRINTF(1)("GameWorld is missing 'WorldEntities'\n");
+  }
+  else
+  {
+    element = element->FirstChildElement();
+      // load Players/Objects/Whatever
+    PRINTF(4)("Loading WorldEntities\n");
+    while( element != NULL)
+    {
+      BaseObject* created = Factory::fabricate(element);
+      if( created != NULL )
+        printf("Created a %s: %s\n", created->getClassName(), created->getName());
+
+
+          //todo do this more elegant
+      if( element->Value() != NULL && !strcmp( element->Value(), "SkyBox"))
+        this->sky = dynamic_cast<WorldEntity*>(created);
+      if( element->Value() != NULL && !strcmp( element->Value(), "Terrain"))
+      {
+        this->terrain = dynamic_cast<Terrain*>(created);
+        CDEngine::getInstance()->setTerrain(terrain);
+      }
+      element = element->NextSiblingElement();
+      this->glmis->step(); //! @todo temporary
+    }
+    PRINTF(4)("Done loading WorldEntities\n");
+  }
+
+    // Create a Player
+  this->localPlayer = new Player();
+
+  Playable* playable;
+  const list<BaseObject*>* playableList = ClassList::getList(CL_PLAYABLE);
+  if (playableList != NULL)
+  {
+    playable = dynamic_cast<Playable*>(playableList->front());
+    this->localPlayer->setControllable(playable);
+  }
+}
+
+
+ErrorMessage GameWorldData::loadScene(TiXmlElement* root)
+{}
+
Index: /branches/network/src/story_entities/game_world.h
===================================================================
--- /branches/network/src/story_entities/game_world.h	(revision 6386)
+++ /branches/network/src/story_entities/game_world.h	(revision 6387)
@@ -20,4 +20,5 @@
 class Shell;
 class OggPlayer;
+class GameWorldData;
 
 //! The game world
@@ -38,11 +39,11 @@
     virtual ErrorMessage init();
     virtual ErrorMessage loadData();
-    virtual ErrorMessage unloadData() {}
+    virtual ErrorMessage unloadData();
 
-    virtual ErrorMessage start();
-    virtual ErrorMessage stop();
-    virtual ErrorMessage pause();
-    virtual ErrorMessage resume();
-
+    virtual bool start();
+    virtual bool stop();
+    virtual bool pause();
+    virtual bool resume();
+    virtual void run();
 
     /**  this returns the current game time @returns elapsed game time     */
@@ -61,12 +62,5 @@
 
   protected:
-    /* world loading functions */
-    virtual ErrorMessage loadGUI(TiXmlElement* root) {}
-    virtual ErrorMessage loadWorldEntities(TiXmlElement* root) {}
-    virtual ErrorMessage loadScene(TiXmlElement* root) {}
-
     /* world - running functions */
-    virtual void mainLoop ();
-
     virtual void synchronize();
     virtual void handleInput();
@@ -85,31 +79,49 @@
 
   protected:
-    char* path;                         //!< The file from which this world is loaded
+    GameWorldData*      gameWorldData;                //!< reference to the GameWorld Data Tank
+    char*               path;                         //!< The file from which this world is loaded
 
-    bool showPNodes;                    //!< if the PNodes should be visible.
-    bool showBV;                        //!< if the Bounding Volumes should be visible.
-
-    GLMenuImageScreen* glmis;           //!< The Level-Loader Display
+    bool                showPNodes;                   //!< if the PNodes should be visible.
+    bool                showBV;                       //!< if the Bounding Volumes should be visible.
 
     /* world timing */
-    Uint32 lastFrame;                   //!< last time of frame
-    Uint32 cycle;                       //!< The cycle we are in (starts with 0 and rises with every frame)
-    Uint32 dt;                          //!< time needed to calculate this frame (in milliSeconds)
-    float dtS;                          //!< The time needed for caluculations in seconds
-    float speed;                        //!< how fast the game flows
-    double gameTime;                    //!< this is where the game time is saved
+    Uint32              lastFrame;                   //!< last time of frame
+    Uint32              cycle;                       //!< The cycle we are in (starts with 0 and rises with every frame)
+    Uint32              dt;                          //!< time needed to calculate this frame (in milliSeconds)
+    float               dtS;                         //!< The time needed for caluculations in seconds
+    float               speed;                       //!< how fast the game flows
+    double              gameTime;                    //!< this is where the game time is saved
 
     /* external modules interfaces */
-    ObjectManager objectManager;        //!< The ObjectManager of this GameWorld.
+    ObjectManager objectManager;                     //!< The ObjectManager of this GameWorld.
 
     /* external modules interfaces */
-    Shell*     shell;
-    OggPlayer* music;
+    Shell*              shell;
+    OggPlayer*          music;
 
     /* important entities */
-    Camera* localCamera;                //!< The current Camera
-    Player* localPlayer;                //!< The Player, you fly through the level.
-    WorldEntity* sky;                   //!< The Environmental Heaven of orxonox @todo insert this to environment insted
-    Terrain* terrain;                   //!< The Terrain of the GameWorld.
+};
+
+
+class GameWorldData : public BaseObject
+{
+
+  public:
+    GameWorldData();
+    ~GameWorldData();
+    /* world loading functions */
+    virtual ErrorMessage loadData(TiXmlElement* root);
+
+    virtual ErrorMessage loadGUI(TiXmlElement* root);
+    virtual ErrorMessage loadWorldEntities(TiXmlElement* root);
+    virtual ErrorMessage loadScene(TiXmlElement* root);
+
+  public:
+    GLMenuImageScreen*  glmis;                        //!< The Level-Loader Display
+
+    Camera*             localCamera;                 //!< The current Camera
+    Player*             localPlayer;                 //!< The Player, you fly through the level.
+    WorldEntity*        sky;                         //!< The Environmental Heaven of orxonox @todo insert this to environment insted
+    Terrain*            terrain;                     //!< The Terrain of the GameWorld.
 
 };
Index: /branches/network/src/story_entities/multi_player_world.cc
===================================================================
--- /branches/network/src/story_entities/multi_player_world.cc	(revision 6386)
+++ /branches/network/src/story_entities/multi_player_world.cc	(revision 6387)
@@ -90,6 +90,4 @@
   this->music = NULL;
   this->shell = NULL;
-  this->localPlayer = NULL;
-  this->localCamera = NULL;
 
   this->showPNodes = false;
Index: /branches/network/src/story_entities/story_entity.h
===================================================================
--- /branches/network/src/story_entities/story_entity.h	(revision 6386)
+++ /branches/network/src/story_entities/story_entity.h	(revision 6387)
@@ -11,4 +11,15 @@
 #include "story_def.h"
 #include "error.h"
+
+
+typedef enum StoryEntityState
+{
+  SE_STATE_RUN     = 0,
+  SE_STATE_STOP,
+  SE_STATE_PAUSE,
+
+  SE_STATE_NUM
+};
+
 
 //! A class that represents something to play in orxonox. it is a container for worlds, movies, mission briefings, etc...
@@ -28,14 +39,20 @@
   /** function that unloads the data from the StoryEntity */
   virtual ErrorMessage unloadData() {};
+
   /* running, stopping and pausing */
   /** starts the Entity. Starts the main cycle */
-  virtual ErrorMessage start() = 0;
-  /** pauses the Entity. call to resume required to get it running again */
-  virtual ErrorMessage pause() = 0;
-  /** resumes the Entity after a stop/pause or suspend. */
-  virtual ErrorMessage resume() = 0;
+  virtual bool start() = 0;
   /**  Stops the entity. */
-  virtual ErrorMessage stop() = 0;
+  virtual bool stop() = 0;
+  /** pauses the Entity, you can resume the game by calling the resume() function */
+  virtual bool pause() = 0;
+  /** resumes a paused StoryEntity */
+  virtual bool resume() = 0;
+  /** function that is been called when the StoryEntity is started via start() */
+  virtual void run() = 0;
 
+  /* properties interface */
+  /** returns the state of this StoryEntity */
+  StoryEntityState getState();
 
   /** sets the story id of the current entity, this enables it to be identified in a global context.  @param storyID the story id */
