diff --git a/IO/IniFileParser.cpp b/IO/IniFileParser.cpp
index 7c41b83e5d216a5b073a0cb70c1c14f773093125..475a45330710db640712058fe9fdd4d1826b1dbf 100644
--- a/IO/IniFileParser.cpp
+++ b/IO/IniFileParser.cpp
@@ -132,171 +132,17 @@ bool IniFileParser::Parse(std::string iniFile)
           return false;
      }
 
-         //check the structure of inifile
-         if (xMainNode->FirstChild("header")) {
-                 //logfile
-                 TiXmlNode* xHeader = xMainNode->FirstChild("header");
-                 if (xHeader->FirstChild("logfile")) {
-                         _config->SetErrorLogFile(
-                                 _config->GetProjectRootDir() + xHeader->FirstChild("logfile")->FirstChild()->Value());
-                         _config->SetLog(2);
-                         Log->Write("INFO:\tlogfile <%s>", _config->GetErrorLogFile().c_str());
-                 }
-
-
-                 Log->Write("----\nJuPedSim - JPScore\n");
-                 Log->Write("Current date   : %s %s", __DATE__, __TIME__);
-                 Log->Write("Version        : %s", JPSCORE_VERSION);
-                 Log->Write("Compiler       : %s (%s)", true_cxx.c_str(), true_cxx_ver.c_str());
-                 Log->Write("Commit hash    : %s", GIT_COMMIT_HASH);
-                 Log->Write("Commit date    : %s", GIT_COMMIT_DATE);
-                 Log->Write("Branch         : %s\n----\n", GIT_BRANCH);
-
-
-                 //seed
-                 if (xHeader->FirstChild("seed")) {
-                         TiXmlNode* seedNode = xHeader->FirstChild("seed")->FirstChild();
-                         if (seedNode) {
-                                 const char* seedValue = seedNode->Value();
-                                 _config->SetSeed((unsigned int)atoi(seedValue));//strtol
-                         }
-                         else {
-                                 _config->SetSeed((unsigned int)time(NULL));
-                         }
-                 }
-                 // srand(_config->GetSeed());
-                 Log->Write("INFO:\trandom seed <%d>", _config->GetSeed());
-
-                 // max simulation time
-                 if (xHeader->FirstChild("max_sim_time")) {
-                         const char* tmax =
-                                 xHeader->FirstChildElement("max_sim_time")->FirstChild()->Value();
-                         _config->SetTmax(atof(tmax));
-                         Log->Write("INFO: \tMaximal simulation time <%.2f> seconds", _config->GetTmax());
-                 }
-
-                 // Progressbar
-                 if (xHeader->FirstChild("progressbar")) {
-                         _config->SetPRB(true);
-                         Log->Write("INFO: \tUse Progressbar");
-                 }
-
-                 // geometry file name
-                 if (xHeader->FirstChild("geometry")) {
-                         std::string filename = xHeader->FirstChild("geometry")->FirstChild()->Value();
-                         _config->SetGeometryFile(filename);
-                         Log->Write("INFO: \tgeometry <%s>", filename.c_str());
-                 }
-
-
-                 //max CPU
-                 int max_threads = 1;
-#ifdef _OPENMP
-                 max_threads = omp_get_max_threads();
-#endif
-                 if (xHeader->FirstChild("num_threads")) {
-                         TiXmlNode* numthreads = xHeader->FirstChild("num_threads")->FirstChild();
-                         if (numthreads) {
-#ifdef _OPENMP
-                                 omp_set_num_threads(xmltoi(numthreads->Value()));
-#endif
-          }
-     }
-     _config->SetMaxOpenMPThreads(omp_get_max_threads());
-     Log->Write("INFO:\tUsing num_threads <%d> threads (%d available)", _config->GetMaxOpenMPThreads(), max_threads);
-
-     //display statistics
-     if (xMainNode->FirstChild("show_statistics")) {
-          std::string value = xMainNode->FirstChild("show_statistics")->FirstChild()->Value();
-          _config->SetShowStatistics(value=="true");
-          Log->Write("INFO: \tShow statistics: %s", value.c_str());
-     }
-
-     //trajectories
-     TiXmlNode* xTrajectories = xMainNode->FirstChild("trajectories");
-     if (xTrajectories) {
-           double fps;
-           xMainNode->FirstChildElement("trajectories")->Attribute("fps", &fps);
-          _config->SetFps(fps);
-
-          string format =
-                    xMainNode->FirstChildElement("trajectories")->Attribute(
-                              "format") ?
-                    xMainNode->FirstChildElement("trajectories")->Attribute(
-                              "format") :
-                    "xml-plain";
-          int embedMesh = 0;
-          if (xMainNode->FirstChildElement("trajectories")->Attribute(
-                    "embed_mesh")) {
-               embedMesh =
-                         string(xMainNode->FirstChildElement("trajectories")->Attribute("embed_mesh"))=="true" ? 1 : 0;
-          }
-          if (format=="xml-plain")
-               _config->SetFileFormat(FORMAT_XML_PLAIN);
-          if (format=="xml-plain" && embedMesh==1)
-               _config->SetFileFormat(FORMAT_XML_PLAIN_WITH_MESH);
-          if (format=="xml-bin")
-               _config->SetFileFormat(FORMAT_XML_BIN);
-          if (format=="plain")
-               _config->SetFileFormat(FORMAT_PLAIN);
-          if (format=="vtk")
-               _config->SetFileFormat(FORMAT_VTK);
-
-          //color mode
-          string color_mode =
-                    xMainNode->FirstChildElement("trajectories")->Attribute(
-                              "color_mode") ?
-                    xMainNode->FirstChildElement("trajectories")->Attribute(
-                              "color_mode") :
-                    "velocity";
-
-          if (color_mode=="velocity")
-               Pedestrian::SetColorMode(
-                         AgentColorMode::BY_VELOCITY); //TODO: config parameter! does not belong to the pedestrian model, we should create a pedestrian config instead. [gl march '16]
-          if (color_mode=="spotlight") Pedestrian::SetColorMode(AgentColorMode::BY_SPOTLIGHT);
-          if (color_mode=="group") Pedestrian::SetColorMode(AgentColorMode::BY_GROUP);
-          if (color_mode=="knowledge") Pedestrian::SetColorMode(AgentColorMode::BY_KNOWLEDGE);
-          if (color_mode=="router") Pedestrian::SetColorMode(AgentColorMode::BY_ROUTER);
-          if (color_mode=="final_goal") Pedestrian::SetColorMode(AgentColorMode::BY_FINAL_GOAL);
-          if (color_mode=="intermediate_goal") Pedestrian::SetColorMode(AgentColorMode::BY_INTERMEDIATE_GOAL);
-
-
-
-
-          //a file descriptor was given
-          if (xTrajectories->FirstChild("file")) {
-               std::string tmp;
-               tmp = xTrajectories->FirstChildElement("file")->Attribute(
-                                                  "location");
-               fs::path p(tmp);
-               fs::path curr_abs_path = fs::current_path();
-               fs::path rel_path = fs::path(_config->GetProjectRootDir()) / fs::path(tmp);
-               fs::path combined = (curr_abs_path /= rel_path);
-               std::string traj = combined.string();
-
-               if (traj.c_str())
-               {
-                    _config->SetTrajectoriesFile(traj);
-                    _config->SetOriginalTrajectoriesFile(traj);
-               }
+     //check the structure of inifile
+     if (xMainNode->FirstChild("header")) {
+          TiXmlNode* xHeader = xMainNode->FirstChild("header");
+          ParseHeader(xHeader);
+     }//if header
+     else {
+          ParseHeader(xMainNode);
+     }//else header
 
 
-               Log->Write("INFO: \toutput file  <%s>", _config->GetTrajectoriesFile().c_str());
-               Log->Write("INFO: \tin format <%s> at <%.0f> frames per seconds",format.c_str(), _config->GetFps());
-          }
 
-          if (xTrajectories->FirstChild("socket")) {
-               std::string tmp =
-                         xTrajectories->FirstChildElement("socket")->Attribute("hostname");
-               if (tmp.c_str())
-                    _config->SetHostname(tmp);
-               int port;
-               xTrajectories->FirstChildElement("socket")->Attribute("port", &port);
-               _config->SetPort(port);
-               Log->Write("INFO: \tStreaming results to output [%s:%d] ",
-                         _config->GetHostname().c_str(), _config->GetPort());
-          }
-     }
 
      // JPSfire
      // -------------------------------------
@@ -404,6 +250,170 @@ bool IniFileParser::Parse(std::string iniFile)
      return true;
 }
 
+bool IniFileParser::ParseHeader(TiXmlNode* xHeader)
+{
+          //logfile
+          if (xHeader->FirstChild("logfile")) {
+               _config->SetErrorLogFile(
+                    _config->GetProjectRootDir() + xHeader->FirstChild("logfile")->FirstChild()->Value());
+               _config->SetLog(2);
+               Log->Write("INFO:\tlogfile <%s>", _config->GetErrorLogFile().c_str());
+          }
+          Log->Write("----\nJuPedSim - JPScore\n");
+          Log->Write("Current date   : %s %s", __DATE__, __TIME__);
+          Log->Write("Version        : %s", JPSCORE_VERSION);
+          Log->Write("Compiler       : %s (%s)", true_cxx.c_str(), true_cxx_ver.c_str());
+          Log->Write("Commit hash    : %s", GIT_COMMIT_HASH);
+          Log->Write("Commit date    : %s", GIT_COMMIT_DATE);
+          Log->Write("Branch         : %s\n----\n", GIT_BRANCH);
+
+
+          //seed
+          if (xHeader->FirstChild("seed")) {
+               TiXmlNode* seedNode = xHeader->FirstChild("seed")->FirstChild();
+               if (seedNode) {
+                    const char* seedValue = seedNode->Value();
+                    _config->SetSeed((unsigned int)atoi(seedValue));//strtol
+               }
+               else {
+                    _config->SetSeed((unsigned int)time(NULL));
+               }
+          }
+          // srand(_config->GetSeed());
+          Log->Write("INFO:\trandom seed <%d>", _config->GetSeed());
+
+          // max simulation time
+          if (xHeader->FirstChild("max_sim_time")) {
+               const char* tmax =
+                    xHeader->FirstChildElement("max_sim_time")->FirstChild()->Value();
+               _config->SetTmax(atof(tmax));
+               Log->Write("INFO: \tMaximal simulation time <%.2f> seconds", _config->GetTmax());
+          }
+
+          // Progressbar
+          if (xHeader->FirstChild("progressbar")) {
+               _config->SetPRB(true);
+               Log->Write("INFO: \tUse Progressbar");
+          }
+
+          // geometry file name
+          if (xHeader->FirstChild("geometry")) {
+               std::string filename = xHeader->FirstChild("geometry")->FirstChild()->Value();
+               _config->SetGeometryFile(filename);
+               Log->Write("INFO: \tgeometry <%s>", filename.c_str());
+          }
+
+
+          //max CPU
+          int max_threads = 1;
+#ifdef _OPENMP
+          max_threads = omp_get_max_threads();
+#endif
+          if (xHeader->FirstChild("num_threads")) {
+               TiXmlNode* numthreads = xHeader->FirstChild("num_threads")->FirstChild();
+               if (numthreads) {
+#ifdef _OPENMP
+                    omp_set_num_threads(xmltoi(numthreads->Value()));
+#endif
+               }
+          }
+          _config->SetMaxOpenMPThreads(omp_get_max_threads());
+          Log->Write("INFO:\tUsing num_threads <%d> threads (%d available)", _config->GetMaxOpenMPThreads(), max_threads);
+
+          //display statistics
+          if (xHeader->FirstChild("show_statistics")) {
+               std::string value = xHeader->FirstChild("show_statistics")->FirstChild()->Value();
+               _config->SetShowStatistics(value=="true");
+               Log->Write("INFO: \tShow statistics: %s", value.c_str());
+          }
+
+          //trajectories
+          TiXmlNode* xTrajectories = xHeader->FirstChild("trajectories");
+          if (xTrajectories) {
+               double fps;
+               xHeader->FirstChildElement("trajectories")->Attribute("fps", &fps);
+               _config->SetFps(fps);
+
+               string format =
+                    xHeader->FirstChildElement("trajectories")->Attribute(
+                         "format") ?
+                    xHeader->FirstChildElement("trajectories")->Attribute(
+                         "format") :
+                    "xml-plain";
+               int embedMesh = 0;
+               if (xHeader->FirstChildElement("trajectories")->Attribute(
+                        "embed_mesh")) {
+                    embedMesh =
+                         string(xHeader->FirstChildElement("trajectories")->Attribute("embed_mesh"))=="true" ? 1 : 0;
+               }
+               if (format=="xml-plain")
+                    _config->SetFileFormat(FORMAT_XML_PLAIN);
+               if (format=="xml-plain" && embedMesh==1)
+                    _config->SetFileFormat(FORMAT_XML_PLAIN_WITH_MESH);
+               if (format=="xml-bin")
+                    _config->SetFileFormat(FORMAT_XML_BIN);
+               if (format=="plain")
+                    _config->SetFileFormat(FORMAT_PLAIN);
+               if (format=="vtk")
+                    _config->SetFileFormat(FORMAT_VTK);
+
+               //color mode
+               string color_mode =
+                    xHeader->FirstChildElement("trajectories")->Attribute(
+                         "color_mode") ?
+                    xHeader->FirstChildElement("trajectories")->Attribute(
+                         "color_mode") :
+                    "velocity";
+
+               if (color_mode=="velocity")
+                    Pedestrian::SetColorMode(
+                         AgentColorMode::BY_VELOCITY); //TODO: config parameter! does not belong to the pedestrian model, we should create a pedestrian config instead. [gl march '16]
+               if (color_mode=="spotlight") Pedestrian::SetColorMode(AgentColorMode::BY_SPOTLIGHT);
+               if (color_mode=="group") Pedestrian::SetColorMode(AgentColorMode::BY_GROUP);
+               if (color_mode=="knowledge") Pedestrian::SetColorMode(AgentColorMode::BY_KNOWLEDGE);
+               if (color_mode=="router") Pedestrian::SetColorMode(AgentColorMode::BY_ROUTER);
+               if (color_mode=="final_goal") Pedestrian::SetColorMode(AgentColorMode::BY_FINAL_GOAL);
+               if (color_mode=="intermediate_goal") Pedestrian::SetColorMode(AgentColorMode::BY_INTERMEDIATE_GOAL);
+
+
+
+
+               //a file descriptor was given
+               if (xTrajectories->FirstChild("file")) {
+                    std::string tmp;
+                    tmp = xTrajectories->FirstChildElement("file")->Attribute(
+                         "location");
+                    fs::path p(tmp);
+                    fs::path curr_abs_path = fs::current_path();
+                    fs::path rel_path = fs::path(_config->GetProjectRootDir()) / fs::path(tmp);
+                    fs::path combined = (curr_abs_path /= rel_path);
+                    std::string traj = combined.string();
+
+                    if (traj.c_str())
+                    {
+                         _config->SetTrajectoriesFile(traj);
+                         _config->SetOriginalTrajectoriesFile(traj);
+                    }
+
+
+                    Log->Write("INFO: \toutput file  <%s>", _config->GetTrajectoriesFile().c_str());
+                    Log->Write("INFO: \tin format <%s> at <%.0f> frames per seconds",format.c_str(), _config->GetFps());
+               }
+
+               if (xTrajectories->FirstChild("socket")) {
+                    std::string tmp =
+                         xTrajectories->FirstChildElement("socket")->Attribute("hostname");
+                    if (tmp.c_str())
+                         _config->SetHostname(tmp);
+                    int port;
+                    xTrajectories->FirstChildElement("socket")->Attribute("port", &port);
+                    _config->SetPort(port);
+                    Log->Write("INFO: \tStreaming results to output [%s:%d] ",
+                               _config->GetHostname().c_str(), _config->GetPort());
+               }
+          }
+
+}
 bool IniFileParser::ParseGCFMModel(TiXmlElement* xGCFM, TiXmlElement* xMainNode)
 {
      Log->Write("\nINFO:\tUsing the GCFM model");
diff --git a/IO/IniFileParser.h b/IO/IniFileParser.h
index 1454f761d740909c644ac4539a3ddc63074e6d74..53dc72d6722f5c9cb19f7d34de435ef511a31bad 100644
--- a/IO/IniFileParser.h
+++ b/IO/IniFileParser.h
@@ -44,6 +44,8 @@ public:
      bool Parse(std::string iniFile);
 
 private:
+     bool ParseHeader(TiXmlNode* xHeader);
+
      bool ParseGCFMModel(TiXmlElement* xGCFM, TiXmlElement* xMain);
 
      bool ParseKrauszModel(TiXmlElement* xKrausz, TiXmlElement* xMain);
diff --git a/demos/scenario_11_sources/inifile.xml b/demos/scenario_11_sources/inifile.xml
index 82eed7abbc2c4357a96d4c64ba8bd83f95783515..e9e8f124c381987312220f95d8c10a6de9b1a6a5 100644
--- a/demos/scenario_11_sources/inifile.xml
+++ b/demos/scenario_11_sources/inifile.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 
 <JuPedSim project="JPS-Project" version="0.8" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://xsd.jupedsim.org/0.6/jps_ini_core.xsd">
-
+<header>
   <!-- seed used for initialising random generator -->
   <seed>12542</seed>
   <!-- geometry file -->
@@ -16,7 +16,7 @@
 
   <!-- where to store the logs -->
   <logfile>log.txt</logfile>
-
+</header>
   <!-- traffic information: e.g closed doors or smoked rooms -->
   <traffic_constraints>
     <!-- doors states are: close or open -->