diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui
index f439fd44327c4c357cc97e2357ffd88b65c83828..9fbee040e233a1dc71980b849550367b3dc7ed30 100644
--- a/forms/mainwindow.ui
+++ b/forms/mainwindow.ui
@@ -631,7 +631,7 @@
     <string>Gather Room Type Data</string>
    </property>
    <property name="visible">
-    <bool>false</bool>
+    <bool>true</bool>
    </property>
   </action>
  </widget>
diff --git a/jpseditor.pro.user b/jpseditor.pro.user
index 66275b866855237ee285ed95a07f457806444f29..85856d4318764085478a1ae0eef4e9988d95d7ae 100644
--- a/jpseditor.pro.user
+++ b/jpseditor.pro.user
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 3.6.1, 2017-08-22T14:49:38. -->
+<!-- Written by QtCreator 3.6.1, 2017-09-05T11:35:16. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
diff --git a/src/AutomaticRoomIdentification/roomdefinition.cpp b/src/AutomaticRoomIdentification/roomdefinition.cpp
index e20bc0706cfa11bb4805ddebd47388b8f4485fe6..efeebace1d9bbc38d06ebbb75eac80b656dc72a6 100644
--- a/src/AutomaticRoomIdentification/roomdefinition.cpp
+++ b/src/AutomaticRoomIdentification/roomdefinition.cpp
@@ -40,6 +40,8 @@ void RoomDefinition::SetUpRoomsAndDoors()
                                     line.p2().y()};
         floorPlan.push_back(lineasVector2);
     }
+    if (floorPlan.empty())
+        return;
 
     //std::cout << "Starting" << std::endl;
     std::vector<std::list<double>> roomList = getRooms(floorPlan);
@@ -85,7 +87,7 @@ void RoomDefinition::SetUpRoomsAndDoors()
     RemoveRoomsWithoutDoors();
 
     // set contigous ids after removing outside
-    int idCounter=0;
+    int idCounter=1;
     for (jpsRoom* room:_dManager->get_roomlist())
     {
         room->set_id(idCounter);
@@ -104,8 +106,6 @@ void RoomDefinition::SetUpRoomsAndDoors()
         }
     }
 
-
-
 }
 
 void RoomDefinition::RemoveOutside()
diff --git a/src/AutomaticRoomIdentification/roomidentification.cpp b/src/AutomaticRoomIdentification/roomidentification.cpp
index 0302d18f1b44d85d1c9d425b6821170937c9befa..06995d78ef699bebd325dd68ab81585e710d0974 100644
--- a/src/AutomaticRoomIdentification/roomidentification.cpp
+++ b/src/AutomaticRoomIdentification/roomidentification.cpp
@@ -5,8 +5,10 @@
 #include <QFileDialog>
 #include <QTextStream>
 #include <numeric>
+#include <iostream>
 #include <cmath>
 
+
 RoomIdentification::RoomIdentification()
 {
 
@@ -19,13 +21,14 @@ RoomIdentification::RoomIdentification(const QList<jpsRoom *> &rooms):_rooms(roo
 
 void RoomIdentification::IdentifyRooms()
 {
+
     for (jpsRoom * room:_rooms)
     {
         if (room->GetArea()==0.0)
             room->IdentifyInnerOuter();
-        double area= room->GetArea();
-        QRectF bBox = room->CalculateBoundingBox();
-        double ratioBBoxArea=(bBox.width()*bBox.height())/area;
+        double area =  room->GetArea();
+        QRectF bBox =  room->CalculateBoundingBox();
+        double ratioBBoxArea= (bBox.width()*bBox.height())/area;
         double ratioBBox=0.0;
         if (bBox.width()<bBox.height())
             ratioBBox=bBox.width()/bBox.height();
@@ -57,12 +60,21 @@ void RoomIdentification::IdentifyRooms()
         diffNumDoors=std::fabs(numberDoors-_circRoom._meanNumDoors);
         penalty_circ+=diffNumDoors/_circRoom._stdNumDoors;
 
-
-        if (penalty_circ>penalty_common)
+        // add 2.3 to penalty_circ to increase accuracy of correct declaration. The value has been found by trial
+        if (2.3+penalty_circ>penalty_common)
+        {
             room->set_type("Office");
+            //std::cout << "Office" << std::endl;
+            //std::cout << "Circ " << penalty_circ << std::endl;
+            //std::cout << "Common " << penalty_common << std::endl;
+        }
         else
+        {
+            //std::cout << "Corridor" << std::endl;
             room->set_type("Corridor");
 
+        }
+
     }
 }
 
@@ -93,8 +105,9 @@ void RoomIdentification::GatherData()
 
         QString type = room->get_type();
 
+
         std::ofstream data;
-        std::string filename = "./Roomtypedata/roomtypedata.txt";
+        std::string filename = "roomtypedata.txt";
         data.open(filename , std::ofstream::out | std::ofstream::app);
         data << type.toStdString() << ";" << std::to_string(area) << ";"
                    << std::to_string((bBox.width()*bBox.height())/area) << ";" << std::to_string(ratioBBox) << ";"
@@ -108,7 +121,7 @@ void RoomIdentification::GatherData()
 void RoomIdentification::LoadDataFile()
 {
 
-    QString fileName="./Roomtypedata/roomtypedata.txt";
+    QString fileName="roomtypedata.txt";
     QFile file(fileName);
 
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
diff --git a/src/datamanager.cpp b/src/datamanager.cpp
index 8b6a32e88c64a46e37bf85c6ad478039afcba25b..cd61947eb57fddd92b3b4bb89a4d74ee6e3eeb51 100644
--- a/src/datamanager.cpp
+++ b/src/datamanager.cpp
@@ -40,7 +40,7 @@ jpsDatamanager::jpsDatamanager(QWidget *parent, jpsGraphicsView *view)
 {
     parent_widget=parent;
     _mView=view;
-    room_id_counter=0;
+    room_id_counter=1;
     obs_id_counter=0;
     //_frameRate=0;
     _landmarkCounter=0;
@@ -720,76 +720,34 @@ QString jpsDatamanager::RoomIDHLine(jpsLineItem *lineItem)
 
 void jpsDatamanager::writeRooms(QXmlStreamWriter *stream, QList<jpsLineItem *> &lines)
 {
-     dtrace(" Enter jpsDatamanager::writeRooms");
-    ///rooms
-    stream->writeStartElement("room");
-    stream->writeAttribute("id","0");
-    stream->writeAttribute("caption","hall");
 
-    for (int i=0; i<roomlist.size(); i++)
+     dtrace(" Enter jpsDatamanager::writeRooms");
+    // stairs
+    for (jpsRoom* room:roomlist)
     {
-        stream->writeStartElement("subroom");
-        stream->writeAttribute("id",QString::number(roomlist[i]->get_id())); // @todo:
-                                                                             // does
-                                                                             // not
-                                                                             // work
-                                                                             // with
-                                                                             // files
-                                                                             // having
-                                                                             // more
-                                                                             // than
-                                                                             // two rooms
-        stream->writeAttribute("caption",roomlist[i]->get_name());
-        stream->writeAttribute("class",roomlist[i]->get_type());
-        roomlist[i]->correctPlaneCoefficients();
-        stream->writeAttribute("A_x",QString::number(roomlist[i]->get_ax()));
-        stream->writeAttribute("B_y",QString::number(roomlist[i]->get_by()));
-        stream->writeAttribute("C_z",QString::number(roomlist[i]->get_cz()));
-        //walls
-        QList<jpsLineItem* > wallList=roomlist[i]->get_listWalls();
-        for (int j=0; j<wallList.size(); j++)
+        if (room->get_type()=="Stair")
         {
-            stream->writeStartElement("polygon");
-            stream->writeAttribute("caption","wall");
-
-            stream->writeStartElement("vertex");
-            stream->writeAttribute("px",QString::number(wallList[j]->get_line()->line().x1()));
-            stream->writeAttribute("py",QString::number(wallList[j]->get_line()->line().y1()));
-            stream->writeEndElement(); //vertex
-
-            stream->writeStartElement("vertex");
-            stream->writeAttribute("px",QString::number(wallList[j]->get_line()->line().x2()));
-            stream->writeAttribute("py",QString::number(wallList[j]->get_line()->line().y2()));
-            stream->writeEndElement(); //vertex
-
-            stream->writeEndElement(); //polygon
-
+            stream->writeStartElement("room");
+            stream->writeAttribute("id",QString::number(room->get_id()));
+            stream->writeAttribute("caption","stair");
+            writeSubRoom(stream,room,lines);
+            stream->writeStartElement("crossings");
+            stream->writeEndElement();//crossings
+            stream->writeEndElement();//room
         }
+    }
 
+    //rooms
+    stream->writeStartElement("room");
+    stream->writeAttribute("id","0");
+    stream->writeAttribute("caption","floor");
 
-        for (int k=0; k<obstaclelist.size(); k++)
+    for (int i=0; i<roomlist.size(); i++)
+    {
+        if (roomlist[i]->get_type()!="Stair")
         {
-            if (roomlist[i]==obstaclelist[k]->get_room())
-            {
-                writeObstacles(stream ,obstaclelist[k],lines);
-            }
+            writeSubRoom(stream,roomlist[i],lines);
         }
-        // if stair write up and down
-        if (roomlist[i]->get_type() == "stair"){
-             // <up>
-             stream->writeStartElement("up");
-             stream->writeAttribute("px",QString::number( roomlist[i]->get_up().x()  ));
-             stream->writeAttribute("py",QString::number( roomlist[i]->get_up().y()  ));
-             stream->writeEndElement();
-             // </up>
-             // <down>
-             stream->writeStartElement("down");
-             stream->writeAttribute("px",QString::number( roomlist[i]->get_down().x()  ));
-             stream->writeAttribute("py",QString::number( roomlist[i]->get_down().y()  ));
-             stream->writeEndElement(); 
-             // </down>
-        }
-        stream->writeEndElement();//subroom
     }// for i
 
 
@@ -802,6 +760,66 @@ void jpsDatamanager::writeRooms(QXmlStreamWriter *stream, QList<jpsLineItem *> &
     dtrace(" Leave jpsDatamanager::writeRooms");
 }
 
+void jpsDatamanager::writeSubRoom(QXmlStreamWriter *stream, jpsRoom *room, QList<jpsLineItem *> &lines)
+{
+    stream->writeStartElement("subroom");
+    stream->writeAttribute("id",QString::number(room->get_id()));
+    stream->writeAttribute("caption",room->get_name());
+    stream->writeAttribute("class",room->get_type());
+    room->correctPlaneCoefficients();
+    stream->writeAttribute("A_x",QString::number(room->get_ax()));
+    stream->writeAttribute("B_y",QString::number(room->get_by()));
+    stream->writeAttribute("C_z",QString::number(room->get_cz()));
+    //walls
+    QList<jpsLineItem* > wallList=room->get_listWalls();
+    for (int j=0; j<wallList.size(); ++j)
+    {
+        stream->writeStartElement("polygon");
+        stream->writeAttribute("caption","wall");
+
+        stream->writeStartElement("vertex");
+        stream->writeAttribute("px",QString::number(wallList[j]->get_line()->line().x1()));
+        stream->writeAttribute("py",QString::number(wallList[j]->get_line()->line().y1()));
+        stream->writeEndElement(); //vertex
+
+        stream->writeStartElement("vertex");
+        stream->writeAttribute("px",QString::number(wallList[j]->get_line()->line().x2()));
+        stream->writeAttribute("py",QString::number(wallList[j]->get_line()->line().y2()));
+        stream->writeEndElement(); //vertex
+
+        stream->writeEndElement(); //polygon
+
+        //remove wall from lines
+        lines.removeOne(wallList[j]);
+
+    }
+
+
+    for (int k=0; k<obstaclelist.size(); k++)
+    {
+        if (room==obstaclelist[k]->get_room())
+        {
+            writeObstacles(stream ,obstaclelist[k],lines);
+        }
+    }
+    // if stair write up and down
+    if (room->get_type() == "Stair"){
+         // <up>
+         stream->writeStartElement("up");
+         stream->writeAttribute("px",QString::number( room->get_up().x()  ));
+         stream->writeAttribute("py",QString::number( room->get_up().y()  ));
+         stream->writeEndElement();
+         // </up>
+         // <down>
+         stream->writeStartElement("down");
+         stream->writeAttribute("px",QString::number( room->get_down().x()  ));
+         stream->writeAttribute("py",QString::number( room->get_down().y()  ));
+         stream->writeEndElement();
+         // </down>
+    }
+    stream->writeEndElement();//subroom
+}
+
 void jpsDatamanager::AutoSaveRooms(QXmlStreamWriter *stream, QList<jpsLineItem *> &lines)
 {
      dtrace("Enter jpsDatamanager::AutoSaveRooms");
@@ -863,10 +881,10 @@ void jpsDatamanager::AutoSaveRooms(QXmlStreamWriter *stream, QList<jpsLineItem *
 
         stream->writeEndElement();//subroom
     }
-    /// Not assigned lines
+    // Not assigned lines
     writeNotAssignedWalls(stream,lines);
 
-    ///Crossings
+    //Crossings
     writeCrossings(stream,lines);
     writeNotAssignedDoors(stream,lines);
     stream->writeEndElement();//crossings
@@ -881,7 +899,7 @@ void jpsDatamanager::writeCrossings(QXmlStreamWriter *stream, QList<jpsLineItem
     stream->writeStartElement("crossings");
     for (int i=0; i<crossingList.size(); i++)
     {
-        if (crossingList[i]->IsExit()==false)
+        if (crossingList[i]->IsExit()==false && crossingList[i]->get_roomList()[0]->get_type()!="Stair" && crossingList[i]->get_roomList()[1]->get_type()!="Stair")
         {
             stream->writeStartElement("crossing");
             stream->writeAttribute("id",QString::number(i));
@@ -907,7 +925,16 @@ void jpsDatamanager::writeCrossings(QXmlStreamWriter *stream, QList<jpsLineItem
         else
         {
             this->new_exit(crossingList[i]->get_cLine());
-            exitList.back()->add_rooms(crossingList[i]->get_roomList()[0]);
+            if (crossingList[i]->get_roomList().size()>1)
+            {
+                // mention stair id first
+                if (crossingList[i]->get_roomList()[0]->get_type()=="Stair")
+                    exitList.back()->set_rooms(crossingList[i]->get_roomList()[0], crossingList[i]->get_roomList()[1]);
+                else
+                    exitList.back()->set_rooms(crossingList[i]->get_roomList()[1], crossingList[i]->get_roomList()[0]);
+            }
+            else
+                exitList.back()->set_rooms(crossingList[i]->get_roomList()[0]);
         }
         lines.removeOne(crossingList[i]->get_cLine());
     }
@@ -917,17 +944,41 @@ void jpsDatamanager::writeCrossings(QXmlStreamWriter *stream, QList<jpsLineItem
 void jpsDatamanager::writeTransitions(QXmlStreamWriter *stream, QList<jpsLineItem *> &lines)
 {
     dtrace("Enter jpsDatamanager::writeTransitions");
-    for (int i=0; i<exitList.size(); i++)
+    for (int i=0; i<exitList.size(); ++i)
     {
         stream->writeStartElement("transition");
 
         stream->writeAttribute("id",QString::number(i));
         stream->writeAttribute("caption","NaN");
         stream->writeAttribute("type","NaN");
-        stream->writeAttribute("room1_id","0");
-        stream->writeAttribute("subroom1_id",QString::number(exitList[i]->get_roomList()[0]->get_id()));
-        stream->writeAttribute("room2_id","-1");
-        stream->writeAttribute("subroom2_id","-1");
+        // transition to stair
+        if (exitList[i]->get_roomList().size()==1 && exitList[i]->get_roomList()[0]->get_type()=="Stair")
+        {
+            //stair id
+            stream->writeAttribute("room1_id",QString::number(exitList[i]->get_roomList()[0]->get_id()));
+            stream->writeAttribute("subroom1_id",QString::number(exitList[i]->get_roomList()[0]->get_id()));
+            //floor id
+            stream->writeAttribute("room2_id","-1");
+            stream->writeAttribute("subroom2_id","-1");
+        }
+        else if (exitList[i]->get_roomList().size()==2)
+        {
+            //stair id
+            stream->writeAttribute("room1_id",QString::number(exitList[i]->get_roomList()[0]->get_id()));
+            stream->writeAttribute("subroom1_id",QString::number(exitList[i]->get_roomList()[0]->get_id()));
+            //floor id
+            stream->writeAttribute("room2_id","0");
+            stream->writeAttribute("subroom2_id",QString::number(exitList[i]->get_roomList()[1]->get_id()));
+        }
+        else
+        {
+            //floor id
+            stream->writeAttribute("room1_id","0");
+            stream->writeAttribute("subroom1_id",QString::number(exitList[i]->get_roomList()[0]->get_id()));
+            //outside
+            stream->writeAttribute("room2_id","-1");
+            stream->writeAttribute("subroom2_id","-1");
+        }
         stream->writeStartElement("vertex");
         stream->writeAttribute("px",QString::number(exitList[i]->get_cLine()->get_line()->line().x1()));
         stream->writeAttribute("py",QString::number(exitList[i]->get_cLine()->get_line()->line().y1()));
diff --git a/src/datamanager.h b/src/datamanager.h
index dbde33ac5e94acebb1548e33a00dd89201c71567..f8209fa66fa47646b835e0c8085896b3380e3590 100644
--- a/src/datamanager.h
+++ b/src/datamanager.h
@@ -136,6 +136,7 @@ public:
     void writeHLines(QXmlStreamWriter *stream, QList<jpsLineItem* >& hLines);
     QString RoomIDHLine(jpsLineItem* lineItem);
     void writeRooms(QXmlStreamWriter *stream, QList<jpsLineItem* >& lines);
+    void writeSubRoom(QXmlStreamWriter *stream, jpsRoom* room, QList<jpsLineItem* >& lines);
     void AutoSaveRooms(QXmlStreamWriter *stream, QList<jpsLineItem* >& lines);
     void writeCrossings(QXmlStreamWriter *stream, QList<jpsLineItem* >& lines);
     void writeTransitions(QXmlStreamWriter *stream, QList<jpsLineItem* >& lines);
diff --git a/src/jpsexit.cpp b/src/jpsexit.cpp
index 7e60f21d0a9d812dde7adab74aa88f34575e4c0e..d87a71baf4941ad48c7f168dda1cab7947701e0a 100644
--- a/src/jpsexit.cpp
+++ b/src/jpsexit.cpp
@@ -76,7 +76,7 @@ void jpsExit::set_type(QString type)
     _type=type;
 }
 
-void jpsExit::add_rooms(jpsRoom *room1, jpsRoom *room2)
+void jpsExit::set_rooms(jpsRoom *room1, jpsRoom *room2)
 {
     roomList.clear();
     roomList.push_back(room1);
diff --git a/src/jpsexit.h b/src/jpsexit.h
index f8ab0f33d485675b96a09a6a324677e4e04c0146..2945066c6a7bb0e19d926e2000c47b0de5b0aea9 100644
--- a/src/jpsexit.h
+++ b/src/jpsexit.h
@@ -44,7 +44,7 @@ public:
     int get_id();
     void set_id(int id);
     void set_type(QString type);
-    void add_rooms(jpsRoom* room1, jpsRoom* room2=0L);
+    void set_rooms(jpsRoom* room1, jpsRoom* room2=nullptr);
 
 private:
     QList<jpsRoom *> roomList;
diff --git a/src/mainWindow.cpp b/src/mainWindow.cpp
index 57a2cd1c7ea5bbfc8527b57d6ba84184129c10b4..0190065e2a66e82293e003bcb8a036a2c07febcd 100644
--- a/src/mainWindow.cpp
+++ b/src/mainWindow.cpp
@@ -403,11 +403,11 @@ void MWindow::saveFile(){
     if (fileName.isEmpty()) return;
     QFile file(fileName);
 
-    QString fileNameLines=fileName.split(".").first()+"_lines.xml";
+    //QString fileNameLines=fileName.split(".").first()+"_lines.xml";
 
-    QFile LinesFile(fileNameLines);
-    if (LinesFile.open(QIODevice::WriteOnly|QIODevice::Text))
-        dmanager->writeLineItems(LinesFile);
+    //QFile LinesFile(fileNameLines);
+    //if (LinesFile.open(QIODevice::WriteOnly|QIODevice::Text))
+    //    dmanager->writeLineItems(LinesFile);
 
     if(file.open(QIODevice::WriteOnly|QIODevice::Text))
     {
diff --git a/src/roomwidget.cpp b/src/roomwidget.cpp
index a8fc05f069376c6cdf9bad93e39aa070c3bef2c4..222bdea2fb205f2c545cd33c599133ef9a9b80c0 100644
--- a/src/roomwidget.cpp
+++ b/src/roomwidget.cpp
@@ -1019,14 +1019,6 @@ void roomWidget::ChangeRoomType()
 
 void roomWidget::StartAutoDef()
 {
-    //for (jpsRoom* room:datamanager->get_roomlist())
-    //{
-     //   room->IdentifyInnerOuter();
-    //    room->CalculateBoundingBox();
-  //      room->GatherData();
-//
-    //}
-
 
     _roomDef = new RoomDefinition(graphview->get_line_vector(),datamanager);
     _roomDef->SetUpRoomsAndDoors();
@@ -1034,10 +1026,10 @@ void roomWidget::StartAutoDef()
     _roomDef=nullptr;
 
 
-    //RoomIdentification roomIdent(datamanager->get_roomlist());
-    //roomIdent.LoadDataFile();
-    //roomIdent.CalcMeansAndStds();
-    //roomIdent.IdentifyRooms();
+    RoomIdentification roomIdent(datamanager->get_roomlist());
+    roomIdent.LoadDataFile();
+    roomIdent.CalcMeansAndStds();
+    roomIdent.IdentifyRooms();