diff --git a/CHANGELOG.md b/CHANGELOG.md
index e9318ad449da7d7f8233768a6cbea39635c2591f..1af42178766a148b8bab071a2144e6b2f08ad2e4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,9 +4,9 @@ All notable changes to this project will be documented in this file.
 
 ## v0.8.0 [Unreleased]
 
-
 ### Added
 #### JPSEDITOR
+- 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 ?! 
@@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file.
 	- Zooming 
 	- Line editing
 	- Length of line is displayed
+	- Show origin
 	- ...
 - Room and door declarations
 	
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/Ressource.qrc b/forms/Ressource.qrc
index ecefdd345d0269930e59a4597e6f09c1f559bcb8..239132d9cc563449d64f155a0f319ba2ab071c31 100644
--- a/forms/Ressource.qrc
+++ b/forms/Ressource.qrc
@@ -41,5 +41,6 @@
         <file>anglesnap.PNG</file>
         <file>Undo-icon.png</file>
         <file>Redo-Icon.png</file>
+        <file>HLine.png</file>
     </qresource>
 </RCC>
diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui
index 97af0c19e3c334749a9002d6f3938eb69d99f4b1..803f47cc4b52cb3dc5261fa97e5271d047516066 100644
--- a/forms/mainwindow.ui
+++ b/forms/mainwindow.ui
@@ -53,8 +53,12 @@
     </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="actiongridmode"/>
     <addaction name="actionObjectsnap"/>
@@ -519,7 +523,7 @@
     <string>Undo</string>
    </property>
    <property name="toolTip">
-    <string>Undo</string>
+    <string>Undo PaintEvent</string>
    </property>
    <property name="shortcut">
     <string>Ctrl+Z</string>
@@ -537,10 +541,10 @@
     <string>Redo</string>
    </property>
    <property name="toolTip">
-    <string>Redo</string>
+    <string>Redo PaintEvent</string>
    </property>
    <property name="shortcut">
-    <string>Ctrl+U</string>
+    <string>Ctrl+Y</string>
    </property>
   </action>
   <action name="actionHLine">
@@ -552,7 +556,7 @@
    </property>
    <property name="icon">
     <iconset resource="Ressource.qrc">
-     <normaloff>:/Wall.png</normaloff>:/Wall.png</iconset>
+     <normaloff>:/HLine.png</normaloff>:/HLine.png</iconset>
    </property>
    <property name="text">
     <string>HLine</string>
diff --git a/src/GraphicView.cpp b/src/GraphicView.cpp
index 352e1c7acb5cd564b06bf8a4c7e5e3f304557781..0d8e51c8bbc59531b34e19d4f4d432727778187c 100644
--- a/src/GraphicView.cpp
+++ b/src/GraphicView.cpp
@@ -46,6 +46,7 @@ jpsGraphicsView::jpsGraphicsView(QWidget* parent):QGraphicsView(parent)
     translation_x=0;
     translation_y=0;//this->height();
     anglesnap=false;
+    id_counter=0;
     _scaleFactor=1.0;
     _gridSize=1.0;
     gl_scale_f=.01*_scaleFactor;
@@ -792,6 +793,8 @@ void jpsGraphicsView::drawLine()
     {
 
         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)
@@ -812,7 +815,7 @@ void jpsGraphicsView::drawLine()
         current_line=nullptr;
 
         //Undo
-        RecordUndoLineAction("LineAdded",lineItem->GetType(),lineItem->get_line()->line());
+        RecordUndoLineAction("LineAdded",lineItem->GetType(),lineItem->get_id(),lineItem->get_line()->line());
 
         //drawLine();
 
@@ -875,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")
     {
@@ -979,6 +984,7 @@ void jpsGraphicsView::EditLine(QPointF* point)
 
         if (marked_lines.first()->get_line()->line().p1()==*point)
         {
+            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(),
@@ -989,6 +995,7 @@ void jpsGraphicsView::EditLine(QPointF* point)
 
         else if (marked_lines.first()->get_line()->line().p2()==*point)
         {
+            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());
 
@@ -1004,6 +1011,7 @@ void jpsGraphicsView::EditLine(QPointF* point)
         //line_tracked=1;
         RemoveIntersections(marked_lines.first());
         _statLineEdit=true;
+
         //delete_marked_lines();
         en_disableWall();
 
@@ -1048,14 +1056,40 @@ bool jpsGraphicsView::show_hide_roomCaption(QString name, qreal x, qreal y)
     return true;
 }
 
-void jpsGraphicsView::RecordUndoLineAction(const QString& name, const QString& type, const QLineF &oldLine)
+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)
 {
-    _undoStack.PushNewAction(LineAction(name,type,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::RecordRedoLineAction(const QString &name, const QString &type, const QLineF &oldLine)
+void jpsGraphicsView::RedoLineEdit(const int &lineID, const QLineF &old_line)
 {
-    _redoStack.PushNewAction(LineAction(name,type,oldLine));
+    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()
@@ -1069,13 +1103,18 @@ void jpsGraphicsView::Undo()
             addLineItem(recentAction.GetOldLine().p1().x(),recentAction.GetOldLine().p1().y(),recentAction.GetOldLine().p2().x(),
                         recentAction.GetOldLine().p2().y(),recentAction.GetType());
 
-            RecordRedoLineAction("LineAdded",recentAction.GetType(),QLineF(0,0,0,0));
+            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_line()->line());
+            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());
+        }
     }
 
 }
@@ -1091,15 +1130,21 @@ void jpsGraphicsView::Redo()
             addLineItem(recentAction.GetOldLine().p1().x(),recentAction.GetOldLine().p1().y(),recentAction.GetOldLine().p2().x(),
                         recentAction.GetOldLine().p2().y(),recentAction.GetType());
 
-            RecordUndoLineAction("LineAdded",recentAction.GetType(),QLineF(0,0,0,0));
+            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_line()->line());
+            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());
+
+        }
 
 
     }
@@ -1443,7 +1488,7 @@ void jpsGraphicsView::delete_marked_lines()
         for (int i=0; i<marked_lines.size(); ++i)
         {
 
-            RecordUndoLineAction("LineDeleted",marked_lines[i]->GetType(),marked_lines[i]->get_line()->line());
+            RecordUndoLineAction("LineDeleted",marked_lines[i]->GetType(),marked_lines[i]->get_id(),marked_lines[i]->get_line()->line());
 
             RemoveIntersections(marked_lines[i]);
 
@@ -1571,6 +1616,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;
diff --git a/src/GraphicView.h b/src/GraphicView.h
index 06be9be84f013b9d71818a36c5ea1ee815e34c11..e72eb847602aab6192ae783019ae7e2f6bd3adc2 100644
--- a/src/GraphicView.h
+++ b/src/GraphicView.h
@@ -132,8 +132,10 @@ public:
     bool show_hide_roomCaption(QString name, qreal x, qreal y);
 
     //Undo Framework
-    void RecordUndoLineAction(const QString &name, const QString &type, const QLineF &oldLine);
-    void RecordRedoLineAction(const QString &name, const QString &type, const QLineF &oldLine);
+    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
@@ -197,6 +199,7 @@ private:
     QList<jpsLineItem *> marked_lines;
     QGraphicsTextItem* current_caption;
     QList<QGraphicsTextItem* > caption_list;
+    int id_counter;
 
     //Landmark and waypoints
     QList<jpsLandmark* > LLandmarks;
diff --git a/src/UndoFramework/lineaction.cpp b/src/UndoFramework/lineaction.cpp
index a8cca4b006a2da540e13af1f6ab04c61cb5ccfab..9bc9523366ea8e8bd70a7b7a4b6885badb11ae32 100644
--- a/src/UndoFramework/lineaction.cpp
+++ b/src/UndoFramework/lineaction.cpp
@@ -5,9 +5,10 @@ LineAction::LineAction()
 
 }
 
-LineAction::LineAction(const QString &name, const QString &type, const QLineF &oldLine) : Action(name,type)
+LineAction::LineAction(const QString &name, const QString &type, const int &itemID, const QLineF &oldLine) : Action(name,type)
 {
     _oldLine=oldLine;
+    _itemID=itemID;
 }
 
 LineAction::~LineAction()
@@ -20,3 +21,8 @@ QLineF LineAction::GetOldLine() const
     return _oldLine;
 }
 
+int LineAction::GetItemID() const
+{
+    return _itemID;
+}
+
diff --git a/src/UndoFramework/lineaction.h b/src/UndoFramework/lineaction.h
index 63e0cb7eefc501b22374023593ea709b52c1a7f5..e61f2662b3c6bc7ab3e94df87814e36f379961da 100644
--- a/src/UndoFramework/lineaction.h
+++ b/src/UndoFramework/lineaction.h
@@ -8,12 +8,14 @@ class LineAction : public Action
 {
 public:
     LineAction();
-    LineAction(const QString& name, const QString& type, const QLineF& oldLine);
+    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 3b699f9d4e9e3ac0903ece5f9dada96e6010f18f..3b58cea740acf040395dc2fbde9d4e26f8a33f52 100644
--- a/src/datamanager.cpp
+++ b/src/datamanager.cpp
@@ -358,6 +358,7 @@ void jpsDatamanager::writeRoutingHeader(QXmlStreamWriter *stream)
 
 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)
     {
diff --git a/src/mainWindow.cpp b/src/mainWindow.cpp
index e063547944c07c0c1dc0c4a6b87e515e0a1e5031..7d9317f7b35f2aa41b2457cc02687b7c8e7f01de 100644
--- a/src/mainWindow.cpp
+++ b/src/mainWindow.cpp
@@ -183,6 +183,13 @@ 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);
     }
 }
 
@@ -339,7 +346,8 @@ void MWindow::saveFile(){
         dmanager->writeXML(file);
 
         //routing (hlines)
-        QString fileNameRouting = fileName+"routing.xml";
+        QString fileNameRouting=fileName.split(".").first()+"_routing.xml";
+
         QFile routingFile(fileNameRouting);
         if (routingFile.open(QIODevice::WriteOnly|QIODevice::Text))
             dmanager->writeRoutingXML(routingFile);