diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000000000000000000000000000000000000..d2398ccf5fed388e7ac85d2bc06b9e5d00ad6361
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+jupedsim
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..94a25f7f4cb416c083d265558da75d457237d671
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/AUTHORS b/AUTHORS
index 89b7a4a31851bfcb5b41d848316c07c589817540..a56f59a0bb21af285bf2aea5874d019b0040ed23 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,11 +1,23 @@
 JuPedSim contributors:
+(Date: 27.01.2016)
 
 Erik Andresen
 Mohcine Chraibi
+Arne Graf
 David Haensel
+Weichen Liao
 Ulrich Kemloh
+Maximilian Osterkamp
 Andrea Portz
 Oliver Schmidts
+Benjamin Schröder
 Denis Shhikhalev
+Antoine Tordeux
 Jun Zhang
 
+JPSeditor contributors:
+(Date: 27.01.2016)
+
+Erik Andresen
+Maximilian Osterkamp
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index bab618f1ed2f377347083fde2c7184d8f285032a..b781b1436fc37579e571cfef9ddff5a3c23c4cbe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,32 @@
 All notable changes to this project will be documented in this file.
 
 
+## v0.8.0 [Unreleased]
+
+### Added
+#### JPSEDITOR
+- 1.2.16 Undo/Redo when Line was edited
+- 1.2.16 Change Info Text
+- 1.2.16 Load HLines
+- 1.2.16 Create and save HLines
+- First approaches of an undo/redo framework
+	- Undo/Redo working when line added or deleted
+- DXF import with different layers - Not working properly with AutoCAD ?! 
+- Bug fixes
+- CAD features
+	- Point and line grid
+	- object snap
+	- Orthomode
+	- Zooming 
+	- Line editing
+	- Length of line is displayed
+	- Show origin
+	- ...
+- Room and door declarations
+# Change Log
+All notable changes to this project will be documented in this file.
+
+
 ## v0.8.0 [Unreleased]
 
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fa6befb6833b6efbb6bc2ed05e55bfdc63c9b4af..69f0f4988f53e1c5c3bbd5eb379bfe4d090c2ddb 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,13 +7,21 @@
 #================
 # 1. CMAKE_BUILD_TYPE=Release (default Debug)
 # 2. DESIRED_QT_VERSION=5 (default 4)
+# example: >> cmake  -DDESIRED_QT_VERSION=5  -DCMAKE_PREFIX_PATH=~/Qt/5.5/clang_64 ..
+# Flags for VS: -G "Visual Studio ..." -DCMAKE_PREFIX_PATH=... -DCMAKE_C_FLAGS="-mwindows" 
 
+cmake_minimum_required(VERSION 2.8.9)
 IF (POLICY CMP0048) # in CMake 3.0.0+
   CMAKE_POLICY (SET CMP0048 OLD) # keep PROJECT() from clearing VERSION variables
 ENDIF (POLICY CMP0048)
-
+IF (POLICY CMP0043) # in CMake 3.0.0+
+  CMAKE_POLICY (SET CMP0043 OLD) # keep PROJECT() from clearing VERSION variables
+ENDIF (POLICY CMP0043)
+IF (POLICY CMP0020)
+CMAKE_POLICY (SET CMP0020 OLD) # keep old POLICY (2.8.10 and lower) The OLD behavior for this policy is not to link executables to
+ENDIF (POLICY CMP0020)			#qtmain.lib automatically when they link to the QtCore IMPORTEDtarget 
 project(JPSeditor)
-cmake_minimum_required(VERSION 2.8.9)
+
 
 
 set(README_FILE "${CMAKE_SOURCE_DIR}/README.md")
@@ -66,6 +74,7 @@ message(STATUS "${PROJECT_NAME} will be installed to ${CMAKE_INSTALL_PREFIX}")
 
 
 #--------------------
+if (NOT MSVC)
 include(CheckCXXCompilerFlag)
 CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
 CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
@@ -77,13 +86,14 @@ else()
   message(AUTHOR_WARNING "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
 endif()
 message(STATUS "Checking for C++11 compiler - available")
-
+endif()
 #---------------------
 
 set( SRCS
     src/mainWindow.cpp
     src/main.cpp 
     src/GraphicView.cpp
+    src/graphicscene.cpp
     src/roomwidget.cpp
     src/rooms.cpp
     src/datamanager.cpp  
@@ -91,9 +101,12 @@ set( SRCS
     src/jpsLineItem.cpp  
     src/jpsexit.cpp
     src/jpsobstacle.cpp 
-	src/jpslandmark.cpp
-	src/jpswaypoint.cpp
-	src/widgetlandmark.cpp
+    src/jpslandmark.cpp
+    src/jpswaypoint.cpp
+    src/widgetlandmark.cpp
+    src/widgetsettings.cpp
+    src/jpsyahpointer.cpp
+    src/jpsconnection.cpp
     dxflib/src/dl_writer_ascii.cpp
     dxflib/src/dl_dxf.cpp
   )  
@@ -101,6 +114,7 @@ set( SRCS
 set( HDR
     src/mainWindow.h 
     src/GraphicView.h
+    src/graphicscene.h
     src/roomwidget.h
     src/rooms.h
     src/datamanager.h  
@@ -108,9 +122,12 @@ set( HDR
     src/jpsLineItem.h  
     src/jpsexit.h     
     src/jpsobstacle.h
-	src/jpslandmark.h
-	src/jpswaypoint.h
-	src/widgetlandmark.h
+    src/jpslandmark.h
+    src/jpswaypoint.h
+    src/widgetlandmark.h
+    src/widgetsettings.h
+    src/jpsyahpointer.h
+    src/jpsconnection.h
     dxflib/src/dl_writer_ascii.h
     dxflib/src/dl_writer.h
     dxflib/src/dl_global.h
@@ -129,7 +146,8 @@ set( HDR
 set( UIS
     forms/mainwindow.ui
     forms/roomwidget.ui
-	forms/widgetlandmark.ui
+    forms/widgetlandmark.ui
+    forms/widgetsettings.ui
   )
 
 # and finally a resource file
@@ -153,7 +171,7 @@ ENDIF (WIN32)
 message(STATUS "QT_Qmake_executable " ${QT_QMAKE_EXECUTABLE})
 if($QT_QMAKE_EXECUTABLE STREQUAL "")
   FIND_PROGRAM(QT_QMAKE_EXECUTABLE NAMES qmake)
-  if (NOT QT_QMAKE_EXECUTABL)
+  if (NOT QT_QMAKE_EXECUTABLE)
     message(WARNING "QT not found - abort.")
   endif()
 endif()
@@ -186,7 +204,7 @@ elseif("${DESIRED_QT_VERSION}" STREQUAL "4")
   #   QT4_INSTALLED is set to TRUE if qt4 is found and
   #   QT3_INSTALLED is set to TRUE if qt3 is found.
   FIND_PACKAGE(Qt COMPONENTS QtXml QT_USE_QTNETWORK QtXmlPatterns REQUIRED)
-
+  set(QT4_INSTALLED TRUE)
 endif()
 
 
diff --git a/README.md b/README.md
index 4c04dd71c00d29c39d5421737924460a76f1af37..c99fd77299f51a98334b86381e997d9323eae39d 100644
--- a/README.md
+++ b/README.md
@@ -1,29 +1,33 @@
-JuPedSim v0.6 alpha
+JuPedSim v0.8 alpha
+JPSeditor v0.8 alpha
 ====================
 
-Ulrich Kemloh drafted this on 25 Jun 2014
+Erik Andresen drafted this on 27 Jun 2016
 
-We are proud to announce the first alpha release of our software JuPedSim for simulating pedestrians evacuations. Please note that it is a pre release version for developers only. We are working hard towards the final release for this version. Two modules are shipped with this pre-release:
+We are proud to announce the first alpha release of our software JPSeditor (part of JuPedSim for simulating pedestrians evacuations). Please note that it is a pre release version for developers only. We are working hard towards the final release for this version.
+
+JPSeditor is a graphical user interface to create the geometry of a scenario simulated by JuPedSim. It comes with set of CAD- and further tools to simplify the creation of proper xml-files 
+incorporating information about the scenario' geometry.
 
-- *jpscore*: command line simulation core
-- *jpsvis*: visualization module
 
 Features
 ========
 
-- Simulate pedestrians movement in a space continuous geometry
-- Forces-based models for describing the pedestrians interactions
-- Shortest and quickest path route choice strategies
-- Loading and visualizing trajectories and geometries
-- Easy to use visualization interface
-- Making high quality videos directly from the visualization interface or generating png screenshots
-- XML based input files
+- DXF Import / Export
+- CAD features
+	- Point and line grid
+	- object snap
+	- Orthomode
+	- Zooming 
+	- Line editing
+	- ...
+- Tools for room and door declarations
 
 
-Showcase
+Tutorial
 ========
 
-To highlight some features of JuPedSim we have uploaded some videos on our [YouTube channel](https://www.youtube.com/user/JuPedSim).
+To highlight some features of JuPedSim we have uploaded some videos on our [YouTube channel](https://www.youtube.com/user/JuPedSim) including a tutorial showing how to use the editor.
 
 
 Installing
@@ -39,39 +43,7 @@ As JuPedSim comes with no installer, you just need to delete the unziped directo
 Running
 =======
 
-    jpscore.exe my_simulation_ini.xml
-
-from the command line (or also dropping the file on the executable) will generate a trajectory file, which you can visualize with `jpsvis`.
-You will find some projects samples in the downloaded files and further information in the manual.
-
-Compiling from sources
-======================
-
-You can compile the simulation core for your specific platform with the supplied cmake script.
-The only requirement is a compiler supporting the new standard c++11.
-
-Windows (tested on Win7 with MinGW 4.8)
----------------------------------------
-
-    cmake -G "MinGW Makefiles" CMakeList.txt
-    make-mingw32.exe
-
-Linux (tested on Ubuntu 14.04 with gcc 4.8)
----------------
-
-    cmake CMakeList.txt
-    make
-
-OSX (tested on OSX Maverick with clang 5.1 and Yosemite with clang 6.1)
----------------------
-
-    cmake   CMakeList.txt
-    make
-
-Note that the OpenMP acceleration might be missing under OSX
-
-For the visualization module (`jpsvis`) at least Qt version 4.5 and VTK version 4.8 are required.
-You can download the latest version of QT [here](https://www.qt.io/download/) and the latest version of VTK [here](http://www.vtk.org/download/).
+Start the application by clicking on the binary file. (For example .exe)
 
 System Requirements
 ==============
@@ -79,11 +51,6 @@ System Requirements
 There is no special hardware/software requirements for running JuPedSim. The distributed binaries however, are only available for windows at the moment. For compiling from sources you need a compiler with c++11 support is needed for the core. Qt version >=4.5 and VTK >5.8 are needed for the visualization.
 
 
-Known Issues
-============
-
-Some verification tests are still failing. The actual cdash-board can be found [here](http://my.cdash.org/index.php?project=JuPedSim) 
-Occasionaly jpscore crashes if the input file is not valid. Make sure to validate your XML input files with the supplied XSD files.
 
 Frequently Asked Questions
 ===========================
diff --git a/forms/HLine.png b/forms/HLine.png
new file mode 100644
index 0000000000000000000000000000000000000000..81b9f3dce14be3bb072beb30858f16af605a42ff
Binary files /dev/null and b/forms/HLine.png differ
diff --git a/forms/Redo-Icon.png b/forms/Redo-Icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d9e0d48c4cfb9ea6f428dda81cb8ff8782f584b
Binary files /dev/null and b/forms/Redo-Icon.png differ
diff --git a/forms/Ressource.qrc b/forms/Ressource.qrc
index 04ae4089a76fbdc7fd529cec23fd35e1b980a23f..239132d9cc563449d64f155a0f319ba2ab071c31 100644
--- a/forms/Ressource.qrc
+++ b/forms/Ressource.qrc
@@ -38,5 +38,9 @@
         <file>jupedsim.png</file>
         <file>statue.jpg</file>
         <file>statue_specs.jpg</file>
+        <file>anglesnap.PNG</file>
+        <file>Undo-icon.png</file>
+        <file>Redo-Icon.png</file>
+        <file>HLine.png</file>
     </qresource>
 </RCC>
diff --git a/forms/Undo-icon.png b/forms/Undo-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9994fc9040a3c99b19e61b291f6f5bcaf3c62d3
Binary files /dev/null and b/forms/Undo-icon.png differ
diff --git a/forms/anglesnap.PNG b/forms/anglesnap.PNG
new file mode 100644
index 0000000000000000000000000000000000000000..97fd814fa2b35a7b918dd4c47d2323dbc53e0265
Binary files /dev/null and b/forms/anglesnap.PNG differ
diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui
index 855d0bcfa13baaa9fd891f23196be6f1a5184d1e..8e958db5b2b19cc3e39355d4ea2f6bbcec0dad6c 100644
--- a/forms/mainwindow.ui
+++ b/forms/mainwindow.ui
@@ -11,7 +11,7 @@
    </rect>
   </property>
   <property name="windowTitle">
-   <string>JuPedSim</string>
+   <string>JPSeditor</string>
   </property>
   <property name="windowIcon">
    <iconset resource="Ressource.qrc">
@@ -36,6 +36,9 @@
     <addaction name="actionSpeichern"/>
     <addaction name="actionSpeichern_dxf"/>
     <addaction name="separator"/>
+    <addaction name="separator"/>
+    <addaction name="actionSettings"/>
+    <addaction name="separator"/>
     <addaction name="actionBeenden"/>
    </widget>
    <widget class="QMenu" name="menuHilfe">
@@ -50,11 +53,16 @@
     </property>
     <addaction name="actionSelect_Mode"/>
     <addaction name="separator"/>
+    <addaction name="actionUndo"/>
+    <addaction name="actionRedo"/>
+    <addaction name="separator"/>
     <addaction name="actionWall"/>
     <addaction name="actionDoor"/>
+    <addaction name="actionHLine"/>
     <addaction name="separator"/>
-    <addaction name="actionanglesnap"/>
+    <addaction name="actiongridmode"/>
     <addaction name="actionObjectsnap"/>
+    <addaction name="actionanglesnap"/>
     <addaction name="actionDelete_lines"/>
     <addaction name="actionDelete_single_line"/>
     <addaction name="separator"/>
@@ -65,6 +73,7 @@
      <string>View</string>
     </property>
     <addaction name="actionRotate_90_deg_clockwise"/>
+    <addaction name="actionShow_Point_of_Origin"/>
    </widget>
    <addaction name="menuDatei"/>
    <addaction name="menuTools"/>
@@ -84,21 +93,27 @@
    </attribute>
    <addaction name="actionSelect_Mode"/>
    <addaction name="separator"/>
+   <addaction name="actionUndo"/>
+   <addaction name="actionRedo"/>
+   <addaction name="separator"/>
    <addaction name="actionWall"/>
    <addaction name="actionDoor"/>
+   <addaction name="actionHLine"/>
    <addaction name="separator"/>
-   <addaction name="actionanglesnap"/>
+   <addaction name="actiongridmode"/>
    <addaction name="separator"/>
    <addaction name="actionObjectsnap"/>
    <addaction name="separator"/>
+   <addaction name="actionanglesnap"/>
+   <addaction name="separator"/>
    <addaction name="actionDelete_lines"/>
    <addaction name="separator"/>
    <addaction name="actionDelete_single_line"/>
    <addaction name="separator"/>
    <addaction name="actionRoom"/>
    <addaction name="separator"/>
-   <addaction name="actionLandmark"/>
    <addaction name="actionLandmarkWidget"/>
+   <addaction name="actionLandmark"/>
   </widget>
   <action name="action_ffnen">
    <property name="icon">
@@ -156,7 +171,7 @@
     <string>F1</string>
    </property>
   </action>
-  <action name="actionanglesnap">
+  <action name="actiongridmode">
    <property name="checkable">
     <bool>true</bool>
    </property>
@@ -168,10 +183,10 @@
      <normaloff>:/Grid.png</normaloff>:/Grid.png</iconset>
    </property>
    <property name="text">
-    <string>Angle snap</string>
+    <string>Gridmode</string>
    </property>
    <property name="toolTip">
-    <string>Angle snap</string>
+    <string>Gridmode</string>
    </property>
    <property name="shortcut">
     <string>Ctrl+G</string>
@@ -391,7 +406,7 @@
     <bool>true</bool>
    </property>
    <property name="enabled">
-    <bool>true</bool>
+    <bool>false</bool>
    </property>
    <property name="icon">
     <iconset resource="Ressource.qrc">
@@ -403,13 +418,16 @@
    <property name="toolTip">
     <string>Landmark</string>
    </property>
+   <property name="visible">
+    <bool>false</bool>
+   </property>
   </action>
   <action name="actionLandmarkWidget">
    <property name="checkable">
     <bool>true</bool>
    </property>
    <property name="enabled">
-    <bool>true</bool>
+    <bool>false</bool>
    </property>
    <property name="icon">
     <iconset resource="Ressource.qrc">
@@ -421,6 +439,126 @@
    <property name="toolTip">
     <string>LandmarkSpecs</string>
    </property>
+   <property name="visible">
+    <bool>false</bool>
+   </property>
+  </action>
+  <action name="actionanglesnap">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="Ressource.qrc">
+     <normaloff>:/anglesnap.PNG</normaloff>:/anglesnap.PNG</iconset>
+   </property>
+   <property name="text">
+    <string>Orthomode</string>
+   </property>
+   <property name="toolTip">
+    <string>Orthomode</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+H</string>
+   </property>
+  </action>
+  <action name="actionSettings">
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Settings</string>
+   </property>
+   <property name="toolTip">
+    <string>Settings</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+E</string>
+   </property>
+  </action>
+  <action name="action_ffnen_CogMap">
+   <property name="icon">
+    <iconset resource="Ressource.qrc">
+     <normaloff>:/open.png</normaloff>:/open.png</iconset>
+   </property>
+   <property name="text">
+    <string>Load CognitiveMap</string>
+   </property>
+   <property name="toolTip">
+    <string>Load CognitiveMap</string>
+   </property>
+  </action>
+  <action name="actionRun_visualisation">
+   <property name="text">
+    <string>Run visualisation</string>
+   </property>
+  </action>
+  <action name="actionShow_Point_of_Origin">
+   <property name="text">
+    <string>Show Point of Origin</string>
+   </property>
+  </action>
+  <action name="actionUndo">
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="Ressource.qrc">
+     <normaloff>:/Undo-icon.png</normaloff>:/Undo-icon.png</iconset>
+   </property>
+   <property name="text">
+    <string>Undo</string>
+   </property>
+   <property name="toolTip">
+    <string>Undo PaintEvent</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+Z</string>
+   </property>
+   <property name="visible">
+    <bool>true</bool>
+   </property>
+  </action>
+  <action name="actionRedo">
+   <property name="icon">
+    <iconset resource="Ressource.qrc">
+     <normaloff>:/Redo-Icon.png</normaloff>:/Redo-Icon.png</iconset>
+   </property>
+   <property name="text">
+    <string>Redo</string>
+   </property>
+   <property name="toolTip">
+    <string>Redo PaintEvent</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+Y</string>
+   </property>
+  </action>
+  <action name="actionHLine">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="enabled">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="Ressource.qrc">
+     <normaloff>:/HLine.png</normaloff>:/HLine.png</iconset>
+   </property>
+   <property name="text">
+    <string>HLine</string>
+   </property>
+   <property name="toolTip">
+    <string>HLine</string>
+   </property>
+   <property name="shortcut">
+    <string>H</string>
+   </property>
+   <property name="iconVisibleInMenu">
+    <bool>true</bool>
+   </property>
   </action>
  </widget>
  <resources>
diff --git a/forms/roomwidget.ui b/forms/roomwidget.ui
index 6810467fd6f70ebb1de824d6a8b0ea5640048e2c..e1225f781a0ccb24175b612d0daf1620d1d7e339 100644
--- a/forms/roomwidget.ui
+++ b/forms/roomwidget.ui
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>320</width>
-    <height>678</height>
+    <height>725</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -42,7 +42,7 @@
     <property name="geometry">
      <rect>
       <x>20</x>
-      <y>510</y>
+      <y>560</y>
       <width>291</width>
       <height>31</height>
      </rect>
@@ -55,7 +55,7 @@
     <property name="geometry">
      <rect>
       <x>10</x>
-      <y>330</y>
+      <y>380</y>
       <width>291</width>
       <height>171</height>
      </rect>
@@ -65,7 +65,7 @@
     <property name="geometry">
      <rect>
       <x>110</x>
-      <y>610</y>
+      <y>660</y>
       <width>93</width>
       <height>28</height>
      </rect>
@@ -78,7 +78,7 @@
     <property name="geometry">
      <rect>
       <x>30</x>
-      <y>550</y>
+      <y>600</y>
       <width>112</width>
       <height>34</height>
      </rect>
@@ -91,7 +91,7 @@
     <property name="geometry">
      <rect>
       <x>170</x>
-      <y>550</y>
+      <y>600</y>
       <width>112</width>
       <height>34</height>
      </rect>
@@ -117,7 +117,7 @@
     <property name="geometry">
      <rect>
       <x>10</x>
-      <y>290</y>
+      <y>340</y>
       <width>191</width>
       <height>31</height>
      </rect>
@@ -199,7 +199,7 @@
     <property name="geometry">
      <rect>
       <x>-10</x>
-      <y>270</y>
+      <y>320</y>
       <width>341</width>
       <height>20</height>
      </rect>
@@ -212,7 +212,7 @@
     <property name="geometry">
      <rect>
       <x>10</x>
-      <y>240</y>
+      <y>280</y>
       <width>121</width>
       <height>28</height>
      </rect>
@@ -225,7 +225,7 @@
     <property name="geometry">
      <rect>
       <x>202</x>
-      <y>240</y>
+      <y>280</y>
       <width>101</width>
       <height>28</height>
      </rect>
@@ -234,6 +234,37 @@
      <string>Highlight Room</string>
     </property>
    </widget>
+   <widget class="QComboBox" name="classBox">
+    <property name="enabled">
+     <bool>true</bool>
+    </property>
+    <property name="geometry">
+     <rect>
+      <x>100</x>
+      <y>240</y>
+      <width>111</width>
+      <height>21</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QLabel" name="label_6">
+    <property name="geometry">
+     <rect>
+      <x>10</x>
+      <y>240</y>
+      <width>91</width>
+      <height>16</height>
+     </rect>
+    </property>
+    <property name="font">
+     <font>
+      <pointsize>9</pointsize>
+     </font>
+    </property>
+    <property name="text">
+     <string>Roomtype:</string>
+    </property>
+   </widget>
   </widget>
   <widget class="QWidget" name="tab">
    <attribute name="title">
diff --git a/forms/widgetsettings.ui b/forms/widgetsettings.ui
new file mode 100644
index 0000000000000000000000000000000000000000..95e275bdc1eb4d11baa4b2ae86b3d617bdbfe6e5
--- /dev/null
+++ b/forms/widgetsettings.ui
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>WidgetSettings</class>
+ <widget class="QTabWidget" name="WidgetSettings">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>330</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>TabWidget</string>
+  </property>
+  <widget class="QWidget" name="tab">
+   <attribute name="title">
+    <string>View Settings</string>
+   </attribute>
+   <widget class="QGroupBox" name="GridSettings">
+    <property name="geometry">
+     <rect>
+      <x>10</x>
+      <y>10</y>
+      <width>171</width>
+      <height>241</height>
+     </rect>
+    </property>
+    <property name="title">
+     <string>Grid Settings</string>
+    </property>
+    <widget class="QRadioButton" name="en_pointGrid">
+     <property name="geometry">
+      <rect>
+       <x>10</x>
+       <y>30</y>
+       <width>95</width>
+       <height>20</height>
+      </rect>
+     </property>
+     <property name="text">
+      <string>Point Grid</string>
+     </property>
+     <property name="checked">
+      <bool>false</bool>
+     </property>
+    </widget>
+    <widget class="QRadioButton" name="en_lineGrid">
+     <property name="geometry">
+      <rect>
+       <x>10</x>
+       <y>60</y>
+       <width>95</width>
+       <height>20</height>
+      </rect>
+     </property>
+     <property name="text">
+      <string>Line Grid</string>
+     </property>
+     <property name="checked">
+      <bool>true</bool>
+     </property>
+    </widget>
+    <widget class="Line" name="line">
+     <property name="geometry">
+      <rect>
+       <x>0</x>
+       <y>90</y>
+       <width>171</width>
+       <height>16</height>
+      </rect>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+    </widget>
+   </widget>
+   <widget class="QPushButton" name="pushButtoncloseSettings">
+    <property name="geometry">
+     <rect>
+      <x>150</x>
+      <y>260</y>
+      <width>101</width>
+      <height>28</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Apply and Close</string>
+    </property>
+   </widget>
+  </widget>
+  <widget class="QWidget" name="tab2">
+   <attribute name="title">
+    <string>Tab 2</string>
+   </attribute>
+  </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/jpseditor.pro b/jpseditor.pro
index 71f932d9cb6212a16c4a5c466be3cd9bd8a9190b..7186b31fc7d00e9c9b258e45714fb0c87b6dbdcf 100644
--- a/jpseditor.pro
+++ b/jpseditor.pro
@@ -27,7 +27,8 @@ QMAKE_CXXFLAGS += -std=c++11
 FORMS += \
     forms/mainwindow.ui \
     forms/roomwidget.ui \
-    forms/widgetlandmark.ui
+    forms/widgetlandmark.ui \
+    forms/widgetsettings.ui
 
 HEADERS += \
     src/mainWindow.h \
@@ -52,7 +53,14 @@ HEADERS += \
     dxflib/src/dl_codes.h \
     dxflib/src/dl_attributes.h \
     src/jpswaypoint.h \
-    src/widgetlandmark.h
+    src/widgetlandmark.h \
+    src/graphicscene.h \
+    src/widgetsettings.h \
+    src/jpsyahpointer.h \
+    src/jpsconnection.h \
+    src/UndoFramework/actionstack.h \
+    src/UndoFramework/action.h \
+    src/UndoFramework/lineaction.h
 
 
 SOURCES += \
@@ -70,7 +78,14 @@ SOURCES += \
     dxflib/src/dl_writer_ascii.cpp \
     dxflib/src/dl_dxf.cpp \
     src/jpswaypoint.cpp \
-    src/widgetlandmark.cpp
+    src/widgetlandmark.cpp \
+    src/graphicscene.cpp \
+    src/widgetsettings.cpp \
+    src/jpsyahpointer.cpp \
+    src/jpsconnection.cpp \
+    src/UndoFramework/actionstack.cpp \
+    src/UndoFramework/action.cpp \
+    src/UndoFramework/lineaction.cpp
 
 
 RESOURCES +=  forms/Ressource.qrc
diff --git a/src/GraphicView.cpp b/src/GraphicView.cpp
index b98f0cc62db862c88bdc57982e233b61626a0a4c..dcb7784c91e0ad0cb0834c9e844eebb7ac414065 100644
--- a/src/GraphicView.cpp
+++ b/src/GraphicView.cpp
@@ -45,8 +45,11 @@ jpsGraphicsView::jpsGraphicsView(QWidget* parent):QGraphicsView(parent)
     midbutton_hold=false;
     translation_x=0;
     translation_y=0;//this->height();
-    gridmode=false;
-    gl_scale_f=.01;
+    anglesnap=false;
+    id_counter=0;
+    _scaleFactor=1.0;
+    _gridSize=1.0;
+    gl_scale_f=.01*_scaleFactor;
     //scale(10,10);
     catch_radius=10*gl_scale_f;
     catch_line_distance=10*gl_scale_f;
@@ -56,10 +59,13 @@ jpsGraphicsView::jpsGraphicsView(QWidget* parent):QGraphicsView(parent)
     line_tracked=-1;
     current_rect=nullptr;
     currentSelectRect=nullptr;
+    gridmap=nullptr;
     objectsnap=false;
+    _gridmode=false;
     statWall=false;
     statDoor=false;
     statExit=false;
+    _statHLine=false;
     statLandmark=false;
     markedLandmark=nullptr;
     currentLandmarkRect=nullptr;
@@ -68,16 +74,16 @@ jpsGraphicsView::jpsGraphicsView(QWidget* parent):QGraphicsView(parent)
     this->scale(1/gl_scale_f,-1/gl_scale_f);
     _currentTrackedPoint=nullptr;
     _statLineEdit=false;
+    intersection_point=nullptr;
 
     lines_collided=false;
     _assoDef=false;
-    //gl_min_x=1e6;
-    //gl_min_y=1e6;
+
 
     //m_graphView->setFixedSize(1600, 900);
     //m_graphView->setScene(m_graphScen);
 
-    setCacheMode(QGraphicsView::CacheBackground);
+    //setCacheMode(QGraphicsView::CacheBackground);
     setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
 
 
@@ -93,16 +99,11 @@ jpsGraphicsView::jpsGraphicsView(QWidget* parent):QGraphicsView(parent)
 
 
     //Set-up the scene
-    Scene = new QGraphicsScene(this);
+    Scene = new GraphicScene(this);
+
     setScene(Scene);
     setSceneRect(0, 0, 1920, 1080);
 
-    //create_grid();
-
-    ///Origin
-
-    //origin.push_back(Scene->addLine(1,1,1/gl_scale_f*0.02,1,QPen(Qt::black,0)));
-    //origin.push_back(Scene->addLine(1,1,1,1/gl_scale_f*0.02,QPen(Qt::black,0)));
 }
 
 jpsGraphicsView::~jpsGraphicsView()
@@ -127,18 +128,18 @@ void jpsGraphicsView::mouseMoveEvent(QMouseEvent *mouseEvent)
 
     pos=mapToScene(mouseEvent->pos());
 
-    if (gridmode==true)
+    if (anglesnap==true)
     {
         if (current_line!=nullptr)
         {
-            use_gridmode(current_line,5);
+            use_anglesnap(current_line,5);
         }
     }
 
     if (_currentVLine!=nullptr)
     {
-        /// vline will be deleted if it is not thrown horizontally or vertically
-        if(!use_gridmode(_currentVLine,15))
+        // vline will be deleted if it is not thrown horizontally or vertically
+        if(!use_anglesnap(_currentVLine,15))
         {
             delete _currentVLine;
             _currentVLine=nullptr;
@@ -161,11 +162,14 @@ void jpsGraphicsView::mouseMoveEvent(QMouseEvent *mouseEvent)
     translated_pos.setX(pos.x()-translation_x);
     translated_pos.setY(pos.y()-translation_y);
 
+    if (_gridmode)
+        use_gridmode();
+
     if (objectsnap)
     {
         catch_points();
 
-        ///VLine
+        //VLine
         if (point_tracked && (statWall==true || statDoor==true || statExit==true))
         {
             SetVLine();
@@ -180,6 +184,8 @@ void jpsGraphicsView::mouseMoveEvent(QMouseEvent *mouseEvent)
         current_line->setLine(current_line->line().x1(),current_line->line().y1(),translated_pos.x(),translated_pos.y());
 
         //}
+        //As line length has changed
+        emit LineLengthChanged();
     }
     if (_currentVLine!=nullptr)
     {
@@ -187,7 +193,7 @@ void jpsGraphicsView::mouseMoveEvent(QMouseEvent *mouseEvent)
         _currentVLine->setLine(_currentVLine->line().x1(),_currentVLine->line().y1(),translated_pos.x(),translated_pos.y());
     }
 
-    /// see if two lines collided FIX ME!!!
+    // see if two lines collided FIX ME!!!
     //line_collision();
 
     emit mouse_moved();
@@ -202,9 +208,22 @@ void jpsGraphicsView::mousePressEvent(QMouseEvent *mouseEvent)
     if (mouseEvent->button() == Qt::LeftButton)
     {
 
-        if (statWall==true || statDoor==true || statExit==true)
+        if (statWall || statDoor || statExit || _statHLine)
         {
-            drawLine();
+            // If line is edited currently
+            if (_statLineEdit)
+            {
+                for (jpsLineItem* line:line_vector)
+                {
+                    locate_intersection(marked_lines.first(),line);
+                }
+                current_line=nullptr;
+                _statLineEdit=false;
+                line_tracked=1;
+                emit no_drawing();
+            }
+            else
+                drawLine();
         }
         else if (statLandmark==true)
         {
@@ -212,7 +231,7 @@ void jpsGraphicsView::mousePressEvent(QMouseEvent *mouseEvent)
         }
         else
         {
-            ///LineEdit
+            //LineEdit
             if (_currentTrackedPoint!=nullptr && line_tracked==1)
             {
                 EditLine(_currentTrackedPoint);
@@ -221,7 +240,7 @@ void jpsGraphicsView::mousePressEvent(QMouseEvent *mouseEvent)
             }
             else
             {
-                ///Select_mode
+                //Select_mode
                 currentSelectRect=Scene->addRect(translated_pos.x(),translated_pos.y(),0,0,QPen(Qt::blue,0));
                 currentSelectRect->setTransform(QTransform::fromTranslate(translation_x,translation_y), true);
                 leftbutton_hold=true;
@@ -241,7 +260,13 @@ void jpsGraphicsView::mousePressEvent(QMouseEvent *mouseEvent)
 void jpsGraphicsView::mouseDoubleClickEvent(QMouseEvent *event)
 {
     if (event->button()==Qt::LeftButton)
+    {   /// To avoid deleting of edited line
+        if (line_tracked==1)
+        {
+            current_line=nullptr;
+        }
         emit no_drawing();
+    }
 
 }
 
@@ -298,32 +323,106 @@ QGraphicsRectItem *jpsGraphicsView::GetCurrentSelectRect()
     return currentSelectRect;
 }
 
-void jpsGraphicsView::ShowWaypoints(QList<jpsWaypoint *> waypoints)
+void jpsGraphicsView::ShowWaypoints(QList<ptrWaypoint> waypoints)
 {
     ClearWaypoints();
 
-    for (jpsWaypoint* waypoint:waypoints)
+    for (ptrWaypoint waypoint:waypoints)
     {
         QGraphicsEllipseItem* ellipse = Scene->addEllipse(waypoint->GetRect(),QPen(Qt::blue,0));
         ellipse->setTransform(QTransform::fromTranslate(translation_x,translation_y), true);
+        QString string = waypoint->GetType() + "\n" + waypoint->GetCaption()+ "\n" + waypoint->GetText();
+        QGraphicsTextItem* text = Scene->addText(string);
+        text->setPos(waypoint->GetPos().x()+translation_x,waypoint->GetPos().y()+translation_y);
+        //text->setScale(gl_scale_f);
+        text->setData(0,gl_scale_f);
+        text->setTransform(QTransform::fromScale(gl_scale_f,-gl_scale_f),true);
         _waypoints.push_back(ellipse);
+        _waypointLabels.push_back(text);
     }
 
 
 }
 
+void jpsGraphicsView::ShowYAHPointer(const QPointF &pos, const qreal &dir)
+{
+    for (QGraphicsLineItem* lineItem:_yahPointer)
+    {
+        delete lineItem;
+    }
+    _yahPointer.clear();
+
+    _yahPointer.push_back(Scene->addLine(pos.x(),pos.y(),pos.x()+0.5*std::cos(dir),pos.y()+0.5*std::sin(dir),QPen(Qt::blue,0)));
+    _yahPointer.push_back(Scene->addLine(pos.x()+0.5*std::cos(dir),pos.y()+0.5*std::sin(dir),pos.x()+0.2*std::cos(dir+M_PI/4.0),pos.y()+0.2*std::sin(dir+M_PI/4.0),QPen(Qt::blue,0)));
+    _yahPointer.push_back(Scene->addLine(pos.x()+0.5*std::cos(dir),pos.y()+0.5*std::sin(dir),pos.x()+0.2*std::cos(dir-M_PI/4.0),pos.y()+0.2*std::sin(dir-M_PI/4.0),QPen(Qt::blue,0)));
+
+    for (QGraphicsLineItem* lineItem:_yahPointer)
+    {
+        lineItem->setTransform(QTransform::fromTranslate(translation_x,translation_y), true);
+    }
+
+
+}
+
+void jpsGraphicsView::ClearWaypointLabels()
+{
+    for (QGraphicsTextItem* label:_waypointLabels)
+    {
+        delete label;
+    }
+    _waypointLabels.clear();
+}
+
+void jpsGraphicsView::ShowConnections(QList<ptrConnection> cons)
+{
+    ClearConnections();
+    for (ptrConnection con:cons)
+    {
+        QGraphicsLineItem* line = Scene->addLine(QLineF(con->GetWaypoints().first->GetPos(),con->GetWaypoints().second->GetPos()),QPen(Qt::blue,0));
+        _connections.push_back(line);
+
+
+        line->setTransform(QTransform::fromTranslate(translation_x,translation_y), true);
+
+
+    }
+}
+
+void jpsGraphicsView::ClearConnections()
+{
+    for (QGraphicsLineItem* line:_connections)
+    {
+        delete line;
+    }
+    _connections.clear();
+}
+
 
 
 void jpsGraphicsView::ClearWaypoints()
 {
 
-    ///Waypoints
+    //Waypoints
     for (QGraphicsEllipseItem* old_waypoint:_waypoints)
     {
         delete old_waypoint;
     }
     _waypoints.clear();
 
+    ClearWaypointLabels();
+
+}
+
+void jpsGraphicsView::ActivateLineGrid()
+{
+    Scene->SetGrid("Line");
+
+}
+
+void jpsGraphicsView::ActivatePointGrid()
+{
+    Scene->SetGrid("Point");
+
 }
 
 
@@ -341,7 +440,7 @@ void jpsGraphicsView::mouseReleaseEvent(QMouseEvent *event)
 
     if (event->button() == Qt::LeftButton)
     {
-        /// Select lines that are located within the rectangle
+        // Select lines that are located within the rectangle
         if (!(statWall==true || statDoor==true || statExit==true || statLandmark==true))
         {
             leftbutton_hold=false;
@@ -350,17 +449,18 @@ void jpsGraphicsView::mouseReleaseEvent(QMouseEvent *event)
             {
                 if (_assoDef)
                 {
-                    ///Waypoint definition
+                    //Waypoint definition
                     emit AssoDefCompleted();
+                    _assoDef=false;
                 }
                 else
                 {
-                    /// Select lines by creating a rect with the cursor
+                    // Select lines by creating a rect with the cursor
                     catch_lines();
 
-                    /// unmark Landmark is possible
+                    // unmark Landmark is possible
                     unmarkLandmark();
-                    /// Look for landmarks with position in the currentSelectRect
+                    // Look for landmarks with position in the currentSelectRect
                     catch_landmark();
                 }
                 delete currentSelectRect;
@@ -368,7 +468,7 @@ void jpsGraphicsView::mouseReleaseEvent(QMouseEvent *event)
 
             }
 
-            ///unmark selected line(s)
+            //unmark selected line(s)
             if (line_tracked==-1)
             {
                 unmark_all_lines();
@@ -455,7 +555,7 @@ void jpsGraphicsView::delete_all(bool final)
     update();
 }
 
-bool jpsGraphicsView::use_gridmode(QGraphicsLineItem* currentline, int accuracy)
+bool jpsGraphicsView::use_anglesnap(QGraphicsLineItem* currentline, int accuracy)
 
 {
     // if a current line is in the drawing procedure (i. e. starting point is determined but not the ending point)
@@ -487,54 +587,128 @@ bool jpsGraphicsView::use_gridmode(QGraphicsLineItem* currentline, int accuracy)
     return false;
 }
 
+void jpsGraphicsView::use_gridmode()
+{
+    if ((std::fmod(std::fabs(translated_pos.x()),_gridSize)<=_gridSize*0.1 || std::fmod(std::fabs(translated_pos.x()),_gridSize)>=_gridSize*0.9) &&
+         (std::fmod(std::fabs(translated_pos.y()),_gridSize)<=_gridSize*0.1 || std::fmod(std::fabs(translated_pos.y()),_gridSize)>=_gridSize*0.9))
+    {
+        bool posx_positiv=true;
+        bool posy_positiv=true;
+        if (translated_pos.x()<0)
+        {
+            translated_pos.setX(std::fabs(translated_pos.x()));
+            posx_positiv=false;
+        }
+
+        if (translated_pos.y()<0)
+        {
+            translated_pos.setY(std::fabs(translated_pos.y()));
+            posy_positiv=false;
+        }
+
+        if (std::fmod(translated_pos.x(),_gridSize)<=_gridSize*0.1)
+            translated_pos.setX(translated_pos.x()-std::fmod(translated_pos.x(),_gridSize));
+        else
+            translated_pos.setX(translated_pos.x()+(_gridSize-std::fmod(translated_pos.x(),_gridSize)));
+
+        if (std::fmod(translated_pos.y(),_gridSize)<=_gridSize*0.1)
+            translated_pos.setY(translated_pos.y()-std::fmod(translated_pos.y(),_gridSize));
+        else
+            translated_pos.setY(translated_pos.y()+(_gridSize-std::fmod(translated_pos.y(),_gridSize)));
+
+        if (!posx_positiv)
+            translated_pos.setX(translated_pos.x()*(-1));
+
+        if (!posy_positiv)
+            translated_pos.setY(translated_pos.y()*(-1));
+
+        current_rect=Scene->addRect(translated_pos.x()+translation_x-10*gl_scale_f,translated_pos.y()+translation_y-10*gl_scale_f,20*gl_scale_f,20*gl_scale_f,QPen(Qt::red,0));
+        point_tracked=true;
+        _currentTrackedPoint= &translated_pos;
+
+
+    }
+    else
+        point_tracked=false;
+}
+
 void jpsGraphicsView::catch_points()
 {
-    ///Searching for startpoints of all lines near the current cursor position
-    for (signed int i=0; i<line_vector.size(); i++){
+    //Searching for startpoints of all lines near the current cursor position
+    for (int i=0; i<line_vector.size(); ++i){
 
         // range chosen: 10 (-5:5) (has to be changed soon)
         if (line_vector[i]->get_line()->line().x1()>=(translated_pos.x()-catch_radius) && line_vector[i]->get_line()->line().x1()<=(translated_pos.x()+catch_radius) && line_vector[i]->get_line()->line().y1()>=(translated_pos.y()-catch_radius) && line_vector[i]->get_line()->line().y1()<=(translated_pos.y()+catch_radius)){
-            /// in this case the cursor is working with global coordinates. So the method 'mapToGlobal' must be used
+            // in this case the cursor is working with global coordinates. So the method 'mapToGlobal' must be used
+
+            //to avoid the tracking of the coords of an edited line
+            if (line_vector[i]->get_line()==current_line)
+            {
+                continue;
+            }
+
             translated_pos.setX(line_vector[i]->get_line()->line().x1());
             translated_pos.setY(line_vector[i]->get_line()->line().y1());
             //cursor.setPos(mapToGlobal(QPoint(translate_back_x(line_vector[i].x1()),translate_back_y(line_vector[i].y1()))));
-            ///bool is used to tell paint device to draw a red rect if a point was tracked
+            //bool is used to tell paint device to draw a red rect if a point was tracked
             point_tracked=true;
             _currentTrackedPoint= &translated_pos;
             //QPen pen;
             //pen.setColor('red');
-            current_rect=Scene->addRect(translated_pos.x()+translation_x-10*gl_scale_f,translated_pos.y()+translation_y-10*gl_scale_f,20*gl_scale_f,20*gl_scale_f,QPen(Qt::red,0));
-            /// if a point was tracked there is no need to look for further points ( only one point can be tracked)
+            if (current_rect==nullptr)
+                current_rect=Scene->addRect(translated_pos.x()+translation_x-10*gl_scale_f,translated_pos.y()+translation_y-10*gl_scale_f,20*gl_scale_f,20*gl_scale_f,QPen(Qt::red,0));
+            // if a point was tracked there is no need to look for further points ( only one point can be tracked)
 
             return;
         }
 
-        ///Searching for endpoints of all lines near the current cursor position
+        //Searching for endpoints of all lines near the current cursor position
         else if (line_vector[i]->get_line()->line().x2()>=(translated_pos.x()-catch_radius) && line_vector[i]->get_line()->line().x2()<=(translated_pos.x()+catch_radius) && line_vector[i]->get_line()->line().y2()>=(translated_pos.y()-catch_radius) && line_vector[i]->get_line()->line().y2()<=(translated_pos.y()+catch_radius)){
             // see above
+
+            //to avoid the tracking of the coords of an edited line
+            if (line_vector[i]->get_line()==current_line)
+            {
+                continue;
+            }
+
+
             translated_pos.setX(line_vector[i]->get_line()->line().x2());
             translated_pos.setY(line_vector[i]->get_line()->line().y2());
             //cursor.setPos(mapToGlobal(QPoint(translate_back_x(line_vector[i].x2()),translate_back_y(line_vector[i].y2()))));
             point_tracked=true;
-            current_rect=Scene->addRect(translated_pos.x()+translation_x-10*gl_scale_f,translated_pos.y()+translation_y-10*gl_scale_f,20*gl_scale_f,20*gl_scale_f,QPen(Qt::red,0));            
+            if (current_rect==nullptr)
+                current_rect=Scene->addRect(translated_pos.x()+translation_x-10*gl_scale_f,translated_pos.y()+translation_y-10*gl_scale_f,20*gl_scale_f,20*gl_scale_f,QPen(Qt::red,0));
             _currentTrackedPoint= &translated_pos;
             return;
         }
     }
-    /// if no start- or endpoint was tracked it is searched for intersections- Points
+    // if no start- or endpoint was tracked it is searched for intersections- Points
 
-    /// see above
+    // see above
     for (int j=0; j<intersect_point_vector.size(); j++)
     {
         if (intersect_point_vector[j]->x()>=(translated_pos.x()-catch_radius) && intersect_point_vector[j]->x()<=(translated_pos.x()+catch_radius) && intersect_point_vector[j]->y()>=(translated_pos.y()-catch_radius) && intersect_point_vector[j]->y()<=(translated_pos.y()+catch_radius))
         {
             translated_pos.setX(intersect_point_vector[j]->x());
             translated_pos.setY(intersect_point_vector[j]->y());
+            if (current_rect==nullptr)
             current_rect=Scene->addRect(translated_pos.x()+translation_x-10*gl_scale_f,translated_pos.y()+translation_y-10*gl_scale_f,20*gl_scale_f,20*gl_scale_f,QPen(Qt::red,0));
-            point_tracked=true;
+                point_tracked=true;
             return;
         }
     }
+
+    // Catch origin
+    if (!_origin.isEmpty())
+        if (std::fabs(translated_pos.x())<=catch_radius && std::fabs(translated_pos.y())<=catch_radius)
+        {
+            translated_pos.setX(0);
+            translated_pos.setY(0);
+            if (current_rect==nullptr)
+                current_rect=Scene->addRect(translated_pos.x()+translation_x-10*gl_scale_f,translated_pos.y()+translation_y-10*gl_scale_f,20*gl_scale_f,20*gl_scale_f,QPen(Qt::red,0));
+
+        }
     //Look for gridpoints
 
 //    for (auto &gridpoint: grid_point_vector)
@@ -559,33 +733,33 @@ void jpsGraphicsView::catch_points()
 //        }
 //    }
 
-    /// if no point was tracked bool is set back to false
+    // if no point was tracked bool is set back to false
     point_tracked=false;
     return;
 }
 
 void jpsGraphicsView::catch_lines()
 {
-    ///catch lines (only possible if wall is disabled)
-    /// if current rect was build up moving the cursor to the left ->
-    /// whole line has to be within the rect to select the line
+    //catch lines (only possible if wall is disabled)
+    // if current rect was build up moving the cursor to the left ->
+    // whole line has to be within the rect to select the line
     line_tracked=-1;
     if (currentSelectRect->rect().width()<0)
     {
-    for (auto &item:line_vector)
-    {
-        if (currentSelectRect->contains(item->get_line()->line().p1())
-                && currentSelectRect->contains(item->get_line()->line().p2()))
+        for (auto &item:line_vector)
         {
-            select_line(item);
-            line_tracked=1;
+            if (currentSelectRect->contains(item->get_line()->line().p1())
+                    && currentSelectRect->contains(item->get_line()->line().p2()))
+            {
+                select_line(item);
+
 
 
+            }
         }
     }
-    }
-    /// if current rect was build up moving the cursor to the right ->
-    /// throwing the select rect only over a part of a line is sufficent to select it
+    // if current rect was build up moving the cursor to the right ->
+    // throwing the select rect only over a part of a line is sufficent to select it
     else if (currentSelectRect->rect().width()>0)
     {
         for (auto &item:line_vector)
@@ -602,11 +776,11 @@ void jpsGraphicsView::catch_lines()
 
 void jpsGraphicsView::drawLine()
 {
-    if (current_line==nullptr) /// if the mouse was pressed first of two times
+    if (current_line==nullptr) // if the mouse was pressed first of two times
     {
-        ///Determining first point of line
+        //Determining first point of line
 
-        /// all two points of the line are inited with the cursorcoordinates
+        // all two points of the line are inited with the cursorcoordinates
         current_line = Scene->addLine(translated_pos.x(),translated_pos.y(),translated_pos.x(),translated_pos.y(),currentPen);
         //current_line->translate(translation_x,translation_y);
         current_line->setTransform(QTransform::fromTranslate(translation_x,translation_y), true);
@@ -617,7 +791,10 @@ void jpsGraphicsView::drawLine()
     // if the mouse was pressed secondly of two times
     else
     {
+
         jpsLineItem* lineItem= new jpsLineItem(current_line);
+        lineItem->set_id(id_counter);
+        id_counter++;
 
         // if there is already a drawn line
         if (line_vector.size()>=1)
@@ -631,27 +808,22 @@ void jpsGraphicsView::drawLine()
             }
         }
 
-        lineItem->set_type(statWall,statDoor,statExit);
+        lineItem->set_type(statWall,statDoor,statExit,_statHLine);
         line_vector.push_back(lineItem);
 
-        ///reset pointer
+        //reset pointer
         current_line=nullptr;
 
-        if (_statLineEdit)
-        {
+        //Undo
+        RecordUndoLineAction("LineAdded",lineItem->GetType(),lineItem->get_id(),lineItem->get_line()->line());
+
+        //drawLine();
 
-            select_line(lineItem);
-            _statLineEdit=false;
-            line_tracked=1;
-            emit no_drawing();
-        }
-        else
-            drawLine();
 
 
     }
 
-    ///Vline
+    //Vline
     if (_currentVLine!=nullptr)
     {
         delete _currentVLine;
@@ -667,6 +839,7 @@ void jpsGraphicsView::select_line(jpsLineItem *mline)
     {
         mline->get_line()->setPen(QPen(Qt::red,0));
         marked_lines.push_back(mline);
+        line_tracked=1;
     }
     else
     {
@@ -683,16 +856,16 @@ void jpsGraphicsView::disable_drawing()
     statExit=false;
     statLandmark=false;
     _statLineEdit=false;
-    /// if drawing was canceled by pushing ESC
+    // if drawing was canceled by pushing ESC
     if (current_line!=nullptr)
     {
-        ///not completed line will be deleted
+        //not completed line will be deleted
         delete current_line;
         current_line=nullptr;
     }
     if (_currentVLine!=nullptr)
     {
-        ///VLine will be deleted
+        //VLine will be deleted
         delete _currentVLine;
         _currentVLine=nullptr;
     }
@@ -705,6 +878,8 @@ jpsLineItem* jpsGraphicsView::addLineItem(const qreal &x1,const qreal &y1,const
     current_line=Scene->addLine(x1,y1,x2,y2);
     current_line->setTransform(QTransform::fromTranslate(translation_x,translation_y), true);
     jpsLineItem* newLine = new jpsLineItem(current_line);
+    newLine->set_id(id_counter);
+    id_counter++;
 
     if (type=="Door")
     {
@@ -714,6 +889,10 @@ jpsLineItem* jpsGraphicsView::addLineItem(const qreal &x1,const qreal &y1,const
     {
         newLine->set_Exit();
     }
+    else if (type=="HLine")
+    {
+        newLine->SetHLine();
+    }
     else
     {
         newLine->set_Wall();
@@ -744,6 +923,11 @@ jpsLineItem* jpsGraphicsView::addLineItem(const qreal &x1,const qreal &y1,const
 
 }
 
+jpsLineItem *jpsGraphicsView::addLineItem(const QLineF &line, const QString &type)
+{
+    return addLineItem(line.p1().x(),line.p1().y(),line.p2().x(),line.p2().y(),type);
+}
+
 void jpsGraphicsView::locate_intersection(jpsLineItem *item1, jpsLineItem *item2)
 {
 
@@ -797,19 +981,31 @@ void jpsGraphicsView::EditLine(QPointF* point)
     if (marked_lines.size()==1)
     {
 
+        delete current_rect;
+        current_rect=nullptr;
+
+        point_tracked=false;
+
         if (marked_lines.first()->get_line()->line().p1()==*point)
         {
-            current_line=Scene->addLine(marked_lines[0]->get_line()->line().p2().x(),
-                    marked_lines[0]->get_line()->line().p2().y(),translated_pos.x(),translated_pos.y(),QPen(Qt::red,0));
-            current_line->setTransform(QTransform::fromTranslate(translation_x,translation_y), true);
+            RecordUndoLineAction("LineEdited",marked_lines.first()->GetType(),marked_lines.first()->get_id(),marked_lines.first()->get_line()->line());
+            current_line=marked_lines[0]->get_line();
+            marked_lines[0]->get_line()->setLine(marked_lines[0]->get_line()->line().x2(),marked_lines[0]->get_line()->line().y2(),translated_pos.x(),translated_pos.y());
+            //current_line=Scene->addLine(marked_lines[0]->get_line()->line().p2().x(),
+             //       marked_lines[0]->get_line()->line().p2().y(),translated_pos.x(),translated_pos.y(),QPen(Qt::red,0));
+            //current_line->setTransform(QTransform::fromTranslate(translation_x,translation_y), true);
             emit set_focus_textedit();
         }
 
         else if (marked_lines.first()->get_line()->line().p2()==*point)
         {
-            current_line=Scene->addLine(marked_lines[0]->get_line()->line().p1().x(),
-                    marked_lines[0]->get_line()->line().p1().y(),translated_pos.x(),translated_pos.y(),QPen(Qt::red,0));
-            current_line->setTransform(QTransform::fromTranslate(translation_x,translation_y), true);
+            RecordUndoLineAction("LineEdited",marked_lines.first()->GetType(),marked_lines.first()->get_id(),marked_lines.first()->get_line()->line());
+            current_line=marked_lines[0]->get_line();
+            marked_lines[0]->get_line()->setLine(marked_lines[0]->get_line()->line().x1(),marked_lines[0]->get_line()->line().y1(),translated_pos.x(),translated_pos.y());
+
+                    //->get_line()->line().p1().x(),
+                    //marked_lines[0]->get_line()->line().p1().y(),translated_pos.x(),translated_pos.y(),QPen(Qt::red,0);
+            //current_line->setTransform(QTransform::fromTranslate(translation_x,translation_y), true);
             emit set_focus_textedit();
         }
 
@@ -817,13 +1013,20 @@ void jpsGraphicsView::EditLine(QPointF* point)
             return;
 
         //line_tracked=1;
+        RemoveIntersections(marked_lines.first());
         _statLineEdit=true;
-        delete_marked_lines();
+
+        //delete_marked_lines();
         en_disableWall();
 
     }
 }
 
+qreal jpsGraphicsView::ReturnLineLength()
+{
+    return current_line->line().length();
+}
+
 bool jpsGraphicsView::show_hide_roomCaption(QString name, qreal x, qreal y)
 {
     // if caption exits, it is supposed to be hided:
@@ -857,7 +1060,102 @@ bool jpsGraphicsView::show_hide_roomCaption(QString name, qreal x, qreal y)
     return true;
 }
 
-void jpsGraphicsView::line_collision() ///FIX ME!!!
+void jpsGraphicsView::RecordUndoLineAction(const QString& name, const QString& type, const int& itemID, const QLineF &oldLine)
+{
+    _undoStack.PushNewAction(LineAction(name,type,itemID,oldLine));
+}
+
+void jpsGraphicsView::RecordRedoLineAction(const QString &name, const QString &type, const int& itemID, const QLineF &oldLine)
+{
+    _redoStack.PushNewAction(LineAction(name,type,itemID,oldLine));
+}
+
+void jpsGraphicsView::UndoLineEdit(const int& lineID, const QLineF& old_line)
+{
+    for (jpsLineItem* lineItem:line_vector)
+    {
+        if (lineItem->get_id()==lineID)
+        {
+           RecordRedoLineAction("LineEdited",lineItem->GetType(),lineItem->get_id(),lineItem->get_line()->line());
+           lineItem->get_line()->setLine(old_line);
+           break;
+        }
+    }
+}
+
+void jpsGraphicsView::RedoLineEdit(const int &lineID, const QLineF &old_line)
+{
+    for (jpsLineItem* lineItem:line_vector)
+    {
+        if (lineItem->get_id()==lineID)
+        {
+           RecordUndoLineAction("LineEdited",lineItem->GetType(),lineItem->get_id(),lineItem->get_line()->line());
+           lineItem->get_line()->setLine(old_line);
+           break;
+        }
+    }
+}
+
+void jpsGraphicsView::Undo()
+{
+    if (!_undoStack.IsEmpty())
+    {
+        const LineAction recentAction = _undoStack.GetRecentAction();
+
+        if (recentAction.GetName()=="LineDeleted")
+        {
+            addLineItem(recentAction.GetOldLine().p1().x(),recentAction.GetOldLine().p1().y(),recentAction.GetOldLine().p2().x(),
+                        recentAction.GetOldLine().p2().y(),recentAction.GetType());
+
+            RecordRedoLineAction("LineAdded",recentAction.GetType(),id_counter-1,QLineF(0,0,0,0));
+        }
+        else if (recentAction.GetName()=="LineAdded")
+        {
+            RecordRedoLineAction("LineDeleted",line_vector.back()->GetType(),line_vector.back()->get_id(),
+                                 line_vector.back()->get_line()->line());
+            RemoveLineItem(line_vector.back());
+        }
+        else if (recentAction.GetName()=="LineEdited")
+        {
+            UndoLineEdit(recentAction.GetItemID(),recentAction.GetOldLine());
+        }
+    }
+
+}
+
+void jpsGraphicsView::Redo()
+{
+    if (!_redoStack.IsEmpty())
+    {
+        const LineAction recentAction = _redoStack.GetRecentAction();
+
+        if (recentAction.GetName()=="LineDeleted")
+        {
+            addLineItem(recentAction.GetOldLine().p1().x(),recentAction.GetOldLine().p1().y(),recentAction.GetOldLine().p2().x(),
+                        recentAction.GetOldLine().p2().y(),recentAction.GetType());
+
+            RecordUndoLineAction("LineAdded",recentAction.GetType(),id_counter-1,QLineF(0,0,0,0));
+        }
+
+        else if (recentAction.GetName()=="LineAdded")
+        {
+            RecordUndoLineAction("LineDeleted",line_vector.back()->GetType(),line_vector.back()->get_id(),
+                                 line_vector.back()->get_line()->line());
+            RemoveLineItem(line_vector.back());
+
+        }
+        else if (recentAction.GetName()=="LineEdited")
+        {
+            RedoLineEdit(recentAction.GetItemID(),recentAction.GetOldLine());
+
+        }
+
+
+    }
+}
+
+
+void jpsGraphicsView::line_collision() //FIX ME!!!
 {
     /// if no lines collided yet
     if (!lines_collided && current_line!=nullptr)
@@ -891,84 +1189,15 @@ void jpsGraphicsView::line_collision() ///FIX ME!!!
     }
 }
 
-void jpsGraphicsView::create_grid() /// FIX ME!!!!
-{
-    //QPointF sceneViewBottomLeft = mapToScene(QPoint(this->sceneRect().bottomLeft()));
-    //QPointF sceneViewTopRight = mapToScene(QPoint(this->sceneRect().topRight()));
-    //QRectF rect = this->sceneRect();
-    //for (QGraphicsLineItem *gridpoint: grid_point_vector)
-    //{
-     //   delete gridpoint;
-    //}
-    grid_point_vector.clear();
-
-    //std::cout << rect.bottomRight().y() << std::endl;
-
-    //QPointF leftdown = mapToScene(this->sceneRect().bottomLeft().x(),this->sceneRect().bottomLeft().y());
-
-    //QPointF leftup = mapToScene(Scene->sceneRect().bottomLeft().x(),Scene->sceneRect().bottomLeft().y());
-    //std::cout << leftup.x()-translation_x << std::endl;
-    qreal rightx = translated_pos.x()+1920*gl_scale_f;
-    qreal upy = translated_pos.y()+1080*gl_scale_f;
-    qreal leftx = translated_pos.x()-1920*gl_scale_f;
-    qreal downy = translated_pos.y()-1080*gl_scale_f;
-    //QGraphicsEllipseItem* point = Scene->addEllipse(0,0,10,10,QPen(Qt::red));
-    //point->setTransform(Scene->sceneRect().);
-    //point->setTransform(QTransform::fromTranslate(translation_x,translation_y));
-    //grid_point_vector.push_back(point);
-    //std::cout << translation_y << std::endl;
-    //std::cout << this->height() << std::endl;
-    //qreal leftdownx = leftdown.x();//+translation_x;
-    //qreal leftdowny = leftdown.y();//+translation_y;
-
-    //QPointF topRight = mapToScene(this->sceneRect().topRight().x(),this->sceneRect().topRight().y());
-    //qreal rightupx = topRight.x();//+translation_x;
-    //qreal rightupy = topRight.y();//+translation_y;
-
-    //std::cout << rightupx << std::endl;
-    //std::cout << rightupy << std::endl;
-    int intervall=100*gl_scale_f;
-    int ileftx = leftx/intervall;
-    ileftx*=intervall;
-    int idowny = downy/intervall;
-    idowny*=intervall;
-    //int ileftdowny = std::floor(leftdowny);
-    //int irightupx = std::floor(rightupx);
-    //int irightupy = std::floor(rightupy);
-    //std::cout << ileftupx << std::endl;
-    //std::cout << rightdownx << std::endl;
-    //QGraphicsTextItem* point = Scene->addText("Hallo Welt");
-    //point->setX(ileftupx);
-    //point->setY(ileftupy);
-    //std::cout << ileftdownx << std::endl;
-    //std::cout << irightupy << std::endl;
-
-    for (int i=ileftx; i<rightx; i+=intervall)
-    {
-        for (int j=idowny; j<upy; j+=intervall)
-        {
-            //std::cout << rightdownx << std::endl;
-            /*
-            QGraphicsLineItem* line1 = Scene->addLine(i,j-5*gl_scale_f,i,j+5*gl_scale_f,QPen(Qt::red,0));
-            line1->setTransform(QTransform::fromTranslate(translation_x,translation_y), true);
-            grid_point_vector.push_back(line1);
-            QGraphicsLineItem* line2 = Scene->addLine(i-5*gl_scale_f,j,i+5*gl_scale_f,j,QPen(Qt::red,0));
-            line2->setTransform(QTransform::fromTranslate(translation_x,translation_y), true);
-            grid_point_vector.push_back(line2);
-            */
-            QPointF gridpoint(i,j);
-            grid_point_vector.push_back(gridpoint);
-        }
-    }
-
-    //std::cout << leftup-translation_x << std::endl;
-}
 
 void jpsGraphicsView::zoom(int delta)
 {
 
     setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
 
+    //exclude origin from scaling
+    ShowOrigin();
+
     // Scale the view / do the zoom
     double scaleFactor = 1.15;
     if(delta > 0)
@@ -979,23 +1208,30 @@ void jpsGraphicsView::zoom(int delta)
         // {
         //    caption_list[i]->setTransform(QTransform::fromScale(1/gl_scale_f,1/gl_scale_f));
         //}
+        _scaleFactor*=1/1.15;
         gl_scale_f*=1/1.15;
         scale(scaleFactor, scaleFactor);
         catch_radius=10*gl_scale_f;
         catch_line_distance=10*gl_scale_f;
+        Scene->ChangeGridSize(this->CalcGridSize());
         //create_grid();
     }
     else
     {
         // Zooming out
 
+        _scaleFactor*=1.15;
         gl_scale_f*=1.15;
         scale(1.0 / scaleFactor, 1.0 / scaleFactor);
         catch_radius=10*gl_scale_f;
         catch_line_distance=10*gl_scale_f;
+        Scene->ChangeGridSize(this->CalcGridSize());
         //create_grid();
     }
 
+    //set origin back to the scene
+    ShowOrigin();
+
 }
 
 void jpsGraphicsView::translations(QPointF old_pos)
@@ -1003,6 +1239,9 @@ void jpsGraphicsView::translations(QPointF old_pos)
     translation_x+=pos.x()-old_pos.x();
     translation_y+=pos.y()-old_pos.y();
 
+    /// translate the background grid
+    Scene->ChangeTranslation(translation_x,translation_y);
+
     if (current_line!=nullptr)
     {
         //current_line->translate(pos.x()-old_pos.x(),pos.y()-old_pos.y());
@@ -1019,6 +1258,11 @@ void jpsGraphicsView::translations(QPointF old_pos)
     for (int i=0; i<line_vector.size(); ++i)
     {
         //line_vector[i]->get_line()->translate(pos.x()-old_pos.x(),pos.y()-old_pos.y());
+        /// To avoid double sized translation of edited line
+        if (current_line==line_vector[i]->get_line())
+        {
+            continue;
+        }
         line_vector[i]->get_line()->setTransform(QTransform::fromTranslate(pos.x()-old_pos.x(),pos.y()-old_pos.y()), true);
 
     }
@@ -1031,13 +1275,13 @@ void jpsGraphicsView::translations(QPointF old_pos)
         caption_list[i]->setTransform(QTransform::fromScale(scalef,scalef),true);
 
     }
-    for (int i=0; i<grid_point_vector.size(); ++i)
-    {
-        //line_vector[i]->get_line()->translate(pos.x()-old_pos.x(),pos.y()-old_pos.y());
-        //grid_point_vector[i]->setTransform(QTransform::fromTranslate(pos.x()-old_pos.x(),pos.y()-old_pos.y()), true);
-        grid_point_vector[i].setX(pos.x());
-        grid_point_vector[i].setY(pos.y());
-    }
+//    for (int i=0; i<grid_point_vector.size(); ++i)
+//    {
+//        //line_vector[i]->get_line()->translate(pos.x()-old_pos.x(),pos.y()-old_pos.y());
+//        //grid_point_vector[i]->setTransform(QTransform::fromTranslate(pos.x()-old_pos.x(),pos.y()-old_pos.y()), true);
+//        grid_point_vector[i].setX(pos.x());
+//        grid_point_vector[i].setY(pos.y());
+//    }
 
     for (jpsLandmark* landmark:LLandmarks)
     {
@@ -1048,11 +1292,35 @@ void jpsGraphicsView::translations(QPointF old_pos)
     {
         currentLandmarkRect->setTransform(QTransform::fromTranslate(pos.x()-old_pos.x(),pos.y()-old_pos.y()), true);
     }
+    if (gridmap!=nullptr)
+    {
+        gridmap->setTransform(QTransform::fromTranslate(pos.x()-old_pos.x(),pos.y()-old_pos.y()), true);
+    }
     for (QGraphicsEllipseItem* ellipse:_waypoints)
     {
         ellipse->setTransform(QTransform::fromTranslate(pos.x()-old_pos.x(),pos.y()-old_pos.y()), true);
     }
+    for (QGraphicsLineItem* lineItem:_yahPointer)
+    {
+        lineItem->setTransform(QTransform::fromTranslate(pos.x()-old_pos.x(),pos.y()-old_pos.y()), true);
+    }
+    for (QGraphicsTextItem* item:_waypointLabels)
+    {
+        qreal scalef = item->data(0).toReal();
+        item->setTransform(QTransform::fromScale(1.0/scalef,1.0/scalef),true); // without this line translations won't work
+        item->setTransform(QTransform::fromTranslate(pos.x()-old_pos.x(),-pos.y()+old_pos.y()), true);
+        item->setTransform(QTransform::fromScale(scalef,scalef),true);
+    }
+
+    for (QGraphicsLineItem* lineItem:_connections)
+    {
+        lineItem->setTransform(QTransform::fromTranslate(pos.x()-old_pos.x(),pos.y()-old_pos.y()), true);
+    }
 
+    for (QGraphicsLineItem* lineItem:_origin)
+    {
+       lineItem->setTransform(QTransform::fromTranslate(pos.x()-old_pos.x(),pos.y()-old_pos.y()), true);
+    }
 }
 
 void jpsGraphicsView::AutoZoom()
@@ -1063,8 +1331,8 @@ void jpsGraphicsView::AutoZoom()
             line_vector[0]->get_line()->line().p1().y());
     for (jpsLineItem* line:line_vector)
     {
-        ///x
-        ///p1
+        //x
+        //p1
         if (line->get_line()->line().p1().x()<min.x())
         {
             min.setX(line->get_line()->line().p1().x());
@@ -1074,7 +1342,7 @@ void jpsGraphicsView::AutoZoom()
             max.setX(line->get_line()->line().p1().x());
         }
 
-        ///p2
+        //p2
         if (line->get_line()->line().p2().x()<min.x())
         {
             min.setX(line->get_line()->line().p2().x());
@@ -1084,8 +1352,8 @@ void jpsGraphicsView::AutoZoom()
             max.setX(line->get_line()->line().p2().x());
         }
 
-        ///y
-        ///p1
+        //y
+        //p1
         if (line->get_line()->line().p1().y()<min.y())
         {
             min.setY(line->get_line()->line().p1().y());
@@ -1108,17 +1376,17 @@ void jpsGraphicsView::AutoZoom()
     //QPointF center((min.x()+max.x())/2.0,(min.y()+max.y())/2.0);
 
 
-    ///scaling
+    //scaling
     qreal width = (max.x()-min.x());
     qreal height = (max.y()-min.y());
-    /// To ensure the functionality of fitInView
+    // To ensure the functionality of fitInView
     this->setSceneRect(min.x(),min.y(),width,height);
     this->fitInView(min.x(),min.y(),width,height,Qt::KeepAspectRatio);
 
-    ///adapting gl_scale_f
+    //adapting gl_scale_f
     gl_scale_f=1/this->transform().m11();
 
-    ///translations
+    //translations
     QPointF old_pos;
     old_pos.setX(pos.x()+translation_x);
     old_pos.setY(pos.y()+translation_y);
@@ -1126,6 +1394,66 @@ void jpsGraphicsView::AutoZoom()
 
 }
 
+qreal jpsGraphicsView::CalcGridSize()
+{
+    int cFactor;
+    if (_scaleFactor<1.0)
+    {
+        cFactor = std::round(1/_scaleFactor);//std::round(_scaleFactor);
+    }
+    else
+        cFactor = std::round(_scaleFactor);
+
+    int n=0;
+    while (cFactor>std::pow(2,n))
+    {
+        n++;
+    }
+    qreal gridSize;
+    if (_scaleFactor<1.0)
+        gridSize=1/std::pow(2,n);
+    else
+        gridSize=std::pow(2,n);
+
+    _gridSize=gridSize;
+    return gridSize;
+
+}
+
+void jpsGraphicsView::ShowOrigin()
+{
+    if (_origin.isEmpty())
+    {
+        //Scene->DrawOrigin();
+        _origin.push_back(Scene->addLine(0,0,0,0+gl_scale_f*100,QPen(Qt::black,gl_scale_f*2)));
+        _origin.push_back(Scene->addLine(0,0+gl_scale_f*100,0-gl_scale_f*10,0+gl_scale_f*100-gl_scale_f*10,QPen(Qt::black,gl_scale_f*2)));
+        _origin.push_back(Scene->addLine(0,0+gl_scale_f*100,0+gl_scale_f*10,0+gl_scale_f*100-gl_scale_f*10,QPen(Qt::black,gl_scale_f*2)));
+        _origin.push_back(Scene->addLine(0,0,0+gl_scale_f*100,0,QPen(Qt::black,gl_scale_f*2)));
+        _origin.push_back(Scene->addLine(0+gl_scale_f*100,0,gl_scale_f*100-gl_scale_f*10,-gl_scale_f*10,QPen(Qt::black,gl_scale_f*2)));
+        _origin.push_back(Scene->addLine(0+gl_scale_f*100,0,gl_scale_f*100-gl_scale_f*10,+gl_scale_f*10,QPen(Qt::black,gl_scale_f*2)));
+        //Y
+        _origin.push_back(Scene->addLine(0-gl_scale_f*10,gl_scale_f*100-gl_scale_f*50,0-gl_scale_f*5,gl_scale_f*100-gl_scale_f*45,QPen(Qt::black,gl_scale_f*2)));
+        _origin.push_back(Scene->addLine(0-gl_scale_f*10,gl_scale_f*100-gl_scale_f*50,0-gl_scale_f*15,gl_scale_f*100-gl_scale_f*45,QPen(Qt::black,gl_scale_f*2)));
+        _origin.push_back(Scene->addLine(0-gl_scale_f*10,gl_scale_f*100-gl_scale_f*50,0-gl_scale_f*10,gl_scale_f*100-gl_scale_f*60,QPen(Qt::black,gl_scale_f*2)));
+        //X
+        _origin.push_back(Scene->addLine(0+gl_scale_f*40,0-gl_scale_f*15,gl_scale_f*50,-gl_scale_f*5,QPen(Qt::black,gl_scale_f*2)));
+        _origin.push_back(Scene->addLine(0+gl_scale_f*40,0-gl_scale_f*5,gl_scale_f*50,-gl_scale_f*15,QPen(Qt::black,gl_scale_f*2)));
+
+        for (QGraphicsLineItem* lineItem:_origin)
+        {
+           lineItem->setTransform(QTransform::fromTranslate(translation_x,translation_y), true);
+        }
+    }
+    else
+    {
+        for (QGraphicsLineItem* line:_origin)
+        {
+            delete line;
+        }
+        _origin.clear();
+    }
+}
+
 void jpsGraphicsView::StatAssoDef()
 {
    _assoDef=!_assoDef;
@@ -1152,9 +1480,6 @@ qreal jpsGraphicsView::calc_d_point(const QLineF &line,const qreal &x, const qre
 
 }
 
-
-
-
 // Delete single line
 
 void jpsGraphicsView::delete_marked_lines()
@@ -1166,30 +1491,10 @@ void jpsGraphicsView::delete_marked_lines()
 
         for (int i=0; i<marked_lines.size(); ++i)
         {
-            QList<QPointF *> points = marked_lines[i]->get_intersectionVector();
-
-            for (int j=0; j<points.size(); ++j)
-            {
-                delete points[j];
-                intersect_point_vector.removeOne(points[j]);
-                for (int k=0; k<marked_lines[i]->get_intersectLineVector().size(); ++k)
-                {
-                    // removing the intersectionPoint pointer from all lines which includes the point
-                    marked_lines[i]->get_intersectLineVector()[k]->remove_intersectionPoint(points[j]);
-
-                    // as marked_lines is removed it is has no intersections with any other line anymore
-                    // so pointers of possible intersectionsLine have to be removed
-
-                }
 
+            RecordUndoLineAction("LineDeleted",marked_lines[i]->GetType(),marked_lines[i]->get_id(),marked_lines[i]->get_line()->line());
 
-            }
-
-
-            for (int k=0; k<marked_lines[i]->get_intersectLineVector().size(); ++k)
-            {
-                marked_lines[i]->get_intersectLineVector()[k]->remove_interLine(marked_lines[i]);
-            }
+            RemoveIntersections(marked_lines[i]);
 
 
             delete marked_lines[i]->get_line();
@@ -1198,7 +1503,9 @@ void jpsGraphicsView::delete_marked_lines()
             line_vector.removeOne(marked_lines[i]);
 
 
+
         }
+
         marked_lines.clear();
 
         //intersect_point_vector.clear();
@@ -1209,6 +1516,65 @@ void jpsGraphicsView::delete_marked_lines()
 
 }
 
+void jpsGraphicsView::RemoveLineItem(jpsLineItem *mline)
+{
+    RemoveIntersections(mline);
+    line_vector.removeOne(mline);
+    delete mline->get_line();
+    delete mline;
+    emit lines_deleted();
+
+}
+
+void jpsGraphicsView::RemoveLineItem(const QLineF &line)
+{
+    for (jpsLineItem* lineItem:line_vector)
+    {
+        if (lineItem->get_line()->line()==line)
+        {
+            unmark_all_lines();
+            select_line(lineItem);
+            delete_marked_lines();
+        }
+    }
+
+}
+
+void jpsGraphicsView::RemoveIntersections(jpsLineItem *lineItem)
+{
+    QList<QPointF *> points = lineItem->get_intersectionVector();
+
+    for (int j=0; j<points.size(); ++j)
+    {
+        delete points[j];
+        intersect_point_vector.removeOne(points[j]);
+        for (int k=0; k<lineItem->get_intersectLineVector().size(); ++k)
+        {
+            // removing the intersectionPoint pointer from all lines which includes the point
+            lineItem->get_intersectLineVector()[k]->remove_intersectionPoint(points[j]);
+
+            // as marked_lines is removed it has no intersections with any other line anymore
+            // so pointers of possible intersectionsLine have to be removed
+
+        }
+    }
+
+
+    for (int k=0; k<lineItem->get_intersectLineVector().size(); ++k)
+    {
+        lineItem->get_intersectLineVector()[k]->remove_interLine(lineItem);
+    }
+}
+
+void jpsGraphicsView::SelectAllLines()
+{
+    marked_lines.clear();
+    for (jpsLineItem* line:line_vector)
+    {
+        select_line(line);
+    }
+}
+
 void jpsGraphicsView::delete_landmark()
 {
     if (markedLandmark!=nullptr)
@@ -1254,6 +1620,8 @@ void jpsGraphicsView::take_l_from_lineEdit(const qreal &length)
         line.setLength(length);
         current_line->setLine(line);
         jpsLineItem* jpsline = new jpsLineItem(current_line);
+        jpsline->set_id(id_counter);
+        id_counter++;
         jpsline->set_type(statWall,statDoor,statExit);
         line_vector.push_back(jpsline);
         current_line=nullptr;
@@ -1306,11 +1674,19 @@ bool jpsGraphicsView::get_objectsnap()
     return objectsnap;
 }
 
+void jpsGraphicsView::change_gridmode()
+{
+    _gridmode=!_gridmode;
+    Scene->ChangeGridmode(_gridmode);
+    Scene->update();
+}
+
 void jpsGraphicsView::en_disableWall()
 {
     statWall=!statWall;
     statDoor=false;
     statExit=false;
+    _statHLine=false;
     statLandmark=false;
     if (statWall==false)
     {
@@ -1328,14 +1704,14 @@ bool jpsGraphicsView::statusWall()
     return statWall;
 }
 
-void jpsGraphicsView::change_gridmode()
+void jpsGraphicsView::change_stat_anglesnap()
 {
-    gridmode=!gridmode;
+    anglesnap=!anglesnap;
 }
 
-bool jpsGraphicsView::get_gridmode()
+bool jpsGraphicsView::get_stat_anglesnap()
 {
-    return gridmode;
+    return anglesnap;
 }
 
 void jpsGraphicsView::en_disableDoor()
@@ -1344,6 +1720,7 @@ void jpsGraphicsView::en_disableDoor()
     statExit=false;
     statWall=false;
     statLandmark=false;
+    _statHLine=false;
     if (statDoor==false)
     {
         emit no_drawing();
@@ -1365,6 +1742,7 @@ void jpsGraphicsView::en_disableExit()
     statExit=!statExit;
     statDoor=false;
     statWall=false;
+    _statHLine=false;
     statLandmark=false;
     if (statExit==false)
     {
@@ -1376,6 +1754,28 @@ void jpsGraphicsView::en_disableExit()
     }
 }
 
+bool jpsGraphicsView::statusHLine()
+{
+    return _statHLine;
+}
+
+void jpsGraphicsView::en_disableHLine()
+{
+    _statHLine=!_statHLine;
+    statExit=false;
+    statDoor=false;
+    statWall=false;
+    statLandmark=false;
+    if (_statHLine==false)
+    {
+        emit no_drawing();
+    }
+    else
+    {
+        currentPen.setColor(Qt::darkCyan);
+    }
+}
+
 bool jpsGraphicsView::statusLandmark()
 {
     return statLandmark;
diff --git a/src/GraphicView.h b/src/GraphicView.h
index 6e2d468fd929415db96e49d6e2a55fe35576b88f..e72eb847602aab6192ae783019ae7e2f6bd3adc2 100644
--- a/src/GraphicView.h
+++ b/src/GraphicView.h
@@ -30,97 +30,130 @@
 
 
 #include <QGraphicsView>
-#include <QGraphicsSceneMouseEvent>
+//#include <QGraphicsSceneMouseEvent>
+#include "graphicscene.h"
 #include <QGraphicsLineItem>
 #include "jpsLineItem.h"
 #include "jpslandmark.h"
+#include "jpsconnection.h"
+#include "./UndoFramework/actionstack.h"
 
+using ptrConnection = std::shared_ptr<jpsConnection>;
 
 class jpsGraphicsView: public QGraphicsView {
 
     Q_OBJECT
 
 public:
-    ///Constructor
+    //Constructor
     jpsGraphicsView(QWidget* parent = nullptr);
 
-    ///Destructor
+    //Destructor
     ~jpsGraphicsView();
 
-    ///Change modes
-    void change_gridmode();
-    bool get_gridmode();
-    bool use_gridmode(QGraphicsLineItem *currentline, int accuracy);
+    //Change modes
+    void change_stat_anglesnap();
+    bool get_stat_anglesnap();
     void change_objectsnap();
     bool get_objectsnap();
+    void change_gridmode();
     bool statusWall();
     void en_disableWall();
     bool statusDoor();
     void en_disableDoor();
     bool statusExit();
     void en_disableExit();
+    bool statusHLine();
+    void en_disableHLine();
     bool statusLandmark();
     void en_disableLandmark();
 
-    ///Pos
+    // global functions
+    qreal get_scale_f();
+    void take_l_from_lineEdit(const qreal &length);
+    void disable_drawing();
+    bool use_anglesnap(QGraphicsLineItem *currentline, int accuracy);
+    void use_gridmode();
+
+    //View
+    void zoom(int delta);
+    void translations(QPointF old_pos);
+    void AutoZoom();
+    qreal CalcGridSize();
+    void ShowOrigin();
+
+    //Pos
     QPointF return_Pos();
 
-    ///Catch points
+    //Catch lines, points and intersections
     void catch_points();
+    void locate_intersection(jpsLineItem* item1, jpsLineItem* item2);
+    void line_collision();
+    void catch_lines();
 
-    ///Delete all
+    //Delete all
     void delete_all(bool final=false);
 
-    ///Line operations
-    void catch_lines();
+    //Line operations
     void drawLine();
     qreal calc_d_point(const QLineF &line, const qreal &x, const qreal &y);
     void delete_marked_lines();
+    void RemoveLineItem(jpsLineItem *mline);
+    void RemoveLineItem(const QLineF &line);
+    void RemoveIntersections(jpsLineItem* lineItem);
+    // lines read from dxf-file
+    jpsLineItem *addLineItem(const qreal &x1, const qreal &y1, const qreal &x2, const qreal &y2, const QString &type="");
+    jpsLineItem *addLineItem(const QLineF &line, const QString &type="");
+    QList<jpsLineItem *> get_markedLines();
+    QList<jpsLineItem *> get_line_vector();
+    void unmark_all_lines();
+    void select_line(jpsLineItem *mline);
+    void SetVLine();
+    void EditLine(QPointF* point);
+    qreal ReturnLineLength();
 
-    /// Landmark
+    // Landmark
     void delete_landmark();
     void catch_landmark();
     void select_landmark(jpsLandmark *landmark);
     void addLandmark();
-    void unmarkLandmark();
+    // unmark Landmarks see slots
     QList<jpsLandmark *> get_landmarks();
 
-    ///Waypoints
+    //Waypoints/Connections and YAHPointer
     QGraphicsRectItem* GetCurrentSelectRect();
-    void ShowWaypoints(QList<jpsWaypoint* > waypoints);
-
-
-    /// Lines
-    void take_l_from_lineEdit(const qreal &length);
-    QList<jpsLineItem *> get_markedLines();
-    QList<jpsLineItem *> get_line_vector();
-    qreal get_scale_f();
-    void unmark_all_lines();
-    void select_line(jpsLineItem *mline);
-    void disable_drawing();
-    jpsLineItem *addLineItem(const qreal &x1, const qreal &y1, const qreal &x2, const qreal &y2, const QString &type="");
-    void locate_intersection(jpsLineItem* item1, jpsLineItem* item2);
-    void SetVLine();
-    void EditLine(QPointF* point);
+    void ShowWaypoints(QList<ptrWaypoint > waypoints);
+    void ShowYAHPointer(const QPointF& pos, const qreal& dir);
+    void ClearWaypointLabels();
+    void ShowConnections(QList<ptrConnection> cons);
+    void ClearConnections();
 
-    ///RoomCaption
+    //RoomCaption
     bool show_hide_roomCaption(QString name, qreal x, qreal y);
 
-    void line_collision();
-    void create_grid();
-
-    ///View
-    void zoom(int delta);
-    void translations(QPointF old_pos);
-    void AutoZoom();
+    //Undo Framework
+    void RecordUndoLineAction(const QString &name, const QString &type, const int &itemID, const QLineF &oldLine);
+    void RecordRedoLineAction(const QString &name, const QString &type, const int &itemID, const QLineF &oldLine);
+    void UndoLineEdit(const int &lineID, const QLineF &old_line);
+    void RedoLineEdit(const int &lineID, const QLineF &old_line);
 
 public slots:
-    ///Waypoints
+    //Waypoints
     void StatAssoDef();
     void ClearWaypoints();
-
+    //GridSettings
+    void ActivateLineGrid();
+    void ActivatePointGrid();
+    //Landmarks
+    void unmarkLandmark();
+    //Line operations
+    void SelectAllLines();
+    //Undo Redo
+    void Undo();
+    void Redo();
 
 protected:
+    //Mouse events
     virtual void mouseMoveEvent(QMouseEvent * mouseEvent);
     //void paintEvent(QPaintEvent* event);
     virtual void mousePressEvent(QMouseEvent *event);
@@ -130,27 +163,31 @@ protected:
 
 private:
     QGraphicsLineItem* current_line;
+    QPolygonF polygon;
     //std::vector<jpsLineItem> line_vector;
     QList<QPointF *> intersect_point_vector;
-    QList<QPointF> grid_point_vector;
+    //QList<QPointF> grid_point_vector;
     QList<jpsLineItem *> line_vector;
-    QList<QGraphicsLineItem *> origin;
+    QList<QGraphicsLineItem *> _origin;
     //QList<QList<jpsLineItem*> *> mainlist;
     QPointF pos;
     //QPointF* intersection_point;
-    QGraphicsScene* Scene;
+    GraphicScene* Scene;
     bool midbutton_hold;
     bool leftbutton_hold;
     qreal translation_x;
     qreal translation_y;
     QPointF translated_pos;
-    bool gridmode;
+    bool anglesnap;
     bool statWall;
     bool statDoor;
     bool statExit;
     bool statLandmark;
+    bool _statHLine;
     qreal catch_radius;
+    qreal _scaleFactor;
     qreal gl_scale_f;
+    qreal _gridSize;
     bool point_tracked;
     QGraphicsItem* current_rect;
     QGraphicsRectItem* currentSelectRect;
@@ -162,20 +199,29 @@ private:
     QList<jpsLineItem *> marked_lines;
     QGraphicsTextItem* current_caption;
     QList<QGraphicsTextItem* > caption_list;
+    int id_counter;
+
+    //Landmark and waypoints
     QList<jpsLandmark* > LLandmarks;
     jpsLandmark* markedLandmark;
     QGraphicsRectItem* currentLandmarkRect;
     QList<QGraphicsEllipseItem* > _waypoints;
+    QList<QGraphicsLineItem* > _connections;
+    QList<QGraphicsLineItem* > _yahPointer;
+    QList<QGraphicsTextItem* > _waypointLabels;
+
     QGraphicsLineItem* _currentVLine;
     QPointF* _currentTrackedPoint;
-
+    QGraphicsPixmapItem* gridmap;
     bool _statLineEdit;
-
     bool lines_collided;
     bool _assoDef;
+    bool _gridmode;
+
+    //Undo/Redo
+    ActionStack _undoStack;
+    ActionStack _redoStack;
 
-    //qreal gl_min_x;
-    //qreal gl_min_y;
 
 signals:
     void mouse_moved();
@@ -186,11 +232,9 @@ signals:
     void remove_all();
     void landmark_added();
     void AssoDefCompleted();
+    void LineLengthChanged();
     //void DoubleClick();
 
-
-
-
 };
 
 
diff --git a/src/UndoFramework/action.cpp b/src/UndoFramework/action.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..43f7b4b86daceabedd951e097a3391515c11540e
--- /dev/null
+++ b/src/UndoFramework/action.cpp
@@ -0,0 +1,30 @@
+#include "action.h"
+
+Action::Action()
+{
+
+}
+
+Action::Action(const QString &name, const QString &type)
+{
+    _name=name;
+    _type=type;
+
+
+}
+
+Action::~Action()
+{
+
+}
+
+const QString &Action::GetName() const
+{
+    return _name;
+
+}
+
+const QString &Action::GetType() const
+{
+    return _type;
+}
diff --git a/src/UndoFramework/action.h b/src/UndoFramework/action.h
new file mode 100644
index 0000000000000000000000000000000000000000..c38c6d649bc3da7b7707ca97e90d286101bb3690
--- /dev/null
+++ b/src/UndoFramework/action.h
@@ -0,0 +1,23 @@
+#ifndef ACTION_H
+#define ACTION_H
+#include <QString>
+
+class Action
+{
+public:
+    Action();
+    Action(const QString& name, const QString& type);
+    ~Action();
+    //Getter
+    const QString& GetName() const;
+    const QString& GetType() const;
+
+
+private:
+    QString _name;
+    QString _type;
+
+
+};
+
+#endif // ACTION_H
diff --git a/src/UndoFramework/actionstack.cpp b/src/UndoFramework/actionstack.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..84bf454ecd7b7bbc29aff7f8f815ff91ce5128b6
--- /dev/null
+++ b/src/UndoFramework/actionstack.cpp
@@ -0,0 +1,28 @@
+#include "actionstack.h"
+
+ActionStack::ActionStack()
+{
+
+}
+
+ActionStack::~ActionStack()
+{
+
+}
+
+LineAction ActionStack::GetRecentAction()
+{ 
+   return _actionstack.pop();
+}
+
+void ActionStack::PushNewAction(const LineAction &action)
+{
+    _actionstack.push_back(action);
+
+}
+
+bool ActionStack::IsEmpty()
+{
+    return _actionstack.isEmpty();
+}
+
diff --git a/src/UndoFramework/actionstack.h b/src/UndoFramework/actionstack.h
new file mode 100644
index 0000000000000000000000000000000000000000..364f7f54a387b69922347766693d9fc435cba5ca
--- /dev/null
+++ b/src/UndoFramework/actionstack.h
@@ -0,0 +1,21 @@
+#ifndef ACTIONSTACK_H
+#define ACTIONSTACK_H
+
+#include <QStack>
+#include "action.h"
+#include "lineaction.h"
+
+class ActionStack
+{
+public:
+    ActionStack();
+    ~ActionStack();
+
+    LineAction GetRecentAction();
+    void PushNewAction(const LineAction& action);
+    bool IsEmpty();
+private:
+    QStack<LineAction> _actionstack;
+};
+
+#endif // ACTIONSTACK_H
diff --git a/src/UndoFramework/lineaction.cpp b/src/UndoFramework/lineaction.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9bc9523366ea8e8bd70a7b7a4b6885badb11ae32
--- /dev/null
+++ b/src/UndoFramework/lineaction.cpp
@@ -0,0 +1,28 @@
+#include "lineaction.h"
+
+LineAction::LineAction()
+{
+
+}
+
+LineAction::LineAction(const QString &name, const QString &type, const int &itemID, const QLineF &oldLine) : Action(name,type)
+{
+    _oldLine=oldLine;
+    _itemID=itemID;
+}
+
+LineAction::~LineAction()
+{
+
+}
+
+QLineF LineAction::GetOldLine() const
+{
+    return _oldLine;
+}
+
+int LineAction::GetItemID() const
+{
+    return _itemID;
+}
+
diff --git a/src/UndoFramework/lineaction.h b/src/UndoFramework/lineaction.h
new file mode 100644
index 0000000000000000000000000000000000000000..e61f2662b3c6bc7ab3e94df87814e36f379961da
--- /dev/null
+++ b/src/UndoFramework/lineaction.h
@@ -0,0 +1,21 @@
+#ifndef LINEACTION_H
+#define LINEACTION_H
+
+#include "action.h"
+#include <QLine>
+
+class LineAction : public Action
+{
+public:
+    LineAction();
+    LineAction(const QString& name, const QString& type, const int& itemID, const QLineF& oldLine);
+    ~LineAction();
+
+    QLineF GetOldLine() const;
+    int GetItemID() const;
+private:
+    QLineF _oldLine;
+    int _itemID;
+};
+
+#endif // PAINTACTION_H
diff --git a/src/datamanager.cpp b/src/datamanager.cpp
index 45ed66c8eac60e456b7f76d6d726ac6f91a55ef8..5f35521d7145a2f24208b139da9da88ccfd25599 100644
--- a/src/datamanager.cpp
+++ b/src/datamanager.cpp
@@ -29,6 +29,7 @@
 
 #include "datamanager.h"
 #include <iostream>
+#include <utility>
 
 
 
@@ -38,6 +39,8 @@ jpsDatamanager::jpsDatamanager(QWidget *parent, jpsGraphicsView *view)
     mView=view;
     room_id_counter=0;
     obs_id_counter=0;
+    _yahPointer=nullptr;
+    _frameRate=0;
 
 }
 
@@ -57,8 +60,14 @@ void jpsDatamanager::remove_room(jpsRoom *room)
 {
     //if (roomlist.size()>0)
     //{
+    int roomID=room->get_id();
     roomlist.removeOne(room);
     delete room;
+    //change IDs of other room with ID greater than roomID
+    for (jpsRoom* otherroom:roomlist)
+        if (otherroom->get_id()>roomID)
+            otherroom->set_id(otherroom->get_id()-1);
+
     room_id_counter-=1;
     //}
 }
@@ -257,9 +266,9 @@ void jpsDatamanager::writeXML(QFile &file)
     exitList.clear();
     stream->writeEndElement();//transitions
 
-    //stream->writeStartElement("landmarks");
-    //writeLandmarks(stream,landmarks);
-    //stream->writeEndElement();//landmarks
+    stream->writeStartElement("landmarks");
+    writeLandmarks(stream,landmarks);
+    stream->writeEndElement();//landmarks
 
     stream->writeEndElement();//geometry
 
@@ -268,6 +277,32 @@ void jpsDatamanager::writeXML(QFile &file)
     delete stream;
 }
 
+void jpsDatamanager::writeRoutingXML(QFile &file) // Construction side
+{
+    QXmlStreamWriter* stream = new QXmlStreamWriter(&file);
+    QList<jpsLineItem* > hLines;
+
+    for (jpsLineItem* line:mView->get_line_vector())
+    {
+        if (line->IsHLine())
+        {
+            hLines.push_back(line);
+        }
+    }
+
+
+    writeRoutingHeader(stream);
+
+    stream->writeStartElement("Hlines");
+    writeHLines(stream,hLines);
+    stream->writeEndElement();//Hlines
+
+    stream->writeEndDocument();
+
+    delete stream;
+
+}
+
 void jpsDatamanager::AutoSaveXML(QFile &file)
 {
     QXmlStreamWriter* stream = new QXmlStreamWriter(&file);
@@ -284,9 +319,9 @@ void jpsDatamanager::AutoSaveXML(QFile &file)
     exitList.clear();
     stream->writeEndElement();//transitions
 
-    //stream->writeStartElement("landmarks");
-    //writeLandmarks(stream,landmarks);
-    //stream->writeEndElement();//landmarks
+    stream->writeStartElement("landmarks");
+    writeLandmarks(stream,landmarks);
+    stream->writeEndElement();//landmarks
 
     stream->writeEndElement();//geometry
 
@@ -301,13 +336,91 @@ void jpsDatamanager::writeHeader(QXmlStreamWriter *stream)
     stream->writeStartDocument("1.0",true);
 
     stream->writeStartElement("geometry");
-    stream->writeAttribute("version", "0.5");
+    stream->writeAttribute("version", "0.8");
     stream->writeAttribute("caption","corner");
     stream->writeAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
     stream->writeAttribute("xsi:noNamespaceSchemaLocation","http://xsd.jupedsim.org/jps_geometry.xsd");
     stream->writeAttribute("unit","m");
 }
 
+void jpsDatamanager::writeRoutingHeader(QXmlStreamWriter *stream)
+{
+    stream->setAutoFormatting(true);
+    stream->writeStartDocument("1.0",true);
+
+    stream->writeStartElement("routing");
+    stream->writeAttribute("version", "0.8");
+    //stream->writeAttribute("caption","corner");
+    stream->writeAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
+    stream->writeAttribute("xsi:noNamespaceSchemaLocation","http://xsd.jupedsim.org/jps_routing.xsd");
+    stream->writeAttribute("unit","m");
+}
+
+void jpsDatamanager::writeHLines(QXmlStreamWriter *stream, QList<jpsLineItem *> &hLines)
+{
+    // to be sure that id is unique (considering crossings, transitions)
+    int id=1000;
+    for (jpsLineItem *lineItem:hLines)
+    {
+        stream->writeStartElement("Hline");
+        stream->writeAttribute("id",QString::number(id));
+        stream->writeAttribute("room_id","0");
+        QString rid = RoomIDHLine(lineItem);
+        if (rid.contains("Warning"))
+        {
+            QMessageBox::critical(mView,
+                                  "WriteHLines",
+                                  rid,
+                                  QMessageBox::Ok);
+        }
+        stream->writeAttribute("subroom_id",rid);
+
+            //Vertices
+            stream->writeStartElement("vertex");
+            stream->writeAttribute("px",QString::number(lineItem->get_line()->line().p1().x()));
+            stream->writeAttribute("py",QString::number(lineItem->get_line()->line().p1().y()));
+            stream->writeEndElement(); //vertex
+
+            stream->writeStartElement("vertex");
+            stream->writeAttribute("px",QString::number(lineItem->get_line()->line().p2().x()));
+            stream->writeAttribute("py",QString::number(lineItem->get_line()->line().p2().y()));
+            stream->writeEndElement(); //vertex
+
+        stream->writeEndElement(); //Hline
+        id++;
+    }
+}
+
+QString jpsDatamanager::RoomIDHLine(jpsLineItem *lineItem)
+{
+
+    for (jpsRoom* room:roomlist)
+    {
+        QPolygonF rPolygon = room->RoomAsSortedPolygon();
+        if (rPolygon.containsPoint(lineItem->get_line()->line().p1(),Qt::OddEvenFill) ||
+                rPolygon.contains(lineItem->get_line()->line().p1()))
+        {
+            if (rPolygon.containsPoint(lineItem->get_line()->line().p2(),Qt::OddEvenFill)||
+                    rPolygon.contains(lineItem->get_line()->line().p2()))
+                return QString::number(room->get_id());
+            else
+                return "Warning! HLine intersects walls";
+        }
+//        else if (rPolygon.containsPoint(lineItem->get_line()->line().p2(),Qt::OddEvenFill)||
+//                 rPolygon.contains(lineItem->get_line()->line().p2()))
+//        {
+//            if (rPolygon.containsPoint(lineItem->get_line()->line().p1(),Qt::OddEvenFill)||
+//                    rPolygon.contains(lineItem->get_line()->line().p1()))
+//                return QString::number(room->get_id());
+//            else
+//                return "Warning! HLine intersects walls";
+//        }
+
+    }
+    return "Warning! HLine outside geometry";
+
+}
+
 void jpsDatamanager::writeRooms(QXmlStreamWriter *stream, QList<jpsLineItem *> &lines)
 {
     ///rooms
@@ -320,7 +433,7 @@ void jpsDatamanager::writeRooms(QXmlStreamWriter *stream, QList<jpsLineItem *> &
         stream->writeStartElement("subroom");
         stream->writeAttribute("id",QString::number(roomlist[i]->get_id()));
         stream->writeAttribute("caption",roomlist[i]->get_name());
-        stream->writeAttribute("class","subroom");
+        stream->writeAttribute("class",roomlist[i]->get_type());
 
         //walls
         QList<jpsLineItem* > wallList=roomlist[i]->get_listWalls();
@@ -356,7 +469,7 @@ void jpsDatamanager::writeRooms(QXmlStreamWriter *stream, QList<jpsLineItem *> &
     }
 
 
-    ///Crossings
+    //Crossings
     writeCrossings(stream,lines);
 
     stream->writeEndElement();//crossings
@@ -666,8 +779,8 @@ void jpsDatamanager::writeLandmarks(QXmlStreamWriter *stream, QList<jpsLandmark
         stream->writeAttribute("px",QString::number(landmark->get_pos().x()));
         stream->writeAttribute("py",QString::number(landmark->get_pos().y()));
         stream->writeStartElement("associations");
-        m=0;
-        for (jpsWaypoint* waypoint:landmark->GetWaypoints())
+
+        for (ptrWaypoint waypoint:landmark->GetWaypoints())
         {
             stream->writeStartElement("association");
             stream->writeAttribute("id",QString::number(m));
@@ -747,29 +860,29 @@ jpsGraphicsView * jpsDatamanager::get_view()
     return mView;
 }
 
-void jpsDatamanager::AutoAssignCrossings()
-{
-    QList<jpsCrossing* > crossings = crossingList;
+//void jpsDatamanager::AutoAssignCrossings()
+//{
+//    QList<jpsCrossing* > crossings = crossingList;
 
-    for (jpsCrossing *crossing: crossings)
-    {
-        int roomCounter=0;
-        for (jpsRoom *room : roomlist)
-        {
-            if (room->ContainsDoor(crossing->get_cLine()) && roomCounter==0)
-            {
-                crossing->add_rooms(room);
-                roomCounter++;
+//    for (jpsCrossing *crossing: crossings)
+//    {
+//        int roomCounter=0;
+//        for (jpsRoom *room : roomlist)
+//        {
+//            if (room->ContainsDoor(crossing->get_cLine()) && roomCounter==0)
+//            {
+//                crossing->add_rooms(room);
+//                roomCounter++;
 
-            }
-            else if (room->ContainsDoor(crossing->get_cLine()) && roomCounter==1)
-            {
-                crossing->add_rooms(crossing->get_roomList()[0],room);
-                crossings.removeOne(crossing);
-                break;
-            }
-        }
-    }
+//            }
+//            else if (room->ContainsDoor(crossing->get_cLine()) && roomCounter==1)
+//            {
+//                crossing->add_rooms(crossing->get_roomList()[0],room);
+//                crossings.removeOne(crossing);
+//                break;
+//            }
+//        }
+//    }
 
 
 
@@ -813,44 +926,52 @@ void jpsDatamanager::AutoAssignCrossings()
 
 
 
-}
+//}
 
-void jpsDatamanager::AutoAssignExits()
-{
-    for (jpsExit *exit: exitList)
-    {
-        for (jpsRoom *room: roomlist)
-        {
-            QList<jpsLineItem* > walls = room->get_listWalls();
+//void jpsDatamanager::AutoAssignExits()
+//{
+//    for (jpsExit *exit: exitList)
+//    {
+//        for (jpsRoom *room: roomlist)
+//        {
+//            QList<jpsLineItem* > walls = room->get_listWalls();
 
-            int pointCounter = 0;
+//            int pointCounter = 0;
 
-            for (jpsLineItem* wall: walls)
-            {
-                if (wall->get_line()->line().p1()==exit->get_cLine()->get_line()->line().p1() ||
-                       wall->get_line()->line().p1()==exit->get_cLine()->get_line()->line().p2() ||
-                        wall->get_line()->line().p2()==exit->get_cLine()->get_line()->line().p1() ||
-                        wall->get_line()->line().p2()==exit->get_cLine()->get_line()->line().p2())
-                {
-                    pointCounter++;
-                }
-            }
+//            for (jpsLineItem* wall: walls)
+//            {
+//                if (wall->get_line()->line().p1()==exit->get_cLine()->get_line()->line().p1() ||
+//                       wall->get_line()->line().p1()==exit->get_cLine()->get_line()->line().p2() ||
+//                        wall->get_line()->line().p2()==exit->get_cLine()->get_line()->line().p1() ||
+//                        wall->get_line()->line().p2()==exit->get_cLine()->get_line()->line().p2())
+//                {
+//                    pointCounter++;
+//                }
+//            }
 
-            if (pointCounter==2)
-            {
-                exit->add_rooms(room);
-                break;
-            }
-        }
-    }
+//            if (pointCounter==2)
+//            {
+//                exit->add_rooms(room);
+//                break;
+//            }
+//        }
+//    }
 
-}
+//}
 
 bool jpsDatamanager::readXML(QFile &file)
 {
 
     QXmlStreamReader xmlReader(&file);
 
+    // skip header
+    xmlReader.readNext();
+    xmlReader.readNext();
+
+    // see if file starts with geometry
+    if (xmlReader.name() != "geometry")
+        return false;
+
     while(!xmlReader.atEnd() && !xmlReader.hasError())
     {
         /* Read next element.*/
@@ -913,12 +1034,92 @@ bool jpsDatamanager::readXML(QFile &file)
      * and resets its internal state to the initial state. */
     xmlReader.clear();
 
-    ///AutoZoom to drawing
-    mView->AutoZoom();
+    return true;
+}
+
+bool jpsDatamanager::readRoutingXML(QFile &file)
+{
+    QXmlStreamReader xmlReader(&file);
+
+    // skip header
+    xmlReader.readNext();
+    xmlReader.readNext();
+
+    // see if file starts with geometry
+    if (xmlReader.name() != "routing")
+        return false;
+
+    while(!xmlReader.atEnd() && !xmlReader.hasError())
+    {
+        /* Read next element.*/
+        QXmlStreamReader::TokenType token = xmlReader.readNext();
+        /* If token is just StartDocument, we'll go to next.*/
+        if(token == QXmlStreamReader::StartDocument)
+        {
+            continue;
+        }
+
+        /* If token is StartElement, we'll see if we can read it.*/
+        if(token == QXmlStreamReader::StartElement)
+        {
+            /* If it's named Hlines, we'll go to the next.*/
+            if(xmlReader.name() == "Hlines")
+            {
+                continue;
+            }
+
+            if(xmlReader.name() == "Hline")
+            {
+                this->parseHline(xmlReader);
+            }
+        }
+    }
+    /* Error handling. */
+    if(xmlReader.hasError())
+    {
+        QMessageBox::critical(mView,
+                              "QXSRExample::parseXML",
+                              xmlReader.errorString(),
+                              QMessageBox::Ok);
+        return false;
+    }
+    /* Removes any device() or data from the reader
+     * and resets its internal state to the initial state. */
+    xmlReader.clear();
 
     return true;
 }
 
+void jpsDatamanager::parseHline(QXmlStreamReader &xmlReader)
+{
+
+    while(!(xmlReader.tokenType() == QXmlStreamReader::EndElement &&
+                xmlReader.name() == "Hline"))
+    {
+        xmlReader.readNext();
+
+        if (xmlReader.tokenType()==QXmlStreamReader::StartElement &&
+                         xmlReader.name() == "vertex")
+        {
+
+            // get coords from vertices
+            qreal x1=xmlReader.attributes().value("px").toString().toFloat();
+            qreal y1=xmlReader.attributes().value("py").toString().toFloat();
+
+            // go to next vertex
+            xmlReader.readNext();
+            xmlReader.readNext();
+            xmlReader.readNext();
+
+            qreal x2=xmlReader.attributes().value("px").toString().toFloat();
+            qreal y2=xmlReader.attributes().value("py").toString().toFloat();
+            // add Line to graphview
+            mView->addLineItem(x1,y1,x2,y2,"HLine");
+        }
+
+    }
+}
+
 void jpsDatamanager::parseSubRoom(QXmlStreamReader &xmlReader)
 {
     // new subroom
@@ -935,8 +1136,10 @@ void jpsDatamanager::parseSubRoom(QXmlStreamReader &xmlReader)
 
     if(attributes.hasAttribute("class"))
     {
-        /* We'll add it to the room. */
-        roomlist.last()->set_type(attributes.value("class").toString());
+        if (attributes.value("class").toString()=="subroom")
+            roomlist.last()->set_type("Not specified");
+        else
+            roomlist.last()->set_type(attributes.value("class").toString());
     }
     this->parseWalls(xmlReader,roomlist.last());
     this->parseObstacles(xmlReader,roomlist.last());
@@ -1181,9 +1384,15 @@ bool jpsDatamanager::readDXF(std::string filename)
 
 void jpsDatamanager::addLine(const DL_LineData &d)
 {
-
-    mView->addLineItem(d.x1,d.y1,d.x2,d.y2);
-
+    DL_Attributes attributes = DL_CreationInterface::getAttributes();
+    std::string layername = attributes.getLayer();
+    std::transform(layername.begin(), layername.end(), layername.begin(), ::tolower);
+    if (layername=="wall")
+        mView->addLineItem(d.x1,d.y1,d.x2,d.y2,"Wall");
+    else if (layername=="door")
+        mView->addLineItem(d.x1,d.y1,d.x2,d.y2,"Door");
+    else
+        mView->addLineItem(d.x1,d.y1,d.x2,d.y2);
 }
 
 
@@ -1441,6 +1650,269 @@ QString jpsDatamanager::check_printAbility()
     return "";
 }
 
+bool jpsDatamanager::ParseCogMap(QFile &file)
+{
+    QXmlStreamReader xmlReader(&file);
+
+    while(!xmlReader.atEnd() && !xmlReader.hasError())
+    {
+        /* Read next element.*/
+        QXmlStreamReader::TokenType token = xmlReader.readNext();
+        /* If token is just StartDocument, we'll go to next.*/
+        if(token == QXmlStreamReader::StartDocument)
+        {
+            continue;
+        }
+
+        /* If token is StartElement, we'll see if we can read it.*/
+        if(token == QXmlStreamReader::StartElement)
+        {
+            /* If it's named rooms, we'll go to the next.*/
+            if(xmlReader.name() == "cognitiveMap")
+            {
+                continue;
+            }
+            if(xmlReader.name() == "header")
+            {
+                continue;
+            }
+            if(xmlReader.name() == "frameRate")
+            {
+                _frameRate=xmlReader.readElementText().toFloat();
+            }
+            if(xmlReader.name() == "frame")
+            {
+                ParseFrames(xmlReader);
+            }
+        }
+    }
+    /* Error handling. */
+    if(xmlReader.hasError())
+    {
+        QMessageBox::critical(mView,
+                              "QXSRExample::parseXML",
+                              xmlReader.errorString(),
+                              QMessageBox::Ok);
+        return false;
+    }
+    /* Removes any device() or data from the reader
+     * and resets its internal state to the initial state. */
+
+
+    xmlReader.clear();
+    return true;
+}
+
+void jpsDatamanager::ParseFrames(QXmlStreamReader &xmlReader)
+{
+      int frameID= xmlReader.attributes().value("ID").toString().toInt();
+
+    while(!(xmlReader.tokenType() == QXmlStreamReader::EndElement &&
+                xmlReader.name() == "frame"))
+    {
+        if (xmlReader.tokenType()==QXmlStreamReader::StartElement &&
+                         xmlReader.name() == "YAHPointer")
+        {
+            ParseYAHPointer(xmlReader, frameID);
+        }
+        else if (xmlReader.tokenType()==QXmlStreamReader::StartElement &&
+                    xmlReader.name() == "landmark")
+        {
+            ParseLandmarksInCMap(xmlReader, frameID);
+        }
+        else if (xmlReader.tokenType()==QXmlStreamReader::StartElement &&
+                    xmlReader.name() == "waypoint")
+        {
+            ParseWaypointInCMap(xmlReader, frameID);
+        }
+        else if (xmlReader.tokenType()==QXmlStreamReader::StartElement &&
+                    xmlReader.name() == "connection")
+        {
+            ParseConnectionsInCMap(xmlReader, frameID);
+        }
+        xmlReader.readNext();
+
+    }
+
+    _lastCMapFrame=frameID;
+}
+
+void jpsDatamanager::ParseYAHPointer(QXmlStreamReader &xmlReader, const int& frame)
+{
+    qreal x = xmlReader.attributes().value("x").toString().toFloat();
+    qreal y = xmlReader.attributes().value("y").toString().toFloat();
+    qreal angle = xmlReader.attributes().value("dir").toString().toFloat();
+    if (_yahPointer==nullptr)
+    {
+        _yahPointer = new jpsYAHPointer(x,y,angle);
+        _yahPointer->SetFirstFrame(frame);
+        _yahPointer->SetLastFrame(frame);
+    }
+    else
+    {
+        _yahPointer->SetPos(QPointF(x,y));
+        _yahPointer->SetDirection(angle);
+        _yahPointer->SetLastFrame(frame);
+    }
+
+}
+
+void jpsDatamanager::ParseLandmarksInCMap(QXmlStreamReader &xmlReader, const int& frame)
+{
+
+    bool wayPInList=false;
+
+    int id = xmlReader.attributes().value("ID").toString().toInt();
+    qreal x = xmlReader.attributes().value("x").toString().toFloat();
+    qreal y = xmlReader.attributes().value("y").toString().toFloat();
+    qreal rA = xmlReader.attributes().value("rA").toString().toFloat();
+    qreal rB = xmlReader.attributes().value("rB").toString().toFloat();
+    QString caption = xmlReader.attributes().value("caption").toString();
+
+    for (ptrWaypoint waypoint:_waypointsInCMap)
+    {
+        if (waypoint->GetId()==id && waypoint->GetType()=="Landmark")
+        {
+            wayPInList = true;
+            waypoint->SetLastFrame(frame);
+        }
+    }
+
+    if (!wayPInList)
+    {
+        _waypointsInCMap.push_back(std::make_shared<jpsWaypoint>(QPointF(x,y),rA,rB,id,"Landmark"));
+        _waypointsInCMap.back()->SetFirstFrame(frame);
+        _waypointsInCMap.back()->SetLastFrame(frame);
+        _waypointsInCMap.back()->SetCaption(caption);
+    }
+}
+
+void jpsDatamanager::ParseWaypointInCMap(QXmlStreamReader &xmlReader, const int& frame)
+{
+    bool wayPInList=false;
+
+    int id = xmlReader.attributes().value("ID").toString().toInt();
+    qreal x = xmlReader.attributes().value("x").toString().toFloat();
+    qreal y = xmlReader.attributes().value("y").toString().toFloat();
+    qreal rA = xmlReader.attributes().value("rA").toString().toFloat();
+    qreal rB = xmlReader.attributes().value("rB").toString().toFloat();
+    QString caption = xmlReader.attributes().value("caption").toString();
+    bool current = xmlReader.attributes().value("current").toString().toInt();
+
+    for (ptrWaypoint waypoint:_waypointsInCMap)
+    {
+        if (waypoint->GetId()==id && waypoint->GetType()=="Waypoint")
+        {
+            wayPInList = true;
+            waypoint->SetLastFrame(frame);
+
+            if (current!=waypoint->IsCurrent())
+            {
+                waypoint->ChangeCurrentness(frame);
+
+            }
+
+        }
+    }
+
+    if (!wayPInList)
+    {
+        _waypointsInCMap.push_back(std::make_shared<jpsWaypoint>(QPointF(x,y),rA,rB,id,"Waypoint"));
+        _waypointsInCMap.back()->SetFirstFrame(frame);
+        _waypointsInCMap.back()->SetLastFrame(frame);
+        _waypointsInCMap.back()->SetCurrentness(current,frame);
+        _waypointsInCMap.back()->SetCaption(caption);
+    }
+
+}
+
+void jpsDatamanager::ParseConnectionsInCMap(QXmlStreamReader &xmlReader, const int &frame)
+{
+    int id1 = xmlReader.attributes().value("Landmark_WaypointID1").toString().toInt();
+    int id2 = xmlReader.attributes().value("Landmark_WaypointID2").toString().toInt();
+    std::shared_ptr<jpsWaypoint> waypoint1 = nullptr;
+    std::shared_ptr<jpsWaypoint> waypoint2 = nullptr;
+
+
+    for (ptrWaypoint waypoint:_waypointsInCMap)
+    {
+        if (waypoint->GetId()==id1)
+        {
+            waypoint1=waypoint;
+
+        }
+        else if (waypoint->GetId()==id2)
+        {
+            waypoint2=waypoint;
+
+        }
+
+    }
+
+    ptrConnection con = std::make_shared<jpsConnection>(waypoint1,waypoint2,frame);
+    if (waypoint1!=nullptr && waypoint2!=nullptr)
+    {
+        for (ptrConnection conInMap : _connectionsInCMap)
+        {
+            if (con->operator ==(conInMap))
+            {
+                conInMap->SetLastFrame(frame);
+
+                return;
+            }
+        }
+
+        _connectionsInCMap.push_back(con);
+    }
+
+
+}
+
+void jpsDatamanager::ShowCMapFrame(const int& frame) const
+{
+    mView->ShowYAHPointer(_yahPointer->GetPosWhenFrame(frame),_yahPointer->GetDirWhenFrame(frame));
+
+    QList<ptrWaypoint > wayPCandidates;
+
+    for (ptrWaypoint waypoint:_waypointsInCMap)
+    {
+        if (waypoint->OccursInFrame(frame))
+        {
+            wayPCandidates.push_back(waypoint);
+
+            if (waypoint->IsCurrentInFrame(frame))
+                waypoint->SetText("Next target");
+            else if (waypoint->Visited(frame))
+                waypoint->SetText("Already visited");
+            else
+                waypoint->SetText("");
+        }
+    }
+    QList<ptrConnection> conCandidates;
+    for (ptrConnection connection:_connectionsInCMap)
+    {
+        if (connection->OccursInFrame(frame))
+        {
+            conCandidates.push_back(connection);
+        }
+    }
+
+    mView->ShowConnections(conCandidates);
+    mView->ShowWaypoints(wayPCandidates);
+
+}
+
+
+const double &jpsDatamanager::GetCMapFrameRate() const
+{
+    return _frameRate;
+}
+
+const int &jpsDatamanager::GetLastCMapFrame() const
+{
+    return _lastCMapFrame;
+}
+
 
 
 
diff --git a/src/datamanager.h b/src/datamanager.h
index d5e77e037f963ebc1f3c49ec2b6abefa44fdd780..d1a14caeb0a78f9ada46fcf292c35d549ff941f3 100644
--- a/src/datamanager.h
+++ b/src/datamanager.h
@@ -30,7 +30,7 @@
 #ifndef DATAMANAGER_H
 #define DATAMANAGER_H
 
-#include<QtGui>
+#include <QtGui>
 #include <QApplication>
 #include <QGraphicsView>
 #include <QMessageBox>
@@ -40,63 +40,71 @@
 #include "jpsexit.h"
 #include "jpsobstacle.h"
 #include "GraphicView.h"
+#include "jpsyahpointer.h"
+#include "jpsconnection.h"
 
 
 #include "../dxflib/src/dl_creationadapter.h"
 #include "../dxflib/src/dl_dxf.h"
 
 
+using ptrConnection = std::shared_ptr<jpsConnection>;
+using ptrWaypoint = std::shared_ptr<jpsWaypoint>;
+
+
 class jpsDatamanager: public DL_CreationAdapter
 {
 public:
     jpsDatamanager(QWidget* parent=0L, jpsGraphicsView* view=0L);
     ~jpsDatamanager();
-    ///Room
+    //Room
     QList<jpsRoom *> get_roomlist();
     void new_room();
     void remove_room(jpsRoom* room);
     void change_roomName(jpsRoom* room, QString name);
     void remove_all_rooms();
-    ///Obstacle
+    //Obstacle
     QList<jpsObstacle *> get_obstaclelist();
     void new_obstacle();
     void remove_obstacle(jpsObstacle* obs);
     void change_obstacleName(jpsObstacle* obs, QString name);
     void remove_all_obstacles();
-    ///Crossing
+    //Crossing
     QList<jpsCrossing *> get_crossingList();
     void new_crossing(QList<jpsLineItem *> newCrossing);
     void new_crossing(jpsLineItem* newCrossing);
     void remove_crossing(jpsCrossing* crossing);
     void change_crossingName(jpsCrossing* crossing, QString name);
     void remove_all_crossings();
-    ///Exit
+    //Exit
     QList<jpsExit *> get_exitList();
     void new_exit(QList<jpsLineItem *> newExits);
     void new_exit(jpsLineItem* newExit);
     void remove_exit(jpsExit* exit);
     void change_exitName(jpsExit* exit, QString name);
     void remove_all_exits();
-    ///Landmark
+    //Landmark
     QList<jpsLandmark *> get_landmarks();
     void new_landmark(jpsLandmark * newlandmark);
     void remove_landmark(jpsLandmark* landmark);
     void change_LandmarkName(jpsLandmark* landmark, QString name);
     void remove_all_landmarks();
-    ///
+    //
     void remove_all();
     void remove_marked_lines();
     void set_view(jpsGraphicsView* view);
     jpsGraphicsView* get_view();
 
 
-    /// Auto Assign
-    void AutoAssignCrossings();
-    void AutoAssignExits();
+    // Auto Assign
+//    void AutoAssignCrossings();
+//    void AutoAssignExits();
 
 
-    /// Read XML
+    // Read XML
     bool readXML(QFile &file);
+    bool readRoutingXML(QFile &file);
+    void parseHline(QXmlStreamReader &xmlReader);
     void parseSubRoom(QXmlStreamReader &xmlReader);
     void parseWalls(QXmlStreamReader &xmlReader,jpsRoom* room);
     void parseWalls(QXmlStreamReader &xmlReader,jpsObstacle* room);
@@ -104,10 +112,14 @@ public:
     void parseTransitions(QXmlStreamReader &xmlReader);
     void parseObstacles(QXmlStreamReader &xmlReader, jpsRoom *room);
 
-    /// Write XML
+    // Write XML
     void writeXML(QFile &file);
+    void writeRoutingXML(QFile &file);
     void AutoSaveXML(QFile &file);
     void writeHeader(QXmlStreamWriter *stream);
+    void writeRoutingHeader(QXmlStreamWriter *stream);
+    void writeHLines(QXmlStreamWriter *stream, QList<jpsLineItem* >& hLines);
+    QString RoomIDHLine(jpsLineItem* lineItem);
     void writeRooms(QXmlStreamWriter *stream, QList<jpsLineItem* >& lines);
     void AutoSaveRooms(QXmlStreamWriter *stream, QList<jpsLineItem* >& lines);
     void writeCrossings(QXmlStreamWriter *stream, QList<jpsLineItem* >& lines);
@@ -118,10 +130,10 @@ public:
     void writeNotAssignedExits(QXmlStreamWriter *stream, QList<jpsLineItem* >& lines);
     void writeLandmarks(QXmlStreamWriter *stream, QList<jpsLandmark* > &landmarks);
 
-    /// Read DXF
+    // Read DXF
     bool readDXF(std::string filename);
     virtual void addLine(const DL_LineData& d);
-    /// write DXF
+    // write DXF
     void writeDXF(std::string filename);
     void writeDXFHeader(DL_Dxf* dxf, DL_WriterA *dw);
     void writeDXFTables(DL_Dxf* dxf, DL_WriterA *dw);
@@ -131,7 +143,21 @@ public:
 
     QString check_printAbility();
 
+    //Parse Cognitive Map
+    bool ParseCogMap(QFile &file);
+    void ParseFrames(QXmlStreamReader &xmlReader);
+    void ParseYAHPointer(QXmlStreamReader &xmlReader, const int &frame);
+    void ParseLandmarksInCMap(QXmlStreamReader &xmlReader, const int &frame);
+    void ParseWaypointInCMap(QXmlStreamReader &xmlReader, const int &frame);
+    void ParseConnectionsInCMap(QXmlStreamReader &xmlReader, const int &frame);
+
+    //Show Cognitive Map
+    void ShowCMapFrame(const int& frame) const;
+    const double& GetCMapFrameRate() const;
+    const int& GetLastCMapFrame() const;
+
 private:
+    //Geometry
     QList<jpsRoom *> roomlist;
     QList<jpsObstacle *> obstaclelist;
     QList<jpsCrossing *> crossingList;
@@ -142,6 +168,14 @@ private:
     QWidget* parent_widget;
     jpsGraphicsView* mView;
 
+    //CognitiveMap
+    QList<jpsLandmark* > _landmarksInCMap;
+    QList<ptrWaypoint > _waypointsInCMap;
+    QList<ptrConnection> _connectionsInCMap;
+    jpsYAHPointer* _yahPointer;
+    double _frameRate;
+    int _lastCMapFrame;
+
 
 
 };
diff --git a/src/graphicscene.cpp b/src/graphicscene.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3600b99d405bd32570bc2f05f8a7f1f96cde71de
--- /dev/null
+++ b/src/graphicscene.cpp
@@ -0,0 +1,97 @@
+#include "graphicscene.h"
+#include <QVarLengthArray>
+#include <cmath>
+
+
+GraphicScene::GraphicScene(QObject *parent) : QGraphicsScene(parent)
+{
+    _translationX=0.0;
+    _translationY=0.0;
+    _gridmode=false;
+    _statgrid="Line";
+    _gridSize=1.0;
+}
+
+GraphicScene::~GraphicScene()
+{
+
+}
+
+void GraphicScene::ChangeGridmode(const bool &stat)
+{
+    _gridmode=stat;
+}
+
+bool GraphicScene::GetGridmode() const
+{
+    return _gridmode;
+}
+
+void GraphicScene::ChangeTranslation(qreal x, qreal y)
+{
+    _translationX=x;
+    _translationY=y;
+}
+
+void GraphicScene::SetGrid(QString grid)
+{
+    _statgrid=grid;
+}
+
+void GraphicScene::ChangeGridSize(const qreal &gridSize)
+{
+    _gridSize=gridSize;
+}
+
+void GraphicScene::drawBackground(QPainter *painter, const QRectF &rect)
+{
+    if (_gridmode)
+    {
+        if (_statgrid=="Line")
+            DrawLineGrid(painter,rect);
+        else
+            DrawPointGrid(painter,rect);
+    }
+}
+
+void GraphicScene::DrawLineGrid(QPainter *painter, const QRectF &rect)
+{
+    //gridSize=1.0;
+    qreal left = int(rect.left()-_translationX) - std::fmod(int(rect.left()-_translationX), _gridSize);
+    qreal top = int(rect.top()-_translationY)- std::fmod(int(rect.top()-_translationY) , _gridSize);
+
+    QVarLengthArray<QLineF, 100> lines;
+
+    for (qreal x = left; x < rect.right()-_translationX; x += _gridSize)
+        lines.append(QLineF(x+_translationX, rect.top(), x+_translationX, rect.bottom()));
+    for (qreal y = top; y < rect.bottom()-_translationY; y += _gridSize)
+        lines.append(QLineF(rect.left(), y+_translationY, rect.right(), y+_translationY));
+
+    //qDebug() << lines.size();
+    painter->setPen(QPen(Qt::gray,0));
+    painter->drawLines(lines.data(), lines.size());
+}
+
+void GraphicScene::DrawPointGrid(QPainter *painter, const QRectF &rect)
+{
+
+
+    qreal left = int(rect.left()-_translationX) - std::fmod(int(rect.left()-_translationX), _gridSize);
+    qreal top = int(rect.top()-_translationY)- std::fmod(int(rect.top()-_translationY) , _gridSize);
+
+    QVarLengthArray<QPointF, 100> points;
+
+    for (qreal x = left; x < rect.right()-_translationX; x += _gridSize)
+    {
+        for (qreal y = top; y < rect.bottom()-_translationY; y += _gridSize)
+        {
+            points.append(QPointF(x+_translationX, y+_translationY));
+        }
+    }
+    //qDebug() << lines.size();
+    painter->setPen(QPen(Qt::black,0));
+    painter->drawPoints(points.data(), points.size());
+}
+
+
+
diff --git a/src/graphicscene.h b/src/graphicscene.h
new file mode 100644
index 0000000000000000000000000000000000000000..91da5da9edb7a1666791a577e8160c9443a09c16
--- /dev/null
+++ b/src/graphicscene.h
@@ -0,0 +1,37 @@
+#ifndef GRAPHICSCENE_H
+#define GRAPHICSCENE_H
+
+#include <QGraphicsScene>
+#include <QPainter>
+
+class GraphicScene : public QGraphicsScene
+{
+    Q_OBJECT
+
+public:
+
+    GraphicScene(QObject* parent=nullptr);
+    GraphicScene(qreal x, qreal y, qreal w, qreal h)
+        : QGraphicsScene(x, y, w, h)
+    { }
+    ~GraphicScene();
+    void ChangeGridmode(const bool& stat);
+    bool GetGridmode() const;
+    void ChangeTranslation(qreal x, qreal y);
+    void SetGrid(QString grid);
+    void ChangeGridSize(const qreal& factor);
+
+protected:
+    void drawBackground(QPainter *painter, const QRectF &rect) override;
+    void DrawLineGrid(QPainter *painter, const QRectF &rect);
+    void DrawPointGrid(QPainter *painter, const QRectF &rect);
+private:
+    bool _gridmode;
+    qreal _translationX;
+    qreal _translationY;
+    QString _statgrid;
+    qreal _gridSize;
+
+};
+
+#endif // GRAPHICSCENE_H
diff --git a/src/jpsLineItem.cpp b/src/jpsLineItem.cpp
index 20896675e0804e811b2a277ceda7002bd4f104cb..10301c4c61e13948777e2414b343e857512581e9 100644
--- a/src/jpsLineItem.cpp
+++ b/src/jpsLineItem.cpp
@@ -58,6 +58,16 @@ QString jpsLineItem::get_name()
     return mName;
 }
 
+QString jpsLineItem::GetType()
+{
+    if (is_Door())
+        return "Door";
+    else if (is_Wall())
+        return "Wall";
+    else if (IsHLine())
+        return "HLine";
+}
+
 void jpsLineItem::set_id(int id)
 {
     mId=id;
@@ -68,7 +78,7 @@ void jpsLineItem::set_name(QString name)
     mName=name;
 }
 
-void jpsLineItem::set_type(bool wall, bool door, bool exit)
+void jpsLineItem::set_type(bool wall, bool door, bool exit, bool hline)
 {
     if (wall==true)
     {
@@ -82,6 +92,8 @@ void jpsLineItem::set_type(bool wall, bool door, bool exit)
     {
         set_Exit();
     }
+    else
+        SetHLine();
 }
 
 void jpsLineItem::set_Wall()
@@ -89,6 +101,7 @@ void jpsLineItem::set_Wall()
     wall=true;
     door=false;
     exit=false;
+    _hLine=false;
     defaultColor="black";
 }
 
@@ -97,6 +110,7 @@ void jpsLineItem::set_Door()
     door=true;
     wall=false;
     exit=false;
+    _hLine=false;
     defaultColor="blue";
 }
 
@@ -105,10 +119,21 @@ void jpsLineItem::set_Exit()
     exit=true;
     wall=false;
     door=false;
+    _hLine=false;
     defaultColor="darkMagenta";
 
 }
 
+void jpsLineItem::SetHLine()
+{
+    exit=false;
+    wall=false;
+    door=false;
+    _hLine=true;
+    defaultColor="darkCyan";
+
+}
+
 void jpsLineItem::set_defaultColor(QString color)
 {
     defaultColor=color;
@@ -129,6 +154,11 @@ bool jpsLineItem::is_Exit()
     return exit;
 }
 
+bool jpsLineItem::IsHLine()
+{
+    return _hLine;
+}
+
 void jpsLineItem::add_intersectionPoint(QPointF *point)
 {
     intersectionVector.push_back(point);
diff --git a/src/jpsLineItem.h b/src/jpsLineItem.h
index d381b6169ea5d21cf89b51665032d4d9b9c15044..3ebb525d7841de23f98c52f2d54836b78721e623 100644
--- a/src/jpsLineItem.h
+++ b/src/jpsLineItem.h
@@ -42,16 +42,19 @@ public:
     int get_id();
     QString get_defaultColor();
     QString get_name();
+    QString GetType();
     void set_id(int id);
     void set_name(QString name);
-    void set_type(bool wall, bool door, bool exit);
+    void set_type(bool wall, bool door, bool exit, bool hline=false);
     void set_Wall();
     void set_Door();
     void set_Exit();
+    void SetHLine();
     void set_defaultColor(QString color);
     bool is_Wall();
     bool is_Door();
     bool is_Exit();
+    bool IsHLine();
     void add_intersectionPoint(QPointF *point);
     void remove_intersectionPoint(QPointF *point);
     QList<QPointF *> get_intersectionVector();
@@ -70,6 +73,7 @@ private:
     bool wall;
     bool door;
     bool exit;
+    bool _hLine;
     QList<QPointF *> intersectionVector;
     QList<jpsLineItem* > intersectLineVector;
     /*
diff --git a/src/jpsconnection.cpp b/src/jpsconnection.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a2ccecc224dd51d448dc2de213c8a5e54e297e27
--- /dev/null
+++ b/src/jpsconnection.cpp
@@ -0,0 +1,61 @@
+#include "jpsconnection.h"
+
+jpsConnection::jpsConnection(ptrWaypoint waypoint1, ptrWaypoint waypoint2, const int &frameID)
+{
+    _waypoint1=waypoint1;
+    _waypoint2=waypoint2;
+    _firstFrame=frameID;
+    _lastFrame=frameID;
+}
+
+jpsConnection::~jpsConnection()
+{
+
+}
+
+std::pair<ptrWaypoint, ptrWaypoint> jpsConnection::GetWaypoints() const
+{
+    return std::make_pair(_waypoint1,_waypoint2);
+}
+
+bool jpsConnection::OccursInFrame(const int& frameID) const
+{
+    if (frameID>=_firstFrame && frameID<=_lastFrame)
+    {
+        return true;
+    }
+    else
+        return false;
+}
+
+void jpsConnection::SetFirstFrame(const int &frameID)
+{
+    _firstFrame=frameID;
+}
+
+void jpsConnection::SetLastFrame(const int &frameID)
+{
+    _lastFrame=frameID;
+}
+
+const int &jpsConnection::GetFirstFrame() const
+{
+    return _firstFrame;
+}
+
+const int &jpsConnection::GetLastFrame() const
+{
+    return _lastFrame;
+}
+
+bool jpsConnection::operator == (const ptrConnection con2) const
+{
+    if ((con2->GetWaypoints().first==_waypoint1 && con2->GetWaypoints().second==_waypoint2)
+            || (con2->GetWaypoints().second==_waypoint1 && con2->GetWaypoints().first==_waypoint2))
+    {
+        return true;
+    }
+    else
+        return false;
+}
+
diff --git a/src/jpsconnection.h b/src/jpsconnection.h
new file mode 100644
index 0000000000000000000000000000000000000000..8359d4e3969343a6c81e56a6e2b5e99c4b76fd91
--- /dev/null
+++ b/src/jpsconnection.h
@@ -0,0 +1,33 @@
+#ifndef JPSCONNECTION_H
+#define JPSCONNECTION_H
+
+#include <memory>
+#include <utility>
+#include "jpswaypoint.h"
+
+using ptrWaypoint = std::shared_ptr<jpsWaypoint>;
+
+
+class jpsConnection
+{
+using ptrConnection = std::shared_ptr<jpsConnection>;
+public:
+    jpsConnection(ptrWaypoint waypoint1, ptrWaypoint waypoint2, const int& frameID=-1);
+    ~jpsConnection();
+    std::pair<ptrWaypoint,ptrWaypoint> GetWaypoints() const;
+    //Occurence
+    bool OccursInFrame(const int &frameID) const;
+    void SetFirstFrame(const int &frameID);
+    void SetLastFrame(const int &frameID);
+    const int& GetFirstFrame() const;
+    const int& GetLastFrame() const;
+    // Operator overload
+    bool operator ==(const ptrConnection con2) const;
+private:
+    ptrWaypoint _waypoint1;
+    ptrWaypoint _waypoint2;
+    int _firstFrame;
+    int _lastFrame;
+};
+
+#endif // JPSCONNECTION_H
diff --git a/src/jpscrossing.cpp b/src/jpscrossing.cpp
index 9fb51983e728867d85e79944c032aadf2456934d..a5f7e9a7a3278b54092e4a86786249c86fc30084 100644
--- a/src/jpscrossing.cpp
+++ b/src/jpscrossing.cpp
@@ -70,9 +70,11 @@ void jpsCrossing::add_rooms(jpsRoom *room1, jpsRoom *room2)
 {
     roomList.clear();
     roomList.push_back(room1);
+    room1->AddDoor(this);
     if (room2!=0L)
     {
         roomList.push_back(room2);
+        room2->AddDoor(this);
     }
 
 
diff --git a/src/jpslandmark.cpp b/src/jpslandmark.cpp
index 637b737a0229b8be0cd9f27c18f2136ac6947bf9..b109cf397a928c3fcea29ea2139922e1d830b3cf 100644
--- a/src/jpslandmark.cpp
+++ b/src/jpslandmark.cpp
@@ -100,27 +100,27 @@ int jpsLandmark::get_visibility()
     return _visibility;
 }
 
-void jpsLandmark::AddWaypoint(jpsWaypoint *waypoint)
+void jpsLandmark::AddWaypoint(ptrWaypoint waypoint)
 {
     _waypoints.push_back(waypoint);
 }
 
-void jpsLandmark::RemoveWaypoint(jpsWaypoint *waypoint)
+void jpsLandmark::RemoveWaypoint(ptrWaypoint waypoint)
 {
-    delete waypoint;
+    delete waypoint.get();
     _waypoints.removeOne(waypoint);
 }
 
-QList<jpsWaypoint *> jpsLandmark::GetWaypoints()
+QList<ptrWaypoint> jpsLandmark::GetWaypoints()
 {
     return _waypoints;
 }
 
 void jpsLandmark::RemoveAllWaypoints()
 {
-    for (jpsWaypoint* waypoint:_waypoints)
+    for (ptrWaypoint waypoint:_waypoints)
     {
-        delete waypoint;
+        delete waypoint.get();
     }
     _waypoints.clear();
 }
diff --git a/src/jpslandmark.h b/src/jpslandmark.h
index 9b3306f05ee3df0669aeca51c23c64a730b61d4c..8bbf20fdf0e6f245a588ecc1c27857d9d7e9969c 100644
--- a/src/jpslandmark.h
+++ b/src/jpslandmark.h
@@ -29,9 +29,11 @@
 #ifndef JPSLANDMARK_H
 #define JPSLANDMARK_H
 #include <QPointF>
+#include <memory>
 #include "rooms.h"
 #include "jpswaypoint.h"
 
+using ptrWaypoint = std::shared_ptr<jpsWaypoint>;
 
 class jpsLandmark
 {
@@ -39,22 +41,22 @@ public:
     jpsLandmark();
     jpsLandmark(QGraphicsPixmapItem* pixmap, QString name, QPointF point);
     ~jpsLandmark();
-    ///Setter
+    //Setter
     void set_pixmap(QGraphicsPixmapItem* pixmap);
     void set_name(QString name);
     void set_pos(QPointF pos);
     void set_room(jpsRoom* room);
     void set_visibility(int visibility);
-    ///Getter
+    //Getter
     QGraphicsPixmapItem* get_pixmap();
     QString get_name();
     const QPointF& get_pos();
     jpsRoom *get_room();
     int get_visibility();
-    ///Waypoint handling
-    void AddWaypoint(jpsWaypoint* waypoint);
-    void RemoveWaypoint(jpsWaypoint* waypoint);
-    QList<jpsWaypoint* > GetWaypoints();
+    //Waypoint handling
+    void AddWaypoint(ptrWaypoint waypoint);
+    void RemoveWaypoint(ptrWaypoint waypoint);
+    QList<ptrWaypoint> GetWaypoints();
     void RemoveAllWaypoints();
 
 
@@ -64,7 +66,7 @@ private:
     jpsRoom* _room;
     int _visibility;
     QGraphicsPixmapItem* _pixmapItem;
-    QList<jpsWaypoint* > _waypoints;
+    QList<ptrWaypoint > _waypoints;
 
 };
 
diff --git a/src/jpsobstacle.cpp b/src/jpsobstacle.cpp
index 3b4d710e618ad59ef00c53b419bfc0c5316ef16a..2b8b52ec122dd6b18c6be76017a1738949074ff5 100644
--- a/src/jpsobstacle.cpp
+++ b/src/jpsobstacle.cpp
@@ -44,3 +44,4 @@ jpsRoom* jpsObstacle::get_room()
 {
     return _room;
 }
+
diff --git a/src/jpswaypoint.cpp b/src/jpswaypoint.cpp
index f9778cd1265fae2135db037d5739e19697cc8cf1..109c26b9be11a6c01804d5398b13e2ff9a58cbad 100644
--- a/src/jpswaypoint.cpp
+++ b/src/jpswaypoint.cpp
@@ -28,27 +28,56 @@
 
 #include "jpswaypoint.h"
 #include <cmath>
+#include <iostream>
 jpsWaypoint::jpsWaypoint()
 {
 
 }
 
-jpsWaypoint::jpsWaypoint(QRectF rect)
+jpsWaypoint::jpsWaypoint(const QPointF &point, const qreal &rA, const qreal &rB, const int &id, const QString &type)
+{
+    _pos=point;
+    _a=rA;
+    _b=rB;
+    _id=id;
+    _type=type;
+    _rect=QRectF(point.x()-rA,point.y()-rB,rA*2,rB*2);
+    _currentness=false;
+    _FFcurrentness=-1;
+    _LFcurrentness=-1;
+    _lastFrame=-1;
+    _firstFrame=-1;
+    _caption="";
+}
+
+jpsWaypoint::jpsWaypoint(QRectF rect, const int &id)
 {
     _rect=rect;
     _pos=_rect.center();
     _a=std::abs(_rect.width()/2.0);
     _b=std::abs(_rect.height()/2.0);
     _ellipseItem=nullptr;
+    _id=id;
+    _currentness=false;
+    _FFcurrentness=-1;
+    _LFcurrentness=-1;
+    _lastFrame=-1;
+    _firstFrame=-1;
 }
 
-jpsWaypoint::jpsWaypoint(QGraphicsEllipseItem* ellipseItem)
+jpsWaypoint::jpsWaypoint(QGraphicsEllipseItem* ellipseItem, const int &id)
 {
     _ellipseItem=ellipseItem;
     _rect=_ellipseItem->rect();
     _pos=_rect.center();
     _a=_rect.width();
     _b=_rect.height();
+    _id=id;
+    _currentness=false;
+    _FFcurrentness=-1;
+    _LFcurrentness=-1;
+    _lastFrame=-1;
+    _firstFrame=-1;
 }
 
 jpsWaypoint::~jpsWaypoint()
@@ -56,32 +85,47 @@ jpsWaypoint::~jpsWaypoint()
 
 }
 
-const QPointF &jpsWaypoint::GetPos()
+const QPointF &jpsWaypoint::GetPos() const
 {
     return _pos;
 
 }
 
-const QRectF &jpsWaypoint::GetRect()
+const QRectF &jpsWaypoint::GetRect() const
 {
     return _rect;
 }
 
-double jpsWaypoint::GetA()
+const double& jpsWaypoint::GetA() const
 {
     return _a;
 }
 
-double jpsWaypoint::GetB()
+const double& jpsWaypoint::GetB() const
 {
     return _b;
 }
 
+const int &jpsWaypoint::GetId() const
+{
+    return _id;
+}
+
 QGraphicsEllipseItem *jpsWaypoint::GetEllipseItem()
 {
     return _ellipseItem;
 }
 
+const QString &jpsWaypoint::GetCaption() const
+{
+    return _caption;
+}
+
+const QString &jpsWaypoint::GetType() const
+{
+    return _type;
+}
+
 
 void jpsWaypoint::SetPos(QPointF point)
 {
@@ -102,6 +146,112 @@ void jpsWaypoint::SetEllipseItem(QGraphicsEllipseItem *ellipseItem)
     _ellipseItem=ellipseItem;
 }
 
+void jpsWaypoint::SetId(const int &id)
+{
+    _id=id;
+}
+
+void jpsWaypoint::SetCaption(const QString &string)
+{
+    _caption=string;
+}
+
+void jpsWaypoint::SetType(const QString &type)
+{
+    _type=type;
+}
+
+const int &jpsWaypoint::GetFirstFrame() const
+{
+    return _firstFrame;
+}
+
+const int &jpsWaypoint::GetLastFrame() const
+{
+    return _lastFrame;
+}
+
+void jpsWaypoint::SetFirstFrame(const int &frame)
+{
+    _firstFrame=frame;
+
+}
+
+void jpsWaypoint::SetLastFrame(const int &frame)
+{
+    _lastFrame=frame;
+
+}
+
+bool jpsWaypoint::OccursInFrame(const int &frame) const
+{
+    if (frame>=_firstFrame && frame<=_lastFrame)
+    {
+        return true;
+    }
+    return false;
+}
+
+bool jpsWaypoint::IsCurrent() const
+{
+    return _currentness;
+}
+
+bool jpsWaypoint::IsCurrentInFrame(const int &frameID)
+{
+    if (_FFcurrentness<= frameID && _LFcurrentness>=frameID)
+        return true;
+    else
+        return false;
+}
+
+void jpsWaypoint::SetCurrentness(bool stat, const int& frameID)
+{
+    _currentness=stat;
+    if (stat)
+        _FFcurrentness=frameID;
+}
+
+const int &jpsWaypoint::GetFirstFrameCurrent() const
+{
+    return _FFcurrentness;
+}
+
+const int &jpsWaypoint::GetLastFrameCurrent() const
+{
+    return _LFcurrentness;
+}
+
+void jpsWaypoint::ChangeCurrentness(const int& frameID)
+{
+    _currentness=!_currentness;
+    if (_currentness)
+        _FFcurrentness=frameID;
+    else
+        _LFcurrentness=frameID;
+}
+
+const QString &jpsWaypoint::GetText()
+{
+    return _text;
+}
+
+void jpsWaypoint::SetText(const QString &text)
+{
+    _text=text;
+}
+
+bool jpsWaypoint::Visited(const int &frameID) const
+{
+    if (frameID > _LFcurrentness && _LFcurrentness!=-1)
+        return true;
+
+    else
+        return false;
+}
+
+
+
 
 
 
diff --git a/src/jpswaypoint.h b/src/jpswaypoint.h
index fda1f7d17a51b423b823d751356d3c668ce341d7..39bb917d03af58315a4a115488497f6d5bbc4b1d 100644
--- a/src/jpswaypoint.h
+++ b/src/jpswaypoint.h
@@ -35,20 +35,46 @@ class jpsWaypoint
 {
 public:
     jpsWaypoint();
-    jpsWaypoint(QRectF rect);
-    jpsWaypoint(QGraphicsEllipseItem* ellipseItem);
+    jpsWaypoint(const QPointF& point,const qreal& rA, const qreal& rB, const int& id=0, const QString& type="Waypoint");
+    jpsWaypoint(QRectF rect, const int& id=0);
+    jpsWaypoint(QGraphicsEllipseItem* ellipseItem, const int& id=0);
     ~jpsWaypoint();
-    ///Getter
-    const QPointF& GetPos();
-    const QRectF &GetRect();
-    double GetA();
-    double GetB();
+    //Getter
+    const QPointF& GetPos() const;
+    const QRectF &GetRect() const;
+    const double& GetA() const;
+    const double& GetB() const;
+    const int& GetId() const;
     QGraphicsEllipseItem* GetEllipseItem();
+    const QString& GetCaption() const;
+    const QString& GetType() const;
 
-    ///Setter
+    //Setter
     void SetPos(QPointF point);
     void SetRect(QRect rect);
     void SetEllipseItem(QGraphicsEllipseItem* ellipseItem);
+    void SetId(const int& id);
+    void SetCaption(const QString& string);
+    void SetType(const QString& type);
+
+    //Occurence
+    const int& GetFirstFrame() const;
+    const int& GetLastFrame() const;
+    void SetFirstFrame(const int& frame);
+    void SetLastFrame(const int& frame);
+    bool OccursInFrame(const int& frame) const;
+
+    //Currency
+    bool IsCurrent() const;
+    bool IsCurrentInFrame(const int& frameID);
+    void SetCurrentness(bool stat, const int &frameID=1);
+    const int& GetFirstFrameCurrent() const;
+    const int& GetLastFrameCurrent() const;
+    void ChangeCurrentness(const int& frameID);
+    const QString& GetText();
+    void SetText(const QString& text);
+
+    bool Visited(const int& frameID) const;
 
 
 private:
@@ -57,6 +83,19 @@ private:
     QRectF _rect;
     double _a;
     double _b;
+    int _id;
+    QString _caption;
+    QString _type;
+
+    //Occurence
+    int _firstFrame;
+    int _lastFrame;
+
+    //Currentness
+    int _FFcurrentness;
+    int _LFcurrentness;
+    bool _currentness;
+    QString _text;
 
 };
 
diff --git a/src/jpsyahpointer.cpp b/src/jpsyahpointer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4c0b90f6d3926f4eef6ffe3eb33dc58c931d62dd
--- /dev/null
+++ b/src/jpsyahpointer.cpp
@@ -0,0 +1,77 @@
+#include "jpsyahpointer.h"
+
+jpsYAHPointer::jpsYAHPointer(const QPointF &point, const qreal &angle)
+{
+    _cPos=point;
+    _cDirection=angle;
+    _allPos.push_back(point);
+    _allDir.push_back(angle);
+}
+
+jpsYAHPointer::jpsYAHPointer(const qreal &x, const qreal &y, const qreal &angle)
+{
+    _cPos.setX(x);
+    _cPos.setY(y);
+    _cDirection=angle;
+    _allPos.push_back(_cPos);
+    _allDir.push_back(angle);
+}
+
+jpsYAHPointer::~jpsYAHPointer()
+{
+
+}
+
+const QPointF &jpsYAHPointer::GetPos() const
+{
+    return _cPos;
+}
+
+const qreal &jpsYAHPointer::GetDirection() const
+{
+    return _cDirection;
+}
+
+void jpsYAHPointer::SetPos(const QPointF &point)
+{
+    _cPos=point;
+    _allPos.push_back(point);
+}
+
+void jpsYAHPointer::SetDirection(const qreal &angle)
+{
+    _cDirection=angle;
+    _allDir.push_back(angle);
+}
+
+
+const int &jpsYAHPointer::GetFirstFrame() const
+{
+    return _firstFrame;
+}
+
+const int &jpsYAHPointer::GetLastFrame() const
+{
+    return _lastFrame;
+}
+
+void jpsYAHPointer::SetFirstFrame(const int &frame)
+{
+    _firstFrame=frame;
+}
+
+void jpsYAHPointer::SetLastFrame(const int &frame)
+{
+    _lastFrame=frame;
+}
+
+const QPointF &jpsYAHPointer::GetPosWhenFrame(const int &frame)
+{
+    return _allPos[frame-1];
+}
+
+const qreal &jpsYAHPointer::GetDirWhenFrame(const int &frame)
+{
+    return _allDir[frame-1];
+}
+
diff --git a/src/jpsyahpointer.h b/src/jpsyahpointer.h
new file mode 100644
index 0000000000000000000000000000000000000000..ef1e00296ad02c3be6801c3b5110568eae25311b
--- /dev/null
+++ b/src/jpsyahpointer.h
@@ -0,0 +1,39 @@
+#ifndef JPSYAHPOINTER_H
+#define JPSYAHPOINTER_H
+#include <QPointF>
+#include <vector>
+class jpsYAHPointer
+{
+public:
+    jpsYAHPointer(const QPointF& point, const qreal& angle=0.0);
+    jpsYAHPointer(const qreal& x, const qreal& y, const qreal& angle=0.0);
+    ~jpsYAHPointer();
+
+    const QPointF& GetPos() const;
+    const qreal& GetDirection() const;
+
+    void SetPos(const QPointF& point);
+    void SetDirection(const qreal& angle);
+
+    //Occurence
+    const int& GetFirstFrame() const;
+    const int& GetLastFrame() const;
+    void SetFirstFrame(const int& frame);
+    void SetLastFrame(const int& frame);
+
+    //
+    const QPointF& GetPosWhenFrame(const int& frame);
+    const qreal& GetDirWhenFrame(const int& frame);
+
+private:
+    QPointF _cPos;
+    qreal _cDirection;
+    std::vector<QPointF> _allPos;
+    std::vector<qreal> _allDir;
+
+    //Occurence
+    int _firstFrame;
+    int _lastFrame;
+};
+
+#endif // JPSYAHPOINTER_H
diff --git a/src/main.cpp b/src/main.cpp
index 047ade36b4a233684e052d3090dd48f38a54d250..b76ab5838b195095b0e9ec1c132ac3ecd1742886 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -27,6 +27,16 @@
 
 //main.cpp
 
+/* for compiling a standalone windows exe with VS
+#ifdef _MSC_VER
+#    ifdef NDEBUG
+#        pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
+#    else
+#        pragma comment(linker, "/SUBSYSTEM:CONSOLE")
+#    endif
+#endif
+*/
+
 
 #include "mainWindow.h"
 #include "GraphicView.h"
diff --git a/src/mainWindow.cpp b/src/mainWindow.cpp
index 5456168edc92c0f9b1f03a135441d0ec95bdd9ad..39293e93eb1ec6cc00464e8d5e967e7745663d06 100644
--- a/src/mainWindow.cpp
+++ b/src/mainWindow.cpp
@@ -36,6 +36,7 @@
 
 #include <QFileDialog>
 #include <QMessageBox>
+#include <QShortcut>
 
 MWindow :: MWindow() {
 
@@ -47,13 +48,15 @@ MWindow :: MWindow() {
     mview = new jpsGraphicsView(this);
     dmanager = new jpsDatamanager(this,mview);
 
-    ///Roomwidget
+    //Roomwidget
     rwidget=nullptr;
-    ///Landmarkwidget
+    //Landmarkwidget
     lwidget=nullptr;
+    //WidgetSettings
+    _settings=nullptr;
 
     length_edit = new QLineEdit();
-    length_edit->setMaximumWidth(55);
+    length_edit->setMaximumWidth(75);
     label1 = new QLabel();
     label1->setMinimumWidth(90);
     label1->setText("Length of Line :");
@@ -63,9 +66,11 @@ MWindow :: MWindow() {
     infoLabel= new QLabel();
     infoLabel->setMinimumWidth(135);
 
-    ///filename of saved project
+    //filename of saved project
     _filename="";
 
+    //WindowTitle
+    this->setWindowTitle("JPSeditor");
 
     setCentralWidget(mview);
     //this->setMaximumSize(1920,1080);
@@ -75,27 +80,33 @@ MWindow :: MWindow() {
     statusBar()->addPermanentWidget(length_edit);
     statusBar()->addPermanentWidget(label2);
 
-    ///Timer needed for autosave function
-    /// timer will trigger autosave every 5th minute
+    //Timer needed for autosave function
+    // timer will trigger autosave every 5th minute
     timer = new QTimer(this);
     timer->setInterval(300000);
     timer->start();
 
+    _cMapTimer = new QTimer(this);
+    //_cMapTimer=nullptr;
 
-    ///Signals and Slots
-    /// Tab File
-    connect(actionBeenden, SIGNAL(triggered(bool)),qApp,SLOT(quit()));
+    //Signals and Slots
+    // Tab File
+    connect(actionBeenden, SIGNAL(triggered(bool)),this,SLOT(close()));
     connect(action_ffnen,SIGNAL(triggered(bool)),this,SLOT(openFile()));
     connect(action_ffnen_xml,SIGNAL(triggered(bool)),this,SLOT(openFileXML()));
     connect(actionSpeichern,SIGNAL(triggered(bool)),this,SLOT(saveFile()));
     connect(actionSpeichern_dxf,SIGNAL(triggered(bool)),this,SLOT(saveAsDXF()));
-    /// Tab Help
+    connect(actionSettings,SIGNAL(triggered(bool)),this,SLOT(Settings()));
+    connect(action_ffnen_CogMap,SIGNAL(triggered(bool)),this,SLOT(openFileCMap()));
+    // Tab Help
     connect(action_ber,SIGNAL(triggered(bool)),this,SLOT(info()));
-    /// Tab Tools
-    connect(actionanglesnap,SIGNAL(triggered(bool)),this,SLOT(gridmode()));
+    // Tab Tools
+    connect(actionanglesnap,SIGNAL(triggered(bool)),this,SLOT(anglesnap()));
+    connect(actiongridmode,SIGNAL(triggered(bool)),this,SLOT(gridmode()));
     connect(actionWall,SIGNAL(triggered(bool)),this,SLOT(en_disableWall()));
     connect(actionDoor,SIGNAL(triggered(bool)),this,SLOT(en_disableDoor()));
     connect(actionExit,SIGNAL(triggered(bool)),this,SLOT(en_disableExit()));
+    connect(actionHLine,SIGNAL(triggered(bool)),this,SLOT(en_disableHLine()));
     connect(actionObjectsnap,SIGNAL(triggered(bool)),this,SLOT(objectsnap()));
     connect(actionDelete_lines,SIGNAL(triggered(bool)),this,SLOT(delete_lines()));
     connect(actionDelete_single_line,SIGNAL(triggered(bool)),this,SLOT(delete_marked_lines()));
@@ -104,26 +115,38 @@ MWindow :: MWindow() {
     connect(actionWall,SIGNAL(triggered(bool)),this,SLOT(dis_selectMode()));
     connect(actionDoor,SIGNAL(triggered(bool)),this,SLOT(dis_selectMode()));
     connect(actionExit,SIGNAL(triggered(bool)),this,SLOT(dis_selectMode()));
-    /// Tab View
+    // Tab View
     connect(actionRotate_90_deg_clockwise,SIGNAL(triggered(bool)),this,SLOT(rotate()));
-    /// Length edit
+    connect(actionShow_Point_of_Origin,SIGNAL(triggered(bool)),this,SLOT(ShowOrigin()));
+    // Length edit
     connect(length_edit,SIGNAL(returnPressed()),this,SLOT(send_length()));
-    /// mview
+    // mview
     connect(mview,SIGNAL(no_drawing()),this,SLOT(en_selectMode()));
     connect(mview,SIGNAL(remove_marked_lines()),this,SLOT(lines_deleted()));
     connect(mview,SIGNAL(remove_all()),this,SLOT(remove_all_lines()));
     connect(mview,SIGNAL(set_focus_textedit()),length_edit,SLOT(setFocus()));
     connect(mview,SIGNAL(mouse_moved()),this,SLOT(show_coords()));
     connect(mview,SIGNAL(landmark_added()),this,SLOT(add_landmark()));
+    connect(mview,SIGNAL(LineLengthChanged()),this,SLOT(ShowLineLength()));
+    // Mark all lines
+    QAction *str_a = new QAction(this);
+    str_a->setShortcut(Qt::Key_A | Qt::CTRL);
+    connect(str_a, SIGNAL(triggered(bool)), mview, SLOT(SelectAllLines()));
+    this->addAction(str_a);
     //connect(mview,SIGNAL(DoubleClick()),this,SLOT(en_selectMode()));
-    ///Autosave
+    // Autosave
     connect(timer, SIGNAL(timeout()), this, SLOT(AutoSave()));
-    ///Landmarks
+    //Landmarks
     connect(actionLandmark,SIGNAL(triggered(bool)),this,SLOT(en_disableLandmark()));
     connect(actionLandmark,SIGNAL(triggered(bool)),this,SLOT(dis_selectMode()));
-    ///Landmark specifications
+    // Landmark specifications
     connect(actionLandmarkWidget,SIGNAL(triggered(bool)),this,SLOT(define_landmark()));
-
+    //CMap
+    connect(actionRun_visualisation,SIGNAL(triggered(bool)),this,SLOT(RunCMap()));
+    connect(_cMapTimer,SIGNAL(timeout()),this,SLOT(UpdateCMap()));
+    //Undo Redo
+    connect(actionUndo,SIGNAL(triggered(bool)),mview,SLOT(Undo()));
+    connect(actionRedo,SIGNAL(triggered(bool)),mview,SLOT(Redo()));
 }
 
 MWindow::~MWindow()
@@ -135,6 +158,7 @@ MWindow::~MWindow()
     delete label2;
     delete infoLabel;
     delete timer;
+    delete _cMapTimer;
 }
 
 void MWindow::AutoSave()
@@ -159,7 +183,40 @@ void MWindow::AutoSave()
         dmanager->AutoSaveXML(file);
         //file.write(coord_string.toUtf8());//textEdit->toPlainText().toUtf8());
         statusBar()->showMessage(tr("Backup file generated!"),10000);
+
+        //routing (hlines)
+        QString fileNameRouting = file.fileName();
+        fileNameRouting=fileNameRouting.split(".").first()+"_routing.xml";
+        QFile routingFile(fileNameRouting);
+        if (routingFile.open(QIODevice::WriteOnly|QIODevice::Text))
+            dmanager->writeRoutingXML(routingFile);
+    }
+}
+
+void MWindow::RunCMap()
+{
+
+    double frameRate = dmanager->GetCMapFrameRate();
+    _cMapFrame=1;
+    if (frameRate==0)
+    {
+        statusBar()->showMessage(tr("No cognitive map has been loaded!"),10000);
+        return;
+    }
+    _cMapTimer->setInterval(1/frameRate*1000);
+    _cMapTimer->start();
+}
+
+void MWindow::UpdateCMap()
+{
+    _cMapFrame++;
+    if (_cMapFrame>dmanager->GetLastCMapFrame())
+    {
+        _cMapTimer->stop();
+        dmanager->ShowCMapFrame(1);
+        return;
     }
+    dmanager->ShowCMapFrame(_cMapFrame);
 }
 
 void MWindow::add_landmark()
@@ -168,6 +225,29 @@ void MWindow::add_landmark()
     dmanager->new_landmark(landmark);
 }
 
+void MWindow::Settings()
+{
+    if (_settings==nullptr)
+    {
+        _settings = new WidgetSettings(this,mview);
+        _settings->setAttribute(Qt::WA_DeleteOnClose);
+        _settings->setGeometry(QRect(QPoint(5,75), _settings->size()));
+        _settings->show();
+    }
+
+    else
+    {
+        _settings->close();
+        _settings=nullptr;
+    }
+
+}
+
+void MWindow::ShowOrigin()
+{
+    mview->ShowOrigin();
+}
+
 void MWindow::openFile(){
 
     QString fileName=QFileDialog::getOpenFileName(this,tr("Open DXF"),"",tr("DXF-Drawings (*.dxf)"));
@@ -190,6 +270,41 @@ void MWindow::openFile(){
 }
 
 void MWindow::openFileXML()
+{
+    QString fileName=QFileDialog::getOpenFileName(this,tr("Open XML"),"",tr("XML-Files (*.xml)"));
+    QFile file(fileName);
+    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
+    {
+        return;
+    }
+
+    //RoutingFile
+    QString fileNameRouting= fileName.split(".").first()+"_routing.xml";
+    QFile fileRouting(fileNameRouting);
+    if (!fileRouting.open(QIODevice::ReadOnly | QIODevice::Text))
+    {
+        return;
+    }
+
+    if (!dmanager->readXML(file) || !dmanager->readRoutingXML(fileRouting))
+    {
+        QMessageBox::critical(this,
+                              "OpenFileXML",
+                              "Couldn't open xml-file",
+                              QMessageBox::Ok);
+        statusBar()->showMessage("XML-File could not be parsed!",10000);
+    }
+
+    else
+    {
+        //AutoZoom to drawing
+        mview->AutoZoom();
+        statusBar()->showMessage("XML-File successfully loaded!",10000);
+    }
+
+}
+
+void MWindow::openFileCMap()
 {
     QString fileName=QFileDialog::getOpenFileName(this,tr("Open XML"),"",tr("XML-Files (*.xml)"));
     QFile file(fileName);
@@ -203,7 +318,7 @@ void MWindow::openFileXML()
     }
 
 
-    if (!dmanager->readXML(file))
+    if (!dmanager->ParseCogMap(file))
     {
         statusBar()->showMessage("XML-File could not be parsed!",10000);
     }
@@ -211,9 +326,9 @@ void MWindow::openFileXML()
     else
     {
 
-        statusBar()->showMessage("XML-File successfully loaded!",10000);
+        statusBar()->showMessage("Cognitive map successfully loaded!",10000);
+        dmanager->ShowCMapFrame(1);
     }
-
 }
 
 void MWindow::saveFile(){
@@ -236,6 +351,14 @@ void MWindow::saveFile(){
             return;
         }
         dmanager->writeXML(file);
+
+        //routing (hlines)
+        QString fileNameRouting=fileName.split(".").first()+"_routing.xml";
+
+        QFile routingFile(fileNameRouting);
+        if (routingFile.open(QIODevice::WriteOnly|QIODevice::Text))
+            dmanager->writeRoutingXML(routingFile);
+
         //file.write(coord_string.toUtf8());//textEdit->toPlainText().toUtf8());
         statusBar()->showMessage(tr("XML-File successfully saved!"),10000);
     }
@@ -261,13 +384,31 @@ void MWindow::saveAsDXF()
 
 void MWindow::info(){
 
-    QMessageBox::information(
-                0,tr("About..."),tr("JuPedSim; Interface for generating and editing geometry(XML)-files necessary for using JPScore; Manual and tutorial coming soon!"));
+
+
+    QString info = "JuPedSim v0.8 alpha\n\
+    JPSeditor v0.8 alpha\n\
+    ====================\n\
+    \n\
+    Erik Andresen drafted this on 27 Jun 2016\n\
+    \n\
+    We are proud to announce the first alpha release of our software JPSeditor (part of JuPedSim for simulating pedestrians evacuations). Please note that it is a pre release version for developers only. We are working hard towards the final release for this version.\n\
+    \n\
+    JPSeditor is a graphical user interface to create the geometry of a scenario simulated by JuPedSim. It comes with set of CAD- and further tools to simplify the creation of proper xml-files incorporating information about the scenario' geometry.\n\
+    \n\
+    Tutorial\n\
+    ========\n\
+    \n\
+    To highlight some features of JuPedSim we have uploaded some videos on our [YouTube channel](https://www.youtube.com/user/JuPedSim) including a tutorial showing how to use the editor.";
+
+    QMessageBox messageBox;
+    messageBox.information(0,tr("About..."),info);
+
 }
 
-void MWindow::gridmode()
+void MWindow::anglesnap()
 {
-   mview->change_gridmode();
+   mview->change_stat_anglesnap();
 }
 
 void MWindow::en_disableWall()
@@ -300,12 +441,20 @@ void MWindow::en_disableLandmark()
     mview->en_disableLandmark();
 }
 
+void MWindow::en_disableHLine()
+{
+    this->disableDrawing();
+    actionHLine->setChecked(true);
+    mview->en_disableHLine();
+}
+
 void MWindow::disableDrawing()
 {
     this->actionWall->setChecked(false);
     this->actionDoor->setChecked(false);
     this->actionExit->setChecked(false);
     this->actionLandmark->setChecked(false);
+    this->actionHLine->setChecked(false);
 }
 
 void MWindow::objectsnap()
@@ -313,6 +462,11 @@ void MWindow::objectsnap()
     mview->change_objectsnap();
 }
 
+void MWindow::gridmode()
+{
+    mview->change_gridmode();
+}
+
 void MWindow::show_coords()
 {
     QPointF point = mview->return_Pos();
@@ -345,26 +499,29 @@ void MWindow::send_length()
 
 void MWindow::define_room()
 {
-    if (rwidget==0L)
+    if (rwidget==nullptr)
     {
         rwidget = new roomWidget(this,this->dmanager,this->mview);
         rwidget->setGeometry(QRect(QPoint(5,75), rwidget->size()));
+        rwidget->setAttribute(Qt::WA_DeleteOnClose);
         rwidget->show();
+
     }
     else
     {
         rwidget->close();
-        rwidget=0L;
+        rwidget=nullptr;
         actionRoom->setChecked(false);
     }
 }
 
 void MWindow::define_landmark()
 {
-    if (lwidget==0L)
+    if (lwidget==nullptr)
     {
         lwidget = new widgetLandmark(this,this->dmanager,this->mview);
         lwidget->setGeometry(QRect(QPoint(5,75), lwidget->size()));
+        lwidget->setAttribute(Qt::WA_DeleteOnClose);
         lwidget->show();
     }
     else
@@ -384,6 +541,7 @@ void MWindow::en_selectMode()
     actionWall->setChecked(false);
     actionDoor->setChecked(false);
     actionExit->setChecked(false);
+    actionHLine->setChecked(false);
     actionLandmark->setChecked(false);
     length_edit->clearFocus();
 }
@@ -407,11 +565,34 @@ void MWindow::remove_all_lines()
     dmanager->remove_all();
 }
 
+void MWindow::ShowLineLength()
+{
+    length_edit->setText(QString::number(mview->ReturnLineLength()));
+    length_edit->selectAll();
+}
+
 void MWindow::rotate()
 {
     mview->rotate(-90);
 }
 
+void MWindow::closeEvent(QCloseEvent *event)
+{
+    int ret = QMessageBox::warning(
+                this, "Quit?",
+                "Do you really want to quit?",
+                QMessageBox::Yes | QMessageBox::No );
+
+    if (ret == QMessageBox::Yes)
+    {
+        QMainWindow::closeEvent(event);
+    }
+    else
+    {
+        event->ignore();
+    }
+}
+
 
 
 
diff --git a/src/mainWindow.h b/src/mainWindow.h
index 3d7667659c0f186c8b3f139bf07fe518b9ffcc33..75e99c3cb7251d480db65446c970d74d3e65877b 100644
--- a/src/mainWindow.h
+++ b/src/mainWindow.h
@@ -37,6 +37,7 @@
 #include "ui_mainwindow.h"
 #include "roomwidget.h"
 #include "widgetlandmark.h"
+#include "widgetsettings.h"
 #include "GraphicView.h"
 #include "datamanager.h"
 #include "rooms.h"
@@ -53,6 +54,7 @@ public:
 private:
     roomWidget* rwidget;
     widgetLandmark* lwidget;
+    WidgetSettings* _settings;
     jpsDatamanager* dmanager;
     jpsGraphicsView* mview;
     //QVBoxLayout* VBox;
@@ -63,33 +65,64 @@ private:
     QString _filename;
     QTimer *timer;
 
+    //CMap
+    QTimer *_cMapTimer;
+    int _cMapFrame;
+
 
 protected slots:
+    
+    //parseFiles
     void openFile();
     void openFileXML();
+    void openFileCMap();
     void saveFile();
     void saveAsDXF();
+    
+    //about
     void info();
-    void gridmode();
+    
+    //drawing options
+    void anglesnap();
     void en_disableWall();
     void en_disableDoor();
     void en_disableExit();
     void en_disableLandmark();
+    void en_disableHLine();
     void disableDrawing();
     void objectsnap();
+
+    //Line operations
     void show_coords();
     void delete_lines();
     void delete_marked_lines();
     void send_length();
-    void define_room();
-    void define_landmark();
     void en_selectMode();
     void dis_selectMode();
     void lines_deleted();
     void remove_all_lines();
+    void ShowLineLength();
+    
+    //Room and landmark def
+    void define_room();
+    void define_landmark();
+    void add_landmark();
+    
+    //view options
+    void gridmode();
     void rotate();
+    void Settings();
+    void ShowOrigin();
+    
+    //autosave
     void AutoSave();
-    void add_landmark();
+    
+    //CMap
+    void RunCMap();
+    void UpdateCMap();
+
+    //quit
+    void closeEvent(QCloseEvent *event);
 
 
 };
diff --git a/src/rooms.cpp b/src/rooms.cpp
index a3733386d46ce3e1273418f4c6452c4af3bb0693..146555edcd3223e658a6619e550c8e71da355454 100644
--- a/src/rooms.cpp
+++ b/src/rooms.cpp
@@ -30,6 +30,7 @@
 #include <QtGui>
 #include <iostream>
 #include <QGraphicsLineItem>
+#include "jpscrossing.h"
 
 
 jpsRoom::jpsRoom(int id_room)
@@ -38,6 +39,7 @@ jpsRoom::jpsRoom(int id_room)
     QString string="Room ";
     name=string.append(QString::number(id));
     highlighted=false;
+    _type="Not specified";
 
 }
 
@@ -87,9 +89,9 @@ void jpsRoom::activate()
     }
 }
 
-QList<QPointF> jpsRoom::get_vertices()
+QVector<QPointF> jpsRoom::get_vertices() const
 {
-    QList<QPointF> vertices;
+    QVector<QPointF> vertices;
 
     for (int i=0; i<item_list.size(); i++)
     {
@@ -102,13 +104,26 @@ QList<QPointF> jpsRoom::get_vertices()
             vertices.push_back(item_list[i]->get_line()->line().p2());
         }
     }
+    for (jpsCrossing* crossing:_doorList)
+    {
+        if (vertices.contains(crossing->get_cLine()->get_line()->line().p1())==false)
+        {
+            vertices.push_back(crossing->get_cLine()->get_line()->line().p1());
+        }
+
+        if (vertices.contains(crossing->get_cLine()->get_line()->line().p1())==false)
+        {
+            vertices.push_back(crossing->get_cLine()->get_line()->line().p1());
+        }
+
+    }
 
     return vertices;
 }
 
 QPointF jpsRoom::get_center()
 {
-    QList<QPointF> vertices = get_vertices();
+    QVector<QPointF> vertices = get_vertices();
     qreal sum_x=0;
     qreal sum_y=0;
 
@@ -197,21 +212,76 @@ QList<QPointF> jpsRoom::GetDoorVertices() const
     return vertices;
 }
 
-bool jpsRoom::ContainsDoor(jpsLineItem *lineItem) const
+void jpsRoom::AddDoor(jpsCrossing *door)
+{
+    _doorList.push_back(door);
+}
+
+QPolygonF jpsRoom::RoomAsPolygon() const
+{
+
+    return QPolygonF(get_vertices());
+}
+
+QPolygonF jpsRoom::RoomAsSortedPolygon() const
 {
-    QList<QPointF> vertices = GetDoorVertices();
+    QList<jpsLineItem*> lines = item_list;
+    for (jpsCrossing* crossing:_doorList)
+    {
+        lines.push_back(crossing->get_cLine());
+    }
+//    std::cout << lines.size() << std::endl;
+    QVector<QPointF> points;
+
+    points.push_back(lines.first()->get_line()->line().p1());
+    points.push_back(lines.first()->get_line()->line().p2());
 
-    for (QPointF vertex:vertices)
+    lines.pop_front();
+
+    for (int i=0; i<lines.size(); i++)
     {
-        if (lineItem->get_line()->contains(vertex))
+        if (lines[i]->get_line()->line().p1() == points.last())
+        {
+            //points.push_back(line->get_line()->line().p1());
+            points.push_back(lines[i]->get_line()->line().p2());
+            lines.removeOne(lines[i]);
+            i=-1;
+        }
+        else if (lines[i]->get_line()->line().p2() == points.last())
         {
-            return true;
+            //points.push_back(line->get_line()->line().p1());
+            points.push_back(lines[i]->get_line()->line().p1());
+            lines.removeOne(lines[i]);
+            i=-1;
         }
     }
-    return false;
 
+
+    for (QPointF point:points)
+    {
+        std::cout << point.x() << " " << point.y() << std::endl;
+
+    }
+    std::cout << "----------------------------" << std::endl;
+
+    return QPolygonF(points);
 }
 
+//bool jpsRoom::ContainsDoor(jpsLineItem *lineItem) const
+//{
+//    QList<QPointF> vertices = GetDoorVertices();
+
+//    for (QPointF vertex:vertices)
+//    {
+//        if (lineItem->get_line()->contains(vertex))
+//        {
+//            return true;
+//        }
+//    }
+//    return false;
+
+//}
+
 
 
 void jpsRoom::set_id(int id_room)
diff --git a/src/rooms.h b/src/rooms.h
index f39baba38d31ddfd56f56ce22a4f1a5b9233c7fb..88f2be036c9f90bdb6586b5c7a70e96919f08a5e 100644
--- a/src/rooms.h
+++ b/src/rooms.h
@@ -32,6 +32,8 @@
 #include <QGraphicsView>
 #include "jpsLineItem.h"
 
+class jpsCrossing;
+
 class jpsRoom
 {
 
@@ -45,7 +47,7 @@ public:
     void change_name(QString name);
     QList<jpsLineItem*> get_listWalls();
     void activate();
-    QList<QPointF> get_vertices();
+    QVector<QPointF> get_vertices() const;
     void set_id(int id_room);
     int get_id();
     QPointF get_center();
@@ -53,7 +55,14 @@ public:
     QString get_type();
     void set_type(const QString &string);
     QList<QPointF> GetDoorVertices() const;
-    bool ContainsDoor(jpsLineItem* lineItem) const;
+    //bool ContainsDoor(jpsLineItem* lineItem) const;
+    void AddDoor(jpsCrossing *door);
+    QPolygonF RoomAsPolygon() const;
+    /**
+     * @brief RoomAsSortedPolygon
+     * @return SortedPolygon: QPolygonF
+     */
+    QPolygonF RoomAsSortedPolygon() const;
 
 
 private:
@@ -62,6 +71,8 @@ private:
     QString name;
     QList<jpsLineItem*> item_list;
     QString _type;
+    QList<jpsCrossing* > _doorList;
+
 };
 
 
diff --git a/src/roomwidget.cpp b/src/roomwidget.cpp
index 221a45a28c74451b759a495f45aee1dcb6819883..2b705cdbf74dfec94406ea961c76c3cc5ec6e737 100644
--- a/src/roomwidget.cpp
+++ b/src/roomwidget.cpp
@@ -47,11 +47,16 @@ roomWidget::roomWidget(QWidget *parent, jpsDatamanager *dmanager, jpsGraphicsVie
     show_exits();
     show_obstacles();
 
-    ///temporary uncommented
+    //temporary uncommented
     ui->auto_assign_doors->setVisible(false);
     //ui->auto_assign_exits->setVisible(false);
 
-
+    // roomClasses
+    ui->classBox->addItem("Not specified");
+    ui->classBox->addItem("Corridor");
+    ui->classBox->addItem("Office");
+    ui->classBox->addItem("Lobby");
+    ui->classBox->addItem("Entrance");
 
 
     //SIGNALS AND SLOTS
@@ -65,12 +70,14 @@ roomWidget::roomWidget(QWidget *parent, jpsDatamanager *dmanager, jpsGraphicsVie
     connect(ui->delete_room,SIGNAL(clicked(bool)),this,SLOT(delete_room()));
     connect(ui->apply_name_button,SIGNAL(clicked(bool)),this,SLOT(change_roomname()));
     connect(ui->add_button,SIGNAL(clicked(bool)),this,SLOT(addWall()));
-    connect(ui->list_rooms,SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),this,SLOT(showWalls()));
-    connect(ui->list_rooms,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(showWalls()));
+    connect(ui->list_rooms,SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),this,SLOT(showWallsAndType()));
+    connect(ui->list_rooms,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(showWallsAndType()));
     connect(ui->listWalls,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(selectWall()));
     connect(ui->remove_button,SIGNAL(clicked(bool)),this,SLOT(removeWall()));
     connect(ui->caption,SIGNAL(clicked(bool)),this,SLOT(shhi_roomCaption()));
     connect(ui->highlight,SIGNAL(clicked(bool)),this,SLOT(highlight_room()));
+    connect(ui->classBox,SIGNAL(activated(int)),this,SLOT(ChangeRoomType()));
+    connect(ui->classBox,SIGNAL(currentIndexChanged(int)),this,SLOT(ChangeRoomType()));
     //tab crossing
     connect(ui->addCrossingButton,SIGNAL(clicked(bool)),this,SLOT(new_crossing()));
     connect(ui->crossingList,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(enable_roomSelectionCrossings()));
@@ -78,7 +85,7 @@ roomWidget::roomWidget(QWidget *parent, jpsDatamanager *dmanager, jpsGraphicsVie
     connect(ui->roomBox2,SIGNAL(activated(int)),this,SLOT(add_rooms_to_crossing()));
     connect(ui->removeCrossingButton,SIGNAL(clicked(bool)),this,SLOT(delete_crossing()));
     connect(ui->crossingList,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(select_crossing()));
-    connect(ui->auto_assign_doors,SIGNAL(clicked(bool)),this,SLOT(autoAssignDoors()));
+    //connect(ui->auto_assign_doors,SIGNAL(clicked(bool)),this,SLOT(autoAssignDoors()));
     //tab exit
 //    connect(ui->addExitButton,SIGNAL(clicked(bool)),this,SLOT(new_exit()));
 //    connect(ui->exitList,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(enable_roomSelectionExits()));
@@ -244,7 +251,7 @@ void roomWidget::addWall()
             int crow=ui->list_rooms->currentRow();
 
             datamanager->get_roomlist()[crow]->addWall(graphview->get_markedLines());
-            this->showWalls();
+            this->showWallsAndType();
 
         }
     }
@@ -259,12 +266,12 @@ void roomWidget::removeWall()
             int crow=ui->list_rooms->currentRow();
 
             datamanager->get_roomlist()[crow]->removeWall(graphview->get_markedLines());
-            this->showWalls();
+            this->showWallsAndType();
         }
     }
 }
 
-void roomWidget::showWalls()
+void roomWidget::showWallsAndType()
 {
     ui->listWalls->clear();
 
@@ -285,6 +292,8 @@ void roomWidget::showWalls()
                 string.append(" y2:"+QString::number(walllist[i]->get_line()->line().y2()));
                 ui->listWalls->addItem(string);
             }
+
+            ShowRoomType(crow);
         }
     }
 }
@@ -558,7 +567,7 @@ void roomWidget::show_all()
     show_crossings();
     show_exits();
     show_obstacles();
-    showWalls();
+    showWallsAndType();
     showWallsObs();
 }
 
@@ -758,18 +767,40 @@ void roomWidget::highlight_obs()
 
 }
 
-void roomWidget::autoAssignDoors()
+//void roomWidget::autoAssignDoors()
+//{
+//    datamanager->AutoAssignCrossings();
+//    show_all();
+//    enable_roomSelectionCrossings();
+//}
+
+//void roomWidget::autoAssignExits()
+//{
+//    datamanager->AutoAssignExits();
+//    show_all();
+//    enable_roomSelectionExits();
+
+//}
+
+void roomWidget::ChangeRoomType()
 {
-    datamanager->AutoAssignCrossings();
-    show_all();
-    enable_roomSelectionCrossings();
+    if (ui->list_rooms->currentItem()!=0L)
+    {
+        int cRoomRow=ui->list_rooms->currentRow();
+        int cClassRow=ui->classBox->currentIndex();
+        if (cClassRow!=-1)
+        {
+            datamanager->get_roomlist()[cRoomRow]->set_type(ui->classBox->currentText());
+        }
+    }
+
 }
 
-void roomWidget::autoAssignExits()
+void roomWidget::ShowRoomType(int& cRow) const
 {
-    datamanager->AutoAssignExits();
-    show_all();
-    enable_roomSelectionExits();
+    QString type = datamanager->get_roomlist()[cRow]->get_type();
+    int itemindex = ui->classBox->findText(type);
+    ui->classBox->setCurrentIndex(itemindex);
 
 }
 
diff --git a/src/roomwidget.h b/src/roomwidget.h
index e37ae170550778af5d8c9b0b0b0d3e10fe3a94f0..ba1365866b45b771ea273080885ccd7094db050a 100644
--- a/src/roomwidget.h
+++ b/src/roomwidget.h
@@ -57,7 +57,7 @@ protected slots:
     void change_roomname();
     void addWall();
     void removeWall();
-    void showWalls();
+    void showWallsAndType();
     void selectWall();
     void new_crossing();
     void enable_roomSelectionCrossings();
@@ -85,8 +85,9 @@ protected slots:
     bool shhi_roomCaption();
     void highlight_room();
     void highlight_obs();
-    void autoAssignDoors();
-    void autoAssignExits();
+//    void autoAssignDoors();
+//    void autoAssignExits();
+    void ChangeRoomType();
 
 
 private:
@@ -94,6 +95,9 @@ private:
     jpsDatamanager *datamanager;
     jpsGraphicsView *graphview;
 
+    //
+    void ShowRoomType(int &cRow) const;
+
 };
 
 #endif // ROOMWIDGET_H
diff --git a/src/widgetlandmark.cpp b/src/widgetlandmark.cpp
index 4dcf8778371fe967fe3709775c83f22df5e66bf5..6e2ce7508518cd5eb6d6218f05bcd636828d5709 100644
--- a/src/widgetlandmark.cpp
+++ b/src/widgetlandmark.cpp
@@ -40,6 +40,7 @@ widgetLandmark::widgetLandmark(QWidget *parent, jpsDatamanager *dmanager, jpsGra
     ui->setupUi(this);
     _dmanager=dmanager;
     _gview=gview;
+    _waypointIDCounter=0;
 
     show_landmarks();
 
@@ -47,6 +48,7 @@ widgetLandmark::widgetLandmark(QWidget *parent, jpsDatamanager *dmanager, jpsGra
     connect(ui->apply_name_button,SIGNAL(clicked(bool)),this,SLOT(change_name()));
     connect(ui->closeButton,SIGNAL(clicked(bool)),this->parentWidget(),SLOT(define_landmark()));
     connect(ui->list_landmarks,SIGNAL(activated(int)),this,SLOT(enable_room_selection()));
+    connect(ui->list_landmarks,SIGNAL(currentIndexChanged(int)),_gview,SLOT(unmarkLandmark()));
     connect(ui->roomBox_landmarks,SIGNAL(activated(int)),this,SLOT(add_room_to_landmark()));
     connect(ui->add_button,SIGNAL(clicked(bool)),_gview,SLOT(StatAssoDef()));
     connect(_gview,SIGNAL(AssoDefCompleted()),this,SLOT(AddAssociation()));
@@ -162,8 +164,11 @@ void widgetLandmark::AddAssociation()
     {
         int cLanRow=ui->list_landmarks->currentIndex();
 
-        _dmanager->get_landmarks()[cLanRow]->AddWaypoint(new jpsWaypoint(_gview->GetCurrentSelectRect()->rect()));
+        _dmanager->get_landmarks()[cLanRow]->AddWaypoint(std::make_shared<jpsWaypoint>(_gview->GetCurrentSelectRect()->rect(),_waypointIDCounter));
+
         ShowAssociations();
+        _waypointIDCounter++;
+        ui->add_button->setChecked(false);
     }
 }
 
@@ -173,9 +178,9 @@ void widgetLandmark::ShowAssociations()
     if (ui->list_landmarks->currentIndex()!=-1)
     {
         int cLanRow=ui->list_landmarks->currentIndex();
-        QList<jpsWaypoint *> waypoints = _dmanager->get_landmarks()[cLanRow]->GetWaypoints();
+        QList<ptrWaypoint> waypoints = _dmanager->get_landmarks()[cLanRow]->GetWaypoints();
 
-        for (jpsWaypoint* waypoint:waypoints)
+        for (ptrWaypoint waypoint:waypoints)
         {
             QPointF pos = waypoint->GetPos();
             QString name = "Waypoint: x: "+QString::number(pos.x())+"y: "+QString::number(pos.y());
diff --git a/src/widgetlandmark.h b/src/widgetlandmark.h
index b4f678d17d87ce3f9c81dac557522126ab04265b..71369c74d65b91802011a8b4ccd009238cced51a 100644
--- a/src/widgetlandmark.h
+++ b/src/widgetlandmark.h
@@ -60,6 +60,7 @@ private:
     Ui::widgetLandmark *ui;
     jpsDatamanager* _dmanager;
     jpsGraphicsView* _gview;
+    int _waypointIDCounter;
 };
 
 #endif // WIDGETLANDMARK_H
diff --git a/src/widgetsettings.cpp b/src/widgetsettings.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7c556e9d304a4bef3e0db318fd5f77c03ea0dbe0
--- /dev/null
+++ b/src/widgetsettings.cpp
@@ -0,0 +1,31 @@
+#include "widgetsettings.h"
+#include "ui_widgetsettings.h"
+
+WidgetSettings::WidgetSettings(QWidget *parent, jpsGraphicsView *view) :
+    QTabWidget(parent),
+    ui(new Ui::WidgetSettings)
+{
+    ui->setupUi(this);
+    _view=view;
+    connect(ui->pushButtoncloseSettings,SIGNAL(clicked(bool)),QTabWidget::parent(),SLOT(Settings()));
+    connect(ui->en_lineGrid,SIGNAL(toggled(bool)),this,SLOT(changeGridRadio(bool)));
+    connect(ui->en_pointGrid,SIGNAL(toggled(bool)),this,SLOT(changeGridRadio(bool)));
+
+}
+
+WidgetSettings::~WidgetSettings()
+{
+    delete ui;
+}
+
+void WidgetSettings::changeGridRadio(bool status)
+{
+    if (status)
+    {
+        if (ui->en_lineGrid->isChecked())
+            _view->ActivateLineGrid();
+
+        else
+            _view->ActivatePointGrid();
+    }
+}
diff --git a/src/widgetsettings.h b/src/widgetsettings.h
new file mode 100644
index 0000000000000000000000000000000000000000..604d8cf417194146b6c9a8ec12ffdee3cccb9175
--- /dev/null
+++ b/src/widgetsettings.h
@@ -0,0 +1,29 @@
+#ifndef WIDGETSETTINGS_H
+#define WIDGETSETTINGS_H
+
+#include <QTabWidget>
+#include "GraphicView.h"
+
+namespace Ui {
+class WidgetSettings;
+}
+
+class WidgetSettings : public QTabWidget
+{
+    Q_OBJECT
+
+public:
+    explicit WidgetSettings(QWidget *parent = nullptr, jpsGraphicsView* view = nullptr);
+    ~WidgetSettings();
+
+public slots:
+    void changeGridRadio(bool status);
+
+private:
+    Ui::WidgetSettings *ui;
+    jpsGraphicsView* _view;
+
+
+};
+
+#endif // WIDGETSETTINGS_H