diff --git a/IO/GeoFileParser.cpp b/IO/GeoFileParser.cpp
index 9594cb38295fc9469231f25c903e0b07e1e23def..5bb9ac10d7a1dd454aa1854dce6dace70943ac5d 100644
--- a/IO/GeoFileParser.cpp
+++ b/IO/GeoFileParser.cpp
@@ -60,7 +60,9 @@ void GeoFileParser::LoadBuilding(Building* building)
 bool GeoFileParser::LoadGeometry(Building* building)
 {
 
-     std::string geoFilenameWithPath = _configuration->GetProjectRootDir()+_configuration->GetGeometryFile();
+     fs::path rootDir(_configuration->GetProjectRootDir());
+
+     std::string geoFilenameWithPath = (rootDir/fs::path(_configuration->GetGeometryFile())).string();
      std::cout << "\nLoadGeometry: file: " << geoFilenameWithPath << "\n";
 
      TiXmlDocument docGeo(geoFilenameWithPath);
diff --git a/IO/IODispatcher.cpp b/IO/IODispatcher.cpp
index 377c9873325c6bf0369b1ac074aa40255dc97cc6..72da2fdc0c9f572208939f3f86a9fb88768b4ff7 100644
--- a/IO/IODispatcher.cpp
+++ b/IO/IODispatcher.cpp
@@ -35,6 +35,7 @@
 #define _USE_MATH_DEFINES
 
 using namespace std;
+namespace fs = std::filesystem;
 
 
 IODispatcher::IODispatcher()
@@ -466,6 +467,8 @@ void TrajectoriesFLAT::WriteHeader(long nPeds, double fps, Building* building, i
      std::string eventFileName = getEventFileName(building->GetProjectFilename());
      std::string trainTimeTableFileName = getTrainTimeTableFileName(building->GetProjectFilename());
      std::string trainTypeFileName = getTrainTypeFileName(building->GetProjectFilename());
+     fs::path projRoot(building->GetProjectRootDir());
+
      (void) seed; (void) nPeds;
      char tmp[100] = "";
      sprintf(tmp, "#description: jpscore (%s)", JPSCORE_VERSION);
@@ -474,31 +477,37 @@ void TrajectoriesFLAT::WriteHeader(long nPeds, double fps, Building* building, i
      Write(tmp);
      sprintf(tmp, "#framerate: %0.2f",fps);
      Write(tmp);
-     sprintf(tmp,"#geometry: %s",building->GetGeometryFilename().c_str());
+     std::string tmpGeo= (projRoot/fs::path(building->GetGeometryFilename())).string();
+     sprintf(tmp,"#geometry: %s",  tmpGeo.c_str());
      Write(tmp);
      if(sourceFileName != "")
      {
-          sprintf(tmp,"#sources: %s", sourceFileName.c_str());
+          std::string tmpSource= (projRoot/fs::path(sourceFileName)).string();
+          sprintf(tmp,"#sources: %s", tmpSource.c_str());
           Write(tmp);
      }
      if(goalFileName != "")
      {
-          sprintf(tmp,"#goals: %s", goalFileName.c_str());
+          std::string tmpGoal= (projRoot/fs::path(goalFileName)).string();
+          sprintf(tmp,"#goals: %s", tmpGoal.c_str());
           Write(tmp);
      }
      if( eventFileName != "")
      {
-          sprintf(tmp,"#events: %s", eventFileName.c_str());
+          std::string tmpEvent= (projRoot/fs::path(eventFileName)).string();
+          sprintf(tmp,"#events: %s", tmpEvent.c_str());
           Write(tmp);
      }
      if( trainTimeTableFileName  != "")
      {
-          sprintf(tmp,"#trainTimeTable: %s", trainTimeTableFileName.c_str());
+          std::string tmpTTT= (projRoot/fs::path(trainTimeTableFileName)).string();
+          sprintf(tmp,"#trainTimeTable: %s", tmpTTT.c_str());
           Write(tmp);
      }
      if( trainTypeFileName  != "")
      {
-          sprintf(tmp,"#trainType: %s", trainTypeFileName.c_str());
+          std::string tmpTT= (projRoot/fs::path(trainTypeFileName)).string();
+          sprintf(tmp,"#trainType: %s", tmpTT.c_str());
           Write(tmp);
      }
      Write("#ID: the agent ID");
diff --git a/IO/IODispatcher.h b/IO/IODispatcher.h
index 9bd950bf6b5dfaa2a83dc177460be0cf06d4c799..891dd8cb6d0decec7a8d04177c068260abd8017a 100644
--- a/IO/IODispatcher.h
+++ b/IO/IODispatcher.h
@@ -33,7 +33,7 @@
 
 #include <cstring>
 #include <vector>
-
+#include <filesystem>
 extern OutputHandler* Log;
 
 class Trajectories;
diff --git a/IO/IniFileParser.cpp b/IO/IniFileParser.cpp
index 9cc4d50051128e23a803cb34fabf821997e5fe6b..5dcb084adc698dcfd9214d5405b3e54e558f1dcb 100644
--- a/IO/IniFileParser.cpp
+++ b/IO/IniFileParser.cpp
@@ -47,6 +47,9 @@
 #include "../routing/ff_router_trips/ffRouterTrips.h"
 #include "../routing/trips_router/TripsRouter.h"
 
+
+namespace fs = std::filesystem;
+
 /* https://stackoverflow.com/questions/38530981/output-compiler-version-in-a-c-program#38531037 */
 std::string ver_string(int a, int b, int c) {
       std::ostringstream ss;
@@ -95,15 +98,9 @@ bool IniFileParser::Parse(std::string iniFile)
      // and as I just realized, I called it configuration. We should be consistent here anything else
      // is confusing [gl march '16]
 
-
-
-     //extract and set the project root dir
-     size_t found = iniFile.find_last_of("/\\");
-     if (found!=std::string::npos) {
-          _config->SetProjectRootDir(iniFile.substr(0, found)+"/");
-     } else {
-          _config->SetProjectRootDir("./");
-     }
+     fs::path root(iniFile);
+     fs::path q(iniFile);
+     _config->SetProjectRootDir(fs::absolute(q.parent_path()).string());
 
      TiXmlDocument doc(iniFile);
      if (!doc.LoadFile()) {
@@ -268,8 +265,19 @@ bool IniFileParser::Parse(std::string iniFile)
                std::string tmp;
                tmp = xTrajectories->FirstChildElement("file")->Attribute(
                                                   "location");
-               if (tmp.c_str())
-                    _config->SetTrajectoriesFile(_config->GetProjectRootDir()+tmp);
+               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());
           }
diff --git a/IO/IniFileParser.h b/IO/IniFileParser.h
index fba4c4c8d15d7c1870efa7350c1d955ffd34bbbf..1454f761d740909c644ac4539a3ddc63074e6d74 100644
--- a/IO/IniFileParser.h
+++ b/IO/IniFileParser.h
@@ -23,7 +23,7 @@
 #define JPSCORE_INIFILEPARSER_H
 
 #include <string>
-
+#include <filesystem>
 #include "../general/Configuration.h"
 #include "../routing/DirectionStrategy.h"
 
diff --git a/Simulation.cpp b/Simulation.cpp
index 87508c782d0ea1986823bf4ad516e416db4a7bfc..8ea41b6107d94b9308b86c1a69713951520f0468 100644
--- a/Simulation.cpp
+++ b/Simulation.cpp
@@ -152,18 +152,31 @@ bool Simulation::InitArgs()
     }
 
     if (!_config->GetTrajectoriesFile().empty()) {
+         fs::path p(_config->GetTrajectoriesFile());
+         fs::path curr_abs_path = fs::current_path();
+         fs::path rel_path = _config->GetTrajectoriesFile();
+         fs::path combined = (curr_abs_path /= rel_path);
+         std::string traj = combined.string();
+         _config->SetTrajectoriesFile(combined);
+         if(!fs::exists(traj))
+              fs::create_directories(combined.parent_path());
+
+
         switch (_config->GetFileFormat()) {
         case FORMAT_XML_PLAIN: {
             OutputHandler* tofile = new FileHandler(
-                    _config->GetTrajectoriesFile().c_str());
+                    traj.c_str());
             Trajectories* output = new TrajectoriesJPSV05();
             output->SetOutputHandler(tofile);
             _iod->AddIO(output);
             break;
         }
         case FORMAT_PLAIN: {
+
+
+
             OutputHandler* file = new FileHandler(
-                    _config->GetTrajectoriesFile().c_str());
+                 traj.c_str());
             outputTXT = new TrajectoriesFLAT();
             outputTXT->SetOutputHandler(file);
             _iod->AddIO(outputTXT);
@@ -172,7 +185,7 @@ bool Simulation::InitArgs()
         case FORMAT_VTK: {
             Log->Write("INFO: \tFormat vtk not yet supported\n");
             OutputHandler* file = new FileHandler(
-                    (_config->GetTrajectoriesFile()+".vtk").c_str());
+                    (traj+".vtk").c_str());
             Trajectories* output = new TrajectoriesVTK();
             output->SetOutputHandler(file);
             _iod->AddIO(output);
@@ -453,12 +466,14 @@ void Simulation::PrintStatistics(double simTime)
                     goal->GetID(), goal->GetDoorUsage(),
                     goal->GetLastPassingTime());
 
-            string statsfile = "flow_exit_id_"+to_string(goal->GetID())+".txt";
+            fs::path p(_config->GetOriginalTrajectoriesFile());
+
+            string statsfile = "flow_exit_id_"+to_string(goal->GetID())+"_"+p.stem().string()+".txt";
             if(goal->GetOutflowRate() <  (std::numeric_limits<double>::max)())
             {
                  char tmp[50];
-                 sprintf(tmp, "%.2f", goal->GetOutflowRate());
-                 statsfile = "flow_exit_id_"+to_string(goal->GetID())+"_rate_"+tmp+".txt";
+                 sprintf(tmp, "%.2f_", goal->GetOutflowRate());
+                 statsfile = "flow_exit_id_"+to_string(goal->GetID())+"_rate_"+tmp+p.stem().string()+".txt";
             }
             Log->Write("More Information in the file: %s", statsfile.c_str());
             {
@@ -708,6 +723,7 @@ bool Simulation::WriteTrajectories(std::string trajectoryName)
       if(_config-> GetFileFormat() == FORMAT_PLAIN)
       {
             fs::path p = _config->GetTrajectoriesFile();
+            fs::path parent = p.parent_path();
             int sf = fs::file_size(p);
             if(sf>_maxFileSize*1024*1024)
             {
@@ -715,7 +731,8 @@ bool Simulation::WriteTrajectories(std::string trajectoryName)
                   this->incrementCountTraj();
                   char tmp_traj_name[100];
                   sprintf(tmp_traj_name,"%s_%.4d_%s", trajectoryName.c_str(), _countTraj, extention.c_str());
-                  _config->SetTrajectoriesFile(tmp_traj_name);
+                  fs::path abs_traj_name = parent/ fs::path(tmp_traj_name);
+                  _config->SetTrajectoriesFile(abs_traj_name.string());
                   Log->Write("INFO:\tNew trajectory file <%s>", tmp_traj_name);
                   OutputHandler* file = new FileHandler(_config->GetTrajectoriesFile().c_str());
                   outputTXT->SetOutputHandler(file);
@@ -770,7 +787,6 @@ bool Simulation::correctGeometry(std::shared_ptr<Building> building, std::shared
      std::cout<< KBLU << "Enter correctGeometry: Building Has " << building->GetAllTransitions().size() << " Transitions\n" << RESET;
      std::cout << "room: " << room_id << " subroom_id " << subroom_id << "\n" ;
 
-
       if(mytrack.empty() || subroom == nullptr)
             return false;
 
@@ -985,7 +1001,6 @@ bool Simulation::correctGeometry(std::shared_ptr<Building> building, std::shared
       }
       _routingEngine->setNeedUpdate(true);
      return true;
-
 }
 void Simulation::RunFooter()
 {
diff --git a/Utest/develop_tests/doors/runtest_dev_1.py b/Utest/develop_tests/doors/runtest_dev_1.py
index c327151ee4a32cea9527b9b2789cdacac6b6f14a..d2b9e1e7996ccccdacbc8687c4c74a56b1c4deab 100644
--- a/Utest/develop_tests/doors/runtest_dev_1.py
+++ b/Utest/develop_tests/doors/runtest_dev_1.py
@@ -15,7 +15,7 @@ def runtest(inifile, trajfile):
     failure = 0
     ids, outflow = get_outflow(inifile)
     for (i, o) in zip(ids, outflow):
-        filename = "flow_exit_id_%d_rate_%.2f.txt"%(i, o)
+        filename = "flow_exit_id_%d_rate_%.2f_%s.txt"%(i, o, os.path.basename(trajfile).split(".")[0])
         if not os.path.exists(filename):
             logging.info("ERROR: can not find statistics file %s"%filename)
             exit(FAILURE)
@@ -31,7 +31,7 @@ def runtest(inifile, trajfile):
         if abs(J-o) > tolerance:
             failure = 1
 
-
+    logging.info("Plot to flow.png")
     plt.savefig("flow.png")
     if failure:
         logging.info("flow from statistics files does not much expected flow from inifile")
diff --git a/general/Configuration.h b/general/Configuration.h
index 20e10dbab01a7c36ffb2bca03d3d00937b6f9038..0ed6c36f3574ffc0498c8e6ba3178a64f249c2c9 100644
--- a/general/Configuration.h
+++ b/general/Configuration.h
@@ -99,6 +99,7 @@ public:
 
           _hostname = "localhost";
           _trajectoriesFile = "trajectories.xml";
+          _originalTrajectoriesFile = "trajectories.xml";
           _errorLogFile = "log.txt";
           _projectFile = "";
           _geometryFile = "";
@@ -125,7 +126,7 @@ public:
 //          _dirSubLocal = nullptr;
 //          _dirLocal = nullptr;
           _dirStrategy = nullptr;
-	  //for random numbers
+          //for random numbers
           _rdGenerator=RandomNumberGenerator();
 
 
@@ -315,6 +316,10 @@ public:
 
      void SetTrajectoriesFile(std::string trajectoriesFile) { _trajectoriesFile = trajectoriesFile; };
 
+     const std::string& GetOriginalTrajectoriesFile() const { return _originalTrajectoriesFile; };
+
+     void SetOriginalTrajectoriesFile(std::string trajectoriesFile) { _originalTrajectoriesFile = trajectoriesFile; };
+
      const std::string& GetErrorLogFile() const { return _errorLogFile; };
 
      void SetErrorLogFile(std::string errorLogFile) { _errorLogFile = errorLogFile; };
@@ -431,6 +436,7 @@ private:
 
      std::string _hostname;
      std::string _trajectoriesFile;
+     std::string _originalTrajectoriesFile;
      std::string _errorLogFile;
      std::string _projectFile;
      std::string _geometryFile;