diff --git a/src/geometry/Building.cpp b/src/geometry/Building.cpp
index a3b5d42a9aa911569fe7471717277303445f214a..9917f889a60024807ec7796fb1c625779b5f7444 100644
--- a/src/geometry/Building.cpp
+++ b/src/geometry/Building.cpp
@@ -577,63 +577,51 @@ bool Building::LoadGeometry(const std::string &geometryfile)
      // all rooms are read, now proceed with transitions
      TiXmlNode*  xTransNode = xRootNode->FirstChild("transitions");
      if(xTransNode)
+     {
+
           for(TiXmlElement* xTrans = xTransNode->FirstChildElement("transition"); xTrans;
-                    xTrans = xTrans->NextSiblingElement("transition")) {
+              xTrans = xTrans->NextSiblingElement("transition")) {
 
-               int id = xmltoi(xTrans->Attribute("id"), -1);
-               // string caption = "door " + id;
-               string caption = "door ";
-               caption += to_string(id);
-               caption = xmltoa(xTrans->Attribute("caption"), caption.c_str());
-               int room1_id = xmltoi(xTrans->Attribute("room1_id"), -1);
-               int room2_id = xmltoi(xTrans->Attribute("room2_id"), -1);
-               int subroom1_id = xmltoi(xTrans->Attribute("subroom1_id"), -1);
-               int subroom2_id = xmltoi(xTrans->Attribute("subroom2_id"), -1);
-               string type = xmltoa(xTrans->Attribute("type"), "normal");
-
-               double x1 = xmltof(     xTrans->FirstChildElement("vertex")->Attribute("px"));
-               double y1 = xmltof(     xTrans->FirstChildElement("vertex")->Attribute("py"));
-
-               double x2 = xmltof(     xTrans->LastChild("vertex")->ToElement()->Attribute("px"));
-               double y2 = xmltof(     xTrans->LastChild("vertex")->ToElement()->Attribute("py"));
-
-
-               Transition* t = new Transition();
-               t->SetID(id);
-               t->SetCaption(caption);
-               t->SetPoint1(Point(x1, y1));
-               t->SetPoint2(Point(x2, y2));
-               t->SetType(type);
-
-               if (room1_id != -1 && subroom1_id != -1) {
-                    //Room* room = _rooms[room1_id];
-                    Room* room = GetRoom(room1_id);
-                    SubRoom* subroom = room->GetSubRoom(subroom1_id);
-
-                    //subroom->AddGoalID(t->GetUniqueID());
-                    //MPI
-                    room->AddTransitionID(t->GetUniqueID());
-                    t->SetRoom1(room);
-                    t->SetSubRoom1(subroom);
-
-                    //new implementation
-                    subroom->AddTransition(t);
+               parseTransition(xTrans);
+               AddTransition(t);
+          }
+// ------ file
+          TiXmlNode * xNodeFile = xTransNode->FirstChild("file");
+          if(xNodeFile)
+          {
+               std::string transFilename = xNodeFile->FirstChild()->ValueStr();
+               Log->Write("INFO:\tParsing transition from file <%s>", transFilename.c_str());
+               TiXmlDocument docTrans(transFilename);
+               if (!docTrans.LoadFile()) {
+                    Log->Write("ERROR: \t%s", docTrans.ErrorDesc());
+                    Log->Write("ERROR: \t could not parse the transitions file.");
+                    return false;
                }
-               if (room2_id != -1 && subroom2_id != -1) {
-                    auto&& room = _rooms[room2_id];
-                    SubRoom* subroom = room->GetSubRoom(subroom2_id);
-                    //subroom->AddGoalID(t->GetUniqueID());
-                    //MPI
-                    room->AddTransitionID(t->GetUniqueID());
-                    t->SetRoom2(room.get());
-                    t->SetSubRoom2(subroom);
-
-                    //new implementation
-                    subroom->AddTransition(t);
+               TiXmlElement* xRootNodeTrans = docTrans.RootElement();
+               if (!xRootNodeTrans) {
+                    Log->Write("ERROR:\tRoot element does not exist in transitions file.");
+                    return false;
+               }
+               if (xRootNodeTrans->ValueStr() != "JPScore") {
+                    Log->Write("ERROR:\tParsing transitions file. Root element value is not 'JPScore'.");
+                    return false;
+               }
+               TiXmlNode* xTransNodeFile = xRootNodeTrans->FirstChild("transitions");
+               if (!xTransNodeFile) {
+                    Log->Write("ERROR:\tNo Transitions in file found.");
+                    return false;
+               }
+               for (TiXmlElement* xTrans = xTransNodeFile->FirstChildElement("transition"); xTrans;
+                    xTrans = xTrans->NextSiblingElement("transition")) {
+                    Transition * t = parseTransitionNode(xTrans, building);
+                    building->AddTransition(t);
                }
-
-               AddTransition(t);
           }
+          else{
+               Log->Write("INFO:\tNot parsing transition from file %s");
+          }
+
+     }
 
      Debug::Messages("Loading building file successful!!!\n");
 
@@ -642,6 +630,63 @@ bool Building::LoadGeometry(const std::string &geometryfile)
 }
 
 
+Transition* Building::ParseTransition(TiXmlElement * xTrans)
+{
+
+     int id = xmltoi(xTrans->Attribute("id"), -1);
+     // string caption = "door " + id;
+     string caption = "door ";
+     caption += to_string(id);
+     caption = xmltoa(xTrans->Attribute("caption"), caption.c_str());
+     int room1_id = xmltoi(xTrans->Attribute("room1_id"), -1);
+     int room2_id = xmltoi(xTrans->Attribute("room2_id"), -1);
+     int subroom1_id = xmltoi(xTrans->Attribute("subroom1_id"), -1);
+     int subroom2_id = xmltoi(xTrans->Attribute("subroom2_id"), -1);
+     string type = xmltoa(xTrans->Attribute("type"), "normal");
+
+     double x1 = xmltof(     xTrans->FirstChildElement("vertex")->Attribute("px"));
+     double y1 = xmltof(     xTrans->FirstChildElement("vertex")->Attribute("py"));
+
+     double x2 = xmltof(     xTrans->LastChild("vertex")->ToElement()->Attribute("px"));
+     double y2 = xmltof(     xTrans->LastChild("vertex")->ToElement()->Attribute("py"));
+
+
+     Transition* t = new Transition();
+     t->SetID(id);
+     t->SetCaption(caption);
+     t->SetPoint1(Point(x1, y1));
+     t->SetPoint2(Point(x2, y2));
+     t->SetType(type);
+
+     if (room1_id != -1 && subroom1_id != -1) {
+          //Room* room = _rooms[room1_id];
+          Room* room = GetRoom(room1_id);
+          SubRoom* subroom = room->GetSubRoom(subroom1_id);
+
+          //subroom->AddGoalID(t->GetUniqueID());
+          //MPI
+          room->AddTransitionID(t->GetUniqueID());
+          t->SetRoom1(room);
+          t->SetSubRoom1(subroom);
+
+          //new implementation
+          subroom->AddTransition(t);
+     }
+     if (room2_id != -1 && subroom2_id != -1) {
+          auto&& room = _rooms[room2_id];
+          SubRoom* subroom = room->GetSubRoom(subroom2_id);
+          //subroom->AddGoalID(t->GetUniqueID());
+          //MPI
+          room->AddTransitionID(t->GetUniqueID());
+          t->SetRoom2(room.get());
+          t->SetSubRoom2(subroom);
+
+          //new implementation
+          subroom->AddTransition(t);
+     }
+     return t;
+}
+
 void Building::WriteToErrorLog() const
 {
      Log->Write("GEOMETRY: ");