Index: /branches/network/src/lib/sound/sound_source.h
===================================================================
--- /branches/network/src/lib/sound/sound_source.h	(revision 6503)
+++ /branches/network/src/lib/sound/sound_source.h	(revision 6504)
@@ -44,5 +44,5 @@
     ALuint                 sourceID;              //!< The ID of the Source
     const SoundBuffer*     buffer;                //!< The buffer to play in this source.
-    const PNode*           sourceNode;            //!< The SourceNode represente the position/velocity... of this source.
+    const PNode*           sourceNode;            //!< The SourceNode representing the position/velocity... of this source.
 };
 #endif /* _SOUND_SOURCE_H */
Index: /branches/network/src/story_entities/campaign_data.cc
===================================================================
--- /branches/network/src/story_entities/campaign_data.cc	(revision 6503)
+++ /branches/network/src/story_entities/campaign_data.cc	(revision 6504)
@@ -76,5 +76,5 @@
   LOAD_PARAM_START_CYCLE(root, element);
   {
-    StoryEntity* created = (StoryEntity*) Factory::fabricate(element);
+    StoryEntity* created = dynamic_cast<StoryEntity*>(Factory::fabricate(element));
     if( created != NULL)
       this->addStoryEntity(created);
Index: /branches/network/src/story_entities/game_world.cc
===================================================================
--- /branches/network/src/story_entities/game_world.cc	(revision 6503)
+++ /branches/network/src/story_entities/game_world.cc	(revision 6504)
@@ -115,4 +115,6 @@
   .describe("The Filename of this GameWorld (relative from the data-dir)");
 
+//   LoadParam(root, "soundtrack", this->dataTank, GameWorldData, setSoundTrack);
+
   PRINTF(4)("Loaded GameWorld specific stuff\n");
 }
@@ -151,5 +153,5 @@
   if( getPath() == NULL)
   {
-    PRINTF(1)("GameWorld has no path specified for loading");
+    PRINTF(1)("GameWorld has no path specified for loading\n");
     return (ErrorMessage){213,"Path not specified","GameWorld::load()"};
   }
@@ -242,4 +244,8 @@
 void GameWorld::run()
 {
+  /* start the music */
+  if(this->dataTank->music != NULL)
+    this->dataTank->music->playback();
+
   this->lastFrame = SDL_GetTicks ();
   PRINTF(3)("GameWorld::mainLoop() - Entering main loop\n");
Index: /branches/network/src/story_entities/game_world_data.cc
===================================================================
--- /branches/network/src/story_entities/game_world_data.cc	(revision 6503)
+++ /branches/network/src/story_entities/game_world_data.cc	(revision 6504)
@@ -73,7 +73,4 @@
   this->setClassID(CL_GAME_WORLD_DATA, "GameWorldData");
 
-  this->localPlayer = NULL;
-  this->localCamera = NULL;
-
   this->glmis = NULL;
 
@@ -285,9 +282,4 @@
   if( this->sky != NULL)
     this->localCamera->addChild(this->sky);
-
-  /* sound loading */
-  this->music = NULL;
-  //(OggPlayer*)ResourceManager::getInstance()->load("sound/00-luke_grey_-_hypermode.ogg", OGG, RP_LEVEL);
-  //music->playback();
   SoundEngine::getInstance()->setListener(this->localCamera);
 }
@@ -313,2 +305,10 @@
 }
 
+
+void GameWorldData::setSoundTrack(const char* name)
+{
+  PRINTF(3)("Setting Sound Track to %s\n", name);
+  this->music = (OggPlayer*)ResourceManager::getInstance()->load(name, OGG, RP_LEVEL);
+}
+
+
Index: /branches/network/src/story_entities/game_world_data.h
===================================================================
--- /branches/network/src/story_entities/game_world_data.h	(revision 6503)
+++ /branches/network/src/story_entities/game_world_data.h	(revision 6504)
@@ -40,4 +40,6 @@
     virtual ErrorMessage unloadData();
 
+    /* interface functions */
+    void setSoundTrack(const char* name);
 
   protected:
Index: /branches/network/src/story_entities/simple_game_menu.cc
===================================================================
--- /branches/network/src/story_entities/simple_game_menu.cc	(revision 6503)
+++ /branches/network/src/story_entities/simple_game_menu.cc	(revision 6504)
@@ -29,4 +29,6 @@
 #include "terrain.h"
 
+#include "event_handler.h"
+
 #include "cd_engine.h"
 
@@ -74,8 +76,47 @@
 {
   /* skip the GameWorld, since it does not define any useful loadParams for this class */
-  static_cast<StoryEntity*>(this)->loadParams(root);
+  static_cast<GameWorld*>(this)->loadParams(root);
 
   PRINTF(4)("Loaded SimpleGameMenu specific stuff\n");
 }
+
+
+/**
+ * this is executed just before load
+ *
+ * since the load function sometimes needs data, that has been initialized
+ * before the load and after the proceeding storyentity has finished
+ */
+ErrorMessage SimpleGameMenu::init()
+{
+  /* call underlying init funciton */
+  GameWorld::init();
+
+  EventHandler::getInstance()->subscribe(this, ES_MENU, SDLK_UP);
+  EventHandler::getInstance()->subscribe(this, ES_MENU, SDLK_DOWN);
+  EventHandler::getInstance()->subscribe(this, ES_MENU, SDLK_RETURN);
+  EventHandler::getInstance()->subscribe(this, ES_MENU, SDLK_SPACE);
+}
+
+
+
+bool SimpleGameMenu::start()
+{
+  EventHandler::getInstance()->pushState(ES_MENU);
+
+  /* now call the underlying*/
+  GameWorld::start();
+}
+
+
+
+bool SimpleGameMenu::stop()
+{
+  EventHandler::getInstance()->popState();
+
+  /* now call the underlying*/
+  GameWorld::stop();
+}
+
 
 
@@ -87,5 +128,17 @@
 
 
-
+/**
+ * event dispatcher funciton
+ * @param event the incoming event
+ */
+void SimpleGameMenu::process(const Event &event)
+{
+  PRINTF(0)("Got Event: %i\n", event.type);
+
+  if( event.type == SDLK_RETURN)
+  {
+    this->stop();
+  }
+}
 
 
@@ -164,8 +217,5 @@
         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();
     }
Index: /branches/network/src/story_entities/simple_game_menu.h
===================================================================
--- /branches/network/src/story_entities/simple_game_menu.h	(revision 6503)
+++ /branches/network/src/story_entities/simple_game_menu.h	(revision 6504)
@@ -9,5 +9,7 @@
 
 #include "game_world.h"
+#include "event_listener.h"
 #include "game_world_data.h"
+
 
 
@@ -21,5 +23,5 @@
  * loadable and is exchangeable very easely :D
  */
-class SimpleGameMenu : public GameWorld
+class SimpleGameMenu : virtual public GameWorld, virtual public EventListener
 {
 
@@ -30,4 +32,12 @@
     void loadParams(const TiXmlElement* root);
 
+    virtual ErrorMessage init();
+    virtual bool start();
+    virtual bool stop();
+
+    virtual void process(const Event &event);
+
+
+  protected:
     virtual void collide();
 };
Index: /branches/network/src/story_entities/story_entity.h
===================================================================
--- /branches/network/src/story_entities/story_entity.h	(revision 6503)
+++ /branches/network/src/story_entities/story_entity.h	(revision 6504)
@@ -24,5 +24,5 @@
 
 //! A class that represents something to play in orxonox. it is a container for worlds, movies, mission briefings, etc...
-class StoryEntity : public BaseObject {
+class StoryEntity : virtual public BaseObject {
 
  public:
