diff --git a/JPSvis.pro b/JPSvis.pro
index 924daac5dcaee8834f1fc9c071b0eb6ada7be40b..da3e562e547664a96fb0660b739bbeec107ce6b8 100644
--- a/JPSvis.pro
+++ b/JPSvis.pro
@@ -601,7 +601,8 @@ HEADERS += src/geometry/Building.h \
     src/network/TraVisToServer.h \
     src/MainWindow.h \
     src/TrailPlotter.h  \
-    src/fix/osx_thread_fix.mm
+    src/fix/osx_thread_fix.mm \
+    src/geometry/GeometryFactory.h
 
 SOURCES += src/geometry/Building.cpp \
     src/geometry/Crossing.cpp \
@@ -643,7 +644,8 @@ SOURCES += src/geometry/Building.cpp \
     src/geometry/PointPlotter.cpp \
     src/network/TraVisToServer.cpp \
     src/MainWindow.cpp \
-    src/TrailPlotter.cpp
+    src/TrailPlotter.cpp \
+    src/geometry/GeometryFactory.cpp
 
 FORMS += forms/settings.ui \
     forms/mainwindow.ui
diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui
index 6397f294d7cad1d58910691b9cc5bbc98ee616f6..21186d13457f8dc8680e207fdd78cdd97dbced63 100644
--- a/forms/mainwindow.ui
+++ b/forms/mainwindow.ui
@@ -634,6 +634,7 @@ border-color: rgb(255, 255, 255);</string>
     <addaction name="separator"/>
     <addaction name="actionShow_Onscreen_Infos"/>
     <addaction name="separator"/>
+    <addaction name="actionShowGeometry_Structure"/>
    </widget>
    <widget class="QMenu" name="menuTools">
     <property name="title">
@@ -1304,6 +1305,20 @@ border-color: rgb(255, 255, 255);</string>
     <string>Remember Settings</string>
    </property>
   </action>
+  <action name="actionShowGeometry_Structure">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Show Geometry Structure</string>
+   </property>
+   <property name="toolTip">
+    <string>Display the structure of the geometry </string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+G</string>
+   </property>
+  </action>
  </widget>
  <resources>
   <include location="icons.qrc"/>
@@ -1359,7 +1374,7 @@ border-color: rgb(255, 255, 255);</string>
   </connection>
   <connection>
    <sender>BtFullscreen</sender>
-   <signal>clicked(bool)</signal>
+   <signal>toggled(bool)</signal>
    <receiver>mainwindow</receiver>
    <slot>slotFullScreen(bool)</slot>
    <hints>
@@ -2141,6 +2156,22 @@ border-color: rgb(255, 255, 255);</string>
     </hint>
    </hints>
   </connection>
+  <connection>
+   <sender>actionShowGeometry_Structure</sender>
+   <signal>triggered()</signal>
+   <receiver>mainwindow</receiver>
+   <slot>slotShowGeometryStructure()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>-1</x>
+     <y>-1</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>224</x>
+     <y>199</y>
+    </hint>
+   </hints>
+  </connection>
  </connections>
  <slots>
   <slot>slotHelpAbout()</slot>
@@ -2204,5 +2235,6 @@ border-color: rgb(255, 255, 255);</string>
   <slot>slotChangeNavLinesColor()</slot>
   <slot>slotShowHideFloor()</slot>
   <slot>slotChangeFloorColor()</slot>
+  <slot>slotShowGeometryStructure()</slot>
  </slots>
 </ui>
diff --git a/src/Frame.cpp b/src/Frame.cpp
index 8d75c2a72a3a65877a03df2d06a3c1d7f8718057..9aba040823a6ebf407111958ed2b45cc7d2242c4 100644
--- a/src/Frame.cpp
+++ b/src/Frame.cpp
@@ -51,12 +51,10 @@ Frame::Frame(int id)
 {
     _elementCursor=0;
     _id=id;
-    //_polydata = vtkPolyData::New();
     _polydata2D = vtkPolyData::New();
     _polydata3D = vtkPolyData::New();
     _framePoints.reserve(1500);
 }
-
 Frame::~Frame()
 {
     while (!_framePoints.empty()) {
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index e0e97fc0fe5db21d18e464cbe3f661b12983e3a5..fe3af9a322bd6dacefbd23a41d06ee87cf93990e 100755
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -7,12 +7,12 @@
  * @section LICENSE
  * This file is part of OpenPedSim.
  *
- * OpenPedSim is free software: you can redistribute it and/or modify
+ * JuPedSim is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation, either version 3 of the License, or
  * any later version.
  *
- * OpenPedSim is distributed in the hope that it will be useful,
+ * JuPedSim is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  * GNU General Public License for more details.
@@ -62,6 +62,12 @@
 #include <QDebug>
 #include <QtXml>
 #include <QTemporaryFile>
+#include <QListView>
+#include <QFileSystemModel>
+#include <QTableView>
+#include <QSplitter>
+#include <QStandardItemModel>
+
 
 #include <iostream>
 #include <limits>
@@ -151,6 +157,10 @@ MainWindow::MainWindow(QWidget *parent) :
     QObject::connect(this, SIGNAL(signal_controlSequence(QString)),
                      travistoOptions, SLOT(slotControlSequence(QString)));
 
+
+    QObject::connect(&visualisationThread->getGeometry().GetModel(),
+                     SIGNAL(itemChanged(QStandardItem*)),this,SLOT(slotOnGeometryItemChanged(QStandardItem*)));
+
     isPlaying = false;
     isPaused = false;
     numberOfDatasetLoaded=0;
@@ -449,14 +459,14 @@ bool MainWindow::slotLoadFile()
 }
 
 // This function is only used in online Mode
-FacilityGeometry* MainWindow::parseGeometry(QDomNode geoNode)
+void MainWindow::parseGeometry(const QDomNode &geoNode)
 {
     cout<<"parsing the geo"<<endl;
-    if(geoNode.isNull()) return NULL;
+    if(geoNode.isNull()) return ;
 
     //check if there is a tag 'file' there in
     QString fileName = geoNode.toElement().elementsByTagName("file").item(0).toElement().attribute("location");
-    FacilityGeometry* geometry = visualisationThread->getGeometry();
+    auto&& geometry = visualisationThread->getGeometry();
 
     if(!fileName.isEmpty()) {
         if (fileName.endsWith(".xml",Qt::CaseInsensitive)) {
@@ -482,11 +492,11 @@ FacilityGeometry* MainWindow::parseGeometry(QDomNode geoNode)
         //must not be a file name
         SaxParser::parseGeometryTRAV(fileName,geometry,geoNode);
     }
-    return geometry;
+    //return geometry;
 }
 
 // This function is only used in online Mode
-FacilityGeometry* MainWindow::parseGeometry(QString geometryString)
+void MainWindow::parseGeometry(const QString& geometryString)
 {
 
     //    QDomDocument doc("");
@@ -524,7 +534,7 @@ FacilityGeometry* MainWindow::parseGeometry(QString geometryString)
 
     //cout<<"filename: "<<geofileName.toStdString()<<endl;exit(0);
 
-    FacilityGeometry* geometry = visualisationThread->getGeometry();
+    auto&& geometry = visualisationThread->getGeometry();
 
 
 
@@ -553,7 +563,7 @@ FacilityGeometry* MainWindow::parseGeometry(QString geometryString)
 
     //delete the file
     file.remove();
-    return geometry;
+
 }
 
 // TODO: still used?
@@ -649,7 +659,7 @@ bool MainWindow::addPedestrianGroup(int groupID,QString fileName)
     SystemSettings::setFilenamePrefix(QFileInfo ( fileName ).baseName()+"_");
 
     //the geometry actor
-    FacilityGeometry* geometry = visualisationThread->getGeometry();
+    auto&& geometry = visualisationThread->getGeometry();
 
     //try to get a geometry filename
     QString geometry_file=SaxParser::extractGeometryFilename(fileName);
@@ -713,9 +723,6 @@ bool MainWindow::addPedestrianGroup(int groupID,QString fileName)
     }
 
     //no other geometry format was detected
-    if(geometry==NULL)
-        geometry=new FacilityGeometry();
-
     double frameRate=15; //default frame rate
     statusBar()->showMessage(tr("parsing the file"));
 
@@ -726,7 +733,7 @@ bool MainWindow::addPedestrianGroup(int groupID,QString fileName)
         QXmlInputSource source(&file);
         QXmlSimpleReader reader;
 
-        SaxParser handler(geometry,dataset,&frameRate);
+        SaxParser handler(geometry,*dataset,&frameRate);
         reader.setContentHandler(&handler);
         reader.parse(source);
         file.close();
@@ -743,7 +750,7 @@ bool MainWindow::addPedestrianGroup(int groupID,QString fileName)
     // set the visualisation window title
     visualisationThread->setWindowTitle(fileName);
     visualisationThread->slotSetFrameRate(frameRate);
-    visualisationThread->setGeometry(geometry);
+    //visualisationThread->setGeometry(geometry);
     //visualisationThread->setWindowTitle(caption);
     labelFrameNumber->setText("fps: " + frameRateStr+"/"+frameRateStr);
 
@@ -807,9 +814,7 @@ void MainWindow::slotSetOfflineMode(bool status)
         ui.actionOnline->setChecked(true);
         extern_offline_mode = false;
         labelMode->setText(" Online ");
-
     }
-
 }
 
 void MainWindow::slotSetOnlineMode(bool status)
@@ -1326,10 +1331,9 @@ void MainWindow::slotStartVisualisationThread(QString data,int numberOfAgents,fl
     }
 
     //FacilityGeometry *geo = parseGeometry(geoNode);
-    FacilityGeometry *geo = parseGeometry(data);
-
+    parseGeometry(data);
     visualisationThread->slotSetFrameRate(frameRate);
-    visualisationThread->setGeometry(geo);
+    //visualisationThread->setGeometry(geo);
     visualisationThread->start();
 
     //enable some buttons
@@ -1841,3 +1845,74 @@ void MainWindow::slotShowHideGeometryCaptions()
     //SystemSettings::setShowCaptions(value);
     //SystemSettings::setOnScreenInfos(value);
 }
+
+void MainWindow::slotShowGeometryStructure()
+{
+    //QListView list;
+    _geoStructure.setWindowTitle("Geometry structure");
+    _geoStructure.setVisible(! _geoStructure.isVisible());
+    _geoStructure.show();
+    visualisationThread->getGeometry().RefreshView();
+    _geoStructure.setModel(&visualisationThread->getGeometry().GetModel());
+    cout<<"showing the list"<<endl;
+
+
+    /*
+     QFileSystemModel *model = new QFileSystemModel;
+     model->setRootPath(QDir::currentPath());
+     QTreeView *tree = new QTreeView(&_splitter);
+     tree->setModel(model);
+     _splitter.show();
+*/
+
+    /*
+     QTreeView *tree = new QTreeView(&_splitter);
+     QListView *list = new QListView();
+     QTableView *table = new QTableView();
+
+
+     _splitter.addWidget( tree );
+     _splitter.addWidget( list );
+     _splitter.addWidget( table );
+
+     QStandardItemModel* model = new QStandardItemModel( 5, 2 );
+
+     for( int r=0; r<5; r++ )
+         for( int c=0; c<2; c++)
+         {
+             QStandardItem *item = new QStandardItem( QString("Row:%0, Column:%1").arg(r).arg(c) );
+             item->setCheckable(true);
+
+             if( c == 0 )
+                 for( int i=0; i<3; i++ )
+                 {
+                     QStandardItem *child = new QStandardItem( QString("Item %0").arg(i) );
+                     child->setEditable( false );
+                     child->setCheckable(true);
+                     item->appendRow( child );
+                     cout<<"adding"<<endl;
+                 }
+
+             model->setItem(r, c, item);
+         }
+
+     model->setHorizontalHeaderItem( 0, new QStandardItem( "Foo" ) );
+     model->setHorizontalHeaderItem( 1, new QStandardItem( "Bar-Baz" ) );
+
+     tree->setModel( model );
+     list->setModel( model );
+     table->setModel( model );
+
+     list->setSelectionModel( tree->selectionModel() );
+     table->setSelectionModel( tree->selectionModel() );
+
+     table->setSelectionBehavior( QAbstractItemView::SelectRows );
+     table->setSelectionMode( QAbstractItemView::SingleSelection );
+     _splitter.show();
+*/
+}
+
+void MainWindow::slotOnGeometryItemChanged( QStandardItem *item)
+{
+    cout<<"triggered"<<endl;
+}
diff --git a/src/MainWindow.h b/src/MainWindow.h
index 7cffd303d463dfb56e7a7f1fadf56e3b334a162f..a2df0c2bad98a2504785412c94a33a14e61fa0f2 100644
--- a/src/MainWindow.h
+++ b/src/MainWindow.h
@@ -37,6 +37,10 @@
 #include "ui_mainwindow.h"
 #include <QMainWindow>
 #include <QSettings>
+#include <QSplitter>
+#include <QTreeView>
+#include <QStandardItem>
+#include <QTreeWidget>
 
 #include <vector>
 
@@ -47,6 +51,7 @@ class ThreadVisualisation;
 class QString;
 class QDomNode;
 class FacilityGeometry;
+class GeometryFactory;
 class Building;
 class Message;
 class Settings;
@@ -236,6 +241,11 @@ public Q_SLOTS:
     /// information include Time and pedestrians left in the facility
     void slotShowOnScreenInfos();
 
+    ///show the detailed structure of the geometry
+    void slotShowGeometryStructure();
+
+    void slotOnGeometryItemChanged(QStandardItem *item);
+
 private:
 Q_SIGNALS:
     void signal_controlSequence(QString);
@@ -264,8 +274,8 @@ private:
 
     /// parse the geometry  Node and return a pointer to geometry object
     /// used in online mode only
-    FacilityGeometry* parseGeometry(QDomNode geoNode);
-    FacilityGeometry* parseGeometry(QString geometryString);
+    void parseGeometry(const QDomNode& geoNode);
+    void parseGeometry(const QString &geometryString);
 
     /**
      * parse a shape node and get the initials heights and colors of pedestrians.
@@ -317,6 +327,10 @@ private:
     QLabel *labelFrameNumber;
     QLabel *labelRecording;
     QLabel *labelMode;
+    QSplitter _splitter;
+    //QTreeWidget _geoStructure;
+    QTreeView _geoStructure;
+
 };
 
 #endif // TRAVISTO_H
diff --git a/src/SaxParser.cpp b/src/SaxParser.cpp
index 9b3631cf4fc7e91942b4aba0e0c01ca4abe205d4..01ef8bc3431a0176f492fd3d6ace6a1575fe24be 100644
--- a/src/SaxParser.cpp
+++ b/src/SaxParser.cpp
@@ -37,6 +37,8 @@
 #include "geometry/JPoint.h"
 #include "geometry/FacilityGeometry.h"
 #include "geometry/Building.h"
+#include "geometry/GeometryFactory.h"
+
 #include "geometry/Wall.h"
 #include "geometry/SubRoom.h"
 
@@ -79,15 +81,17 @@ using namespace std;
  * @param roomCaption
  * @return
  */
-SaxParser::SaxParser(FacilityGeometry* geo, SyncData* data, double* fps)
+SaxParser::SaxParser(GeometryFactory& geoFac, SyncData& dataset, double * fps):_geoFactory(geoFac),_dataset(dataset)
 {
-    _geometry=geo;
-    _dataset=data;
     _para=fps;
     _parsingWalls=false;
     _parsingCrossings=false;
     _color=0.0;
-    _dataset->clearFrames();
+    _dataset.clearFrames();
+
+    _geometry = std::shared_ptr<FacilityGeometry>(new FacilityGeometry("No name"));
+    _geoFactory.AddElement(-1,-1,_geometry);
+
     //default header
     InitHeader(0,0,0);
 }
@@ -134,16 +138,16 @@ bool SaxParser::startElement(const QString & /* namespaceURI */,
                     if(fileName.endsWith(".xml",Qt::CaseInsensitive)) {
                         //SaxParser::parseGeometryJPS(fileName,geometry);
                     } else if (fileName.endsWith(".trav",Qt::CaseInsensitive)) {
-                        SaxParser::parseGeometryTRAV(fileName,_geometry);
+                        SaxParser::parseGeometryTRAV(fileName,_geoFactory);
                     }
                 }
             }
         }
     } else if (qName == "floor") {
         double xMin=0,
-               xMax=0,
-               yMin=0,
-               yMax=0;
+                xMax=0,
+                yMin=0,
+                yMax=0;
 
         for(int i=0; i<at.length(); i++) {
             if(at.localName(i)=="xMin") {
@@ -160,7 +164,7 @@ bool SaxParser::startElement(const QString & /* namespaceURI */,
         _geometry->addFloor(xMin,yMin,xMax,yMax);
     } else if (qName == "cuboid") {
         double length=0, height=0,
-               width=0, color=0;
+                width=0, color=0;
         double center[3]= {0,0,0};
 
         for(int i=0; i<at.length(); i++) {
@@ -249,8 +253,14 @@ bool SaxParser::startElement(const QString & /* namespaceURI */,
     } else if (qName == "agents") {
     } else if (qName == "roomCaption") {
     } else if (qName == "frameRate") {
-    } else if (qName == "geometry") {
-    } else if (qName == "wall") {
+    } else if (qName == "geometry")
+    {
+        //cout<<"geo tag found"<<endl;
+        //_geometry = std::shared_ptr<FacilityGeometry>(new FacilityGeometry("No name"));
+        //_geoFactory.AddElement(0,0,_geometry);
+
+    }
+    else if (qName == "wall") {
         _parsingWalls=true;
         _thickness=15;
         _height=250;
@@ -495,7 +505,7 @@ bool SaxParser::endElement(const QString & /* namespaceURI */,
     if (qName == "header") {
 
     } else if (qName == "agents") {
-        _dataset->setNumberOfAgents(_currentText.toInt());
+        _dataset.setNumberOfAgents(_currentText.toInt());
     } else if (qName == "frameRate") {
         _para[0]=_currentText.toFloat();
     } else if (qName == "wall") {
@@ -537,7 +547,7 @@ bool SaxParser::endElement(const QString & /* namespaceURI */,
         //compute the polydata, might increase the runtime
         frame->ComputePolyData();
 
-        _dataset->addFrame(frame);
+        _dataset.addFrame(frame);
         //to be on the safe side
         _currentFrame.clear();
 
@@ -545,8 +555,8 @@ bool SaxParser::endElement(const QString & /* namespaceURI */,
     } else if (qName == "geometry") {
     } else if (qName == "point") {
     } else if (qName == "shape") {
-        _dataset->setInitialHeights(_initialPedestriansHeights);
-        _dataset->setInitialColors(_initialPedestriansColors);
+        _dataset.setInitialHeights(_initialPedestriansHeights);
+        _dataset.setInitialColors(_initialPedestriansColors);
     }
     _currentText.clear();
     return true;
@@ -582,8 +592,10 @@ void SaxParser::clearPoints()
 }
 
 /// provided for convenience and will be removed in the next version
-bool SaxParser::parseGeometryJPS(QString fileName, FacilityGeometry *geometry)
+bool SaxParser::parseGeometryJPS(QString fileName, GeometryFactory& geoFac)
 {
+    auto geometry= shared_ptr<FacilityGeometry>(new FacilityGeometry("test"));
+
     double captionsColor=0;//red
     if(!fileName.endsWith(".xml",Qt::CaseInsensitive)) return false;
     QString wd;
@@ -734,6 +746,7 @@ bool SaxParser::parseGeometryJPS(QString fileName, FacilityGeometry *geometry)
         geometry->addObjectLabel(pos,pos,"door_"+QString::number(tr->GetID()).toStdString(),captionsColor);
     }
 
+    geoFac.AddElement(0,0,geometry);
     //TODO:dirty hack for parsing the Hlines
     // free memory
     delete building;
@@ -743,7 +756,7 @@ bool SaxParser::parseGeometryJPS(QString fileName, FacilityGeometry *geometry)
 
 /// provided for convenience and will be removed in the next version
 
-void SaxParser::parseGeometryTRAV(QString content, FacilityGeometry *geometry,QDomNode geo)
+void SaxParser::parseGeometryTRAV(QString content, GeometryFactory& geoFac,QDomNode geo)
 {
 
     cout<<"external geometry found"<<endl;
@@ -751,6 +764,7 @@ void SaxParser::parseGeometryTRAV(QString content, FacilityGeometry *geometry,QD
     // to be filled
     QDomDocument doc("");
     QDomNode geoNode;
+    auto geometry= shared_ptr<FacilityGeometry>(new FacilityGeometry("no mame"));
 
     //first try to open the file
     if(content.endsWith(".trav",Qt::CaseInsensitive) ) {
@@ -928,6 +942,8 @@ void SaxParser::parseGeometryTRAV(QString content, FacilityGeometry *geometry,QD
         // you should normally have only one geometry node, but one never knows...
         geoNode = geoNode.nextSiblingElement("geometry");
     }
+
+    geoFac.AddElement(0,0,geometry);
 }
 
 QString SaxParser::extractGeometryFilename(QString &filename)
@@ -968,24 +984,23 @@ QString SaxParser::extractGeometryFilename(QString &filename)
 
     //maybe this is already the geometry file itself ?
     //do a rapid test
-//    FacilityGeometry* geo = new FacilityGeometry();
-//    QFileInfo fileInfoGeometry(filename);
-//    extracted_geo_name=fileInfoGeometry.fileName();
+    //    FacilityGeometry* geo = new FacilityGeometry();
+    //    QFileInfo fileInfoGeometry(filename);
+    //    extracted_geo_name=fileInfoGeometry.fileName();
 
-//    //just check if it starts with geometry
-//    //if(parseGeometryJPS(extracted_geo_name,geo)==true)
-//    //{
-//        return extracted_geo_name;
-//    //}
-//    delete geo;
+    //    //just check if it starts with geometry
+    //    //if(parseGeometryJPS(extracted_geo_name,geo)==true)
+    //    //{
+    //        return extracted_geo_name;
+    //    //}
+    //    delete geo;
 
     return "";
 }
 
-void SaxParser::parseGeometryXMLV04(QString filename, FacilityGeometry *geo)
+void SaxParser::parseGeometryXMLV04(QString filename, GeometryFactory& geoFac)
 {
     QDomDocument doc("");
-
     QFile file(filename);
 
     int size =file.size()/(1024*1024);
@@ -995,7 +1010,7 @@ void SaxParser::parseGeometryXMLV04(QString filename, FacilityGeometry *geo)
         //cout<<"The file is too large: "<<filename.toStdString()<<endl;
         return;
     }
-
+    auto geo= shared_ptr<FacilityGeometry>(new FacilityGeometry("no name"));
     //cout<<"filename: "<<filename.toStdString()<<endl;
 
     //TODO: check if you can parse this with the building classes.
@@ -1157,6 +1172,9 @@ void SaxParser::parseGeometryXMLV04(QString filename, FacilityGeometry *geo)
         double center[3]= {(x1+x2)/2.0, (y1+y2)/2.0, (z2+z1)/2.0};
         geo->addObjectLabel(center,center,id,21);
     }
+
+    //room 0, subroom 0
+    geoFac.AddElement(0,0,geo);
 }
 
 bool SaxParser::ParseTxtFormat(QString fileName, SyncData* dataset, double * fps)
@@ -1190,7 +1208,7 @@ bool SaxParser::ParseTxtFormat(QString fileName, SyncData* dataset, double * fps
             bool ok;
             maxFrame=line.split(":")[1].toDouble(&ok);
             if(!ok) maxFrame=1000;//default value
-             //cout<<"frame: "<<maxFrame<<endl; exit(0);
+            //cout<<"frame: "<<maxFrame<<endl; exit(0);
         }
 
         //initialize the process dialog
diff --git a/src/SaxParser.h b/src/SaxParser.h
index 322042ecad853d835c4f3317c1cc5f4416a1cd05..7c3e7a63b557211dea27682400bf83112b75860e 100644
--- a/src/SaxParser.h
+++ b/src/SaxParser.h
@@ -34,6 +34,7 @@
 #include <QTreeWidget>
 #include <vector>
 #include "SyncData.h"
+#include"geometry/GeometryFactory.h"
 
 
 
@@ -42,13 +43,13 @@ class JPoint;
 class TrajectoryPoint;
 class FrameElement;
 class SyncData;
-class FacilityGeometry;
+class GeometryFactory;
 
 
 class SaxParser: public QXmlDefaultHandler
 {
 public:
-    SaxParser(FacilityGeometry* _geometry,SyncData* _dataset, double * fps);
+    SaxParser(GeometryFactory& geoFac, SyncData& _dataset, double * fps);
     virtual ~SaxParser();
     bool startElement(const QString &namespaceURI,
                       const QString &localName,
@@ -66,13 +67,13 @@ public:
                        const QString& value);
 
     /// provided for convenience and will be removed in the next version
-    static bool parseGeometryJPS(QString content, FacilityGeometry *geo);
+    static bool parseGeometryJPS(QString content, GeometryFactory& geo);
 
     /// provided for convenience and will be removed in the next version
-    static void parseGeometryXMLV04(QString content, FacilityGeometry *geo);
+    static void parseGeometryXMLV04(QString content, GeometryFactory& geo);
 
     /// provided for convenience and will be removed in the next version
-    static void parseGeometryTRAV(QString content, FacilityGeometry *geo,QDomNode geoNode=QDomNode());
+    static void parseGeometryTRAV(QString fileName, GeometryFactory& geoFac, QDomNode geoNode=QDomNode());
 
     /// take a large file and find the geometry file location.
     static QString extractGeometryFilename(QString& filename);
@@ -86,8 +87,9 @@ private:
     void InitHeader(int major, int minor, int patch);
 
 private:
-    FacilityGeometry* _geometry;
-    SyncData* _dataset;
+    GeometryFactory& _geoFactory;
+    std::shared_ptr<FacilityGeometry> _geometry;
+    SyncData& _dataset;
     double* _para;
     QString _currentText;
     int _currentFrameID=-1;
diff --git a/src/ThreadVisualisation.cpp b/src/ThreadVisualisation.cpp
index a447beac1d902416d054296cc38e023352fb5ac5..44ccfb42d0083cc2856319f3eba621890b907536 100644
--- a/src/ThreadVisualisation.cpp
+++ b/src/ThreadVisualisation.cpp
@@ -77,6 +77,7 @@
 
 
 #include "geometry/FacilityGeometry.h"
+#include "geometry/GeometryFactory.h"
 #include "geometry/LinePlotter2D.h"
 
 #include "ThreadVisualisation.h"
@@ -98,23 +99,21 @@
 ThreadVisualisation::ThreadVisualisation(QObject *parent):
     QThread(parent)
 {
-    renderer=NULL;
-    renderWindow=NULL;
-    renderWinInteractor=NULL;
-    runningTime=vtkTextActor::New();;
-    framePerSecond=25;
-    axis=NULL;
-    winTitle="header without room caption";
-    geometry=new FacilityGeometry();
-
+    _renderer=NULL;
+    _renderWindow=NULL;
+    _renderWinInteractor=NULL;
+    _runningTime=vtkTextActor::New();;
+    _framePerSecond=25;
+    _axis=NULL;
+    _winTitle="header without room caption";
+    //_geometry=new FacilityGeometry();
 }
 
 ThreadVisualisation::~ThreadVisualisation()
 {
 
-    if(axis)
-        axis->Delete();
-    delete geometry;
+    if(_axis)
+        _axis->Delete();
 
     if(extern_glyphs_pedestrians_3D) extern_glyphs_pedestrians_3D->Delete();
     if(extern_glyphs_pedestrians_actor_3D) extern_glyphs_pedestrians_actor_3D->Delete();
@@ -122,18 +121,18 @@ ThreadVisualisation::~ThreadVisualisation()
     if(extern_glyphs_pedestrians_actor_2D) extern_glyphs_pedestrians_actor_2D->Delete();
     if(extern_pedestrians_labels) extern_pedestrians_labels->Delete();
 
-    runningTime->Delete();
+    _runningTime->Delete();
 
 }
 
 void ThreadVisualisation::setFullsreen(bool status)
 {
-    renderWindow->SetFullScreen(status);
+    _renderWindow->SetFullScreen(status);
 }
 
 void ThreadVisualisation::slotSetFrameRate(float fps)
 {
-    framePerSecond=fps;
+    _framePerSecond=fps;
 }
 
 
@@ -141,27 +140,28 @@ void ThreadVisualisation::run()
 {
 
     //deactivate the output windows
-    vtkObject::GlobalWarningDisplayOff();
+    //vtkObject::GlobalWarningDisplayOff();
 
     //emit signalStatusMessage("running");
 
 
     // Create the renderer
-    renderer = vtkRenderer::New();
+    _renderer = vtkRenderer::New();
     // set the background
     //renderer->SetBackground(.00,.00,.00);
-    renderer->SetBackground(1.0,1.0,1.0);
+    _renderer->SetBackground(1.0,1.0,1.0);
     //add the geometry
-    geometry->CreateActors();
-    renderer->AddActor(geometry->getActor2D());
-    renderer->AddActor(geometry->getActor3D());
+    _geometry.Init(_renderer);
+    //_geometry->CreateActors();
+    //_renderer->AddActor(_geometry->getActor2D());
+    //_renderer->AddActor(_geometry->getActor3D());
 
     initGlyphs2D();
     initGlyphs3D();
 
     //create the trails
     extern_trail_plotter = new PointPlotter();
-    renderer->AddActor(extern_trail_plotter->getActor());
+    _renderer->AddActor(extern_trail_plotter->getActor());
 
     // add axis
     //axis= vtkAxesActor::New();
@@ -233,9 +233,9 @@ void ThreadVisualisation::run()
     }
 
     // Create the render window
-    renderWindow = vtkRenderWindow::New();
-    renderWindow->AddRenderer( renderer );
-    renderWindow->SetSize(960, 800);
+    _renderWindow = vtkRenderWindow::New();
+    _renderWindow->AddRenderer( _renderer );
+    _renderWindow->SetSize(960, 800);
     //renderWindow->SetSize(640, 480);
 
     // add the legend
@@ -243,23 +243,23 @@ void ThreadVisualisation::run()
     //	initLegend();
 
     //add the running time frame
-    runningTime->SetTextScaleModeToViewport();
+    _runningTime->SetTextScaleModeToViewport();
     //runningTime->SetTextScaleModeToProp();
     //runningTime->SetMinimumSize(10,10);
     //runningTime->SetMinimumSize(180,80);
     //runningTime->SetInput(txt);
     //runningTime->SetDisplayPosition(500,700);
-    runningTime->SetVisibility(SystemSettings::getOnScreenInfos());
+    _runningTime->SetVisibility(SystemSettings::getOnScreenInfos());
 
     // set the properties of the caption
-    vtkTextProperty* tprop = runningTime->GetTextProperty();
+    vtkTextProperty* tprop = _runningTime->GetTextProperty();
     //tprop->SetFontFamilyToArial();
     //tprop->BoldOn();
     //tprop->SetLineSpacing(1.0);
     tprop->SetFontSize(10);
     tprop->SetColor(1.0,0.0,0.0);
 
-    renderer->AddActor2D(runningTime);
+    _renderer->AddActor2D(_runningTime);
 
     //CAUTION: this is necessary for WIN32 to update the window name
     // but his will freeze your system on linux
@@ -267,12 +267,12 @@ void ThreadVisualisation::run()
     renderWindow->Render();
 #endif
 
-    renderWindow->SetWindowName(winTitle.toStdString().c_str());
+    _renderWindow->SetWindowName(_winTitle.toStdString().c_str());
 
     // Create an interactor
-    renderWinInteractor = vtkRenderWindowInteractor::New();
-    renderWindow->SetInteractor( renderWinInteractor );
-    renderWinInteractor->Initialize();
+    _renderWinInteractor = vtkRenderWindowInteractor::New();
+    _renderWindow->SetInteractor( _renderWinInteractor );
+    _renderWinInteractor->Initialize();
 
     //add a light kit
     {
@@ -288,17 +288,17 @@ void ThreadVisualisation::run()
 
 
     if(false || SystemSettings::get2D()) {
-        renderer->GetActiveCamera()->OrthogonalizeViewUp();
-        renderer->GetActiveCamera()->ParallelProjectionOn();
-        renderer->ResetCamera();
+        _renderer->GetActiveCamera()->OrthogonalizeViewUp();
+        _renderer->GetActiveCamera()->ParallelProjectionOn();
+        _renderer->ResetCamera();
     }
 
     //create a timer for rendering the window
     TimerCallback *renderingTimer = new TimerCallback();
-    int timer= renderWinInteractor->CreateRepeatingTimer(1000.0/framePerSecond);
+    int timer= _renderWinInteractor->CreateRepeatingTimer(1000.0/_framePerSecond);
     renderingTimer->SetRenderTimerId(timer);
-    renderingTimer->setTextActor(runningTime);
-    renderWinInteractor->AddObserver(vtkCommand::TimerEvent,renderingTimer);
+    renderingTimer->setTextActor(_runningTime);
+    _renderWinInteractor->AddObserver(vtkCommand::TimerEvent,renderingTimer);
 
     //create the necessary connections
     QObject::connect(renderingTimer, SIGNAL(signalRunningTime(unsigned long )),
@@ -312,7 +312,7 @@ void ThreadVisualisation::run()
 
     // Create my interactor style
     InteractorStyle* style = InteractorStyle::New();
-    renderWinInteractor->SetInteractorStyle( style );
+    _renderWinInteractor->SetInteractorStyle( style );
     style->Delete();
 
 
@@ -335,7 +335,7 @@ void ThreadVisualisation::run()
     //save the top view  camera
     _topViewCamera=vtkCamera::New();
     //renderer->GetActiveCamera()->Modified();
-    _topViewCamera->DeepCopy(renderer->GetActiveCamera());
+    _topViewCamera->DeepCopy(_renderer->GetActiveCamera());
 
     //update all (restored) system settings
     setGeometryVisibility2D(SystemSettings::get2D());
@@ -354,18 +354,18 @@ void ThreadVisualisation::run()
     setNavLinesColor(SystemSettings::getNavLinesColor());
 
 
-    renderWinInteractor->Start();
+    _renderWinInteractor->Start();
 
 
 #ifdef __APPLE__
-//InitMultiThreading();
+    //InitMultiThreading();
 
-//dispatch_async(main_q, ^(void){
-//          is_main_thread(); //Unfortunately not
-//          std::cout << "now spinning the visualizer" << std::endl;
-//                  renderWinInteractor->Start();
+    //dispatch_async(main_q, ^(void){
+    //          is_main_thread(); //Unfortunately not
+    //          std::cout << "now spinning the visualizer" << std::endl;
+    //                  renderWinInteractor->Start();
 
-//});
+    //});
     //[[NSThread new] start];
     //#include <objc/objc.h>
     //NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(workerThreadFunction:) object:nil];
@@ -375,17 +375,17 @@ void ThreadVisualisation::run()
     emit signal_controlSequences("CONTROL_RESET");
 
 
-// still debugging. TODO, check the source of the leak while using cocoa
+    // still debugging. TODO, check the source of the leak while using cocoa
 #ifndef __APPLE__
     //clear some stuffs
     //delete extern_trail_plotter;
     finalize();
 
-    renderer->Delete();
-    renderWindow->Delete();
-    renderWinInteractor->Delete();
+    _renderer->Delete();
+    _renderWindow->Delete();
+    _renderWinInteractor->Delete();
     _topViewCamera->Delete();
-    renderer=NULL;
+    _renderer=NULL;
     delete renderingTimer;
 #endif
 
@@ -400,41 +400,36 @@ void ThreadVisualisation::slotControlSequence(const char* para)
 
 void ThreadVisualisation::setGeometryVisibility( bool status)
 {
-    if(geometry) {
-        if(SystemSettings::get2D()) {
-            geometry->set2D(status);
-        } else {
-            geometry->set3D(status);
-        }
+
+    if(SystemSettings::get2D())
+    {
+        _geometry.Set2D(status);
+    } else
+    {
+        _geometry.Set3D(status);
     }
 }
 
 /// show / hide the walls
 void ThreadVisualisation::showWalls(bool status)
 {
-    if(geometry) {
-        geometry->showWalls(status);
-    }
+    _geometry.ShowWalls(status);
 }
 
 /// show/ hide the exits
 void ThreadVisualisation::showDoors(bool status)
 {
-    if(geometry) {
-        geometry->showDoors(status);
-    }
+    _geometry.ShowDoors(status);
 }
 
 void ThreadVisualisation::showNavLines(bool status)
 {
-    if(geometry) {
-        geometry->showNavLines(status);
-    }
+    _geometry.ShowNavLines(status);
 }
 
 void ThreadVisualisation::showFloor(bool status)
 {
-    geometry->showFloor(status);
+    _geometry.ShowFloor(status);
 }
 
 void  ThreadVisualisation::initGlyphs2D()
@@ -543,14 +538,14 @@ void  ThreadVisualisation::initGlyphs2D()
     //extern_glyphs_pedestrians_actor_2D->GetProperty()->BackfaceCullingOn();
 
     //if(extern_trajectories_firstSet.getNumberOfAgents()>0)
-    renderer->AddActor(extern_glyphs_pedestrians_actor_2D);
+    _renderer->AddActor(extern_glyphs_pedestrians_actor_2D);
 
     // structure for the labels
     VTK_CREATE(vtkLabeledDataMapper, labelMapper);
     extern_pedestrians_labels->SetMapper(labelMapper);
     labelMapper->SetFieldDataName("labels");
     labelMapper->SetLabelModeToLabelFieldData();
-    renderer->AddActor2D(extern_pedestrians_labels);
+    _renderer->AddActor2D(extern_pedestrians_labels);
     extern_pedestrians_labels->SetVisibility(false);
 }
 
@@ -644,7 +639,7 @@ void ThreadVisualisation::initGlyphs3D()
     extern_glyphs_pedestrians_actor_3D->SetMapper(mapper);
     extern_glyphs_pedestrians_actor_3D->GetProperty()->BackfaceCullingOn();
     //if(extern_trajectories_firstSet.getNumberOfAgents()>0)
-    renderer->AddActor(extern_glyphs_pedestrians_actor_3D);
+    _renderer->AddActor(extern_glyphs_pedestrians_actor_3D);
 
     extern_glyphs_pedestrians_actor_3D->SetVisibility(false);
 }
@@ -713,24 +708,24 @@ void ThreadVisualisation::initLegend(/*std::vector scalars*/)
     //scalarBar->SetPickable(1);
     //scalarBar->SetTextPositionToPrecedeScalarBar();
     //scalarBar->SetLabelFormat("%-#5.1f");
-    renderer->AddActor2D(scalarBar);
-    renderer->Render();
+    _renderer->AddActor2D(scalarBar);
+    _renderer->Render();
 
 }
 
 
 void ThreadVisualisation::setAxisVisible(bool status)
 {
-    axis->SetVisibility(status);
+    _axis->SetVisibility(status);
 }
 
 void ThreadVisualisation::setCameraPerspective(int mode)
 {
-    if(renderer==NULL) return;
+    if(_renderer==NULL) return;
 
     switch (mode) {
     case 1: //TOP oder RESET
-        renderer->GetActiveCamera()->DeepCopy(_topViewCamera);
+        _renderer->GetActiveCamera()->DeepCopy(_topViewCamera);
         break;
 
     case 2://SIDE
@@ -758,85 +753,82 @@ void ThreadVisualisation::setBackgroundColor(const QColor& col)
 {
     double  bgcolor[3];
     QcolorToDouble(col,bgcolor);
-    if (renderer!=NULL)
-        renderer->SetBackground(bgcolor);
+    if (_renderer!=NULL)
+        _renderer->SetBackground(bgcolor);
 }
 
 void ThreadVisualisation::setWindowTitle(QString title)
 {
     if(title.isEmpty())return;
-    winTitle=title;
+    _winTitle=title;
 }
 
 /// @todo check this construct
 void ThreadVisualisation::setGeometry(FacilityGeometry* geometry)
 {
-    this->geometry=geometry;
+    //this->_geometry=geometry;
+    cout<<"dont call me"<<endl;
+    exit(0);
 }
 
-FacilityGeometry* ThreadVisualisation::getGeometry()
+GeometryFactory &ThreadVisualisation::getGeometry()
 {
-    //if(geometry==NULL){
     //delete the old object
-    delete geometry;
-    geometry=new FacilityGeometry();
-    //}
-    return geometry;
+    //delete _geometry;
+    //_geometry=new FacilityGeometry();
+    return _geometry;
 }
 
 void ThreadVisualisation::setWallsColor(const QColor &color)
 {
     double  rbgColor[3];
     QcolorToDouble(color,rbgColor);
-    geometry->changeWallsColor(rbgColor);
+    _geometry.ChangeWallsColor(rbgColor);
 }
 
 void ThreadVisualisation::setFloorColor(const QColor &color)
 {
     double  rbgColor[3];
     QcolorToDouble(color,rbgColor);
-    geometry->changeFloorColor(rbgColor);
+    _geometry.ChangeFloorColor(rbgColor);
 }
 
 void ThreadVisualisation::setGeometryLabelsVisibility(int v)
 {
-    geometry->showGeometryLabels(v);
+    _geometry.ShowGeometryLabels(v);
 }
 
 void ThreadVisualisation::setExitsColor(const QColor &color)
 {
     double  rbgColor[3];
     QcolorToDouble(color,rbgColor);
-    geometry->changeExitsColor(rbgColor);
+    _geometry.ChangeExitsColor(rbgColor);
 }
 
 void ThreadVisualisation::setNavLinesColor(const QColor &color)
 {
     double  rbgColor[3];
     QcolorToDouble(color,rbgColor);
-    geometry->changeNavLinesColor(rbgColor);
+    _geometry.ChangeNavLinesColor(rbgColor);
 }
 
 /// enable/disable 2D
 /// todo: consider disabling the 2d option in the 3d, and vice-versa
 void ThreadVisualisation::setGeometryVisibility2D(bool status)
 {
-    if(geometry!=NULL) //FIXME this should never happens
-        geometry->set2D(status);
+    _geometry.Set2D(status);
 }
 
 /// enable/disable 3D
 /// todo: consider disabling the 2d option in the 3d, and vice-versa
 void ThreadVisualisation::setGeometryVisibility3D(bool status)
 {
-    if(geometry!=NULL) //FIXME this should never happens, seems to be called by slotReset() !
-        geometry->set3D(status);
+    _geometry.Set3D(status);
 }
 
 void ThreadVisualisation::setOnscreenInformationVisibility(bool show)
 {
-    //if(runningTime)
-    runningTime->SetVisibility(show);
+    _runningTime->SetVisibility(show);
 }
 
 void ThreadVisualisation::Create2dAgent()
diff --git a/src/ThreadVisualisation.h b/src/ThreadVisualisation.h
index 7abc79132bf4414b9942bc9fd7b26f975d8ed0d2..12eab0aef5107b9709e958fa02c565f4a77f7ccc 100644
--- a/src/ThreadVisualisation.h
+++ b/src/ThreadVisualisation.h
@@ -41,6 +41,7 @@
 #include <vtkTensorGlyph.h>
 #include <vtkSmartPointer.h>
 #include <vtkPolyDataMapper.h>
+#include "geometry/GeometryFactory.h"
 
 // forwarded classes
 class QThread;
@@ -91,9 +92,9 @@ public:
 
     /// load and display the geometry where
     /// the pedestrians will move
-    void setGeometry(FacilityGeometry* geometry);
+    void setGeometry(FacilityGeometry* _geometry);
 
-    FacilityGeometry* getGeometry();
+    GeometryFactory& getGeometry();
 
     ///this is for convenience and will be delete later
     void setWindowTitle(QString title);
@@ -178,16 +179,17 @@ private:
     void Create2dAgent();
 
 private:
-    FacilityGeometry* geometry;
-    vtkRenderer* renderer;
-    vtkRenderWindow* renderWindow;
-    vtkRenderWindowInteractor* renderWinInteractor;
-    vtkAxesActor* axis;
-    vtkTextActor* runningTime;
+    //FacilityGeometry* _geometry;
+    GeometryFactory _geometry;
+    vtkRenderer* _renderer;
+    vtkRenderWindow* _renderWindow;
+    vtkRenderWindowInteractor* _renderWinInteractor;
+    vtkAxesActor* _axis;
+    vtkTextActor* _runningTime;
     vtkCamera* _topViewCamera;
-    QString winTitle;
+    QString _winTitle;
 
-    float framePerSecond;
+    float _framePerSecond;
 
 };
 
diff --git a/src/geometry/FacilityGeometry.cpp b/src/geometry/FacilityGeometry.cpp
index 65d8a892443d3d236247f7074cf7d7e52657c3a7..8ecf48cd02e4ce338cb4ec5835a3cb75c9553168 100644
--- a/src/geometry/FacilityGeometry.cpp
+++ b/src/geometry/FacilityGeometry.cpp
@@ -68,7 +68,7 @@ using namespace std;
     vtkSmartPointer<type> name = vtkSmartPointer<type>::New()
 
 
-FacilityGeometry::FacilityGeometry()
+FacilityGeometry::FacilityGeometry(const string &description)
 {
 
     assembly = vtkAssembly::New();
@@ -105,13 +105,11 @@ FacilityGeometry::FacilityGeometry()
     stepColor = 130;
     doorColor = 50;
     navlineColor=95;
+    _description=description;
 }
 
 FacilityGeometry::~FacilityGeometry()
 {
-    //if(assembly)
-    //    assembly->Delete();
-
     lookupTable->Delete();
     captions->Delete();
 
@@ -128,7 +126,6 @@ FacilityGeometry::~FacilityGeometry()
     delete linesPlotter2D;
 }
 
-
 vtkAssembly* FacilityGeometry::getActor2D()
 {
     return assembly2D;
@@ -246,7 +243,7 @@ void FacilityGeometry::addNewElement(double center[3], double length, double ori
         actor->GetProperty()->SetOpacity(0.5);
         assemblyDoors3D->AddPart(actor);
     }
-    break;
+        break;
     case WALL: {
         double colorRGB[3];
         lookupTable->GetColor(wallColor, colorRGB);
@@ -260,7 +257,7 @@ void FacilityGeometry::addNewElement(double center[3], double length, double ori
         //src->SetRadius(wallWidth);
         assemblyWalls3D->AddPart(actor);
     }
-    break;
+        break;
     case STEP: {
         double colorRGB[3];
         lookupTable->GetColor(stepColor, colorRGB);
@@ -269,9 +266,9 @@ void FacilityGeometry::addNewElement(double center[3], double length, double ori
         src->SetZLength(stepHeight);
         assemblyDoors3D->AddPart(actor);
     }
-    break;
+        break;
 
-    //default behaviour not defined
+        //default behaviour not defined
     default:
         break;
     }
@@ -320,17 +317,17 @@ void FacilityGeometry::addStair(double x1, double y1, double z1, double x2, doub
     linesPlotter2D->PlotWall(m,n,wallColor/255.0);
 
 
-//    JPoint *p1 = new JPoint(x1,y1,z1);
-//    JPoint *p2 = new JPoint(x2,y2,z2);
-//    double *center = p1->centreCoordinatesWith(*p2);
-//    double angle =p1->angleMadeWith(*p2);
-//    double length =p1->distanceTo(*p2)+wallThickness;
+    //    JPoint *p1 = new JPoint(x1,y1,z1);
+    //    JPoint *p2 = new JPoint(x2,y2,z2);
+    //    double *center = p1->centreCoordinatesWith(*p2);
+    //    double angle =p1->angleMadeWith(*p2);
+    //    double length =p1->distanceTo(*p2)+wallThickness;
 
-//    addNewElement(center, length, angle, WALL);
+    //    addNewElement(center, length, angle, WALL);
 
-//    delete p1;
-//    delete p2;
-//    delete center;
+    //    delete p1;
+    //    delete p2;
+    //    delete center;
 }
 
 void FacilityGeometry::addDoor(double x1, double y1, double z1, double x2, double y2, double z2,double thickness ,double height, double color)
@@ -483,10 +480,10 @@ void FacilityGeometry::addStair(JPoint* p1, JPoint* p2, string caption)
         addNewElementText(center,orientation,caption.c_str(),50);
     }
 
-//    double *center = p1->centreCoordinatesWith(*p2);
-//    double angle =p1->angleMadeWith(*p2);
-//    double length =p1->distanceTo(*p2)+wallThickness;
-//    addNewElement( center,  length, angle,  WALL);
+    //    double *center = p1->centreCoordinatesWith(*p2);
+    //    double angle =p1->angleMadeWith(*p2);
+    //    double length =p1->distanceTo(*p2)+wallThickness;
+    //    addNewElement( center,  length, angle,  WALL);
 }
 
 void FacilityGeometry::addDoor(JPoint* p1, JPoint* p2, string caption)
@@ -666,7 +663,7 @@ void FacilityGeometry::addFloor(double x1, double y1, double x2, double y2, doub
 
 
 void FacilityGeometry::addObjectSphere(double center[3], double radius,
-                                       double color)
+double color)
 {
 
     double colorRGB[3];
@@ -693,7 +690,7 @@ void FacilityGeometry::addObjectSphere(double center[3], double radius,
 
 
 void FacilityGeometry::addObjectCylinder(double center[3], double radius,
-        double height, double orientation[3],double color)
+double height, double orientation[3],double color)
 {
 
     double colorRGB[3];
@@ -720,7 +717,7 @@ void FacilityGeometry::addObjectCylinder(double center[3], double radius,
 }
 
 void FacilityGeometry::addObjectBox(double center[3], double height,
-                                    double width, double length, double color)
+double width, double length, double color)
 {
 
     double colorRGB[3];
@@ -869,7 +866,7 @@ vtkActor2DCollection* FacilityGeometry::getCaptions()
 
 // orientation and color ignored
 void FacilityGeometry::addNewElementText(double center[3], double orientation[3],
-        string text, double color)
+string text, double color)
 {
 
     //return ;
@@ -912,3 +909,7 @@ void FacilityGeometry::showGeometryLabels(int status)
 
 }
 
+const std::string & FacilityGeometry::GetDescription() const
+{
+    return _description;
+}
diff --git a/src/geometry/FacilityGeometry.h b/src/geometry/FacilityGeometry.h
index 05610a3d3a9a53d44b69a16c2e7c05fb27800ec4..bea3e52ae67a6ebf7d5ece8024b5922b297e4c46 100644
--- a/src/geometry/FacilityGeometry.h
+++ b/src/geometry/FacilityGeometry.h
@@ -63,7 +63,8 @@ public:
         BOX      //!< BOX defined by centre, length, width and height
     };
 
-    FacilityGeometry();
+    FacilityGeometry(const std::string & description);
+
     virtual ~FacilityGeometry();
 
     vtkAssembly* getActor2D();
@@ -109,6 +110,8 @@ public:
     ///draw obstacles
     void addObstacles(vtkPolyData* polygonPolyData);
 
+    const std::string & GetDescription() const ;
+
     /// draw other kinds of objects
     void addObjectSphere(double center[3], double radius, double couleur=1);
     void addObjectCone(double center[3], double height, double radius, double couleur=2);
@@ -172,6 +175,8 @@ private:
     // other parts
     vtkAssembly* assemblyCaptions;
     vtkActor2DCollection* captions;
+
+    std::string _description;
 };
 
 #endif /* FACILITYGEOMETRY_H_ */