[qmapshack] 04/11: Imported Upstream version 0.8.1

Bas Couwenberg sebastic at xs4all.nl
Sat Dec 13 14:11:34 UTC 2014


This is an automated email from the git hooks/post-receive script.

sebastic-guest pushed a commit to branch master
in repository qmapshack.

commit 3a925068ac76d6358af53621b2603201288f21ae
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Sat Dec 13 01:32:15 2014 +0100

    Imported Upstream version 0.8.1
---
 .hg_archival.txt                                   |   4 +-
 .hgtags                                            |   1 +
 CMakeLists.txt                                     |   2 +-
 changelog.txt                                      |   6 +-
 src/CMainWindow.cpp                                |  24 +-
 src/CMainWindow.h                                  |   1 +
 src/CMakeLists.txt                                 |  35 +-
 src/GeoMath.cpp                                    |  89 +--
 src/IMainWindow.ui                                 |  11 +
 src/dem/CDemVRT.cpp                                |   8 +
 src/dem/IDem.cpp                                   |  14 +-
 src/dem/IDem.h                                     |   4 +
 src/gis/CGisListDB.cpp                             | 239 +++++++-
 src/gis/CGisListDB.h                               |  33 ++
 src/gis/CGisListWks.cpp                            | 214 ++++++-
 src/gis/CGisListWks.h                              |  14 +-
 src/gis/CGisWidget.cpp                             |  60 +-
 src/gis/IGisItem.cpp                               | 106 +++-
 src/gis/IGisItem.h                                 |  31 +-
 src/gis/IGisProject.cpp                            |  68 ++-
 src/gis/IGisProject.h                              |  98 ++--
 src/gis/IGisWidget.ui                              |  24 +-
 .../{CGisListDB.cpp => db/CDBFolderDatabase.cpp}   |  14 +-
 src/gis/{CGisListDB.h => db/CDBFolderDatabase.h}   |  14 +-
 src/gis/{CGisListDB.cpp => db/CDBFolderGroup.cpp}  |  12 +-
 src/gis/{CGisListDB.h => db/CDBFolderGroup.h}      |  14 +-
 .../{CGisListDB.cpp => db/CDBFolderLostFound.cpp}  |  14 +-
 src/gis/{CGisListDB.h => db/CDBFolderLostFound.h}  |  14 +-
 src/gis/{CGisListDB.cpp => db/CDBFolderOther.cpp}  |  13 +-
 src/gis/{CGisListDB.h => db/CDBFolderOther.h}      |  14 +-
 .../{CGisListDB.cpp => db/CDBFolderProject.cpp}    |  13 +-
 src/gis/{CGisListDB.h => db/CDBFolderProject.h}    |  14 +-
 src/gis/{CGisListDB.cpp => db/CDBItem.cpp}         |   9 +-
 src/gis/{CGisListDB.cpp => db/CDBItem.h}           |  19 +-
 src/gis/{CGisListDB.cpp => db/CDBProject.cpp}      |  12 +-
 src/gis/{CGisListDB.h => db/CDBProject.h}          |  14 +-
 src/gis/db/CSetupDB.cpp                            |  69 +++
 src/gis/{CGisListDB.h => db/CSetupDB.h}            |  24 +-
 src/gis/db/CSetupFolder.cpp                        |  77 +++
 src/gis/{bin/CBinProject.h => db/CSetupFolder.h}   |  29 +-
 src/gis/db/IDBFolder.cpp                           | 106 ++++
 src/gis/{gpx/CGpxProject.h => db/IDBFolder.h}      |  49 +-
 src/gis/db/ISetupDB.ui                             | 147 +++++
 src/gis/db/ISetupFolder.ui                         | 116 ++++
 src/gis/{CGisListDB.cpp => db/macros.h}            |  27 +-
 src/gis/gpx/CGpxProject.cpp                        |  47 +-
 src/gis/gpx/CGpxProject.h                          |   3 +-
 src/gis/ovl/CDetailsOvlArea.cpp                    |  53 +-
 src/gis/ovl/CDetailsOvlArea.h                      |   2 -
 src/gis/ovl/CGisItemOvlArea.cpp                    |  35 +-
 src/gis/ovl/CGisItemOvlArea.h                      |   5 +-
 .../{bin/CBinProject.cpp => qms/CQmsProject.cpp}   |  49 +-
 src/gis/{bin/CBinProject.h => qms/CQmsProject.h}   |  13 +-
 src/gis/{bin => qms}/serialization.cpp             |  57 +-
 src/gis/rte/CGisItemRte.cpp                        |  27 +-
 src/gis/rte/CGisItemRte.h                          |   2 +-
 src/gis/search/CSearchGoogle.cpp                   |   2 +-
 src/gis/trk/CDetailsTrk.cpp                        |  47 +-
 src/gis/trk/CDetailsTrk.h                          |   3 -
 src/gis/trk/CGisItemTrk.cpp                        | 302 +++++-----
 src/gis/trk/CGisItemTrk.h                          |   3 +-
 src/gis/wpt/CDetailsWpt.cpp                        |  59 +-
 src/gis/wpt/CDetailsWpt.h                          |   1 -
 src/gis/wpt/CGisItemWpt.cpp                        |  45 +-
 src/gis/wpt/CGisItemWpt.h                          |   3 +-
 src/helpers/CHistoryListWidget.cpp                 |   3 +-
 src/helpers/CLinksDialog.cpp                       |  87 +++
 .../bin/CBinProject.h => helpers/CLinksDialog.h}   |  29 +-
 src/helpers/ILinksDialog.ui                        | 130 +++++
 src/icons/32x32/DBProject.png                      | Bin 0 -> 1533 bytes
 src/icons/32x32/Database.png                       | Bin 0 -> 1277 bytes
 src/icons/32x32/DatabaseSetup.png                  | Bin 0 -> 2142 bytes
 src/icons/32x32/Link.png                           | Bin 0 -> 952 bytes
 src/icons/32x32/Path.png                           | Bin 0 -> 536 bytes
 src/icons/32x32/PathBlue.png                       | Bin 0 -> 536 bytes
 src/icons/32x32/PathGreen.png                      | Bin 0 -> 544 bytes
 src/icons/32x32/PathOrange.png                     | Bin 0 -> 538 bytes
 src/icons/48x48/DBProject.png                      | Bin 0 -> 2245 bytes
 src/icons/48x48/Database.png                       | Bin 0 -> 1946 bytes
 src/icons/48x48/DatabaseSetup.png                  | Bin 0 -> 3348 bytes
 src/icons/48x48/Link.png                           | Bin 0 -> 1093 bytes
 src/icons/48x48/Path.png                           | Bin 0 -> 756 bytes
 src/icons/48x48/PathBlue.png                       | Bin 0 -> 756 bytes
 src/icons/48x48/PathGreen.png                      | Bin 0 -> 753 bytes
 src/icons/48x48/PathOrange.png                     | Bin 0 -> 733 bytes
 src/icons/DBProject.svg                            | 180 ++++++
 src/icons/Database.svg                             | 168 ++++++
 src/icons/DatabaseSetup.svg                        | 152 +++++
 src/icons/Link.svg                                 | 140 +++++
 src/icons/PathBlue.svg                             |  81 +++
 src/icons/PathGreen.svg                            |  77 +++
 src/icons/PathOrange.svg                           |  77 +++
 src/locale/qmapshack_cs.ts                         | 395 ++++++++-----
 src/locale/qmapshack_de.ts                         | 622 +++++++++++++--------
 src/locale/qmapshack_es.ts                         | 397 ++++++++-----
 src/map/CMapIMG.cpp                                |  14 +
 src/map/CMapIMG.h                                  |   1 +
 src/map/CMapPathSetup.cpp                          |   1 +
 src/mouse/IScrOptEditLine.ui                       |   3 -
 src/resources.qrc                                  |  14 +
 100 files changed, 3977 insertions(+), 1272 deletions(-)

diff --git a/.hg_archival.txt b/.hg_archival.txt
index d4851dc..0cbe63a 100644
--- a/.hg_archival.txt
+++ b/.hg_archival.txt
@@ -1,4 +1,4 @@
 repo: 9d6ee306235c77d65d21797124dfc82760eb94e8
-node: c77136ce6df5377999c5c4fa3b8030a34e67e9a0
+node: ef016d14cfedfd7ef049e654b8ba51ddd0596550
 branch: default
-tag: V 0.8.0
+tag: V 0.8.1
diff --git a/.hgtags b/.hgtags
index 4b77a16..0248458 100644
--- a/.hgtags
+++ b/.hgtags
@@ -15,3 +15,4 @@ cbe5b6e6cab489636c3cce79c16a340fb249156f V 0.3.1
 c0720884e8fdba0b812a76e8620f972f302e4162 V 0.5.0
 d7d2ddcbb62525558535f27ebffb1f9a54133441 V 0.6.0
 60688b74ffb725c9c4503e61557365f83300f678 V 0.7.0
+c77136ce6df5377999c5c4fa3b8030a34e67e9a0 V 0.8.0
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0556b08..b3e8b77 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -21,7 +21,7 @@ set(APPLICATION_NAME qmapshack)
 
 set(APPLICATION_VERSION_MAJOR "0")
 set(APPLICATION_VERSION_MINOR "8")
-set(APPLICATION_VERSION_PATCH "0")
+set(APPLICATION_VERSION_PATCH "1")
 
 add_definitions(-DVER_MAJOR=${APPLICATION_VERSION_MAJOR} -DVER_MINOR=${APPLICATION_VERSION_MINOR} -DVER_STEP=${APPLICATION_VERSION_PATCH} -DAPPLICATION_NAME=${PROJECT_NAME})
 
diff --git a/changelog.txt b/changelog.txt
index a6b74ef..3724bc6 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,3 +1,8 @@
+V 0.8.1
+* Handle "no data" values in DEM files
+* Garmin maps: read copyright information 
+* Save/Restore workspace on exit/start
+
 V 0.8.0
 * Add unit setup (metric, imperial, nautical)
 * Add data serialization for track, waypoint, route and area
@@ -37,7 +42,6 @@ V 0.3.0.bureaucratic
 * Add copyright notice to GpxExamples to satisfy bureaucrats @ debian
 
 V 0.3.0
-
 * A lot of little fixes to prevent crashes and glitches due to multithreading
 * Take special care of the +-180 degree problem
 * Add RGB support to raster maps
diff --git a/src/CMainWindow.cpp b/src/CMainWindow.cpp
index c1f7121..abc6928 100644
--- a/src/CMainWindow.cpp
+++ b/src/CMainWindow.cpp
@@ -28,30 +28,38 @@
 #include "units/CTimeZoneSetup.h"
 #include "units/CUnitsSetup.h"
 #include "version.h"
+#include "config.h"
 #include "CAbout.h"
 #include "gis/CGisWidget.h"
 #include "gis/WptIcons.h"
+#include "gis/db/CSetupDB.h"
 
 #include <QtGui>
 #include <QtWidgets>
+#include <QtSql>
 
 CMainWindow * CMainWindow::pSelf = 0;
 
 CMainWindow::CMainWindow()
 {
+    SETTINGS;
+
     pSelf = this;
-    qDebug() << WHAT_STR;
     setupUi(this);
     setWindowTitle(WHAT_STR);
 
     initWptIcons();
 
-    gisWidget = new CGisWidget(menuProject, this);
-    dockGis->setWidget(gisWidget);
+    IUnit::self().setUnitType((IUnit::type_e)cfg.value("MainWindow/units",IUnit::eTypeMetric).toInt(), this);
 
+    QString path = cfg.value("Database/path", QDir::home().filePath(CONFIGDIR).append("/qms.db")).toString();
+    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
+    db.setDatabaseName(path);
+    db.open();
 
+    gisWidget = new CGisWidget(menuProject, this);
+    dockGis->setWidget(gisWidget);
 
-    SETTINGS;
     // start ---- restore window geometry -----
     if ( cfg.contains("MainWindow/geometry"))
     {
@@ -68,7 +76,6 @@ CMainWindow::CMainWindow()
     }
     // end ---- restore window geometry -----
 
-    IUnit::self().setUnitType((IUnit::type_e)cfg.value("MainWindow/units",IUnit::eTypeMetric).toInt(), this);
 
     connect(actionAbout, SIGNAL(triggered()), this, SLOT(slotAbout()));
     connect(actionHelp, SIGNAL(triggered()), this, SLOT(slotHelp()));
@@ -85,6 +92,7 @@ CMainWindow::CMainWindow()
     connect(actionSetupMapWks, SIGNAL(triggered()), this, SLOT(slotSetupMapWks()));
     connect(actionSetupTimeZone, SIGNAL(triggered()), this, SLOT(slotSetupTimeZone()));
     connect(actionSetupUnits, SIGNAL(triggered()), this, SLOT(slotSetupUnits()));
+    connect(actionSetupDatabase, SIGNAL(triggered()), this, SLOT(slotSetupDatabase()));
     connect(actionSaveGISData, SIGNAL(triggered()), gisWidget, SLOT(slotSaveAll()));
     connect(actionLoadGISData, SIGNAL(triggered()), this, SLOT(slotLoadGISData()));
     connect(tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(slotTabCloseRequest(int)));
@@ -535,6 +543,12 @@ void CMainWindow::slotSetupUnits()
     dlg.exec();
 }
 
+void CMainWindow::slotSetupDatabase()
+{
+    CSetupDB dlg(this);
+    dlg.exec();
+}
+
 void CMainWindow::slotLoadGISData()
 {
     SETTINGS;
diff --git a/src/CMainWindow.h b/src/CMainWindow.h
index d149ed4..94b39b2 100644
--- a/src/CMainWindow.h
+++ b/src/CMainWindow.h
@@ -79,6 +79,7 @@ class CMainWindow : public QMainWindow, private Ui::IMainWindow
         void slotSetupMapWks();
         void slotSetupTimeZone();
         void slotSetupUnits();
+        void slotSetupDatabase();
         void slotLoadGISData();
 
     private:
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index a93c229..c3fb21e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -9,12 +9,14 @@ find_package(Qt5Widgets)
 find_package(Qt5Core)
 find_package(Qt5Xml)
 find_package(Qt5Script)
+find_package(Qt5Sql)
 find_package(Qt5WebKitWidgets)
 find_package(Qt5LinguistTools)
 find_package(GDAL REQUIRED)
 find_package(PROJ REQUIRED)
 
 set( SRCS
+
     main.cpp
     GeoMath.cpp
     CMainWindow.cpp
@@ -26,6 +28,7 @@ set( SRCS
     helpers/CSelectProjectDialog.cpp
     helpers/CHistoryListWidget.cpp
     helpers/CElevationDialog.cpp
+    helpers/CLinksDialog.cpp
     canvas/CCanvas.cpp
     canvas/CCanvasSetup.cpp
     canvas/IDrawContext.cpp
@@ -95,8 +98,18 @@ set( SRCS
     gis/IGisProject.cpp
     gis/gpx/CGpxProject.cpp
     gis/gpx/serialization.cpp
-    gis/bin/CBinProject.cpp
-    gis/bin/serialization.cpp
+    gis/qms/CQmsProject.cpp
+    gis/qms/serialization.cpp
+    gis/db/CSetupDB.cpp
+    gis/db/CSetupFolder.cpp
+    gis/db/IDBFolder.cpp
+    gis/db/CDBFolderLostFound.cpp
+    gis/db/CDBFolderDatabase.cpp
+    gis/db/CDBFolderGroup.cpp
+    gis/db/CDBFolderOther.cpp
+    gis/db/CDBFolderProject.cpp
+    gis/db/CDBItem.cpp
+    gis/db/CDBProject.cpp
     gis/search/CSearchGoogle.cpp
     gis/wpt/CGisItemWpt.cpp
     gis/wpt/CScrOptWpt.cpp
@@ -139,6 +152,7 @@ set( HDRS
     helpers/CSelectProjectDialog.h
     helpers/CHistoryListWidget.h
     helpers/CElevationDialog.h
+    helpers/CLinksDialog.h
     canvas/CCanvas.h
     canvas/CCanvasSetup.h
     canvas/IDrawContext.h
@@ -207,7 +221,18 @@ set( HDRS
     gis/CGisWidget.h
     gis/CGisListDB.h
     gis/CGisListWks.h
-    gis/bin/CBinProject.cpp
+    gis/qms/CQmsProject.cpp
+    gis/db/macros.h
+    gis/db/CSetupDB.h
+    gis/db/CSetupFolder.h
+    gis/db/IDBFolder.h
+    gis/db/CDBFolderLostFound.h
+    gis/db/CDBFolderDatabase.h
+    gis/db/CDBFolderGroup.h
+    gis/db/CDBFolderOther.h
+    gis/db/CDBFolderProject.h
+    gis/db/CDBItem.h
+    gis/db/CDBProject.h
     gis/wpt/CGisItemWpt.h
     gis/wpt/CScrOptWpt.h
     gis/wpt/CDetailsWpt.h
@@ -243,6 +268,7 @@ set( UIS
     helpers/ITextEditWidget.ui
     helpers/ISelectProjectDialog.ui
     helpers/IElevationDialog.ui
+    helpers/ILinksDialog.ui
     canvas/ICanvasSetup.ui
     dem/IDemList.ui
     dem/IDemPathSetup.ui
@@ -257,6 +283,8 @@ set( UIS
     mouse/IScrOptRange.ui
     mouse/IScrOptRangeTrk.ui
     gis/IGisWidget.ui
+    gis/db/ISetupDB.ui
+    gis/db/ISetupFolder.ui
     gis/wpt/IScrOptWpt.ui
     gis/wpt/IDetailsWpt.ui
     gis/wpt/IDetailsGeoCache.ui
@@ -319,6 +347,7 @@ target_link_libraries(${APPLICATION_NAME}
     Qt5::Widgets
     Qt5::Xml
     Qt5::Script
+    Qt5::Sql
     Qt5::WebKitWidgets
     CGetOpt
     ${GDAL_LIBRARIES}
diff --git a/src/GeoMath.cpp b/src/GeoMath.cpp
index 8b11fb2..eef1510 100644
--- a/src/GeoMath.cpp
+++ b/src/GeoMath.cpp
@@ -20,8 +20,8 @@
 #include "GeoMath.h"
 #include "canvas/IDrawContext.h"
 #include <math.h>
-#include <stdlib.h>
 #include <proj_api.h>
+#include <stdlib.h>
 
 #include <QtGui>
 #include <QtWidgets>
@@ -31,7 +31,6 @@
 
 void GPS_Math_DegMinSec_To_Deg(bool sign, const int32_t d, const int32_t m, const int32_t s, qreal &deg)
 {
-
     deg = qAbs(d) + qreal(m) / 60.0 + qreal(s) / 3600;
     if(sign)
     {
@@ -46,20 +45,20 @@ bool GPS_Math_Deg_To_DegMin(qreal v, qint32 *d, qreal *m)
 {
     bool sign = v < 0;
     qint32 deg = qAbs(v);
-    qreal  min = (qAbs(v) - deg) * 60.0;
+    qreal min = (qAbs(v) - deg) * 60.0;
 
     *d = deg;
     *m = min;
 
-    return sign;
+    return(sign);
 }
 
 
 void GPS_Math_DegMin_To_Deg(bool sign, const qint32 d, const qreal m, qreal& deg)
 {
-
     deg = qAbs(d) + m / 60.0;
-    if(sign) {
+    if(sign)
+    {
         deg = -deg;
     }
 
@@ -85,9 +84,10 @@ void GPS_Math_Deg_To_Str(const qreal& x, const qreal& y, QString& str)
 bool GPS_Math_Str_To_Deg(const QString& str, qreal& lon, qreal& lat)
 {
     QRegExp re("^\\s*([N|S]){1}\\W*([0-9]+)\\W*([0-9]+\\.[0-9]+)\\s+([E|W]){1}\\W*([0-9]+)\\W*([0-9]+\\.[0-9]+)\\s*$");
-    if(!re.exactMatch(str)) {
+    if(!re.exactMatch(str))
+    {
         QMessageBox::warning(0,QObject::tr("Error"),QObject::tr("Bad position format. Must be: [N|S] ddd mm.sss [W|E] ddd mm.sss"),QMessageBox::Abort,QMessageBox::Abort);
-        return false;
+        return(false);
     }
 
     bool signLat    = re.cap(1) == "S";
@@ -102,7 +102,7 @@ bool GPS_Math_Str_To_Deg(const QString& str, qreal& lon, qreal& lat)
 
     GPS_Math_DegMin_To_Deg(signLon, degLon, minLon, lon);
 
-    return true;
+    return(true);
 }
 
 // from http://www.movable-type.co.uk/scripts/LatLongVincenty.html
@@ -127,13 +127,15 @@ qreal GPS_Math_Distance(const qreal u1, const qreal v1, const qreal u2, const qr
     qreal lambda = L, lambdaP = 2*PI;
     unsigned iterLimit = 20;
 
-    while ((qAbs(lambda - lambdaP) > 1e-12) && (--iterLimit > 0)) {
+    while ((qAbs(lambda - lambdaP) > 1e-12) && (--iterLimit > 0))
+    {
         sinLambda = sin(lambda);
         cosLambda = cos(lambda);
         sinSigma = sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
 
-        if (sinSigma==0){
-            return 0;  // co-incident points
+        if (sinSigma==0)
+        {
+            return(0);  // co-incident points
         }
 
         cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;
@@ -142,7 +144,8 @@ qreal GPS_Math_Distance(const qreal u1, const qreal v1, const qreal u2, const qr
         cosSqAlpha = 1 - sinAlpha * sinAlpha;
         cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha;
 
-        if (isnan(cos2SigmaM)){
+        if (isnan(cos2SigmaM))
+        {
             cos2SigmaM = 0;  // equatorial line: cosSqAlpha=0 (§6)
         }
 
@@ -150,8 +153,10 @@ qreal GPS_Math_Distance(const qreal u1, const qreal v1, const qreal u2, const qr
         lambdaP = lambda;
         lambda = L + (1-C) * f * sinAlpha * (sigma + C*sinSigma*(cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));
     }
-    if (iterLimit==0) return FP_NAN;  // formula failed to converge
-
+    if (iterLimit==0)
+    {
+        return( FP_NAN);              // formula failed to converge
+    }
     qreal uSq = cosSqAlpha * (a*a - b*b) / (b*b);
     qreal A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
     qreal B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
@@ -160,7 +165,7 @@ qreal GPS_Math_Distance(const qreal u1, const qreal v1, const qreal u2, const qr
 
     a1 = atan2(cosU2 * sinLambda, cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) * 360 / TWOPI;
     a2 = atan2(cosU1 * sinLambda, -sinU1 * cosU2 + cosU1 * sinU2 * cosLambda) * 360 / TWOPI;
-    return s;
+    return(s);
 }
 
 qreal GPS_Math_Distance(const qreal u1, const qreal v1, const qreal u2, const qreal v2)
@@ -184,13 +189,15 @@ qreal GPS_Math_Distance(const qreal u1, const qreal v1, const qreal u2, const qr
     qreal lambda = L, lambdaP = 2*PI;
     unsigned iterLimit = 20;
 
-    while ((qAbs(lambda - lambdaP) > 1e-12) && (--iterLimit > 0)) {
+    while ((qAbs(lambda - lambdaP) > 1e-12) && (--iterLimit > 0))
+    {
         sinLambda = sin(lambda);
         cosLambda = cos(lambda);
         sinSigma = sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
 
-        if (sinSigma==0){
-            return 0;  // co-incident points
+        if (sinSigma==0)
+        {
+            return(0);  // co-incident points
         }
 
         cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;
@@ -199,7 +206,8 @@ qreal GPS_Math_Distance(const qreal u1, const qreal v1, const qreal u2, const qr
         cosSqAlpha = 1 - sinAlpha * sinAlpha;
         cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha;
 
-        if (isnan(cos2SigmaM)){
+        if (isnan(cos2SigmaM))
+        {
             cos2SigmaM = 0;  // equatorial line: cosSqAlpha=0 (§6)
         }
 
@@ -207,15 +215,17 @@ qreal GPS_Math_Distance(const qreal u1, const qreal v1, const qreal u2, const qr
         lambdaP = lambda;
         lambda = L + (1-C) * f * sinAlpha * (sigma + C*sinSigma*(cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM)));
     }
-    if (iterLimit==0) return FP_NAN;  // formula failed to converge
-
+    if (iterLimit==0)
+    {
+        return( FP_NAN);              // formula failed to converge
+    }
     qreal uSq = cosSqAlpha * (a*a - b*b) / (b*b);
     qreal A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
     qreal B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
     qreal deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
     qreal s = b*A*(sigma-deltaSigma);
 
-    return s;
+    return(s);
 }
 
 qreal GPS_Math_DistanceQuick(const qreal u1, const qreal v1, const qreal u2, const qreal v2)
@@ -225,7 +235,7 @@ qreal GPS_Math_DistanceQuick(const qreal u1, const qreal v1, const qreal u2, con
 
     qreal d = 2*asin(sqrt(sin(dV/2) * sin(dV/2) + cos(v1) * cos(v2) * sin(dU/2) * sin(dU/2)));
 
-    return 6371010 * d;
+    return(6371010 * d);
 }
 
 void GPS_Math_Wpt_Projection(const qreal lon1, const qreal lat1, const qreal distance, const qreal bearing, qreal& lon2, qreal& lat2)
@@ -237,7 +247,6 @@ void GPS_Math_Wpt_Projection(const qreal lon1, const qreal lat1, const qreal dis
 
 qreal GPS_Math_distPointLine3D(point3D& x1, point3D& x2, point3D& x0)
 {
-
     point3D v1, v2, v3, v1x2;
 
     qreal a1x2, a3;
@@ -267,21 +276,28 @@ qreal GPS_Math_distPointLine3D(point3D& x1, point3D& x2, point3D& x0)
     // |(x2 - x1)|
     a3      = v3.x*v3.x + v3.y*v3.y + v3.z*v3.z;
 
-    return sqrt(a1x2/a3);
+    return(sqrt(a1x2/a3));
 }
 
 
 struct segment
 {
-    segment(): idx1(0), idx2(0){}
-    segment(qint32 idx1, quint32 idx2) : idx1(idx1), idx2(idx2) {}
+    segment() : idx1(0), idx2(0)
+    {
+    }
+    segment(qint32 idx1, quint32 idx2) : idx1(idx1), idx2(idx2)
+    {
+    }
     qint32 idx1;
     qint32 idx2;
 };
 
 void GPS_Math_DouglasPeucker(QVector<pointDP> &line, qreal d)
 {
-    if(line.count() < 3) return;
+    if(line.count() < 3)
+    {
+        return;
+    }
 
     QStack<segment> stack;
     stack << segment(0, line.size() - 1);
@@ -332,17 +348,16 @@ QPointF GPS_Math_Wpt_Projection(const QPointF& pt1, qreal distance, qreal bearin
 
     pt2.rx() = lon2;
     pt2.ry() = lat2;
-    return pt2;
+    return(pt2);
 }
 
 
 bool GPS_Math_LineCrossesRect(const QPointF &p1, const QPointF &p2, const QRectF &rect)
 {
-
     // the trival case
     if(rect.contains(p1) || rect.contains(p2))
     {
-        return true;
+        return(true);
     }
 
     qreal slope    = qreal(p2.y() - p1.y()) / (p2.x() - p1.x());
@@ -352,14 +367,14 @@ bool GPS_Math_LineCrossesRect(const QPointF &p1, const QPointF &p2, const QRectF
 
     if((y1 < rect.top()) && (y2 < rect.top()))
     {
-        return false;
+        return(false);
     }
     else if((y1 > rect.bottom()) && (y2 > rect.bottom()))
     {
-        return false;
+        return(false);
     }
 
-    return true;
+    return(true);
 }
 
 
@@ -418,7 +433,6 @@ void GPS_Math_SubPolyline(const QPointF& pt1, const QPointF& pt2, qint32 thresho
 
         if(u >= 0.0 && u <= 1.0)
         {
-
             x = p1.u + u * dx;
             y = p1.v + u * dy;
 
@@ -492,7 +506,6 @@ void GPS_Math_SubPolyline(const QPointF& pt1, const QPointF& pt2, qint32 thresho
 
 void segment_t::apply(const QPolygonF& coords, const QPolygonF& pixel, QPolygonF& segCoord, QPolygonF& segPixel, IDrawContext * context)
 {
-
     QPointF pt1 = px1;
     QPointF pt2 = px2;
 
@@ -508,7 +521,6 @@ void segment_t::apply(const QPolygonF& coords, const QPolygonF& pixel, QPolygonF
 
             segCoord.push_back(pt1);
             segCoord.push_back(pt2);
-
         }
         else if(idx12 == idx21)
         {
@@ -519,7 +531,6 @@ void segment_t::apply(const QPolygonF& coords, const QPolygonF& pixel, QPolygonF
             segCoord.push_back(pt1);
             segCoord.push_back(coords[idx12]);
             segCoord.push_back(pt2);
-
         }
         else if(idx11 < idx21)
         {
diff --git a/src/IMainWindow.ui b/src/IMainWindow.ui
index 2106bb4..26e9b66 100644
--- a/src/IMainWindow.ui
+++ b/src/IMainWindow.ui
@@ -102,6 +102,8 @@
     </property>
     <addaction name="actionAddEmptyProject"/>
     <addaction name="actionSearchGoogle"/>
+    <addaction name="separator"/>
+    <addaction name="actionSetupDatabase"/>
     <addaction name="actionCloseAllProjects"/>
    </widget>
    <addaction name="menuFile"/>
@@ -427,6 +429,15 @@
     <string>Setup Units</string>
    </property>
   </action>
+  <action name="actionSetupDatabase">
+   <property name="icon">
+    <iconset resource="resources.qrc">
+     <normaloff>:/icons/32x32/DatabaseSetup.png</normaloff>:/icons/32x32/DatabaseSetup.png</iconset>
+   </property>
+   <property name="text">
+    <string>Setup Database</string>
+   </property>
+  </action>
  </widget>
  <resources>
   <include location="resources.qrc"/>
diff --git a/src/dem/CDemVRT.cpp b/src/dem/CDemVRT.cpp
index 7375a65..499ba19 100644
--- a/src/dem/CDemVRT.cpp
+++ b/src/dem/CDemVRT.cpp
@@ -64,6 +64,9 @@ CDemVRT::CDemVRT(const QString &filename, CDemDraw *parent)
     hasOverviews = pBand->GetOverviewCount() != 0;
     qDebug() << "has overviews" << hasOverviews;
 
+    noData = pBand->GetNoDataValue(&hasNoData);
+    qDebug() << "no data:" << hasNoData << noData;
+
     // ------- setup projection ---------------
     char str[1024] = {0};
     if(dataset->GetProjectionRef())
@@ -159,6 +162,11 @@ qreal CDemVRT::getElevationAt(const QPointF& pos)
         return NOFLOAT;
     }
 
+    if(hasNoData && e[0] == noData)
+    {
+        return NOFLOAT;
+    }
+
     qreal b1 = e[0];
     qreal b2 = e[1] - e[0];
     qreal b3 = e[2] - e[0];
diff --git a/src/dem/IDem.cpp b/src/dem/IDem.cpp
index 436f05e..b72c050 100644
--- a/src/dem/IDem.cpp
+++ b/src/dem/IDem.cpp
@@ -46,6 +46,8 @@ IDem::IDem(CDemDraw *parent)
     , dem(parent)
     , pjsrc(0)
     , isActivated(false)
+    , hasNoData(0)
+    , noData(0)
     , bHillshading(false)
     , factorHillshading(1.0)
 {
@@ -53,10 +55,11 @@ IDem::IDem(CDemDraw *parent)
     pjtar = pj_init_plus("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
 
     graytable.resize(256);
-    for(int i = 0; i < 256; i++)
+    for(int i = 0; i < 255; i++)
     {
-        graytable[i] = qRgb(i,i,i);
+        graytable[i] = qRgba(i,i,i,255);
     }
+    graytable[255] = qRgba(0,0,0,0);
 
 }
 
@@ -141,6 +144,13 @@ void IDem::hillshading(QVector<qint16>& data, qreal w, qreal h, QImage& img)
         for(int n = 1; n <= w; n++)
         {
             fillWindow(data, n, m, wp2, win);
+
+            if(hasNoData && win[4] == noData)
+            {
+                img.setPixel(n - 1, m - 1, 255);
+                continue;
+            }
+
             dx          = ((win[0] + win[3] + win[3] + win[6]) - (win[2] + win[5] + win[5] + win[8])) / (xscale*factorHillshading);
             dy          = ((win[6] + win[7] + win[7] + win[8]) - (win[0] + win[1] + win[1] + win[2])) / (yscale*factorHillshading);
             aspect      = atan2(dy, dx);
diff --git a/src/dem/IDem.h b/src/dem/IDem.h
index 9d63bff..b3087f4 100644
--- a/src/dem/IDem.h
+++ b/src/dem/IDem.h
@@ -114,6 +114,10 @@ class IDem : public IDrawObject
 
         QVector<QRgb> graytable;
 
+        int hasNoData;
+
+        double noData;
+
     private:
         bool bHillshading;
 
diff --git a/src/gis/CGisListDB.cpp b/src/gis/CGisListDB.cpp
index 4d2b2cf..9e20b9a 100644
--- a/src/gis/CGisListDB.cpp
+++ b/src/gis/CGisListDB.cpp
@@ -16,18 +16,255 @@
 
 **********************************************************************************************/
 
-#include "CGisListDB.h"
+#include "gis/CGisListDB.h"
+#include "gis/db/macros.h"
+#include "gis/db/CSetupFolder.h"
+#include "gis/db/CDBFolderDatabase.h"
+#include "gis/db/CDBFolderLostFound.h"
 
+#include <QtSql>
 #include <QtWidgets>
 
 CGisListDB::CGisListDB(QWidget *parent)
     : QTreeWidget(parent)
 {
+    db = QSqlDatabase::database();
 
+    QSqlQuery query(db);
+
+    if(!query.exec("PRAGMA locking_mode=EXCLUSIVE"))
+    {
+        return;
+    }
+
+    if(!query.exec("PRAGMA synchronous=OFF"))
+    {
+        return;
+    }
+
+    if(!query.exec("PRAGMA temp_store=MEMORY"))
+    {
+        return;
+    }
+
+    if(!query.exec("PRAGMA default_cache_size=50"))
+    {
+        return;
+    }
+
+    if(!query.exec("PRAGMA page_size=8192"))
+    {
+        return;
+    }
+
+    if(!query.exec("SELECT version FROM versioninfo"))
+    {
+        initDB();
+    }
+    else if(query.next())
+    {
+        int version = query.value(0).toInt();
+        if(version != DB_VERSION)
+        {
+            migrateDB(version);
+        }
+    }
+    else
+    {
+        initDB();
+    }
+
+//    itemLostFound       = new CDBFolderLostFound(this);
+//    itemDatabase        = new CDBFolderDatabase(this);
+
+    menuDatabase        = new QMenu(this);
+    actionAddFolder     = menuDatabase->addAction(QIcon("://icons/32x32/Add.png"), tr("Add Folder"), this, SLOT(slotAddFolder()));
+
+    menuProject         = new QMenu(this);
+    menuItem            = new QMenu(this);
+
+    connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));
+    connect(this, SIGNAL(itemExpanded(QTreeWidgetItem*)), this, SLOT(slotItemExpanded(QTreeWidgetItem*)));
+
+//    itemDatabase->setExpanded(true);
 }
 
 CGisListDB::~CGisListDB()
 {
+}
+
+void CGisListDB::initDB()
+{
+    QSqlQuery query(db);
+
+    if(query.exec( "CREATE TABLE versioninfo ( version TEXT )"))
+    {
+        query.prepare( "INSERT INTO versioninfo (version) VALUES(:version)");
+        query.bindValue(":version", DB_VERSION);
+        QUERY_EXEC(; );
+    }
+
+    if(!query.exec( "CREATE TABLE folders ("
+                    "id             INTEGER PRIMARY KEY AUTOINCREMENT,"
+                    "type           INTEGER NOT NULL,"
+                    "date           DATETIME DEFAULT CURRENT_TIMESTAMP,"
+                    "name           TEXT NOT NULL,"
+                    "comment        TEXT,"
+                    "locked         BOOLEAN DEFAULT FALSE"
+                    ")"))
+    {
+        qDebug() << query.lastQuery();
+        qDebug() << query.lastError();
+    }
+
+    if(!query.exec( "CREATE TABLE items ("
+                    "id             INTEGER PRIMARY KEY AUTOINCREMENT,"
+                    "type           INTEGER,"
+                    "key            TEXT NOT NULL,"
+                    "date           DATETIME DEFAULT CURRENT_TIMESTAMP,"
+                    "icon           TEXT NOT NULL,"
+                    "name           TEXT NOT NULL,"
+                    "comment        TEXT,"
+                    "data           BLOB NOT NULL"
+                    ")"))
+    {
+        qDebug() << query.lastQuery();
+        qDebug() << query.lastError();
+    }
 
+    if(!query.exec( "CREATE TABLE workspace ("
+                    "id             INTEGER PRIMARY KEY AUTOINCREMENT,"
+                    "type           INTEGER NOT NULL,"
+                    "name           TEXT NOT NULL,"
+                    "key            TEXT NOT NULL,"
+                    "changed        BOOLEAN DEFAULT FALSE,"
+                    "data           BLOB NOT NULL"
+
+                    ")"))
+    {
+        qDebug() << query.lastQuery();
+        qDebug() << query.lastError();
+    }
+
+    if(!query.exec("INSERT INTO folders (type, name, comment) VALUES (2, 'Database', '')"))
+    {
+        qDebug() << query.lastQuery();
+        qDebug() << query.lastError();
+    }
+
+    if(!query.exec( "CREATE TABLE folder2folder ("
+                    "id             INTEGER PRIMARY KEY AUTOINCREMENT,"
+                    "parent         INTEGER NOT NULL,"
+                    "child          INTEGER NOT NULL,"
+                    "FOREIGN KEY(parent) REFERENCES folders(id),"
+                    "FOREIGN KEY(child) REFERENCES folders(id)"
+                    ")"))
+    {
+        qDebug() << query.lastQuery();
+        qDebug() << query.lastError();
+    }
+
+    if(!query.exec( "CREATE TABLE folder2item ("
+                    "id             INTEGER PRIMARY KEY AUTOINCREMENT,"
+                    "parent         INTEGER NOT NULL,"
+                    "child          INTEGER NOT NULL,"
+                    "FOREIGN KEY(parent) REFERENCES folders(id),"
+                    "FOREIGN KEY(child) REFERENCES items(id)"
+                    ")"))
+    {
+        qDebug() << query.lastQuery();
+        qDebug() << query.lastError();
+    }
 }
 
+void CGisListDB::migrateDB(int version)
+{
+    QSqlQuery query(db);
+
+    for(version++; version <= DB_VERSION; version++)
+    {
+        switch(version)
+        {
+        }
+    }
+    query.prepare( "UPDATE versioninfo set version=:version");
+    query.bindValue(":version", version - 1);
+    QUERY_EXEC(; );
+}
+
+void CGisListDB::slotContextMenu(const QPoint& point)
+{
+    QPoint p = mapToGlobal(point);
+    IDBFolder * folder = dynamic_cast<IDBFolder*>(currentItem());
+    if((folder != 0))
+    {
+        menuDatabase->exec(p);
+        return;
+    }
+}
+
+void CGisListDB::slotAddFolder()
+{
+    IDBFolder * parentFolder = dynamic_cast<IDBFolder*>(currentItem());
+    if(parentFolder == 0)
+    {
+        return;
+    }
+    quint64 idParent = parentFolder->getId();
+
+    IDBFolder::type_e type = IDBFolder::eTypeProject;
+    QString name;
+    CSetupFolder dlg(type, name, this);
+    if(dlg.exec() != QDialog::Accepted)
+    {
+        return;
+    }
+
+    QSqlQuery query(db);
+    query.prepare("INSERT INTO folders (name, type) VALUES (:name, :type)");
+    query.bindValue(":name", name);
+    query.bindValue(":type", type);
+    QUERY_EXEC(return);
+
+    query.prepare("SELECT last_insert_rowid() from folders");
+    QUERY_EXEC(return);
+    query.next();
+    quint64 idChild = query.value(0).toULongLong();
+    if(idChild == 0)
+    {
+        qDebug() << "CGisListDB::slotAddFolder(): childId equals 0. bad.";
+        return;
+    }
+
+    query.prepare("INSERT INTO folder2folder (parent, child) VALUES (:parent, :child)");
+    query.bindValue(":parent", idParent);
+    query.bindValue(":child", idChild);
+    QUERY_EXEC(return);
+
+    IDBFolder * childFolder = IDBFolder::createFolderByType(type, idChild, parentFolder);
+}
+
+void CGisListDB::slotItemExpanded(QTreeWidgetItem * item)
+{
+    IDBFolder * folder = dynamic_cast<IDBFolder*>(item);
+    if(folder == 0)
+    {
+        return;
+    }
+
+    folder->expanding();
+}
+
+void CGisListDB::addFolder(IDBFolder::type_e type, quint64 key, IDBFolder *parent)
+{
+    QList<QTreeWidgetItem*> items = findItems("*", Qt::MatchWildcard|Qt::MatchRecursive, 0);
+
+    foreach(QTreeWidgetItem * item, items)
+    {
+        IDBFolder * folder = dynamic_cast<IDBFolder*>(item);
+        if(folder == 0)
+        {
+            continue;
+        }
+    }
+}
diff --git a/src/gis/CGisListDB.h b/src/gis/CGisListDB.h
index e6a3fdf..9afa907 100644
--- a/src/gis/CGisListDB.h
+++ b/src/gis/CGisListDB.h
@@ -20,12 +20,45 @@
 #define CGISLISTDB_H
 
 #include <QTreeWidget>
+#include <QSqlDatabase>
+
+#include <gis/db/IDBFolder.h>
+
+class QMenu;
+class CDBFolderDatabase;
+class CDBFolderLostFound;
 
 class CGisListDB : public QTreeWidget
 {
+    Q_OBJECT
     public:
         CGisListDB(QWidget * parent);
         virtual ~CGisListDB();
+
+
+    private slots:
+        void slotContextMenu(const QPoint& point);
+        void slotAddFolder();
+
+        void slotItemExpanded(QTreeWidgetItem * item);
+
+    private:
+        void initDB();
+        void migrateDB(int version);
+
+        void addFolder(IDBFolder::type_e type, quint64 key, IDBFolder *parent);
+
+
+        QSqlDatabase db;
+
+        QMenu * menuDatabase;
+        QAction * actionAddFolder;
+
+        QMenu * menuProject;
+        QMenu * menuItem;
+
+        CDBFolderLostFound * itemLostFound;
+        CDBFolderDatabase * itemDatabase;
 };
 
 #endif //CGISLISTDB_H
diff --git a/src/gis/CGisListWks.cpp b/src/gis/CGisListWks.cpp
index c9fb4cc..37fa44c 100644
--- a/src/gis/CGisListWks.cpp
+++ b/src/gis/CGisListWks.cpp
@@ -16,30 +16,36 @@
 
 **********************************************************************************************/
 
+#include "CMainWindow.h"
 #include "gis/CGisListWks.h"
-#include "gis/IGisProject.h"
-#include "gis/IGisItem.h"
 #include "gis/CGisWidget.h"
+#include "gis/IGisItem.h"
+#include "gis/IGisProject.h"
+#include "gis/db/macros.h"
 #include "gis/gpx/CGpxProject.h"
-#include "gis/bin/CBinProject.h"
-#include "gis/wpt/CGisItemWpt.h"
-#include "gis/trk/CGisItemTrk.h"
-#include "gis/rte/CGisItemRte.h"
 #include "gis/ovl/CGisItemOvlArea.h"
+#include "gis/qms/CQmsProject.h"
+#include "gis/rte/CGisItemRte.h"
 #include "gis/search/CSearchGoogle.h"
+#include "gis/trk/CGisItemTrk.h"
+#include "gis/wpt/CGisItemWpt.h"
 #include "helpers/CSelectProjectDialog.h"
-#include "CMainWindow.h"
+#include "helpers/CSettings.h"
 
+#include <QtSql>
 #include <QtWidgets>
 
 CGisListWks::CGisListWks(QWidget *parent)
     : QTreeWidget(parent)
     , menuNone(0)
+    , saveOnExit(true)
+    , saveEvery(5)
 {
+    db = QSqlDatabase::database();
 
     menuProject     = new QMenu(this);
     actionSaveAs    = menuProject->addAction(QIcon("://icons/32x32/SaveGISAs.png"),tr("Save As..."), this, SLOT(slotSaveAsProject()));
-    actionSave      = menuProject->addAction(QIcon("://icons/32x32/SaveGIS.png"),tr("Save"), this, SLOT(slotSaveProject()));    
+    actionSave      = menuProject->addAction(QIcon("://icons/32x32/SaveGIS.png"),tr("Save"), this, SLOT(slotSaveProject()));
     actionClose     = menuProject->addAction(QIcon("://icons/32x32/Close.png"),tr("Close"), this, SLOT(slotCloseProject()));
 
     connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));
@@ -57,12 +63,24 @@ CGisListWks::CGisListWks(QWidget *parent)
     actionEditArea   = menuItem->addAction(QIcon("://icons/32x32/AreaMove.png"),tr("Edit Area Points"), this, SLOT(slotEditArea()));
     actionFocusTrk->setCheckable(true);
     connect(actionFocusTrk, SIGNAL(triggered(bool)), this, SLOT(slotFocusTrk(bool)));
-    actionDelete    = menuItem->addAction(QIcon("://icons/32x32/DeleteOne.png"),tr("Delete"), this, SLOT(slotDeleteItem()));    
+    actionDelete    = menuItem->addAction(QIcon("://icons/32x32/DeleteOne.png"),tr("Delete"), this, SLOT(slotDeleteItem()));
+
+    connect(qApp, SIGNAL(aboutToQuit ()), this, SLOT(slotSaveWorkspace()));
+
+    SETTINGS;
+    saveOnExit  = cfg.value("Database/saveOnExit", saveOnExit).toBool();
+    saveEvery   = cfg.value("Database/saveEvery", saveEvery).toInt();
+
+    if(saveOnExit && (saveEvery > 0))
+    {
+        QTimer::singleShot(saveEvery * 60000, this, SLOT(slotSaveWorkspace()));
+    }
+
+    slotLoadWorkspace();
 }
 
 CGisListWks::~CGisListWks()
 {
-
 }
 
 void CGisListWks::setExternalMenu(QMenu * project)
@@ -84,7 +102,7 @@ void CGisListWks::dragMoveEvent (QDragMoveEvent  * e )
         2.1) different parent -> copy
         3) go on with dragMoveEvent();
 
-    */
+     */
 
     CGisItemTrk * trk1 = dynamic_cast<CGisItemTrk*>(currentItem());
     CGisItemTrk * trk2 = dynamic_cast<CGisItemTrk*>(itemAt(e->pos()));
@@ -135,7 +153,6 @@ void CGisListWks::dragMoveEvent (QDragMoveEvent  * e )
         }
         QTreeWidget::dragMoveEvent(e);
         return;
-
     }
 
     CGisItemOvlArea * area1 = dynamic_cast<CGisItemOvlArea*>(currentItem());
@@ -153,7 +170,6 @@ void CGisListWks::dragMoveEvent (QDragMoveEvent  * e )
         }
         QTreeWidget::dragMoveEvent(e);
         return;
-
     }
 
     IGisProject * proj = dynamic_cast<IGisProject*>(itemAt(e->pos()));
@@ -170,6 +186,51 @@ void CGisListWks::dragMoveEvent (QDragMoveEvent  * e )
 
 void CGisListWks::dropEvent ( QDropEvent  * e )
 {
+    // block out items with same key (duplicats)
+    IGisItem * item1 = dynamic_cast<IGisItem*>(currentItem());
+    IGisItem * item2 = dynamic_cast<IGisItem*>(itemAt(e->pos()));
+    if(item1 && item2)
+    {
+        // if it is a drop on an item and the other item is in another project
+        if(item1->parent() != item2->parent())
+        {
+            // iterate over all items of the target project and check keys
+            QTreeWidgetItem * parent = item2->parent();
+            for(int i = 0; i < parent->childCount(); i++)
+            {
+                IGisItem * item = dynamic_cast<IGisItem*>(parent->child(i));
+                if(item)
+                {
+                    if(item->getKey() == item1->getKey())
+                    {
+                        return;
+                    }
+                }
+            }
+        }
+    }
+    else
+    {
+        // if it is a drop on a project the project is different from the source item's project
+        IGisProject * parent = dynamic_cast<IGisProject*>(itemAt(e->pos()));
+        if(parent && item1 && item1->parent() != parent)
+        {
+            // iterate over all items of the target project and check keys
+            for(int i = 0; i < parent->childCount(); i++)
+            {
+                IGisItem * item = dynamic_cast<IGisItem*>(parent->child(i));
+                if(item)
+                {
+                    if(item->getKey() == item1->getKey())
+                    {
+                        return;
+                    }
+                }
+            }
+        }
+    }
+
+    // go on with item insertion
 
     /*
         What's happening here?
@@ -184,7 +245,7 @@ void CGisListWks::dropEvent ( QDropEvent  * e )
         5) Test if item under cursor is a project
         6) If project and project is not item's project create a copy
 
-    */
+     */
 
     // calc. index offset (below/above item)
     QRect r = visualItemRect(itemAt(e->pos()));
@@ -296,29 +357,135 @@ void CGisListWks::dropEvent ( QDropEvent  * e )
         {
             new CGisItemOvlArea(*area1, project, -1);
         }
-
     }
-
 }
 
 
-bool CGisListWks::hasProject(const QString& key)
+bool CGisListWks::hasProject(IGisProject * project)
 {
     QMutexLocker lock(&IGisItem::mutexItems);
+
+    QString key = project->getKey();
+
     for(int i = 0; i < topLevelItemCount(); i++)
     {
         IGisProject * item = dynamic_cast<IGisProject*>(topLevelItem(i));
         if(item && item->getKey() == key)
         {
-            return true;
+            if(item != project)
+            {
+                return(true);
+            }
         }
     }
-    return false;
+    return(false);
 }
 
-void CGisListWks::slotContextMenu(const QPoint& point)
+void CGisListWks::slotSaveWorkspace()
 {
+    if(!saveOnExit)
+    {
+        return;
+    }
 
+    QSqlQuery query(db);
+    if(!query.exec("DELETE FROM workspace"))
+    {
+        QUERY_EXEC(return );
+    }
+
+    qDebug() << "slotSaveWorkspace()";
+
+    const int total = topLevelItemCount();
+    PROGRESS_SETUP(tr("Saving workspace. Please wait."), total);
+
+    for(int i = 0; i < total; i++)
+    {
+        PROGRESS(i, return );
+
+        IGisProject * project = dynamic_cast<IGisProject*>(topLevelItem(i));
+        if(project == 0)
+        {
+            continue;
+        }
+
+        QByteArray data;
+        QDataStream stream(&data, QIODevice::WriteOnly);
+        stream.setVersion(QDataStream::Qt_5_2);
+        stream.setByteOrder(QDataStream::LittleEndian);
+
+        *project >> stream;
+
+        query.prepare("INSERT INTO workspace (type, key, name, changed, data) VALUES (:type, :key, :name, :changed, :data)");
+        query.bindValue(":type", project->getType());
+        query.bindValue(":key", project->getKey());
+        query.bindValue(":name", project->text(0));
+        query.bindValue(":changed", project->text(1) == "*");
+        query.bindValue(":data", data);
+        QUERY_EXEC(continue);
+    }
+
+    if(saveEvery)
+    {
+        QTimer::singleShot(saveEvery * 60000, this, SLOT(slotSaveWorkspace()));
+    }
+}
+
+void CGisListWks::slotLoadWorkspace()
+{
+    QSqlQuery query(db);
+
+    query.prepare("SELECT type, key, name, changed, data FROM workspace");
+    QUERY_EXEC(return );
+
+    PROGRESS_SETUP(tr("Loading workspace. Please wait."), query.size());
+    quint32 progCnt = 0;
+
+    while(query.next())
+    {
+        PROGRESS(progCnt++, return );
+
+
+        int type       = query.value(0).toInt();
+//        QString key     = query.value(1).toString();
+        QString name    = query.value(2).toString();
+        bool changed    = query.value(3).toBool();
+        QByteArray data = query.value(4).toByteArray();
+
+        QDataStream stream(&data, QIODevice::ReadOnly);
+        stream.setVersion(QDataStream::Qt_5_2);
+        stream.setByteOrder(QDataStream::LittleEndian);
+
+        IGisProject * project = 0;
+        switch(type)
+        {
+        case IGisProject::eTypeQms:
+        {
+            project = new CQmsProject(name,this);
+            *project << stream;
+            break;
+        }
+
+        case IGisProject::eTypeGpx:
+        {
+            project = new CGpxProject(name,this);
+            *project << stream;
+            break;
+        }
+        }
+
+        if(project == 0)
+        {
+            continue;
+        }
+
+        project->setToolTip(0,project->getInfo());
+        project->setText(1, changed ? "*" : "");
+    }
+}
+
+void CGisListWks::slotContextMenu(const QPoint& point)
+{
     if(selectedItems().isEmpty() && menuNone)
     {
         QPoint p = mapToGlobal(point);
@@ -370,7 +537,7 @@ void CGisListWks::slotContextMenu(const QPoint& point)
             actionCombineTrk->setVisible(true);
             actionRangeTrk->setVisible(true);
             actionFocusTrk->setChecked(trk->hasUserFocus());
-            actionEditTrk->setEnabled(!trk->isReadOnly());            
+            actionEditTrk->setEnabled(!trk->isReadOnly());
         }
 
         // try to cast item to track and hide/show actions on result
@@ -437,7 +604,6 @@ void CGisListWks::slotSaveAsProject()
         }
     }
     IGisItem::mutexItems.unlock();
-
 }
 
 void CGisListWks::slotItemDoubleClicked(QTreeWidgetItem * item, int )
@@ -448,7 +614,7 @@ void CGisListWks::slotItemDoubleClicked(QTreeWidgetItem * item, int )
     {
         CMainWindow::self().zoomCanvasTo(gisItem->getBoundingRect());
         CGisWidget::self().focusTrkByKey(true, gisItem->getKey());
-    }    
+    }
     IGisItem::mutexItems.unlock();
 }
 
@@ -594,7 +760,7 @@ void CGisListWks::slotAddEmptyProject()
     }
     else if(type == CSelectProjectDialog::eTypeQms)
     {
-        new CBinProject(name, this);
+        new CQmsProject(name, this);
     }
 }
 
diff --git a/src/gis/CGisListWks.h b/src/gis/CGisListWks.h
index c79d528..9ee83e3 100644
--- a/src/gis/CGisListWks.h
+++ b/src/gis/CGisListWks.h
@@ -21,9 +21,11 @@
 
 #include <QTreeWidget>
 #include <QPointer>
+#include <QSqlDatabase>
 
 class QAction;
 class CSearchGoogle;
+class IGisProject;
 
 class CGisListWks : public QTreeWidget
 {
@@ -33,9 +35,7 @@ class CGisListWks : public QTreeWidget
         virtual ~CGisListWks();
 
         void setExternalMenu(QMenu * project);
-
-        bool hasProject(const QString& key);        
-
+        bool hasProject(IGisProject *project);
     signals:
         void sigChanged();
 
@@ -44,6 +44,8 @@ class CGisListWks : public QTreeWidget
         void dropEvent ( QDropEvent  * e );
 
     private slots:
+        void slotSaveWorkspace();
+        void slotLoadWorkspace();
         void slotContextMenu(const QPoint& point);
         void slotSaveProject();
         void slotSaveAsProject();
@@ -65,6 +67,8 @@ class CGisListWks : public QTreeWidget
 
 
     private:                
+        QSqlDatabase db;
+
         QMenu * menuProject;
         QAction  * actionSave;
         QAction  * actionSaveAs;
@@ -85,6 +89,10 @@ class CGisListWks : public QTreeWidget
         QMenu * menuNone;
 
         QPointer<CSearchGoogle> searchGoogle;
+
+        bool saveOnExit;
+        qint32 saveEvery;
+
 };
 
 #endif //CGISLISTWKS_H
diff --git a/src/gis/CGisWidget.cpp b/src/gis/CGisWidget.cpp
index e7e69f2..275d47d 100644
--- a/src/gis/CGisWidget.cpp
+++ b/src/gis/CGisWidget.cpp
@@ -16,19 +16,19 @@
 
 **********************************************************************************************/
 
+#include "CMainWindow.h"
+#include "gis/CGisDraw.h"
 #include "gis/CGisWidget.h"
-#include "gis/IGisProject.h"
 #include "gis/IGisItem.h"
-#include "gis/CGisDraw.h"
+#include "gis/IGisProject.h"
 #include "gis/gpx/CGpxProject.h"
-#include "gis/bin/CBinProject.h"
+#include "gis/ovl/CGisItemOvlArea.h"
+#include "gis/qms/CQmsProject.h"
+#include "gis/trk/CGisItemTrk.h"
 #include "gis/wpt/CGisItemWpt.h"
 #include "gis/wpt/CProjWpt.h"
-#include "gis/trk/CGisItemTrk.h"
-#include "gis/ovl/CGisItemOvlArea.h"
-#include "CMainWindow.h"
-#include "helpers/CSettings.h"
 #include "helpers/CSelectProjectDialog.h"
+#include "helpers/CSettings.h"
 
 #include <QtWidgets>
 #include <QtXml>
@@ -44,7 +44,8 @@ CGisWidget::CGisWidget(QMenu *menuProject, QWidget *parent)
     treeWks->setExternalMenu(menuProject);
 
     SETTINGS;
-    treeWks->header()->resizeSection(0, cfg.value("Workspace/treeWks/colum0/size", 100).toInt());
+    treeWks->header()->restoreState(cfg.value("Workspace/treeWks/state", treeWks->header()->saveState()).toByteArray());
+    treeDB->header()->restoreState(cfg.value("Workspace/treeDB/state", treeDB->header()->saveState()).toByteArray());
 
     connect(treeWks, SIGNAL(sigChanged()), SIGNAL(sigChanged()));
 }
@@ -52,26 +53,12 @@ CGisWidget::CGisWidget(QMenu *menuProject, QWidget *parent)
 CGisWidget::~CGisWidget()
 {
     SETTINGS;
-    cfg.setValue("Workspace/treeWks/colum0/size", treeWks->header()->sectionSize(0));
+    cfg.setValue("Workspace/treeWks/state", treeWks->header()->saveState());
+    cfg.setValue("Workspace/treeDB/state", treeDB->header()->saveState());
 }
 
 void CGisWidget::loadGisProject(const QString& filename)
 {
-    // cerate file instance
-    QFile file(filename);
-    file.open(QIODevice::ReadOnly);
-
-    // create md5 hash
-    QCryptographicHash md5(QCryptographicHash::Md5);
-    md5.addData(file.readAll());
-    file.close();
-    QString key = md5.result().toHex();
-
-    // skip if project is already loaded
-    if(treeWks->hasProject(key))
-    {
-        return;
-    }
 
     // add project to workspace
     QApplication::setOverrideCursor(Qt::WaitCursor);
@@ -80,18 +67,25 @@ void CGisWidget::loadGisProject(const QString& filename)
     QString suffix = QFileInfo(filename).suffix().toLower();
     if(suffix == "gpx")
     {
-        item = new CGpxProject(filename, key, treeWks);
+        item = new CGpxProject(filename, treeWks);
     }
     else if(suffix == "qms")
     {
-        item = new CBinProject(filename, key, treeWks);
+        item = new CQmsProject(filename, treeWks);
     }
 
     if(item && !item->isValid())
     {
         delete item;
     }
-    IGisItem::mutexItems.unlock();    
+
+    // skip if project is already loaded
+    if(item && treeWks->hasProject(item))
+    {
+        delete item;
+    }
+
+    IGisItem::mutexItems.unlock();
     QApplication::restoreOverrideCursor();
 
     emit sigChanged();
@@ -150,13 +144,13 @@ IGisProject * CGisWidget::selectProject()
         }
         else if (type == CSelectProjectDialog::eTypeQms)
         {
-            project = new CBinProject(name, treeWks);
+            project = new CQmsProject(name, treeWks);
         }
 
         IGisItem::mutexItems.unlock();
     }
 
-    return project;
+    return(project);
 }
 
 void CGisWidget::getItemsByPos(const QPointF& pos, QList<IGisItem*>& items)
@@ -192,7 +186,7 @@ IGisItem * CGisWidget::getItemByKey(const QString& key)
         }
     }
     IGisItem::mutexItems.unlock();
-    return item;
+    return(item);
 }
 
 void CGisWidget::delItemByKey(const QString& key)
@@ -297,7 +291,6 @@ void CGisWidget::reverseTrkByKey(const QString& key)
     }
     IGisItem::mutexItems.unlock();
     emit sigChanged();
-
 }
 
 void CGisWidget::combineTrkByKey(const QString& key)
@@ -311,7 +304,6 @@ void CGisWidget::combineTrkByKey(const QString& key)
     }
     IGisItem::mutexItems.unlock();
     emit sigChanged();
-
 }
 
 void CGisWidget::editTrkByKey(const QString& key)
@@ -391,7 +383,7 @@ void CGisWidget::draw(QPainter& p, const QRectF& viewport, CGisDraw * gis)
     // reset seen keys as lables will build the list a second time
     seenKeys.clear();
 
-    // draw optional labels second    
+    // draw optional labels second
     for(int i = 0; i < treeWks->topLevelItemCount(); i++)
     {
         if(gis->needsRedraw())
@@ -414,7 +406,7 @@ void CGisWidget::fastDraw(QPainter& p, const QRectF& viewport, CGisDraw *gis)
     /*
         Mutex locking will make map moving very slow if there are many GIS items
         visible. Remove it for now. But I am not sure if that is a good idea.
-    */
+     */
     //IGisItem::mutexItems.lock();
     for(int i = 0; i < treeWks->topLevelItemCount(); i++)
     {
diff --git a/src/gis/IGisItem.cpp b/src/gis/IGisItem.cpp
index 2a15a72..7865aaa 100644
--- a/src/gis/IGisItem.cpp
+++ b/src/gis/IGisItem.cpp
@@ -139,17 +139,54 @@ IGisItem::~IGisItem()
 
 }
 
-void IGisItem::changed(const QString &what, const QString &icon)
+void IGisItem::genKey()
+{
+    if(key.isEmpty())
+    {
+        QByteArray buffer;
+        QDataStream stream(&buffer, QIODevice::WriteOnly);
+        stream.setByteOrder(QDataStream::LittleEndian);
+        stream.setVersion(QDataStream::Qt_5_2);
+
+        *this >> stream;
+
+        QCryptographicHash md5(QCryptographicHash::Md5);
+        md5.addData(buffer);
+        key = md5.result().toHex();
+    }
+}
+
+void IGisItem::updateDecoration(mark_e enable, mark_e disable)
 {
-    setText(1,"*");
+    // update text and icon
     setToolTip(0,getInfo());
+    setText(0, getName());
+    setSymbol();
 
+    // update project if necessary
     IGisProject * project = dynamic_cast<IGisProject*>(parent());
-    if(project)
+    if(project && (enable & eMarkChanged))
     {
         project->setText(1,"*");
     }
 
+    // set marks in column 1
+    quint32 mask = data(1,Qt::UserRole).toUInt();
+    mask |=  enable;
+    mask &= ~disable;
+    setData(1, Qt::UserRole, mask);
+
+    QString str;
+    if(mask & eMarkChanged)
+    {
+        str += "*";
+    }
+    setText(1, str);
+}
+
+
+void IGisItem::changed(const QString &what, const QString &icon)
+{    
     /*
         If item gets changed but if it's origin is not QMapShack
         then it is assumed to be tainted, as imported data should
@@ -179,7 +216,13 @@ void IGisItem::changed(const QString &what, const QString &icon)
 
     *this >> stream;
 
+    QCryptographicHash md5(QCryptographicHash::Md5);
+    md5.addData(event.data);
+    event.hash = md5.result().toHex();
+
     history.histIdxCurrent = history.events.size() - 1;
+
+    updateDecoration(eMarkChanged, eMarkNone);
 }
 
 void IGisItem::setupHistory()
@@ -194,7 +237,7 @@ void IGisItem::setupHistory()
         history_event_t& event = history.events.last();
         event.time      = QDateTime::currentDateTimeUtc();
         event.comment   = QObject::tr("Initial version.");
-        event.icon      = "://icons/48x48/Start.png";
+        event.icon      = "://icons/48x48/Start.png";        
     }
 
     // search for the first item with data
@@ -218,6 +261,10 @@ void IGisItem::setupHistory()
         stream.setVersion(QDataStream::Qt_5_2);
         *this >> stream;
 
+        QCryptographicHash md5(QCryptographicHash::Md5);
+        md5.addData(event.data);
+        event.hash = md5.result().toHex();
+
         history.histIdxInitial = history.events.size() - 1;
     }
 
@@ -447,3 +494,54 @@ QString IGisItem::removeHtml(const QString &str)
     html.setHtml(str);
     return html.toPlainText();
 }
+
+
+QString IGisItem::toLink(bool isReadOnly, const QString& href, const QString& str)
+{
+    if(isReadOnly)
+    {
+        return QString("%1").arg(str);
+    }
+
+    return QString("<a href='%1'>%2</a>").arg(href).arg(str);
+}
+
+QString IGisItem::createText(bool isReadOnly, const QString& cmt, const QString& desc, const QList<link_t>& links)
+{
+    QString str;
+
+    str += toLink(isReadOnly, "comment", QObject::tr("<h4>Comment:</h4>"));
+    if(removeHtml(cmt).simplified().isEmpty())
+    {
+        str += QObject::tr("<p>--- no comment ---</p>");
+    }
+    else
+    {
+        str += cmt;
+    }
+
+    str += toLink(isReadOnly, "description", QObject::tr("<h4>Description:</h4>"));
+    if(removeHtml(desc).simplified().isEmpty())
+    {
+        str += QObject::tr("<p>--- no description ---</p>");
+    }
+    else
+    {
+        str += desc;
+    }
+
+    str += toLink(isReadOnly, "links", QObject::tr("<h4>Links:</h4>"));
+    if(links.isEmpty())
+    {
+        str += QObject::tr("<p>--- no links ---</p>");
+    }
+    else
+    {
+        foreach(const link_t& link, links)
+        {
+            str += QString("<p><a href='%1'>%2</a></p>").arg(link.uri.toString()).arg(link.text);
+        }
+    }
+
+    return str;
+}
diff --git a/src/gis/IGisItem.h b/src/gis/IGisItem.h
index ffe6951..f88b0b7 100644
--- a/src/gis/IGisItem.h
+++ b/src/gis/IGisItem.h
@@ -44,6 +44,7 @@ class IGisItem : public QTreeWidgetItem
         struct history_event_t
         {
             QDateTime time;
+            QString   hash;
             QString   icon;
             QString   comment;
             QByteArray data;
@@ -106,12 +107,20 @@ class IGisItem : public QTreeWidgetItem
 
         enum type_e
         {
-              eTypeTrk
-            , eTypeRte
-            , eTypeWpt
-            , eTypeOvl
+              eTypeWpt = 1
+            , eTypeTrk = 2
+            , eTypeRte = 3
+            , eTypeOvl = 4
+            , eTypeMax = 5
         };
 
+        enum mark_e
+        {
+             eMarkNone      = 0
+            ,eMarkChanged   = 0x00000001
+        };
+
+
         IGisItem(QTreeWidgetItem * parent, type_e typ, int idx);
         virtual ~IGisItem();
 
@@ -119,6 +128,13 @@ class IGisItem : public QTreeWidgetItem
         static QMutex mutexItems;
 
         /**
+           @brief Update the visual representation of the QTreeWidgetItem
+           @param enable
+           @param disable
+         */
+        virtual void updateDecoration(mark_e enable, mark_e disable);
+
+        /**
            @brief Save the item's data into a GPX structure
            @param gpx       the files <gpx> tag to attach the data to
          */
@@ -249,16 +265,20 @@ class IGisItem : public QTreeWidgetItem
         void cutHistory();
 
         static QString removeHtml(const QString &str);
+        static QString createText(bool isReadOnly, const QString& cmt, const QString& desc, const QList<link_t>& links);
+        static QString toLink(bool isReadOnly, const QString& href, const QString& str);
 
     protected:
         struct color_t;
 
+        /// set icon of QTreeWidgetItem
+        virtual void setSymbol() = 0;
         /// read waypoint data from an XML snippet
         void readWpt(const QDomNode& xml, wpt_t &wpt);
         /// write waypoint data to an XML snippet
         void writeWpt(QDomElement &xml, const wpt_t &wpt);
         /// gnerate a unique key from item's data
-        virtual void genKey() = 0;
+        virtual void genKey();
         /// setup the history structure right after the creation of the item
         void setupHistory();
         /// convert a color string from GPX to a QT color
@@ -274,6 +294,7 @@ class IGisItem : public QTreeWidgetItem
 
         quint32 flags;
         QString key;
+        QString hash;
         QPixmap icon;
         QRectF boundingRect;
 
diff --git a/src/gis/IGisProject.cpp b/src/gis/IGisProject.cpp
index bc197ba..efd3d79 100644
--- a/src/gis/IGisProject.cpp
+++ b/src/gis/IGisProject.cpp
@@ -24,22 +24,48 @@
 #include <QtWidgets>
 
 
-IGisProject::IGisProject(const QString& key, const QString &filename, CGisListWks *parent)
+IGisProject::IGisProject(type_e type, const QString &filename, CGisListWks *parent)
     : QTreeWidgetItem(parent)
-    , key(key)
+    , type(type)
     , filename(filename)
     , valid(false)
 {
+
+}
+
+IGisProject::~IGisProject()
+{
+
+}
+
+void IGisProject::genKey()
+{
     if(key.isEmpty())
     {
+        QByteArray buffer;
+        QDataStream stream(&buffer, QIODevice::WriteOnly);
+        stream.setByteOrder(QDataStream::LittleEndian);
+        stream.setVersion(QDataStream::Qt_5_2);
+
+        *this >> stream;
+
         QCryptographicHash md5(QCryptographicHash::Md5);
-        md5.addData((char*)this, sizeof(*this));
-        this->key = md5.result().toHex();
+        md5.addData(buffer);
+        key = md5.result().toHex();
     }
 }
 
-IGisProject::~IGisProject()
+void IGisProject::setupName(const QString &defaultName)
 {
+    if(metadata.name.isEmpty())
+    {
+        setText(0, defaultName);
+        metadata.name = defaultName;
+    }
+    else
+    {
+        setText(0,metadata.name);
+    }
 
 }
 
@@ -54,7 +80,7 @@ void IGisProject::markAsSaved()
         {
             continue;
         }
-        item->setText(1,"");
+        item->updateDecoration(IGisItem::eMarkNone, IGisItem::eMarkChanged);
     }
 }
 
@@ -83,6 +109,36 @@ QString IGisProject::getInfo()
         }
     }
 
+    str += QObject::tr("\nFilename: %1").arg(filename);
+
+    // count number of items by type
+    int counter[IGisItem::eTypeMax] = {0};
+    for(int i = 0; i < childCount(); i++)
+    {
+        IGisItem * item = dynamic_cast<IGisItem*>(child(i));
+        if(item == 0)
+        {
+            continue;
+        }
+
+        counter[item->type()]++;
+    }
+    if(counter[IGisItem::eTypeWpt])
+    {
+        str += "\n" + QObject::tr("Waypoints: %1").arg(counter[IGisItem::eTypeWpt]);
+    }
+    if(counter[IGisItem::eTypeTrk])
+    {
+        str += "\n" + QObject::tr("Tracks: %1").arg(counter[IGisItem::eTypeTrk]);
+    }
+    if(counter[IGisItem::eTypeRte])
+    {
+        str += "\n" + QObject::tr("Routes: %1").arg(counter[IGisItem::eTypeRte]);
+    }
+    if(counter[IGisItem::eTypeOvl])
+    {
+        str += "\n" + QObject::tr("Areas: %1").arg(counter[IGisItem::eTypeOvl]);
+    }
 
     return str;
 }
diff --git a/src/gis/IGisProject.h b/src/gis/IGisProject.h
index cc82cd2..de68e04 100644
--- a/src/gis/IGisProject.h
+++ b/src/gis/IGisProject.h
@@ -31,7 +31,45 @@ class QDataStream;
 class IGisProject : public QTreeWidgetItem
 {
     public:
-        IGisProject(const QString &key, const QString& filename, CGisListWks * parent);
+        enum type_e
+        {
+              eTypeGoogle
+            , eTypeQms
+            , eTypeGpx
+            , eTypeDb
+        };
+
+        struct person_t
+        {
+            QString name;
+            QString id;
+            QString domain;
+            IGisItem::link_t link;
+        };
+
+        struct copyright_t
+        {
+            QString author;
+            QString year;
+            QString license;
+        };
+
+        struct metadata_t
+        {
+            QString name;
+            QString desc;
+            person_t author;
+            copyright_t copyright;
+            QList<IGisItem::link_t> links;
+            QDateTime time;
+            QString keywords;
+            QRectF bounds;
+            // -- all gpx tags - stop
+            QMap<QString, QVariant> extensions;
+
+        };
+
+        IGisProject(type_e type, const QString& filename, CGisListWks * parent);
         virtual ~IGisProject();
 
         virtual void save() = 0;
@@ -40,15 +78,20 @@ class IGisProject : public QTreeWidgetItem
         virtual void setFilename(const QString& fn){filename = fn;}
         virtual QString getFilename(){return filename;}
 
-        virtual QString getInfo();
+        type_e getType(){return type;}
 
         /**
            @brief Get unique project key.
            @return A MD5 hash string
          */
-        const QString& getKey(){return key;}
+        const QString& getKey(){genKey(); return key;}
 
         /**
+           @brief Get a short metadata summary
+           @return Informational string.
+         */
+        virtual QString getInfo();
+        /**
            @brief Get a temporary pointer to the item with matching key
            @param key
            @return If no item is found 0 is returned.
@@ -65,7 +108,6 @@ class IGisProject : public QTreeWidgetItem
         */
         void getItemByPos(const QPointF& pos, QList<IGisItem*>& items);
 
-
         /**
            @brief Delete items with matching key
            @param key
@@ -88,8 +130,6 @@ class IGisProject : public QTreeWidgetItem
          */
         bool  isValid(){return valid;}
 
-
-
         void drawItem(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, QSet<QString> &seenKeys, CGisDraw * gis);
         void drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, QSet<QString> &seenKeys, const QFontMetricsF& fm, CGisDraw * gis);
         void drawItem(QPainter& p, const QRectF& viewport, CGisDraw * gis);
@@ -103,6 +143,7 @@ class IGisProject : public QTreeWidgetItem
            @return The stream object.
         */
         virtual QDataStream& operator<<(QDataStream& stream);
+
         /**
            @brief Serialize object into a QDataStream
 
@@ -113,38 +154,16 @@ class IGisProject : public QTreeWidgetItem
         */
         virtual QDataStream& operator>>(QDataStream& stream);
 
-        struct person_t
-        {
-            QString name;
-            QString id;
-            QString domain;
-            IGisItem::link_t link;
-        };
-
-        struct copyright_t
-        {
-            QString author;
-            QString year;
-            QString license;
-        };
-
-        struct metadata_t
-        {
-            QString name;
-            QString desc;
-            person_t author;
-            copyright_t copyright;
-            QList<IGisItem::link_t> links;
-            QDateTime time;
-            QString keywords;
-            QRectF bounds;
-            // -- all gpx tags - stop
-            QMap<QString, QVariant> extensions;
-
-        };
-
+        /**
+           @brief writeMetadata
+           @param doc
+           @return
+         */
         QDomNode writeMetadata(QDomDocument& doc);
+
     protected:
+        void genKey();
+        void setupName(const QString& defaultName);
         void markAsSaved();
         void readMetadata(const QDomNode& xml, metadata_t& metadata);
 
@@ -159,18 +178,13 @@ class IGisProject : public QTreeWidgetItem
         static const QString gpx_ns;
         static const QString xsi_ns;
 
-
-
+        type_e type;
         QString key;
         QString filename;
         bool valid;
 
-
         metadata_t metadata;
 
-
-
-
 };
 
 #endif //IGISPROJECT_H
diff --git a/src/gis/IGisWidget.ui b/src/gis/IGisWidget.ui
index a43427f..fcb1742 100644
--- a/src/gis/IGisWidget.ui
+++ b/src/gis/IGisWidget.ui
@@ -45,10 +45,13 @@
      </property>
      <property name="iconSize">
       <size>
-       <width>22</width>
-       <height>22</height>
+       <width>20</width>
+       <height>20</height>
       </size>
      </property>
+     <property name="indentation">
+      <number>14</number>
+     </property>
      <column>
       <property name="text">
        <string notr="true">Name</string>
@@ -68,16 +71,21 @@
      </property>
      <property name="iconSize">
       <size>
-       <width>22</width>
-       <height>22</height>
+       <width>20</width>
+       <height>20</height>
       </size>
      </property>
-     <attribute name="headerVisible">
-      <bool>false</bool>
-     </attribute>
+     <property name="indentation">
+      <number>14</number>
+     </property>
+     <column>
+      <property name="text">
+       <string notr="true">-</string>
+      </property>
+     </column>
      <column>
       <property name="text">
-       <string notr="true">1</string>
+       <string>Name</string>
       </property>
      </column>
     </widget>
diff --git a/src/gis/CGisListDB.cpp b/src/gis/db/CDBFolderDatabase.cpp
similarity index 72%
copy from src/gis/CGisListDB.cpp
copy to src/gis/db/CDBFolderDatabase.cpp
index 4d2b2cf..d3d5cf4 100644
--- a/src/gis/CGisListDB.cpp
+++ b/src/gis/db/CDBFolderDatabase.cpp
@@ -16,17 +16,17 @@
 
 **********************************************************************************************/
 
-#include "CGisListDB.h"
+#include "gis/db/CDBFolderDatabase.h"
 
-#include <QtWidgets>
-
-CGisListDB::CGisListDB(QWidget *parent)
-    : QTreeWidget(parent)
+CDBFolderDatabase::CDBFolderDatabase(QTreeWidget *parent)
+    : IDBFolder(eTypeDatabase, 1, parent)
 {
-
+    setToolTip(1, QObject::tr("All your data grouped by folders."));
+    setIcon(0, QIcon("://icons/32x32/Database.png"));
+    setText(1, QObject::tr("Database"));
 }
 
-CGisListDB::~CGisListDB()
+CDBFolderDatabase::~CDBFolderDatabase()
 {
 
 }
diff --git a/src/gis/CGisListDB.h b/src/gis/db/CDBFolderDatabase.h
similarity index 79%
copy from src/gis/CGisListDB.h
copy to src/gis/db/CDBFolderDatabase.h
index e6a3fdf..f49ac23 100644
--- a/src/gis/CGisListDB.h
+++ b/src/gis/db/CDBFolderDatabase.h
@@ -16,17 +16,17 @@
 
 **********************************************************************************************/
 
-#ifndef CGISLISTDB_H
-#define CGISLISTDB_H
+#ifndef CDBFOLDERDATABASE_H
+#define CDBFOLDERDATABASE_H
 
-#include <QTreeWidget>
+#include "gis/db/IDBFolder.h"
 
-class CGisListDB : public QTreeWidget
+class CDBFolderDatabase : public IDBFolder
 {
     public:
-        CGisListDB(QWidget * parent);
-        virtual ~CGisListDB();
+        CDBFolderDatabase(QTreeWidget *parent);
+        virtual ~CDBFolderDatabase();
 };
 
-#endif //CGISLISTDB_H
+#endif //CDBFOLDERDATABASE_H
 
diff --git a/src/gis/CGisListDB.cpp b/src/gis/db/CDBFolderGroup.cpp
similarity index 79%
copy from src/gis/CGisListDB.cpp
copy to src/gis/db/CDBFolderGroup.cpp
index 4d2b2cf..0b60168 100644
--- a/src/gis/CGisListDB.cpp
+++ b/src/gis/db/CDBFolderGroup.cpp
@@ -16,17 +16,15 @@
 
 **********************************************************************************************/
 
-#include "CGisListDB.h"
+#include "gis/db/CDBFolderGroup.h"
 
-#include <QtWidgets>
-
-CGisListDB::CGisListDB(QWidget *parent)
-    : QTreeWidget(parent)
+CDBFolderGroup::CDBFolderGroup(quint64 key, QTreeWidgetItem * parent)
+    : IDBFolder(eTypeGroup, key, parent)
 {
-
+    setIcon(0,QIcon("://icons/32x32/PathBlue.png"));
 }
 
-CGisListDB::~CGisListDB()
+CDBFolderGroup::~CDBFolderGroup()
 {
 
 }
diff --git a/src/gis/CGisListDB.h b/src/gis/db/CDBFolderGroup.h
similarity index 79%
copy from src/gis/CGisListDB.h
copy to src/gis/db/CDBFolderGroup.h
index e6a3fdf..91fb15e 100644
--- a/src/gis/CGisListDB.h
+++ b/src/gis/db/CDBFolderGroup.h
@@ -16,17 +16,17 @@
 
 **********************************************************************************************/
 
-#ifndef CGISLISTDB_H
-#define CGISLISTDB_H
+#ifndef CDBFOLDERGROUP_H
+#define CDBFOLDERGROUP_H
 
-#include <QTreeWidget>
+#include "gis/db/IDBFolder.h"
 
-class CGisListDB : public QTreeWidget
+class CDBFolderGroup : public IDBFolder
 {
     public:
-        CGisListDB(QWidget * parent);
-        virtual ~CGisListDB();
+        CDBFolderGroup(quint64 key, QTreeWidgetItem * parent);
+        virtual ~CDBFolderGroup();
 };
 
-#endif //CGISLISTDB_H
+#endif //CDBFOLDERGROUP_H
 
diff --git a/src/gis/CGisListDB.cpp b/src/gis/db/CDBFolderLostFound.cpp
similarity index 71%
copy from src/gis/CGisListDB.cpp
copy to src/gis/db/CDBFolderLostFound.cpp
index 4d2b2cf..93533f6 100644
--- a/src/gis/CGisListDB.cpp
+++ b/src/gis/db/CDBFolderLostFound.cpp
@@ -16,17 +16,17 @@
 
 **********************************************************************************************/
 
-#include "CGisListDB.h"
+#include "gis/db/CDBFolderLostFound.h"
 
-#include <QtWidgets>
-
-CGisListDB::CGisListDB(QWidget *parent)
-    : QTreeWidget(parent)
+CDBFolderLostFound::CDBFolderLostFound(QTreeWidget *parent)
+    : IDBFolder(eTypeLostFound, 0, parent)
 {
-
+    setToolTip(1, QObject::tr("All your data grouped by folders."));
+    setIcon(0, QIcon("://icons/32x32/DeleteMultiple.png"));
+    setText(1, QObject::tr("Lost & Found"));
 }
 
-CGisListDB::~CGisListDB()
+CDBFolderLostFound::~CDBFolderLostFound()
 {
 
 }
diff --git a/src/gis/CGisListDB.h b/src/gis/db/CDBFolderLostFound.h
similarity index 78%
copy from src/gis/CGisListDB.h
copy to src/gis/db/CDBFolderLostFound.h
index e6a3fdf..2eff9ae 100644
--- a/src/gis/CGisListDB.h
+++ b/src/gis/db/CDBFolderLostFound.h
@@ -16,17 +16,17 @@
 
 **********************************************************************************************/
 
-#ifndef CGISLISTDB_H
-#define CGISLISTDB_H
+#ifndef CDBFOLDERLOSTFOUND_H
+#define CDBFOLDERLOSTFOUND_H
 
-#include <QTreeWidget>
+#include "gis/db/IDBFolder.h"
 
-class CGisListDB : public QTreeWidget
+class CDBFolderLostFound : public IDBFolder
 {
     public:
-        CGisListDB(QWidget * parent);
-        virtual ~CGisListDB();
+        CDBFolderLostFound(QTreeWidget *parent);
+        virtual ~CDBFolderLostFound();
 };
 
-#endif //CGISLISTDB_H
+#endif //CDBFOLDERLOSTFOUND_H
 
diff --git a/src/gis/CGisListDB.cpp b/src/gis/db/CDBFolderOther.cpp
similarity index 77%
copy from src/gis/CGisListDB.cpp
copy to src/gis/db/CDBFolderOther.cpp
index 4d2b2cf..210f3f9 100644
--- a/src/gis/CGisListDB.cpp
+++ b/src/gis/db/CDBFolderOther.cpp
@@ -16,17 +16,16 @@
 
 **********************************************************************************************/
 
-#include "CGisListDB.h"
+#include "gis/db/CDBFolderOther.h"
 
-#include <QtWidgets>
-
-CGisListDB::CGisListDB(QWidget *parent)
-    : QTreeWidget(parent)
+CDBFolderOther::CDBFolderOther(quint64 key, QTreeWidgetItem * parent)
+    : IDBFolder(eTypeOther, key, parent)
 {
-
+    setIcon(0,QIcon("://icons/32x32/PathOrange.png"));
+    setCheckState(0, Qt::Unchecked);
 }
 
-CGisListDB::~CGisListDB()
+CDBFolderOther::~CDBFolderOther()
 {
 
 }
diff --git a/src/gis/CGisListDB.h b/src/gis/db/CDBFolderOther.h
similarity index 79%
copy from src/gis/CGisListDB.h
copy to src/gis/db/CDBFolderOther.h
index e6a3fdf..dc562a6 100644
--- a/src/gis/CGisListDB.h
+++ b/src/gis/db/CDBFolderOther.h
@@ -16,17 +16,17 @@
 
 **********************************************************************************************/
 
-#ifndef CGISLISTDB_H
-#define CGISLISTDB_H
+#ifndef CDBFOLDEROTHER_H
+#define CDBFOLDEROTHER_H
 
-#include <QTreeWidget>
+#include "gis/db/IDBFolder.h"
 
-class CGisListDB : public QTreeWidget
+class CDBFolderOther : public IDBFolder
 {
     public:
-        CGisListDB(QWidget * parent);
-        virtual ~CGisListDB();
+        CDBFolderOther(quint64 key, QTreeWidgetItem *parent);
+        virtual ~CDBFolderOther();
 };
 
-#endif //CGISLISTDB_H
+#endif //CDBFOLDEROTHER_H
 
diff --git a/src/gis/CGisListDB.cpp b/src/gis/db/CDBFolderProject.cpp
similarity index 76%
copy from src/gis/CGisListDB.cpp
copy to src/gis/db/CDBFolderProject.cpp
index 4d2b2cf..b223cad 100644
--- a/src/gis/CGisListDB.cpp
+++ b/src/gis/db/CDBFolderProject.cpp
@@ -16,17 +16,16 @@
 
 **********************************************************************************************/
 
-#include "CGisListDB.h"
+#include "gis/db/CDBFolderProject.h"
 
-#include <QtWidgets>
-
-CGisListDB::CGisListDB(QWidget *parent)
-    : QTreeWidget(parent)
+CDBFolderProject::CDBFolderProject(quint64 key, QTreeWidgetItem * parent)
+    : IDBFolder(eTypeProject, key, parent)
 {
-
+    setIcon(0,QIcon("://icons/32x32/PathGreen.png"));
+    setCheckState(0, Qt::Unchecked);
 }
 
-CGisListDB::~CGisListDB()
+CDBFolderProject::~CDBFolderProject()
 {
 
 }
diff --git a/src/gis/CGisListDB.h b/src/gis/db/CDBFolderProject.h
similarity index 78%
copy from src/gis/CGisListDB.h
copy to src/gis/db/CDBFolderProject.h
index e6a3fdf..0732da0 100644
--- a/src/gis/CGisListDB.h
+++ b/src/gis/db/CDBFolderProject.h
@@ -16,17 +16,17 @@
 
 **********************************************************************************************/
 
-#ifndef CGISLISTDB_H
-#define CGISLISTDB_H
+#ifndef CDBFOLDERPROJECT_H
+#define CDBFOLDERPROJECT_H
 
-#include <QTreeWidget>
+#include "gis/db/IDBFolder.h"
 
-class CGisListDB : public QTreeWidget
+class CDBFolderProject : public IDBFolder
 {
     public:
-        CGisListDB(QWidget * parent);
-        virtual ~CGisListDB();
+        CDBFolderProject(quint64 key, QTreeWidgetItem *parent);
+        virtual ~CDBFolderProject();
 };
 
-#endif //CGISLISTDB_H
+#endif //CDBFOLDERPROJECT_H
 
diff --git a/src/gis/CGisListDB.cpp b/src/gis/db/CDBItem.cpp
similarity index 86%
copy from src/gis/CGisListDB.cpp
copy to src/gis/db/CDBItem.cpp
index 4d2b2cf..f62cd91 100644
--- a/src/gis/CGisListDB.cpp
+++ b/src/gis/db/CDBItem.cpp
@@ -16,17 +16,14 @@
 
 **********************************************************************************************/
 
-#include "CGisListDB.h"
+#include "gis/db/CDBItem.h"
 
-#include <QtWidgets>
-
-CGisListDB::CGisListDB(QWidget *parent)
-    : QTreeWidget(parent)
+CDBItem::CDBItem()
 {
 
 }
 
-CGisListDB::~CGisListDB()
+CDBItem::~CDBItem()
 {
 
 }
diff --git a/src/gis/CGisListDB.cpp b/src/gis/db/CDBItem.h
similarity index 83%
copy from src/gis/CGisListDB.cpp
copy to src/gis/db/CDBItem.h
index 4d2b2cf..c92f4d8 100644
--- a/src/gis/CGisListDB.cpp
+++ b/src/gis/db/CDBItem.h
@@ -16,18 +16,17 @@
 
 **********************************************************************************************/
 
-#include "CGisListDB.h"
+#ifndef CDBITEM_H
+#define CDBITEM_H
 
-#include <QtWidgets>
+#include <QTreeWidgetItem>
 
-CGisListDB::CGisListDB(QWidget *parent)
-    : QTreeWidget(parent)
+class CDBItem : public QTreeWidgetItem
 {
+    public:
+        CDBItem();
+        virtual ~CDBItem();
+};
 
-}
-
-CGisListDB::~CGisListDB()
-{
-
-}
+#endif //CDBITEM_H
 
diff --git a/src/gis/CGisListDB.cpp b/src/gis/db/CDBProject.cpp
similarity index 82%
copy from src/gis/CGisListDB.cpp
copy to src/gis/db/CDBProject.cpp
index 4d2b2cf..2039adb 100644
--- a/src/gis/CGisListDB.cpp
+++ b/src/gis/db/CDBProject.cpp
@@ -16,17 +16,15 @@
 
 **********************************************************************************************/
 
-#include "CGisListDB.h"
+#include "gis/db/CDBProject.h"
 
-#include <QtWidgets>
-
-CGisListDB::CGisListDB(QWidget *parent)
-    : QTreeWidget(parent)
+CDBProject::CDBProject(CGisListWks *parent)
+    : IGisProject(eTypeDb, "", parent)
 {
-
+    setIcon(0,QIcon("://icons/32x32/DBProject.png"));
 }
 
-CGisListDB::~CGisListDB()
+CDBProject::~CDBProject()
 {
 
 }
diff --git a/src/gis/CGisListDB.h b/src/gis/db/CDBProject.h
similarity index 81%
copy from src/gis/CGisListDB.h
copy to src/gis/db/CDBProject.h
index e6a3fdf..71156a0 100644
--- a/src/gis/CGisListDB.h
+++ b/src/gis/db/CDBProject.h
@@ -16,17 +16,17 @@
 
 **********************************************************************************************/
 
-#ifndef CGISLISTDB_H
-#define CGISLISTDB_H
+#ifndef CDBPROJECT_H
+#define CDBPROJECT_H
 
-#include <QTreeWidget>
+#include "gis/IGisProject.h"
 
-class CGisListDB : public QTreeWidget
+class CDBProject : public IGisProject
 {
     public:
-        CGisListDB(QWidget * parent);
-        virtual ~CGisListDB();
+        CDBProject(CGisListWks * parent);
+        virtual ~CDBProject();
 };
 
-#endif //CGISLISTDB_H
+#endif //CDBPROJECT_H
 
diff --git a/src/gis/db/CSetupDB.cpp b/src/gis/db/CSetupDB.cpp
new file mode 100644
index 0000000..30db108
--- /dev/null
+++ b/src/gis/db/CSetupDB.cpp
@@ -0,0 +1,69 @@
+/**********************************************************************************************
+    Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "gis/db/CSetupDB.h"
+#include "helpers/CSettings.h"
+#include "config.h"
+
+#include <QtWidgets>
+
+CSetupDB::CSetupDB(QWidget *parent)
+    : QDialog(parent)
+{
+    setupUi(this);
+
+    SETTINGS;
+    cfg.beginGroup("Database");
+    checkSaveOnExit->setChecked(cfg.value("saveOnExit", true).toBool());
+    spinSaveEvery->setValue(cfg.value("saveEvery",5).toInt());
+    labelDatabasePath->setText(cfg.value("path",QDir::home().filePath(CONFIGDIR).append("qms.db")).toString());
+    cfg.endGroup();
+
+    connect(toolDatabasePath, SIGNAL(clicked()), this, SLOT(slotSetupPath()));
+    connect(checkSaveOnExit, SIGNAL(toggled(bool)), spinSaveEvery, SLOT(setEnabled(bool)));
+}
+
+CSetupDB::~CSetupDB()
+{
+
+}
+
+void CSetupDB::accept()
+{
+    SETTINGS;
+    cfg.beginGroup("Database");
+    cfg.setValue("saveOnExit", checkSaveOnExit->isChecked());
+    cfg.setValue("saveEvery", spinSaveEvery->value());
+    cfg.setValue("path", labelDatabasePath->text());
+    cfg.endGroup();
+
+    QMessageBox::information(this, tr("Setup database..."), tr("Changes will become active after an application's restart."), QMessageBox::Ok);
+
+    QDialog::accept();
+}
+
+void CSetupDB::slotSetupPath()
+{
+    QFileInfo fi(labelDatabasePath->text());
+    QString filename = QFileDialog::getSaveFileName(this, tr("Select database path..."),fi.absoluteFilePath(), "Database (*.db)");
+    if(filename.isEmpty())
+    {
+        return;
+    }
+    labelDatabasePath->setText(filename);
+}
diff --git a/src/gis/CGisListDB.h b/src/gis/db/CSetupDB.h
similarity index 73%
copy from src/gis/CGisListDB.h
copy to src/gis/db/CSetupDB.h
index e6a3fdf..976eacc 100644
--- a/src/gis/CGisListDB.h
+++ b/src/gis/db/CSetupDB.h
@@ -16,17 +16,27 @@
 
 **********************************************************************************************/
 
-#ifndef CGISLISTDB_H
-#define CGISLISTDB_H
+#ifndef CSETUPDB_H
+#define CSETUPDB_H
 
-#include <QTreeWidget>
+#include <QDialog>
+#include "ui_ISetupDB.h"
 
-class CGisListDB : public QTreeWidget
+
+class CSetupDB : public QDialog, private Ui::ISetupDB
 {
+    Q_OBJECT
     public:
-        CGisListDB(QWidget * parent);
-        virtual ~CGisListDB();
+        CSetupDB(QWidget * parent);
+        virtual ~CSetupDB();
+
+    public slots:
+        void accept();
+
+
+    private slots:
+        void slotSetupPath();
 };
 
-#endif //CGISLISTDB_H
+#endif //CSETUPDB_H
 
diff --git a/src/gis/db/CSetupFolder.cpp b/src/gis/db/CSetupFolder.cpp
new file mode 100644
index 0000000..524f1ba
--- /dev/null
+++ b/src/gis/db/CSetupFolder.cpp
@@ -0,0 +1,77 @@
+/**********************************************************************************************
+    Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "gis/db/CSetupFolder.h"
+
+#include <QtWidgets>
+
+CSetupFolder::CSetupFolder(IDBFolder::type_e& type, QString &name, QWidget *parent)
+    : QDialog(parent)
+    , type(type)
+    , name(name)
+{
+    setupUi(this);
+
+    connect(lineName, SIGNAL(textChanged(QString)), this, SLOT(slotNameChanged(QString)));
+
+    lineName->setText(name);
+    switch(type)
+    {
+        case IDBFolder::eTypeGroup:
+            radioGroup->setChecked(true);
+            break;
+        case IDBFolder::eTypeProject:
+            radioProject->setChecked(true);
+            break;
+        case IDBFolder::eTypeOther:
+            radioOther->setChecked(true);
+            break;
+        default:;
+    }
+
+    slotNameChanged(name);
+}
+
+CSetupFolder::~CSetupFolder()
+{
+
+}
+
+void CSetupFolder::accept()
+{
+    name    = lineName->text();
+    if(radioGroup->isChecked())
+    {
+        type = IDBFolder::eTypeGroup;
+    }
+    else if(radioProject->isChecked())
+    {
+        type = IDBFolder::eTypeProject;
+    }
+    else if(radioOther->isChecked())
+    {
+        type = IDBFolder::eTypeOther;
+    }
+
+    QDialog::accept();
+}
+
+void CSetupFolder::slotNameChanged(const QString& text)
+{
+    buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!text.isEmpty());
+}
diff --git a/src/gis/bin/CBinProject.h b/src/gis/db/CSetupFolder.h
similarity index 64%
copy from src/gis/bin/CBinProject.h
copy to src/gis/db/CSetupFolder.h
index 6302d3e..24f133b 100644
--- a/src/gis/bin/CBinProject.h
+++ b/src/gis/db/CSetupFolder.h
@@ -16,24 +16,31 @@
 
 **********************************************************************************************/
 
-#ifndef CBINPROJECT_H
-#define CBINPROJECT_H
+#ifndef CSETUPFOLDER_H
+#define CSETUPFOLDER_H
 
-#include "gis/IGisProject.h"
+#include "gis/db/IDBFolder.h"
+#include <QDialog>
+#include "ui_ISetupFolder.h"
 
-class CBinProject : public IGisProject
+class CSetupFolder : public QDialog, private Ui::ISetupFolder
 {
+    Q_OBJECT
     public:
-        CBinProject(const QString &name,  CGisListWks * parent);
-        CBinProject(const QString& filename, const QString &key, CGisListWks * parent);
-        virtual ~CBinProject();
+        CSetupFolder(IDBFolder::type_e& type, QString& name, QWidget * parent);
+        virtual ~CSetupFolder();
 
-        void save();
-        void saveAs();
+    public slots:
+        void accept();
 
-        static void saveAs(const QString& fn, IGisProject& project);
+    private slots:
+        void slotNameChanged(const QString& text);
+
+    private:
+        IDBFolder::type_e& type;
+        QString& name;
 
 };
 
-#endif //CBINPROJECT_H
+#endif //CSETUPFOLDER_H
 
diff --git a/src/gis/db/IDBFolder.cpp b/src/gis/db/IDBFolder.cpp
new file mode 100644
index 0000000..d45a3dc
--- /dev/null
+++ b/src/gis/db/IDBFolder.cpp
@@ -0,0 +1,106 @@
+/**********************************************************************************************
+    Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "gis/db/macros.h"
+#include "gis/db/IDBFolder.h"
+#include "gis/db/CDBFolderGroup.h"
+#include "gis/db/CDBFolderProject.h"
+#include "gis/db/CDBFolderOther.h"
+
+#include <QtSql>
+
+IDBFolder::IDBFolder(type_e type, quint64 id, QTreeWidgetItem *parent)
+    : QTreeWidgetItem(parent, type)
+    , id(id)
+{
+    db = QSqlDatabase::database();
+    setupFromDB();
+}
+
+IDBFolder::IDBFolder(type_e type, quint64 id, QTreeWidget * parent)
+    : QTreeWidgetItem(parent, type)
+    , id(id)
+{
+    db = QSqlDatabase::database();
+    setupFromDB();
+}
+
+IDBFolder::~IDBFolder()
+{
+
+}
+
+IDBFolder * IDBFolder::createFolderByType(int type, quint64 id, QTreeWidgetItem * parent)
+{
+    switch(type)
+    {
+    case eTypeGroup:
+        return new CDBFolderGroup(id, parent);
+    case eTypeProject:
+        return new CDBFolderProject(id, parent);
+    case eTypeOther:
+        return new CDBFolderOther(id, parent);
+    default:
+        return 0;
+    }
+}
+
+void IDBFolder::setupFromDB()
+{
+    if(id == 0)
+    {
+        return;
+    }
+    QSqlQuery query(db);
+
+    query.prepare("SELECT name FROM folders WHERE id=:id");
+    query.bindValue(":id", id);
+    QUERY_EXEC(return);
+    query.next();
+
+    setText(1, query.value(0).toString());
+
+    query.prepare("SELECT EXISTS(SELECT 1 FROM folder2folder WHERE parent=:id LIMIT 1)");
+    query.bindValue(":id", id);
+    QUERY_EXEC(return);
+    query.next();
+
+    if(query.value(0).toInt() == 1)
+    {
+        setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);
+    }
+
+}
+
+void IDBFolder::expanding()
+{
+    qDeleteAll(takeChildren());
+
+    QSqlQuery query(db);
+
+    query.prepare("SELECT t1.child, t2.type FROM folder2folder AS t1, folders AS t2 WHERE t1.parent = :id AND t2.id = t1.child ORDER BY t2.name");
+    query.bindValue(":id", id);
+    QUERY_EXEC(return);
+    while(query.next())
+    {
+        quint64 idChild     = query.value(0).toULongLong();
+        quint32 typeChild   = query.value(1).toInt();
+        IDBFolder::createFolderByType(typeChild, idChild, this);
+    }
+
+}
diff --git a/src/gis/gpx/CGpxProject.h b/src/gis/db/IDBFolder.h
similarity index 55%
copy from src/gis/gpx/CGpxProject.h
copy to src/gis/db/IDBFolder.h
index 0c19f45..9f1c1dc 100644
--- a/src/gis/gpx/CGpxProject.h
+++ b/src/gis/db/IDBFolder.h
@@ -16,39 +16,44 @@
 
 **********************************************************************************************/
 
-#ifndef CGPXPROJECT_H
-#define CGPXPROJECT_H
+#ifndef IDBFOLDER_H
+#define IDBFOLDER_H
 
-#include "gis/IGisProject.h"
+#include <QTreeWidgetItem>
+#include <QSqlDatabase>
 
-#include <QDomElement>
-#include <QDateTime>
-#include <QUrl>
-
-class CGisListWks;
-class CGisDraw;
-
-
-class CGpxProject : public IGisProject
+class IDBFolder : public QTreeWidgetItem
 {
     public:
-        CGpxProject(const QString &name, CGisListWks * parent);
-        CGpxProject(const QString& filename, const QString &key, CGisListWks * parent);
-        virtual ~CGpxProject();
+        enum type_e
+        {
+             eTypeLostFound = 1
+            ,eTypeDatabase = 2
+            ,eTypeGroup = 3
+            ,eTypeProject = 4
+            ,eTypeOther = 5
+        };
 
-        void save();
-        void saveAs();
 
-        static void saveAs(const QString& fn, IGisProject& project);
+        IDBFolder(type_e type, quint64 id, QTreeWidgetItem * parent);
+        IDBFolder(type_e type, quint64 id, QTreeWidget * parent);
+        virtual ~IDBFolder();
 
+        quint64 getId(){return id;}
 
-    private:
-        void saveGpx(const QString& fn);
+        virtual void expanding();
 
+        static IDBFolder * createFolderByType(int type, quint64 id, QTreeWidgetItem *parent);
 
-        QDomElement xmlGpx;
+    protected:
+        void setupFromDB();
+
+
+    private:
+        QSqlDatabase db;
+        quint64 id;
 
 };
 
-#endif //CGPXPROJECT_H
+#endif //IDBFOLDER_H
 
diff --git a/src/gis/db/ISetupDB.ui b/src/gis/db/ISetupDB.ui
new file mode 100644
index 0000000..9bc1bb7
--- /dev/null
+++ b/src/gis/db/ISetupDB.ui
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ISetupDB</class>
+ <widget class="QDialog" name="ISetupDB">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>397</width>
+    <height>116</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Setup database...</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QCheckBox" name="checkSaveOnExit">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Maximum" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_4">
+       <property name="text">
+        <string>save workspace on exit, and every</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QSpinBox" name="spinSaveEvery"/>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_2">
+       <property name="text">
+        <string>minutes</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <widget class="QLabel" name="label_3">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>Database path</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="toolDatabasePath">
+       <property name="text">
+        <string>...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../../resources.qrc">
+         <normaloff>:/icons/32x32/PathBlue.png</normaloff>:/icons/32x32/PathBlue.png</iconset>
+       </property>
+       <property name="iconSize">
+        <size>
+         <width>22</width>
+         <height>22</height>
+        </size>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="labelDatabasePath">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>-</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="../../resources.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>ISetupDB</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>227</x>
+     <y>91</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>111</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>ISetupDB</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>295</x>
+     <y>97</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>111</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/src/gis/db/ISetupFolder.ui b/src/gis/db/ISetupFolder.ui
new file mode 100644
index 0000000..e0d2d1a
--- /dev/null
+++ b/src/gis/db/ISetupFolder.ui
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ISetupFolder</class>
+ <widget class="QDialog" name="ISetupFolder">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>168</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Folder...</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>Name</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLineEdit" name="lineName"/>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QRadioButton" name="radioGroup">
+     <property name="text">
+      <string>Group</string>
+     </property>
+     <property name="icon">
+      <iconset resource="../../resources.qrc">
+       <normaloff>:/icons/32x32/PathBlue.png</normaloff>:/icons/32x32/PathBlue.png</iconset>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QRadioButton" name="radioProject">
+     <property name="text">
+      <string>Project</string>
+     </property>
+     <property name="icon">
+      <iconset resource="../../resources.qrc">
+       <normaloff>:/icons/32x32/PathGreen.png</normaloff>:/icons/32x32/PathGreen.png</iconset>
+     </property>
+     <property name="checked">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QRadioButton" name="radioOther">
+     <property name="text">
+      <string>Other</string>
+     </property>
+     <property name="icon">
+      <iconset resource="../../resources.qrc">
+       <normaloff>:/icons/32x32/PathOrange.png</normaloff>:/icons/32x32/PathOrange.png</iconset>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="../../resources.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>ISetupFolder</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>ISetupFolder</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/src/gis/CGisListDB.cpp b/src/gis/db/macros.h
similarity index 68%
copy from src/gis/CGisListDB.cpp
copy to src/gis/db/macros.h
index 4d2b2cf..d66359f 100644
--- a/src/gis/CGisListDB.cpp
+++ b/src/gis/db/macros.h
@@ -16,18 +16,27 @@
 
 **********************************************************************************************/
 
-#include "CGisListDB.h"
+#ifndef MACROS_H
+#define MACROS_H
 
-#include <QtWidgets>
+#define DB_VERSION 1
 
-CGisListDB::CGisListDB(QWidget *parent)
-    : QTreeWidget(parent)
-{
+#define QUERY_EXEC(cmd) \
+if(!query.exec())\
+{ \
+    qDebug() << query.lastQuery();\
+    qDebug() << query.lastError();\
+    cmd;\
+}\
 
-}
+#define PROGRESS_SETUP(lbl, max) \
+QProgressDialog progress(lbl, "Abort", 0, max, 0);\
+progress.setWindowModality(Qt::WindowModal);\
 
-CGisListDB::~CGisListDB()
-{
+#define PROGRESS(x, cmd) \
+progress.setValue(x); \
+if (progress.wasCanceled()) cmd;\
 
-}
+
+#endif //MACROS_H
 
diff --git a/src/gis/gpx/CGpxProject.cpp b/src/gis/gpx/CGpxProject.cpp
index b0ff6f3..0b264f9 100644
--- a/src/gis/gpx/CGpxProject.cpp
+++ b/src/gis/gpx/CGpxProject.cpp
@@ -17,7 +17,7 @@
 **********************************************************************************************/
 
 #include "gis/gpx/CGpxProject.h"
-#include "gis/bin/CBinProject.h"
+#include "gis/qms/CQmsProject.h"
 #include "gis/CGisListWks.h"
 #include "gis/wpt/CGisItemWpt.h"
 #include "gis/trk/CGisItemTrk.h"
@@ -30,24 +30,30 @@
 
 #include <QtWidgets>
 
-CGpxProject::CGpxProject(const QString &name,  CGisListWks * parent)
-    : IGisProject("", "", parent)
-{
-    setText(0, name);
-    setIcon(0,QIcon("://icons/32x32/GpxProject.png"));
-    setToolTip(0, getInfo());
-    valid = true;
-}
-
-CGpxProject::CGpxProject(const QString &filename, const QString& key, CGisListWks *parent)
-    : IGisProject(key, filename, parent)
-{
-    setText(0, QFileInfo(filename).baseName());
+CGpxProject::CGpxProject(const QString &filename, CGisListWks *parent)
+    : IGisProject(eTypeGpx, filename, parent)
+{               
     setIcon(0,QIcon("://icons/32x32/GpxProject.png"));
 
     // cerate file instance
     QFile file(filename);
-    file.open(QIODevice::ReadOnly);
+
+    // if the file does not exist, the filename is assumed to be a name for a new project
+    if(!file.exists())
+    {
+        IGisProject::filename.clear();
+        setupName(filename);
+        setToolTip(0, getInfo());
+        valid = true;
+        return;
+    }
+
+    if(!file.open(QIODevice::ReadOnly))
+    {
+        QMessageBox::critical(0, QObject::tr("Failed to open..."), QObject::tr("Failed to open %1").arg(filename), QMessageBox::Abort);
+        return;
+    }
+
 
     // load file content to xml document
     QDomDocument xml;
@@ -113,8 +119,8 @@ CGpxProject::CGpxProject(const QString &filename, const QString& key, CGisListWk
         new CGisItemOvlArea(xmlArea, this);
     }
 
+    setupName(QFileInfo(filename).baseName().replace("_", " "));
     setToolTip(0, getInfo());
-
     valid = true;
 }
 
@@ -152,16 +158,17 @@ void CGpxProject::saveAs()
 
     if(filter == "*.gpx")
     {
-        saveAs(fn, *this);
-
         filename = fn;
-        setText(0, QFileInfo(filename).baseName());
+        metadata.name.clear();
+        setupName(QFileInfo(filename).baseName().replace("_", " "));
+
+        saveAs(fn, *this);
         markAsSaved();
 
     }
     else if(filter == "*.qms")
     {
-        CBinProject::saveAs(fn, *this);
+        CQmsProject::saveAs(fn, *this);
     }
     else
     {
diff --git a/src/gis/gpx/CGpxProject.h b/src/gis/gpx/CGpxProject.h
index 0c19f45..6ff7899 100644
--- a/src/gis/gpx/CGpxProject.h
+++ b/src/gis/gpx/CGpxProject.h
@@ -32,8 +32,7 @@ class CGisDraw;
 class CGpxProject : public IGisProject
 {
     public:
-        CGpxProject(const QString &name, CGisListWks * parent);
-        CGpxProject(const QString& filename, const QString &key, CGisListWks * parent);
+        CGpxProject(const QString &filename, CGisListWks * parent);
         virtual ~CGpxProject();
 
         void save();
diff --git a/src/gis/ovl/CDetailsOvlArea.cpp b/src/gis/ovl/CDetailsOvlArea.cpp
index 678a4aa..f43ef95 100644
--- a/src/gis/ovl/CDetailsOvlArea.cpp
+++ b/src/gis/ovl/CDetailsOvlArea.cpp
@@ -19,6 +19,7 @@
 #include "gis/ovl/CDetailsOvlArea.h"
 #include "gis/ovl/CGisItemOvlArea.h"
 #include "helpers/CTextEditWidget.h"
+#include "helpers/CLinksDialog.h"
 #include "GeoMath.h"
 
 
@@ -161,6 +162,16 @@ void CDetailsOvlArea::slotLinkActivated(const QUrl& url)
         }
         setupGui();
     }
+    else if(url.toString() == "links")
+    {
+        QList<IGisItem::link_t> links = area.getLinks();
+        CLinksDialog dlg(links, 0);
+        if(dlg.exec() == QDialog::Accepted)
+        {
+            area.setLinks(links);
+        }
+        setupGui();
+    }
     else
     {
         QDesktopServices::openUrl(url);
@@ -168,16 +179,6 @@ void CDetailsOvlArea::slotLinkActivated(const QUrl& url)
 }
 
 
-QString CDetailsOvlArea::toLink(bool isReadOnly, const QString& href, const QString& str)
-{
-    if(isReadOnly)
-    {
-        return QString("%1").arg(str);
-    }
-
-    return QString("<a href='%1'>%2</a>").arg(href).arg(str);
-}
-
 void CDetailsOvlArea::setupGui()
 {
     if(originator)
@@ -199,7 +200,7 @@ void CDetailsOvlArea::setupGui()
     }
 
 
-    labelName->setText(toLink(isReadOnly, "name", area.getName()));
+    labelName->setText(IGisItem::toLink(isReadOnly, "name", area.getName()));
 
     comboColor->setCurrentIndex(area.getColorIdx());
     comboColor->setEnabled(!isReadOnly);
@@ -211,36 +212,10 @@ void CDetailsOvlArea::setupGui()
     checkOpacity->setEnabled(!isReadOnly);
 
     textCmtDesc->document()->clear();
-
-    foreach(const IGisItem::link_t& link, area.getLinks())
-    {
-        QString str = QString("<p><a href='%1'>%2</a></p>").arg(link.uri.toString()).arg(link.text);
-        textCmtDesc->append(str);
-    }
-
-    textCmtDesc->append(toLink(isReadOnly, "comment", tr("<h4>Comment:</h4>")));
-    if(IGisItem::removeHtml(area.getComment()).simplified().isEmpty())
-    {
-        textCmtDesc->append(tr("<p>--- no comment ---</p>"));
-    }
-    else
-    {
-        textCmtDesc->append(area.getComment());
-    }
-
-    textCmtDesc->append(toLink(isReadOnly, "description", tr("<h4>Description:</h4>")));
-    if(IGisItem::removeHtml(area.getDescription()).simplified().isEmpty())
-    {
-        textCmtDesc->append(tr("<p>--- no description ---</p>"));
-    }
-    else
-    {
-        textCmtDesc->append(area.getDescription());
-    }
+    textCmtDesc->append(IGisItem::createText(isReadOnly, area.getComment(), area.getDescription(), area.getLinks()));
     textCmtDesc->moveCursor (QTextCursor::Start) ;
     textCmtDesc->ensureCursorVisible() ;
 
-
     int idx = 0;
     QList<QTreeWidgetItem*> items;
     const CGisItemOvlArea::area_t& a = area.getAreaData();
@@ -254,9 +229,7 @@ void CDetailsOvlArea::setupGui()
         // position
         GPS_Math_Deg_To_Str(pt.lon, pt.lat, str);
         item->setText(eColPosition,str);
-
         items << item;
-
     }
 
     treeWidget->clear();
diff --git a/src/gis/ovl/CDetailsOvlArea.h b/src/gis/ovl/CDetailsOvlArea.h
index 923ae6d..2fbe401 100644
--- a/src/gis/ovl/CDetailsOvlArea.h
+++ b/src/gis/ovl/CDetailsOvlArea.h
@@ -49,8 +49,6 @@ class CDetailsOvlArea : public QDialog, private Ui::IDetailsOvlArea
             ,eColMax
         };
 
-        QString toLink(bool isReadOnly, const QString& href, const QString& str);
-
         CGisItemOvlArea& area;
 
         bool originator;
diff --git a/src/gis/ovl/CGisItemOvlArea.cpp b/src/gis/ovl/CGisItemOvlArea.cpp
index 8cada8e..117d7f6 100644
--- a/src/gis/ovl/CGisItemOvlArea.cpp
+++ b/src/gis/ovl/CGisItemOvlArea.cpp
@@ -123,12 +123,10 @@ CGisItemOvlArea::CGisItemOvlArea(const QPolygonF& line, const QString &name, IGi
     flags |=  eFlagCreatedInQms|eFlagWriteAllowed;
 
     setColor(str2color(""));
-    setText(1, "*");
-    setText(0, area.name);
-    setToolTip(0, getInfo());
     genKey();
-    project->setText(1,"*");
+
     setupHistory();
+    updateDecoration(eMarkChanged, eMarkNone);
 }
 
 CGisItemOvlArea::CGisItemOvlArea(const CGisItemOvlArea& parentArea, IGisProject * project, int idx)
@@ -138,13 +136,11 @@ CGisItemOvlArea::CGisItemOvlArea(const CGisItemOvlArea& parentArea, IGisProject
 {
     *this = parentArea;
 
-    setText(1, "*");
-    setText(0, area.name);
-    setToolTip(0, getInfo());
     key.clear();
     genKey();
-    project->setText(1,"*");
+
     setupHistory();
+    updateDecoration(eMarkChanged, eMarkNone);
 }
 
 CGisItemOvlArea::CGisItemOvlArea(const QDomNode &xml, IGisProject *project)
@@ -156,10 +152,9 @@ CGisItemOvlArea::CGisItemOvlArea(const QDomNode &xml, IGisProject *project)
     setColor(penForeground.color());
     readArea(xml, area);
     // --- stop read and process data ----
-    setText(0, area.name);
-    setToolTip(0, getInfo());
     genKey();
     setupHistory();
+    updateDecoration(eMarkNone, eMarkNone);
 }
 
 CGisItemOvlArea::CGisItemOvlArea(const history_t& hist, IGisProject * project)
@@ -182,14 +177,9 @@ CGisItemOvlArea::~CGisItemOvlArea()
     }
 }
 
-void CGisItemOvlArea::genKey()
+void CGisItemOvlArea::setSymbol()
 {
-    if(key.isEmpty())
-    {
-        QCryptographicHash md5(QCryptographicHash::Md5);
-        md5.addData((const char*)&area, sizeof(area));
-        key = md5.result().toHex();
-    }
+    setColor(str2color(area.color));
 }
 
 bool CGisItemOvlArea::isCloseTo(const QPointF& pos)
@@ -424,10 +414,9 @@ void CGisItemOvlArea::setDataFromPolyline(const QPolygonF& line)
     readLine(line);
 
     flags |= eFlagTainted;
-    setText(1,"*");
-    setToolTip(0, getInfo());
-    parent()->setText(1,"*");
+
     changed(QObject::tr("Changed area shape."), "://icons/48x48/AreaMove.png");
+    updateDecoration(eMarkChanged, eMarkNone);
 }
 
 void CGisItemOvlArea::setName(const QString& str)
@@ -467,6 +456,12 @@ void CGisItemOvlArea::setDescription(const QString& str)
     changed(QObject::tr("Changed description."), "://icons/48x48/EditText.png");
 }
 
+void CGisItemOvlArea::setLinks(const QList<link_t>& links)
+{
+    area.links = links;
+    changed(QObject::tr("Changed links"), "://icons/48x48/Link.png");
+}
+
 
 void CGisItemOvlArea::setColor(int idx)
 {
diff --git a/src/gis/ovl/CGisItemOvlArea.h b/src/gis/ovl/CGisItemOvlArea.h
index 34c8996..f595b5e 100644
--- a/src/gis/ovl/CGisItemOvlArea.h
+++ b/src/gis/ovl/CGisItemOvlArea.h
@@ -55,7 +55,6 @@ class CGisItemOvlArea : public IGisItem, public IGisLine
         qint32 getStyle(){return area.style;}
         bool getOpacity(){return area.opacity;}
 
-
         void setName(const QString& str);
         void setColor(int idx);
         void setDataFromPolyline(const QPolygonF& line);
@@ -64,7 +63,7 @@ class CGisItemOvlArea : public IGisItem, public IGisLine
         void setOpacity(bool yes);
         void setComment(const QString& str);
         void setDescription(const QString& str);
-
+        void setLinks(const QList<link_t>& links);
 
         void save(QDomNode& gpx);
         void edit();
@@ -90,7 +89,7 @@ class CGisItemOvlArea : public IGisItem, public IGisLine
         static const width_t lineWidths[OVL_N_WIDTHS];
         static const Qt::BrushStyle brushStyles[OVL_N_STYLES];
     protected:
-        void genKey();
+        void setSymbol();
 
 
     public:
diff --git a/src/gis/bin/CBinProject.cpp b/src/gis/qms/CQmsProject.cpp
similarity index 78%
rename from src/gis/bin/CBinProject.cpp
rename to src/gis/qms/CQmsProject.cpp
index 0394b93..0e7b930 100644
--- a/src/gis/bin/CBinProject.cpp
+++ b/src/gis/qms/CQmsProject.cpp
@@ -16,29 +16,32 @@
 
 **********************************************************************************************/
 
-#include "gis/bin/CBinProject.h"
+#include "gis/qms/CQmsProject.h"
 #include "gis/gpx/CGpxProject.h"
 #include "helpers/CSettings.h"
 
 
 #include <QtWidgets>
-CBinProject::CBinProject(const QString &name,  CGisListWks * parent)
-    : IGisProject("", "", parent)
-{
-    setText(0, name);
-    setIcon(0,QIcon("://icons/32x32/QmsProject.png"));
-    setToolTip(0, getInfo());
-    valid = true;
-}
 
 
-CBinProject::CBinProject(const QString &filename, const QString &key, CGisListWks *parent)
-    : IGisProject(key, filename, parent)
-{
-    setText(0, QFileInfo(filename).baseName());
+CQmsProject::CQmsProject(const QString &filename, CGisListWks *parent)
+    : IGisProject(eTypeQms, filename, parent)
+{   
     setIcon(0,QIcon("://icons/32x32/QmsProject.png"));
 
+    // cerate file instance
     QFile file(filename);
+
+    // if the file does not exist, the filename is assumed to be a name for a new project
+    if(!file.exists())
+    {
+        IGisProject::filename.clear();
+        setupName(filename);
+        setToolTip(0, getInfo());
+        valid = true;
+        return;
+    }
+
     if(!file.open(QIODevice::ReadOnly))
     {
         QMessageBox::critical(0, QObject::tr("Failed to open..."), QObject::tr("Failed to open %1").arg(filename), QMessageBox::Abort);
@@ -48,22 +51,23 @@ CBinProject::CBinProject(const QString &filename, const QString &key, CGisListWk
     QDataStream in(&file);
     in.setByteOrder(QDataStream::LittleEndian);
     in.setVersion(QDataStream::Qt_5_2);
-
     *this << in;    
-
     file.close();
 
+    markAsSaved();
+
+    setupName(QFileInfo(filename).baseName().replace("_", " "));
     setToolTip(0, getInfo());
     valid = true;
 }
 
-CBinProject::~CBinProject()
+CQmsProject::~CQmsProject()
 {
 
 }
 
 
-void CBinProject::save()
+void CQmsProject::save()
 {
 
     if(filename.isEmpty())
@@ -77,7 +81,7 @@ void CBinProject::save()
     }
 }
 
-void CBinProject::saveAs()
+void CQmsProject::saveAs()
 {
     SETTINGS;
     QString path = cfg.value("Paths/lastGisPath", QDir::homePath()).toString();
@@ -97,10 +101,11 @@ void CBinProject::saveAs()
     }
     else if(filter == "*.qms")
     {
-        saveAs(fn, *this);
-
         filename = fn;
-        setText(0, QFileInfo(filename).baseName());
+        metadata.name.clear();
+        setupName(QFileInfo(filename).baseName().replace("_", " "));
+
+        saveAs(fn, *this);
         markAsSaved();
     }
     else
@@ -113,7 +118,7 @@ void CBinProject::saveAs()
 
 }
 
-void CBinProject::saveAs(const QString& fn, IGisProject& project)
+void CQmsProject::saveAs(const QString& fn, IGisProject& project)
 {
     QString _fn_ = fn;
     QFileInfo fi(_fn_);
diff --git a/src/gis/bin/CBinProject.h b/src/gis/qms/CQmsProject.h
similarity index 78%
copy from src/gis/bin/CBinProject.h
copy to src/gis/qms/CQmsProject.h
index 6302d3e..14a8fb2 100644
--- a/src/gis/bin/CBinProject.h
+++ b/src/gis/qms/CQmsProject.h
@@ -16,17 +16,16 @@
 
 **********************************************************************************************/
 
-#ifndef CBINPROJECT_H
-#define CBINPROJECT_H
+#ifndef CQMSPROJECT_H
+#define CQMSPROJECT_H
 
 #include "gis/IGisProject.h"
 
-class CBinProject : public IGisProject
+class CQmsProject : public IGisProject
 {
     public:
-        CBinProject(const QString &name,  CGisListWks * parent);
-        CBinProject(const QString& filename, const QString &key, CGisListWks * parent);
-        virtual ~CBinProject();
+        CQmsProject(const QString& filename, CGisListWks * parent);
+        virtual ~CQmsProject();
 
         void save();
         void saveAs();
@@ -35,5 +34,5 @@ class CBinProject : public IGisProject
 
 };
 
-#endif //CBINPROJECT_H
+#endif //CQMSPROJECT_H
 
diff --git a/src/gis/bin/serialization.cpp b/src/gis/qms/serialization.cpp
similarity index 92%
rename from src/gis/bin/serialization.cpp
rename to src/gis/qms/serialization.cpp
index 259b753..375c5b3 100644
--- a/src/gis/bin/serialization.cpp
+++ b/src/gis/qms/serialization.cpp
@@ -39,8 +39,8 @@
 #define VER_COPYRIGHT   quint8(1)
 #define VER_PERSON      quint8(1)
 #define VER_HIST        quint8(1)
-#define VER_HIST_EVT    quint8(1)
-#define VER_ITEM        quint8(1)
+#define VER_HIST_EVT    quint8(2)
+#define VER_ITEM        quint8(2)
 
 #define MAGIC_SIZE      10
 #define MAGIC_TRK       "QMTrk     "
@@ -49,11 +49,6 @@
 #define MAGIC_AREA      "QMArea    "
 #define MAGIC_PROJ      "QMProj    "
 
-#define ITEM_WPT        quint8(1)
-#define ITEM_TRK        quint8(2)
-#define ITEM_RTE        quint8(3)
-#define ITEM_AREA       quint8(4)
-
 
 QDataStream& operator<<(QDataStream& stream, const IGisItem::link_t& link)
 {
@@ -125,10 +120,11 @@ QDataStream& operator>>(QDataStream& stream, IGisItem::wpt_t& wpt)
 QDataStream& operator<<(QDataStream& stream, const IGisItem::history_event_t& e)
 {
     stream << VER_HIST_EVT;
-    stream << e.time;
+    stream << e.time;    
     stream << e.icon;
     stream << e.comment;
     stream << e.data;
+    stream << e.hash;
     return stream;
 }
 
@@ -140,6 +136,11 @@ QDataStream& operator>>(QDataStream& stream, IGisItem::history_event_t& e)
     stream >> e.icon;
     stream >> e.comment;
     stream >> e.data;
+    if(version > 1)
+    {
+        stream >> e.hash;
+    }
+
     return stream;
 }
 
@@ -598,26 +599,37 @@ QDataStream& IGisProject::operator<<(QDataStream& stream)
     while(!stream.atEnd())
     {
         IGisItem::history_t history;
+        quint8 changed = 0;
         quint8 version, type;
         stream >> version;
         stream >> type;
         stream >> history;
+        if(version > 1)
+        {
+            stream >> changed;
+        }
+
+        IGisItem * item = 0;
         switch(type)
         {
-            case ITEM_WPT:
-                new CGisItemWpt(history, this);
+            case IGisItem::eTypeWpt:
+                item = new CGisItemWpt(history, this);
                 break;
-            case ITEM_TRK:
-                new CGisItemTrk(history, this);
+            case IGisItem::eTypeTrk:
+                item = new CGisItemTrk(history, this);
                 break;
-            case ITEM_RTE:
-                new CGisItemRte(history, this);
+            case IGisItem::eTypeRte:
+                item = new CGisItemRte(history, this);
                 break;
-            case ITEM_AREA:
-                new CGisItemOvlArea(history, this);
+            case IGisItem::eTypeOvl:
+                item = new CGisItemOvlArea(history, this);
                 break;
             default:;
         }
+        if(item && changed)
+        {
+            item->updateDecoration(IGisItem::eMarkChanged, IGisItem::eMarkNone);
+        }
     }
 
     return stream;
@@ -646,8 +658,9 @@ QDataStream& IGisProject::operator>>(QDataStream& stream)
             continue;
         }
         stream << VER_ITEM;
-        stream << ITEM_TRK;
+        stream << quint8(item->type());
         stream << item->getHistory();
+        stream << quint8(item->data(1,Qt::UserRole).toUInt() & IGisItem::eMarkChanged);
     }
     for(int i = 0; i < childCount(); i++)
     {
@@ -657,8 +670,9 @@ QDataStream& IGisProject::operator>>(QDataStream& stream)
             continue;
         }
         stream << VER_ITEM;
-        stream << ITEM_RTE;
+        stream << quint8(item->type());
         stream << item->getHistory();
+        stream << quint8(item->data(1,Qt::UserRole).toUInt() & IGisItem::eMarkChanged);
     }
     for(int i = 0; i < childCount(); i++)
     {
@@ -668,8 +682,9 @@ QDataStream& IGisProject::operator>>(QDataStream& stream)
             continue;
         }
         stream << VER_ITEM;
-        stream << ITEM_WPT;
+        stream << quint8(item->type());
         stream << item->getHistory();
+        stream << quint8(item->data(1,Qt::UserRole).toUInt() & IGisItem::eMarkChanged);
     }
     for(int i = 0; i < childCount(); i++)
     {
@@ -679,11 +694,11 @@ QDataStream& IGisProject::operator>>(QDataStream& stream)
             continue;
         }
         stream << VER_ITEM;
-        stream << ITEM_AREA;
+        stream << quint8(item->type());
         stream << item->getHistory();
+        stream << quint8(item->data(1,Qt::UserRole).toUInt() & IGisItem::eMarkChanged);
     }
 
-
     return stream;
 }
 
diff --git a/src/gis/rte/CGisItemRte.cpp b/src/gis/rte/CGisItemRte.cpp
index 25f4865..2bbb4ec 100644
--- a/src/gis/rte/CGisItemRte.cpp
+++ b/src/gis/rte/CGisItemRte.cpp
@@ -37,18 +37,11 @@ CGisItemRte::CGisItemRte(const CGisItemRte& parentRte, IGisProject * project, in
 {
     *this = parentRte;
 
-    icon = QPixmap("://icons/32x32/Route.png").scaled(22,22, Qt::KeepAspectRatio, Qt::SmoothTransformation);
-
-    setText(1, "*");
-    setText(0, rte.name);
-    setIcon(0, icon);
-    setToolTip(0, getInfo());
-
     key.clear();
     genKey();
 
-    project->setText(1,"*");
     setupHistory();
+    updateDecoration(eMarkChanged, eMarkNone);
 }
 
 /// used to create route from GPX file
@@ -58,13 +51,11 @@ CGisItemRte::CGisItemRte(const QDomNode& xml, IGisProject *parent)
 {
     // --- start read and process data ----
     readRte(xml, rte);    
-    icon = QPixmap("://icons/32x32/Route.png").scaled(22,22, Qt::KeepAspectRatio, Qt::SmoothTransformation);
     // --- stop read and process data ----
-    setText(0, rte.name);
-    setIcon(0, icon);
-    setToolTip(0,getInfo());
+
     genKey();
     setupHistory();
+    updateDecoration(eMarkNone, eMarkNone);
 }
 
 CGisItemRte::CGisItemRte(const history_t& hist, IGisProject * project)
@@ -82,17 +73,13 @@ CGisItemRte::~CGisItemRte()
 
 }
 
-
-void CGisItemRte::genKey()
+void CGisItemRte::setSymbol()
 {
-    if(key.isEmpty())
-    {
-        QCryptographicHash md5(QCryptographicHash::Md5);
-        md5.addData((const char*)&rte, sizeof(rte));
-        key = md5.result().toHex();
-    }
+    icon = QPixmap("://icons/32x32/Route.png").scaled(22,22, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+    setIcon(0, icon);
 }
 
+
 QString CGisItemRte::getInfo()
 {
     QString str = getName();
diff --git a/src/gis/rte/CGisItemRte.h b/src/gis/rte/CGisItemRte.h
index 5b615fa..4b8cc45 100644
--- a/src/gis/rte/CGisItemRte.h
+++ b/src/gis/rte/CGisItemRte.h
@@ -54,7 +54,7 @@ class CGisItemRte : public IGisItem, public IGisLine
 
     private:
         struct rte_t;
-        void genKey();
+        void setSymbol();
         void readRte(const QDomNode& xml, rte_t& rte);
 
         static QString keyUserFocus;
diff --git a/src/gis/search/CSearchGoogle.cpp b/src/gis/search/CSearchGoogle.cpp
index d644a21..f7548f4 100644
--- a/src/gis/search/CSearchGoogle.cpp
+++ b/src/gis/search/CSearchGoogle.cpp
@@ -30,7 +30,7 @@
 #include <QtXml>
 
 CSearchGoogle::CSearchGoogle(CGisListWks * parent)
-    : IGisProject("","", parent)
+    : IGisProject(eTypeGoogle, "", parent)
 {
     QPointF focus;
 
diff --git a/src/gis/trk/CDetailsTrk.cpp b/src/gis/trk/CDetailsTrk.cpp
index 23fa56a..dd6af46 100644
--- a/src/gis/trk/CDetailsTrk.cpp
+++ b/src/gis/trk/CDetailsTrk.cpp
@@ -19,6 +19,7 @@
 #include "gis/trk/CDetailsTrk.h"
 #include "helpers/CSettings.h"
 #include "helpers/CTextEditWidget.h"
+#include "helpers/CLinksDialog.h"
 #include "units/IUnit.h"
 #include "GeoMath.h"
 
@@ -76,15 +77,6 @@ CDetailsTrk::~CDetailsTrk()
     cfg.endGroup();
 }
 
-QString CDetailsTrk::toLink(bool isReadOnly, const QString& href, const QString& str)
-{
-    if(isReadOnly)
-    {
-        return QString("%1").arg(str);
-    }
-
-    return QString("<a href='%1'>%2</a>").arg(href).arg(str);
-}
 
 
 void CDetailsTrk::setupGui()
@@ -216,32 +208,7 @@ void CDetailsTrk::setupGui()
     lineName->setText(trk.getName());
 
     textCmtDesc->document()->clear();
-
-    foreach(const IGisItem::link_t& link, trk.getLinks())
-    {
-        QString str = QString("<p><a href='%1'>%2</a></p>").arg(link.uri.toString()).arg(link.text);
-        textCmtDesc->append(str);
-    }
-
-    textCmtDesc->append(toLink(isReadOnly, "comment", tr("<h4>Comment:</h4>")));
-    if(IGisItem::removeHtml(trk.getComment()).simplified().isEmpty())
-    {
-        textCmtDesc->append(tr("<p>--- no comment ---</p>"));
-    }
-    else
-    {
-        textCmtDesc->append(trk.getComment());
-    }
-
-    textCmtDesc->append(toLink(isReadOnly, "description", tr("<h4>Description:</h4>")));
-    if(IGisItem::removeHtml(trk.getDescription()).simplified().isEmpty())
-    {
-        textCmtDesc->append(tr("<p>--- no description ---</p>"));
-    }
-    else
-    {
-        textCmtDesc->append(trk.getDescription());
-    }
+    textCmtDesc->append(IGisItem::createText(isReadOnly, trk.getComment(), trk.getDescription(), trk.getLinks()));
     textCmtDesc->moveCursor (QTextCursor::Start) ;
     textCmtDesc->ensureCursorVisible() ;
 
@@ -387,6 +354,16 @@ void CDetailsTrk::slotLinkActivated(const QUrl& url)
             trk.setDescription(dlg.getHtml());
         }
     }
+    else if(url.toString() == "links")
+    {
+        QList<IGisItem::link_t> links = trk.getLinks();
+        CLinksDialog dlg(links, 0);
+        if(dlg.exec() == QDialog::Accepted)
+        {
+            trk.setLinks(links);
+        }
+        setupGui();
+    }
     else
     {
         QDesktopServices::openUrl(url);
diff --git a/src/gis/trk/CDetailsTrk.h b/src/gis/trk/CDetailsTrk.h
index f793ce2..105d0b5 100644
--- a/src/gis/trk/CDetailsTrk.h
+++ b/src/gis/trk/CDetailsTrk.h
@@ -47,9 +47,6 @@ class CDetailsTrk : public QWidget, private Ui::IDetailsTrk
         void slotLinkActivated(const QUrl& url);
 
     private:
-        QString toLink(bool isReadOnly, const QString& href, const QString& str);
-
-
         enum columns_t
         {
             eColNum
diff --git a/src/gis/trk/CGisItemTrk.cpp b/src/gis/trk/CGisItemTrk.cpp
index 031c5fe..e3d1e68 100644
--- a/src/gis/trk/CGisItemTrk.cpp
+++ b/src/gis/trk/CGisItemTrk.cpp
@@ -16,19 +16,19 @@
 
 **********************************************************************************************/
 
-#include "gis/trk/CGisItemTrk.h"
-#include "gis/trk/CScrOptTrk.h"
-#include "gis/trk/CDetailsTrk.h"
-#include "gis/trk/CCombineTrk.h"
-#include "gis/IGisProject.h"
+#include "CMainWindow.h"
+#include "GeoMath.h"
 #include "gis/CGisDraw.h"
 #include "gis/CGisWidget.h"
+#include "gis/IGisProject.h"
+#include "gis/trk/CCombineTrk.h"
+#include "gis/trk/CDetailsTrk.h"
+#include "gis/trk/CGisItemTrk.h"
+#include "gis/trk/CScrOptTrk.h"
 #include "plot/IPlot.h"
-#include "CMainWindow.h"
-#include "GeoMath.h"
 
-#include <QtXml>
 #include <QtWidgets>
+#include <QtXml>
 #include <proj_api.h>
 
 #define ASCEND_THRESHOLD    5
@@ -38,7 +38,7 @@
 
 const QColor CGisItemTrk::lineColors[TRK_N_COLORS] =
 {
-     Qt::black                    // 0
+    Qt::black                     // 0
     ,Qt::darkRed                 // 1
     ,Qt::darkGreen               // 2
     ,Qt::darkYellow              // 3
@@ -59,38 +59,37 @@ const QColor CGisItemTrk::lineColors[TRK_N_COLORS] =
 
 const QString CGisItemTrk::bulletColors[TRK_N_COLORS] =
 {
-
-                                 // 0
+    // 0
     QString("://icons/8x8/bullet_black.png")
-                                 // 1
+    // 1
     ,QString("://icons/8x8/bullet_dark_red.png")
-                                 // 2
+    // 2
     ,QString("://icons/8x8/bullet_dark_green.png")
-                                 // 3
+    // 3
     ,QString("://icons/8x8/bullet_dark_yellow.png")
-                                 // 4
+    // 4
     ,QString("://icons/8x8/bullet_dark_blue.png")
-                                 // 5
+    // 5
     ,QString("://icons/8x8/bullet_dark_magenta.png")
-                                 // 6
+    // 6
     ,QString("://icons/8x8/bullet_dark_cyan.png")
-                                 // 7
+    // 7
     ,QString("://icons/8x8/bullet_gray.png")
-                                 // 8
+    // 8
     ,QString("://icons/8x8/bullet_dark_gray.png")
-                                 // 9
+    // 9
     ,QString("://icons/8x8/bullet_red.png")
-                                 // 10
+    // 10
     ,QString("://icons/8x8/bullet_green.png")
-                                 // 11
+    // 11
     ,QString("://icons/8x8/bullet_yellow.png")
-                                 // 12
+    // 12
     ,QString("://icons/8x8/bullet_blue.png")
-                                 // 13
+    // 13
     ,QString("://icons/8x8/bullet_magenta.png")
-                                 // 14
+    // 14
     ,QString("://icons/8x8/bullet_cyan.png")
-                                 // 15
+    // 15
     ,QString("://icons/8x8/bullet_white.png")
     ,QString("")                 // 16
 };
@@ -111,10 +110,10 @@ CGisItemTrk::CGisItemTrk(const QString &name, qint32 idx1, qint32 idx2, const tr
 {
     flags = eFlagCreatedInQms;
 
-    foreach(const trkseg_t& srcseg, srctrk.segs)
+    foreach(const trkseg_t &srcseg, srctrk.segs)
     {
         trkseg_t seg;
-        foreach(const trkpt_t& srcpt, srcseg.pts)
+        foreach(const trkpt_t &srcpt, srcseg.pts)
         {
             if(srcpt.idxTotal < idx1)
             {
@@ -144,14 +143,9 @@ CGisItemTrk::CGisItemTrk(const QString &name, qint32 idx1, qint32 idx2, const tr
 
     deriveSecondaryData();
 
-    setColor(str2color(srctrk.color));
-    setText(1, "*");
-    setText(0, trk.name);
-    setToolTip(0, getInfo());
     genKey();
-
-    project->setText(1,"*");
     setupHistory();
+    updateDecoration(eMarkChanged, eMarkNone);
 }
 
 /// used to create a copy of track with new parent
@@ -164,13 +158,10 @@ CGisItemTrk::CGisItemTrk(const CGisItemTrk& parentTrk, IGisProject *project, int
 {
     *this = parentTrk;
 
-    setText(1, "*");
-    setText(0, trk.name);
-    setToolTip(0, getInfo());
     key.clear();
     genKey();
-    project->setText(1,"*");
     setupHistory();
+    updateDecoration(eMarkChanged, eMarkNone);
 }
 
 /// usd to create a track from a line of coordinates
@@ -187,12 +178,9 @@ CGisItemTrk::CGisItemTrk(const QPolygonF& l, const QString& name, IGisProject *
     flags |=  eFlagCreatedInQms|eFlagWriteAllowed;
 
     setColor(str2color(""));
-    setText(1, "*");
-    setText(0, trk.name);
-    setToolTip(0, getInfo());
     genKey();
-    project->setText(1,"*");
     setupHistory();
+    updateDecoration(eMarkChanged, eMarkNone);
 }
 
 /// used to create track from GPX file
@@ -202,16 +190,14 @@ CGisItemTrk::CGisItemTrk(const QDomNode& xml, IGisProject *project)
     , drawMode(eDrawNormal)
     , mouseMoveFocus(0)
     , mouseClickFocus(0)
-{        
+{
     // --- start read and process data ----
     setColor(penForeground.color());
     readTrk(xml, trk);
     // --- stop read and process data ----
-    setText(0, trk.name);
-    setToolTip(0, getInfo());
     genKey();
-
     setupHistory();
+    updateDecoration(eMarkNone, eMarkNone);
 }
 
 CGisItemTrk::CGisItemTrk(const history_t& hist, IGisProject * project)
@@ -240,19 +226,23 @@ CGisItemTrk::~CGisItemTrk()
         As the plot objects will unregister via unregisterPlot() in their
         destructor things will get a bit complicated here. Better create
         a copy of the list befor we start to delete.
-    */
+     */
     qDeleteAll(registeredPlots.toList());
 
     delete dlgDetails;
 }
 
+void CGisItemTrk::setSymbol()
+{
+    setColor(str2color(trk.color));
+}
 
 void CGisItemTrk::setDataFromPolyline(const QPolygonF &l)
 {
     /*
         as this will change the line significantly we better stop
         all focus operations and close the detail dialog.
-    */
+     */
     mouseClickFocus = 0;
     mouseMoveFocus  = 0;
     delete dlgDetails;
@@ -260,18 +250,15 @@ void CGisItemTrk::setDataFromPolyline(const QPolygonF &l)
     readTrackDataFromPolyLine(l);
 
     flags |= eFlagTainted;
-    setText(1,"*");
-    setToolTip(0, getInfo());
-    parent()->setText(1,"*");    
     changed(QObject::tr("Changed trackpoints, sacrificed all previous data."), "://icons/48x48/LineMove.png");
 }
 
 void CGisItemTrk::getPolylineFromData(QPolygonF &l)
 {
     l.clear();
-    foreach (const trkseg_t& seg, trk.segs)
+    foreach (const trkseg_t &seg, trk.segs)
     {
-        foreach(const trkpt_t& pt, seg.pts)
+        foreach(const trkpt_t &pt, seg.pts)
         {
             if(pt.flags & trkpt_t::eHidden)
             {
@@ -280,7 +267,6 @@ void CGisItemTrk::getPolylineFromData(QPolygonF &l)
             l << QPointF(pt.lon * DEG_TO_RAD, pt.lat * DEG_TO_RAD);
         }
     }
-
 }
 
 void CGisItemTrk::readTrackDataFromPolyLine(const QPolygonF &l)
@@ -318,24 +304,14 @@ void CGisItemTrk::unregisterPlot(IPlot * plot)
 }
 
 
-void CGisItemTrk::genKey()
-{
-    if(key.isEmpty())
-    {
-        QCryptographicHash md5(QCryptographicHash::Md5);
-        md5.addData((const char*)&trk, sizeof(trk));
-        key = md5.result().toHex();
-    }
-}
-
 
 QString CGisItemTrk::getInfo()
-{    
+{
     QString val1, unit1, val2, unit2;
     QString str = getName();
     if(cntVisiblePoints == 0)
     {
-        return str;
+        return(str);
     }
 
     IUnit::self().meter2distance(totalDistance, val1, unit1);
@@ -386,7 +362,7 @@ QString CGisItemTrk::getInfo()
     str += QObject::tr("Points: %1 (%2)").arg(cntVisiblePoints).arg(cntTotalPoints);
 
 
-    return str;
+    return(str);
 }
 
 QString CGisItemTrk::getInfoRange()
@@ -395,7 +371,7 @@ QString CGisItemTrk::getInfoRange()
     QString str, val, unit;
     if(mouseClickFocus == 0 || mouseMoveFocus == 0)
     {
-        return str;
+        return(str);
     }
 
     int idx1 = mouseClickFocus->idxTotal;
@@ -440,19 +416,18 @@ QString CGisItemTrk::getInfoRange()
     str += QString("%3 %1%2 (%4%5, %6%)").arg(val).arg(unit).arg(QChar(0x2198)).arg(qRound(slope1)).arg(QChar(0260)).arg(qRound(slope2));
 
 
-    return str;
+    return(str);
 }
 
 QString CGisItemTrk::getInfoTrkPt(const trkpt_t& pt)
 {
-
     QString str, val1, unit1;
     str += IUnit::datetime2string(pt.time, false, QPointF(pt.lon, pt.lat) * DEG_TO_RAD) + "\n";
     IUnit::self().meter2elevation(pt.ele, val1, unit1);
     str += QObject::tr("Ele.: %1 %2").arg(val1).arg(unit1);
     if(pt.slope1 != NOFLOAT)
     {
-        str += QObject::tr(" slope: %1° (%2%)").arg(pt.slope1,2,'f',0).arg(pt.slope2, 2,'f',0);
+        str += QObject::tr(" slope: %1%3 (%2%)").arg(pt.slope1, 2, 'f', 0).arg(pt.slope2, 2, 'f', 0).arg(QChar(0260));
     }
     if(pt.speed != NOFLOAT)
     {
@@ -460,7 +435,7 @@ QString CGisItemTrk::getInfoTrkPt(const trkpt_t& pt)
         str += QObject::tr(" speed: %1%2").arg(val1).arg(unit1);
     }
 
-    return str;
+    return(str);
 }
 
 QString CGisItemTrk::getInfoProgress(const trkpt_t& pt)
@@ -507,7 +482,7 @@ QString CGisItemTrk::getInfoProgress(const trkpt_t& pt)
         str += QObject::tr(" Moving: - (-) ");
     }
 
-    return str;
+    return(str);
 }
 
 IScrOpt * CGisItemTrk::getScreenOptions(const QPoint& origin, IMouse * mouse)
@@ -516,15 +491,15 @@ IScrOpt * CGisItemTrk::getScreenOptions(const QPoint& origin, IMouse * mouse)
     {
         scrOpt = new CScrOptTrk(this, origin, mouse);
     }
-    return scrOpt;
+    return(scrOpt);
 }
 
 QPointF CGisItemTrk::getPointCloseBy(const QPoint& screenPos)
 {
     qint32 i    = 0;
     qint32 idx  = -1;
-    qint32  d   = NOINT;
-    foreach(const QPointF& point, lineSimple)
+    qint32 d   = NOINT;
+    foreach(const QPointF &point, lineSimple)
     {
         int tmp = (screenPos - point).manhattanLength();
         if(tmp < d)
@@ -537,20 +512,19 @@ QPointF CGisItemTrk::getPointCloseBy(const QPoint& screenPos)
 
     if(idx < 0)
     {
-        return NOPOINTF;
+        return(NOPOINTF);
     }
 
     const trkpt_t * newPointOfFocus = getVisibleTrkPtByIndex(idx);
     publishMouseFocus(newPointOfFocus, eFocusMouseClick, 0);
 
-    return lineSimple[idx];
+    return(lineSimple[idx]);
 }
 
 
 
 void CGisItemTrk::deriveSecondaryData()
 {
-
     qreal north = -90;
     qreal east  = -180;
     qreal south =  90;
@@ -606,10 +580,22 @@ void CGisItemTrk::deriveSecondaryData()
             }
             trkpt.idxVisible = cntVisiblePoints++;
 
-            if(trkpt.lon < west)  west    = trkpt.lon;
-            if(trkpt.lon > east)  east    = trkpt.lon;
-            if(trkpt.lat < south) south   = trkpt.lat;
-            if(trkpt.lat > north) north   = trkpt.lat;
+            if(trkpt.lon < west)
+            {
+                west    = trkpt.lon;
+            }
+            if(trkpt.lon > east)
+            {
+                east    = trkpt.lon;
+            }
+            if(trkpt.lat < south)
+            {
+                south   = trkpt.lat;
+            }
+            if(trkpt.lat > north)
+            {
+                north   = trkpt.lat;
+            }
 
             if(lastTrkpt != 0)
             {
@@ -620,7 +606,6 @@ void CGisItemTrk::deriveSecondaryData()
                 // ascend descend
                 if(lastEle != NOFLOAT)
                 {
-
                     qreal delta     = trkpt.ele - lastEle;
                     qreal absDelta  = qAbs(delta);
 
@@ -655,7 +640,6 @@ void CGisItemTrk::deriveSecondaryData()
                 {
                     trkpt.elapsedSecondsMoving = lastTrkpt->elapsedSecondsMoving;
                 }
-
             }
             else
             {
@@ -770,25 +754,23 @@ void CGisItemTrk::deriveSecondaryData()
 //    qDebug() << "totalDescend" << totalDescend;
 //    qDebug() << "totalElapsedSeconds" << totalElapsedSeconds;
 //    qDebug() << "totalElapsedSecondsMoving" << totalElapsedSecondsMoving;
-
-
 }
 
 
 bool CGisItemTrk::isCloseTo(const QPointF& pos)
 {
-    foreach(const QPointF& pt, lineSimple)
+    foreach(const QPointF &pt, lineSimple)
     {
         if((pt - pos).manhattanLength() < MIN_DIST_CLOSE_TO)
         {
-            return true;
+            return(true);
         }
     }
-    return false;
+    return(false);
 }
 
 void CGisItemTrk::gainUserFocus(bool yes)
-{    
+{
     keyUserFocus = yes ? key : "";
 }
 
@@ -796,8 +778,8 @@ void CGisItemTrk::edit()
 {
     if(dlgDetails.isNull())
     {
-       dlgDetails = new CDetailsTrk(*this, 0);
-       dlgDetails->setObjectName(getName());
+        dlgDetails = new CDetailsTrk(*this, 0);
+        dlgDetails->setObjectName(getName());
     }
 
     CMainWindow::self().addWidgetToTab(dlgDetails);
@@ -808,20 +790,20 @@ bool CGisItemTrk::cut()
 {
     if(mouseClickFocus == 0)
     {
-        return false;
+        return(false);
     }
 
     IGisProject * project = dynamic_cast<IGisProject*>(parent());
     if(project == 0)
     {
-        return false;
+        return(false);
     }
 
     QString name1 = getName() + QString(" (%1 - %2)").arg(0).arg(mouseClickFocus->idxTotal);
     name1 = QInputDialog::getText(0, QObject::tr("Edit name..."), QObject::tr("Enter new track name."), QLineEdit::Normal, name1);
     if(name1.isEmpty())
     {
-        return false;
+        return(false);
     }
     new CGisItemTrk(name1, 0, mouseClickFocus->idxTotal, trk, project);
 
@@ -829,11 +811,11 @@ bool CGisItemTrk::cut()
     name1 = QInputDialog::getText(0, QObject::tr("Edit name..."), QObject::tr("Enter new track name."), QLineEdit::Normal, name1);
     if(name1.isEmpty())
     {
-        return false;
+        return(false);
     }
     new CGisItemTrk(name1, mouseClickFocus->idxTotal, cntTotalPoints-1, trk, project);
 
-    return true;
+    return(true);
 }
 
 void CGisItemTrk::reverse()
@@ -854,10 +836,10 @@ void CGisItemTrk::reverse()
 
     trk1->trk.name = name1;
     trk1->trk.segs.clear();
-    foreach(const trkseg_t& seg, trk.segs)
+    foreach(const trkseg_t &seg, trk.segs)
     {
         trkseg_t seg1;
-        foreach(const trkpt_t& pt, seg.pts)
+        foreach(const trkpt_t &pt, seg.pts)
         {
             trkpt_t pt1     = pt;
             pt1.time        = QDateTime();
@@ -867,11 +849,7 @@ void CGisItemTrk::reverse()
         trk1->trk.segs.push_front(seg1);
     }
     trk1->deriveSecondaryData();
-    trk1->setText(0, trk1->getName());
-    trk1->setToolTip(0, trk1->getInfo());
-    trk1->setText(1,"*");
-    project->setText(1,"*");
-
+    trk1->updateDecoration(eMarkChanged, eMarkNone);
 }
 
 void CGisItemTrk::combine()
@@ -901,7 +879,7 @@ void CGisItemTrk::combine()
 
     trk1->trk.name = name1;
     trk1->trk.segs.clear();
-    foreach(const QString& key, keys)
+    foreach(const QString &key, keys)
     {
         CGisItemTrk * trk2 = dynamic_cast<CGisItemTrk*>(project->getItemByKey(key));
         if(trk2 == 0)
@@ -913,16 +891,11 @@ void CGisItemTrk::combine()
     }
 
     trk1->deriveSecondaryData();
-    trk1->setText(0, trk1->getName());
-    trk1->setToolTip(0, trk1->getInfo());
-    trk1->setText(1,"*");
-    project->setText(1,"*");
-
+    trk1->updateDecoration(eMarkChanged, eMarkNone);
 }
 
 void CGisItemTrk::hideSelectedPoints()
 {
-
     if((mouseClickFocus == 0) && (mouseMoveFocus == 0))
     {
         return;
@@ -963,7 +936,7 @@ void CGisItemTrk::hideSelectedPoints()
     }
     mouseClickFocus = 0;
     mouseMoveFocus  = 0;
-    deriveSecondaryData();    
+    deriveSecondaryData();
     changed(QObject::tr("Hide points."), "://icons/48x48/PointHide.png");
 }
 
@@ -1051,9 +1024,9 @@ void CGisItemTrk::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &b
     if(drawMode == eDrawNormal)
     {
         // in normal mode the trackline without points marked as deleted is drawn
-        foreach (const trkseg_t& seg, trk.segs)
+        foreach (const trkseg_t &seg, trk.segs)
         {
-            foreach(const trkpt_t& pt, seg.pts)
+            foreach(const trkpt_t &pt, seg.pts)
             {
                 if(pt.flags & trkpt_t::eHidden)
                 {
@@ -1072,9 +1045,9 @@ void CGisItemTrk::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &b
         // in full mode the complete track including points marked as deleted
         // is drawn as gray line first. Then the track without points marked as
         // deleted is drawn with it's configured color
-        foreach (const trkseg_t& seg, trk.segs)
+        foreach (const trkseg_t &seg, trk.segs)
         {
-            foreach(const trkpt_t& pt, seg.pts)
+            foreach(const trkpt_t &pt, seg.pts)
             {
                 pt1.setX(pt.lon);
                 pt1.setY(pt.lat);
@@ -1102,20 +1075,19 @@ void CGisItemTrk::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &b
 
         p.setPen(QPen(Qt::lightGray,5,Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
 
-        foreach(const QPolygonF& l, lines)
+        foreach(const QPolygonF &l, lines)
         {
             p.drawPolyline(l);
         }
 
         QPixmap bullet("://icons/8x8/bullet_dark_gray.png");
-        foreach(const QPolygonF& l, lines)
+        foreach(const QPolygonF &l, lines)
         {
-            foreach(const QPointF& pt, l)
+            foreach(const QPointF &pt, l)
             {
                 p.drawPixmap(pt.x() - 3, pt.y() - 3, bullet);
             }
         }
-
     }
     // -------------------------
 
@@ -1126,7 +1098,7 @@ void CGisItemTrk::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &b
     if(key == keyUserFocus)
     {
         p.setPen(QPen(Qt::red,11,Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
-        foreach(const QPolygonF& l, lines)
+        foreach(const QPolygonF &l, lines)
         {
             p.drawPolyline(l);
         }
@@ -1134,14 +1106,14 @@ void CGisItemTrk::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &b
 
     p.setBrush(color);
     p.setPen(penBackground);
-    foreach(const QPolygonF& l, lines)
+    foreach(const QPolygonF &l, lines)
     {
         p.drawPolyline(l);
         drawArrows(l, extViewport, p);
     }
     penForeground.setColor(color);
     p.setPen(penForeground);
-    foreach(const QPolygonF& l, lines)
+    foreach(const QPolygonF &l, lines)
     {
         p.drawPolyline(l);
     }
@@ -1275,7 +1247,7 @@ void CGisItemTrk::drawRange(QPainter& p)
 
         p.setPen(QPen(Qt::red, 12, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
         p.drawPolyline(line);
-        foreach(const QPointF& pt, line)
+        foreach(const QPointF &pt, line)
         {
             p.drawPixmap(pt.x() - 3, pt.y() - 3, bullet);
         }
@@ -1301,6 +1273,13 @@ void CGisItemTrk::setDescription(const QString& str)
     changed(QObject::tr("Changed description"), "://icons/48x48/EditText.png");
 }
 
+void CGisItemTrk::setLinks(const QList<link_t>& links)
+{
+    trk.links = links;
+    changed(QObject::tr("Changed links"), "://icons/48x48/Link.png");
+}
+
+
 void CGisItemTrk::setColor(int idx)
 {
     int N = sizeof(lineColors)/sizeof(QColor);
@@ -1363,9 +1342,9 @@ void CGisItemTrk::setMouseFocusByDistance(qreal dist, focusmode_e mode, IPlot *i
 
         /// @todo: optimze search by single out segment and then do a binary search
 
-        foreach (const trkseg_t& seg, trk.segs)
+        foreach (const trkseg_t &seg, trk.segs)
         {
-            foreach(const trkpt_t& pt, seg.pts)
+            foreach(const trkpt_t &pt, seg.pts)
             {
                 if(pt.flags & trkpt_t::eHidden)
                 {
@@ -1382,12 +1361,11 @@ void CGisItemTrk::setMouseFocusByDistance(qreal dist, focusmode_e mode, IPlot *i
                 {
                     break;
                 }
-            }            
+            }
         }
     }
 
     publishMouseFocus(newPointOfFocus, mode, initiator);
-
 }
 
 void CGisItemTrk::setMouseFocusByTime(quint32 time, focusmode_e mode, IPlot * initiator)
@@ -1400,9 +1378,9 @@ void CGisItemTrk::setMouseFocusByTime(quint32 time, focusmode_e mode, IPlot * in
 
         qreal delta = totalElapsedSeconds;
 
-        foreach (const trkseg_t& seg, trk.segs)
+        foreach (const trkseg_t &seg, trk.segs)
         {
-            foreach(const trkpt_t& pt, seg.pts)
+            foreach(const trkpt_t &pt, seg.pts)
             {
                 if(pt.flags & trkpt_t::eHidden)
                 {
@@ -1424,7 +1402,6 @@ void CGisItemTrk::setMouseFocusByTime(quint32 time, focusmode_e mode, IPlot * in
     }
 
     publishMouseFocus(newPointOfFocus, mode, initiator);
-
 }
 
 QPointF CGisItemTrk::setMouseFocusByPoint(const QPoint& pt, focusmode_e mode)
@@ -1441,11 +1418,11 @@ QPointF CGisItemTrk::setMouseFocusByPoint(const QPoint& pt, focusmode_e mode)
             into the polyline cant't be used directly. In a second step we have
             to iterate over all segments and visible points of the trk_t object
             until the visible index is reached. This is done by getVisibleTrkPtByIndex().
-        */
+         */
 
         quint32 i = 0;
         qint32 d  = NOINT;
-        foreach(const QPointF& point, lineSimple)
+        foreach(const QPointF &point, lineSimple)
         {
             int tmp = (pt - point).manhattanLength();
             if(tmp < d)
@@ -1463,7 +1440,7 @@ QPointF CGisItemTrk::setMouseFocusByPoint(const QPoint& pt, focusmode_e mode)
     }
     publishMouseFocus(newPointOfFocus, mode, 0);
 
-    return newPointOfFocus ? lineSimple[idx] : NOPOINTF;
+    return(newPointOfFocus ? lineSimple[idx] : NOPOINTF);
 }
 
 
@@ -1471,9 +1448,9 @@ void CGisItemTrk::setMouseFocusByIndex(qint32 idx, focusmode_e mode)
 {
     const trkpt_t * newPointOfFocus = 0;
 
-    foreach (const trkseg_t& seg, trk.segs)
+    foreach (const trkseg_t &seg, trk.segs)
     {
-        foreach(const trkpt_t& pt, seg.pts)
+        foreach(const trkpt_t &pt, seg.pts)
         {
             if(pt.idxTotal == idx)
             {
@@ -1488,9 +1465,9 @@ void CGisItemTrk::setMouseFocusByIndex(qint32 idx, focusmode_e mode)
 const CGisItemTrk::trkpt_t * CGisItemTrk::getVisibleTrkPtByIndex(quint32 idx)
 {
     quint32 i = 0;
-    foreach (const trkseg_t& seg, trk.segs)
+    foreach (const trkseg_t &seg, trk.segs)
     {
-        foreach(const trkpt_t& pt, seg.pts)
+        foreach(const trkpt_t &pt, seg.pts)
         {
             if(pt.flags & trkpt_t::eHidden)
             {
@@ -1498,12 +1475,12 @@ const CGisItemTrk::trkpt_t * CGisItemTrk::getVisibleTrkPtByIndex(quint32 idx)
             }
             if(i == idx)
             {
-                return &pt;
+                return(&pt);
             }
             i++;
         }
     }
-    return 0;
+    return(0);
 }
 
 
@@ -1512,35 +1489,36 @@ void CGisItemTrk::publishMouseFocus(const trkpt_t * pt, focusmode_e mode,  IPlot
 {
     switch(mode)
     {
-        case eFocusMouseMove:
-            if(pt != mouseMoveFocus)
+    case eFocusMouseMove:
+        if(pt != mouseMoveFocus)
+        {
+            mouseMoveFocus = pt;
+            foreach(IPlot * plot, registeredPlots)
             {
-                mouseMoveFocus = pt;
-                foreach(IPlot * plot, registeredPlots)
+                if(plot != initiator)
                 {
-                    if(plot != initiator)
-                    {
-                        plot->setMouseMoveFocus(mouseMoveFocus);
-                    }
+                    plot->setMouseMoveFocus(mouseMoveFocus);
                 }
+            }
 
-                if(!dlgDetails.isNull())
-                {
-                    dlgDetails->setMouseMoveFocus(mouseMoveFocus);
-                }
+            if(!dlgDetails.isNull())
+            {
+                dlgDetails->setMouseMoveFocus(mouseMoveFocus);
             }
-            break;
-        case eFocusMouseClick:
-            if(pt != mouseClickFocus)
+        }
+        break;
+
+    case eFocusMouseClick:
+        if(pt != mouseClickFocus)
+        {
+            mouseClickFocus = pt;
+            if(!dlgDetails.isNull())
             {
-                mouseClickFocus = pt;
-                if(!dlgDetails.isNull())
-                {
-                    dlgDetails->setMouseClickFocus(mouseClickFocus);
-                }
+                dlgDetails->setMouseClickFocus(mouseClickFocus);
             }
+        }
 
-        default:;
+    default:;
     }
 }
 
diff --git a/src/gis/trk/CGisItemTrk.h b/src/gis/trk/CGisItemTrk.h
index e12c45c..361bf6b 100644
--- a/src/gis/trk/CGisItemTrk.h
+++ b/src/gis/trk/CGisItemTrk.h
@@ -78,6 +78,7 @@ class CGisItemTrk : public IGisItem, public IGisLine
         void setDrawMode(drawmode_e mode){drawMode = mode;}
         void setComment(const QString& str);
         void setDescription(const QString& str);
+        void setLinks(const QList<link_t>& links);
         void setDataFromPolyline(const QPolygonF& l);
 
         IScrOpt * getScreenOptions(const QPoint &origin, IMouse * mouse);
@@ -219,7 +220,7 @@ class CGisItemTrk : public IGisItem, public IGisLine
         static const QString bulletColors[TRK_N_COLORS];
 
     private:        
-        void genKey();
+        void setSymbol();
         /**
            @brief Read track data from section in GPX file
            @param xml   The XML <trk> section
diff --git a/src/gis/wpt/CDetailsWpt.cpp b/src/gis/wpt/CDetailsWpt.cpp
index 633e5bf..7d4feea 100644
--- a/src/gis/wpt/CDetailsWpt.cpp
+++ b/src/gis/wpt/CDetailsWpt.cpp
@@ -25,6 +25,7 @@
 #include "helpers/CWptIconDialog.h"
 #include "helpers/CTextEditWidget.h"
 #include "helpers/CElevationDialog.h"
+#include "helpers/CLinksDialog.h"
 
 
 #include <QtWidgets>
@@ -53,15 +54,6 @@ CDetailsWpt::~CDetailsWpt()
 
 }
 
-QString CDetailsWpt::toLink(bool isReadOnly, const QString& href, const QString& str)
-{
-    if(isReadOnly)
-    {
-        return QString("%1").arg(str);
-    }
-
-    return QString("<a href='%1'>%2</a>").arg(href).arg(str);
-}
 
 void CDetailsWpt::setupGui()
 {
@@ -82,8 +74,8 @@ void CDetailsWpt::setupGui()
 
     toolIcon->setIcon(wpt.getIcon());
     toolIcon->setObjectName(wpt.getIconName());   
-    labelName->setText(toLink(isReadOnly, "name", wpt.getName()));
-    labelPositon->setText(toLink(isReadOnly, "position", strPos));
+    labelName->setText(IGisItem::toLink(isReadOnly, "name", wpt.getName()));
+    labelPositon->setText(IGisItem::toLink(isReadOnly, "position", strPos));
 
     if(wpt.isTainted())
     {
@@ -97,21 +89,21 @@ void CDetailsWpt::setupGui()
     if(wpt.getElevation() != NOINT)
     {
         IUnit::self().meter2elevation(wpt.getElevation(), val, unit);
-        labelElevation->setText(toLink(isReadOnly, "elevation", QString("%1 %2").arg(val).arg(unit)));
+        labelElevation->setText(IGisItem::toLink(isReadOnly, "elevation", QString("%1 %2").arg(val).arg(unit)));
     }
     else
     {
-        labelElevation->setText(toLink(isReadOnly, "elevation", "--"));
+        labelElevation->setText(IGisItem::toLink(isReadOnly, "elevation", "--"));
     }
 
     if(wpt.getProximity() != NOFLOAT)
     {
         IUnit::self().meter2elevation(wpt.getProximity(), val, unit);
-        labelProximity->setText(toLink(isReadOnly, "proximity", QString("%1 %2").arg(val).arg(unit)));
+        labelProximity->setText(IGisItem::toLink(isReadOnly, "proximity", QString("%1 %2").arg(val).arg(unit)));
     }
     else
     {
-        labelProximity->setText(toLink(isReadOnly, "proximity", "--"));
+        labelProximity->setText(IGisItem::toLink(isReadOnly, "proximity", "--"));
     }
 
     if(wpt.getTime().isValid())
@@ -120,32 +112,7 @@ void CDetailsWpt::setupGui()
     }
 
     textCmtDesc->document()->clear();
-
-    foreach(const IGisItem::link_t& link, wpt.getLinks())
-    {
-        QString str = QString("<p><a href='%1'>%2</a></p>").arg(link.uri.toString()).arg(link.text);
-        textCmtDesc->append(str);
-    }
-
-    textCmtDesc->append(toLink(isReadOnly, "comment", tr("<h4>Comment:</h4>")));
-    if(IGisItem::removeHtml(wpt.getComment()).simplified().isEmpty())
-    {
-        textCmtDesc->append(tr("<p>--- no comment ---</p>"));
-    }
-    else
-    {
-        textCmtDesc->append(wpt.getComment());
-    }
-
-    textCmtDesc->append(toLink(isReadOnly, "description", tr("<h4>Description:</h4>")));
-    if(IGisItem::removeHtml(wpt.getDescription()).simplified().isEmpty())
-    {
-        textCmtDesc->append(tr("<p>--- no description ---</p>"));
-    }
-    else
-    {
-        textCmtDesc->append(wpt.getDescription());
-    }
+    textCmtDesc->append(IGisItem::createText(isReadOnly, wpt.getComment(), wpt.getDescription(), wpt.getLinks()));
     textCmtDesc->moveCursor (QTextCursor::Start) ;
     textCmtDesc->ensureCursorVisible() ;
 
@@ -221,6 +188,16 @@ void CDetailsWpt::slotLinkActivated(const QUrl& url)
         }
         setupGui();
     }
+    else if(url.toString() == "links")
+    {
+        QList<IGisItem::link_t> links = wpt.getLinks();
+        CLinksDialog dlg(links, 0);
+        if(dlg.exec() == QDialog::Accepted)
+        {
+            wpt.setLinks(links);
+        }
+        setupGui();
+    }
     else
     {
         QDesktopServices::openUrl(url);
diff --git a/src/gis/wpt/CDetailsWpt.h b/src/gis/wpt/CDetailsWpt.h
index 0963673..e08460b 100644
--- a/src/gis/wpt/CDetailsWpt.h
+++ b/src/gis/wpt/CDetailsWpt.h
@@ -39,7 +39,6 @@ class CDetailsWpt : public QDialog, private Ui::IDetailsWpt
         void setupGui();
 
     private:        
-        QString toLink(bool isReadOnly, const QString& href, const QString& str);
         CGisItemWpt& wpt;
 
         bool originator;
diff --git a/src/gis/wpt/CGisItemWpt.cpp b/src/gis/wpt/CGisItemWpt.cpp
index dcbc45c..7719d33 100644
--- a/src/gis/wpt/CGisItemWpt.cpp
+++ b/src/gis/wpt/CGisItemWpt.cpp
@@ -58,14 +58,10 @@ CGisItemWpt::CGisItemWpt(const QPointF& pos, const QString& name, const QString
     wpt.ele = (ele == NOFLOAT) ? NOINT : qRound(ele);
 
     boundingRect = QRectF(QPointF(wpt.lon,wpt.lat)*DEG_TO_RAD,QPointF(wpt.lon,wpt.lat)*DEG_TO_RAD);
-    setText(1, "*");
-    setText(0, wpt.name);
-    setIcon();
-    setToolTip(0, getInfo());
-    genKey();
 
-    project->setText(1,"*");
+    genKey();
     setupHistory();
+    updateDecoration(eMarkChanged, eMarkNone);
 }
 
 /// used to move a copy of waypoint
@@ -86,14 +82,10 @@ CGisItemWpt::CGisItemWpt(const QPointF& pos, const CGisItemWpt& parentWpt, IGisP
     wpt.ele = (ele == NOFLOAT) ? NOINT : qRound(ele);
 
     boundingRect = QRectF(QPointF(wpt.lon,wpt.lat)*DEG_TO_RAD,QPointF(wpt.lon,wpt.lat)*DEG_TO_RAD);
-    setText(1, "*");
-    setText(0, wpt.name);
-    setIcon();
-    setToolTip(0, getInfo());
-    genKey();
 
-    project->setText(1,"*");
+    genKey();
     setupHistory();
+    updateDecoration(eMarkChanged, eMarkNone);
 }
 
 /// used to create a copy of waypoint with new parent
@@ -103,16 +95,11 @@ CGisItemWpt::CGisItemWpt(const CGisItemWpt &parentWpt, IGisProject *project, int
     , posScreen(NOPOINTF)
 {
     *this = parentWpt;
-    setText(1, "*");
-    setText(0, wpt.name);
-    setIcon();
-    setToolTip(0, getInfo());
 
     key.clear();
     genKey();
-
-    project->setText(1,"*");
     setupHistory();
+    updateDecoration(eMarkChanged, eMarkNone);
 }
 
 /// used to create waypoint from GPX file
@@ -123,11 +110,10 @@ CGisItemWpt::CGisItemWpt(const QDomNode &xml, IGisProject *project)
 {
     readGpx(xml);
     boundingRect = QRectF(QPointF(wpt.lon,wpt.lat)*DEG_TO_RAD,QPointF(wpt.lon,wpt.lat)*DEG_TO_RAD);
-    setText(0, wpt.name);
-    setIcon();
-    setToolTip(0, getInfo());
+
     genKey();
     setupHistory();
+    updateDecoration(eMarkNone, eMarkNone);
 }
 
 CGisItemWpt::CGisItemWpt(const history_t& hist, IGisProject * project)
@@ -146,16 +132,12 @@ CGisItemWpt::~CGisItemWpt()
 
 }
 
-void CGisItemWpt::genKey()
+void CGisItemWpt::setSymbol()
 {
-    if(key.isEmpty())
-    {
-        QCryptographicHash md5(QCryptographicHash::Md5);
-        md5.addData((const char*)&wpt, sizeof(wpt));
-        key = md5.result().toHex();
-    }
+    setIcon();
 }
 
+
 const QString& CGisItemWpt::getNewName()
 {
     const int s = lastName.size();
@@ -325,7 +307,6 @@ void CGisItemWpt::setIcon(const QString& name)
 {    
     lastIcon = name;
     wpt.sym  = name;
-    setIcon();
 
     QPointF focus;
     QString path;
@@ -346,7 +327,11 @@ void CGisItemWpt::setDescription(const QString& str)
     changed(QObject::tr("Changed description"), "://icons/48x48/EditText.png");
 }
 
-
+void CGisItemWpt::setLinks(const QList<link_t>& links)
+{
+    wpt.links = links;
+    changed(QObject::tr("Changed links"), "://icons/48x48/Link.png");
+}
 
 
 bool CGisItemWpt::isCloseTo(const QPointF& pos)
diff --git a/src/gis/wpt/CGisItemWpt.h b/src/gis/wpt/CGisItemWpt.h
index cc52b7d..35aeba0 100644
--- a/src/gis/wpt/CGisItemWpt.h
+++ b/src/gis/wpt/CGisItemWpt.h
@@ -129,6 +129,7 @@ class CGisItemWpt : public IGisItem
         void setIcon(const QString& name);
         void setComment(const QString& str);
         void setDescription(const QString& str);
+        void setLinks(const QList<link_t>& links);
 
         const QString& getName(){return wpt.name;}
         QString getInfo();
@@ -159,7 +160,7 @@ class CGisItemWpt : public IGisItem
         static void getNewPosition(QPointF &pos);
 
     private:
-        void genKey();
+        void setSymbol();
         void readGpx(const QDomNode& xml);
         void setIcon();
         void readGcExt(const QDomNode& xmlCache);
diff --git a/src/helpers/CHistoryListWidget.cpp b/src/helpers/CHistoryListWidget.cpp
index 351f4bd..1ec3fea 100644
--- a/src/helpers/CHistoryListWidget.cpp
+++ b/src/helpers/CHistoryListWidget.cpp
@@ -82,8 +82,7 @@ void CHistoryListWidget::slotSelectionChanged()
     }
 
     item->loadHistory(currentRow());
-    item->setText(1,"*");
-    item->parent()->setText(1,"*");
+    item->updateDecoration(IGisItem::eMarkChanged, IGisItem::eMarkNone);
 
     emit sigChanged();
 }
diff --git a/src/helpers/CLinksDialog.cpp b/src/helpers/CLinksDialog.cpp
new file mode 100644
index 0000000..f168327
--- /dev/null
+++ b/src/helpers/CLinksDialog.cpp
@@ -0,0 +1,87 @@
+/**********************************************************************************************
+    Copyright (C) 2014 Oliver Eichler oliver.eichler at gmx.de
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+**********************************************************************************************/
+
+#include "CLinksDialog.h"
+
+#include <QtWidgets>
+
+CLinksDialog::CLinksDialog(QList<IGisItem::link_t> &links, QWidget *parent)
+    : QDialog(parent)
+    , links(links)
+{
+    setupUi(this);
+
+    connect(toolAdd, SIGNAL(clicked()), this, SLOT(slotAddLink()));
+    connect(toolDelete, SIGNAL(clicked()), this, SLOT(slotDelLink()));
+    connect(treeWidget, SIGNAL(itemSelectionChanged()), this, SLOT(slotItemSelectionChanged()));
+
+    foreach(const IGisItem::link_t& link, links)
+    {
+        QTreeWidgetItem * item = new QTreeWidgetItem(treeWidget);
+        item->setText(0, link.type);
+        item->setText(1, link.text);
+        item->setText(2, link.uri.toString());
+        item->setFlags(item->flags()|Qt::ItemIsEditable);
+    }
+
+}
+
+CLinksDialog::~CLinksDialog()
+{
+
+}
+
+void CLinksDialog::slotItemSelectionChanged()
+{
+    QList<QTreeWidgetItem*> items = treeWidget->selectedItems();
+    toolDelete->setEnabled(!items.isEmpty());
+}
+
+void CLinksDialog::slotAddLink()
+{
+    QTreeWidgetItem * item = new QTreeWidgetItem(treeWidget);
+    item->setText(0, "");
+    item->setText(1, "enter a text");
+    item->setText(2, "enter a link");
+    item->setFlags(item->flags()|Qt::ItemIsEditable);
+}
+
+void CLinksDialog::slotDelLink()
+{
+    QList<QTreeWidgetItem *> items = treeWidget->selectedItems();
+    qDeleteAll(items);
+}
+
+void CLinksDialog::accept()
+{
+    links.clear();
+
+    for(int i = 0; i < treeWidget->topLevelItemCount(); i++)
+    {
+        QTreeWidgetItem * item = treeWidget->topLevelItem(i);
+
+        IGisItem::link_t link;
+        link.type = item->text(0);
+        link.text = item->text(1);
+        link.uri  = item->text(2);
+
+        links << link;
+    }
+
+    QDialog::accept();
+}
diff --git a/src/gis/bin/CBinProject.h b/src/helpers/CLinksDialog.h
similarity index 63%
rename from src/gis/bin/CBinProject.h
rename to src/helpers/CLinksDialog.h
index 6302d3e..be89600 100644
--- a/src/gis/bin/CBinProject.h
+++ b/src/helpers/CLinksDialog.h
@@ -16,24 +16,31 @@
 
 **********************************************************************************************/
 
-#ifndef CBINPROJECT_H
-#define CBINPROJECT_H
+#ifndef CLINKSDIALOG_H
+#define CLINKSDIALOG_H
 
-#include "gis/IGisProject.h"
+#include "gis/IGisItem.h"
+#include <QDialog>
+#include "ui_ILinksDialog.h"
 
-class CBinProject : public IGisProject
+class CLinksDialog : public QDialog, private Ui::ILinksDialog
 {
+    Q_OBJECT
     public:
-        CBinProject(const QString &name,  CGisListWks * parent);
-        CBinProject(const QString& filename, const QString &key, CGisListWks * parent);
-        virtual ~CBinProject();
+        CLinksDialog(QList<IGisItem::link_t>& links, QWidget * parent);
+        virtual ~CLinksDialog();
 
-        void save();
-        void saveAs();
+    public slots:
+        void accept();
 
-        static void saveAs(const QString& fn, IGisProject& project);
+    private slots:
+        void slotAddLink();
+        void slotDelLink();
+        void slotItemSelectionChanged();
 
+    private:
+        QList<IGisItem::link_t>& links;
 };
 
-#endif //CBINPROJECT_H
+#endif //CLINKSDIALOG_H
 
diff --git a/src/helpers/ILinksDialog.ui b/src/helpers/ILinksDialog.ui
new file mode 100644
index 0000000..f145227
--- /dev/null
+++ b/src/helpers/ILinksDialog.ui
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ILinksDialog</class>
+ <widget class="QDialog" name="ILinksDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>700</width>
+    <height>150</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Links...</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_2">
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QTreeWidget" name="treeWidget">
+       <column>
+        <property name="text">
+         <string>Type</string>
+        </property>
+       </column>
+       <column>
+        <property name="text">
+         <string>Text</string>
+        </property>
+       </column>
+       <column>
+        <property name="text">
+         <string>Uri</string>
+        </property>
+       </column>
+      </widget>
+     </item>
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout">
+       <item>
+        <widget class="QToolButton" name="toolAdd">
+         <property name="text">
+          <string>...</string>
+         </property>
+         <property name="icon">
+          <iconset resource="../resources.qrc">
+           <normaloff>:/icons/32x32/Add.png</normaloff>:/icons/32x32/Add.png</iconset>
+         </property>
+         <property name="iconSize">
+          <size>
+           <width>32</width>
+           <height>32</height>
+          </size>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QToolButton" name="toolDelete">
+         <property name="enabled">
+          <bool>false</bool>
+         </property>
+         <property name="text">
+          <string>...</string>
+         </property>
+         <property name="icon">
+          <iconset resource="../resources.qrc">
+           <normaloff>:/icons/32x32/DeleteOne.png</normaloff>:/icons/32x32/DeleteOne.png</iconset>
+         </property>
+         <property name="iconSize">
+          <size>
+           <width>32</width>
+           <height>32</height>
+          </size>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="../resources.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>ILinksDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>ILinksDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/src/icons/32x32/DBProject.png b/src/icons/32x32/DBProject.png
new file mode 100644
index 0000000..5dcbef8
Binary files /dev/null and b/src/icons/32x32/DBProject.png differ
diff --git a/src/icons/32x32/Database.png b/src/icons/32x32/Database.png
new file mode 100644
index 0000000..0cc53ca
Binary files /dev/null and b/src/icons/32x32/Database.png differ
diff --git a/src/icons/32x32/DatabaseSetup.png b/src/icons/32x32/DatabaseSetup.png
new file mode 100644
index 0000000..208f14d
Binary files /dev/null and b/src/icons/32x32/DatabaseSetup.png differ
diff --git a/src/icons/32x32/Link.png b/src/icons/32x32/Link.png
new file mode 100644
index 0000000..29494e3
Binary files /dev/null and b/src/icons/32x32/Link.png differ
diff --git a/src/icons/32x32/Path.png b/src/icons/32x32/Path.png
new file mode 100644
index 0000000..a790673
Binary files /dev/null and b/src/icons/32x32/Path.png differ
diff --git a/src/icons/32x32/PathBlue.png b/src/icons/32x32/PathBlue.png
new file mode 100644
index 0000000..a790673
Binary files /dev/null and b/src/icons/32x32/PathBlue.png differ
diff --git a/src/icons/32x32/PathGreen.png b/src/icons/32x32/PathGreen.png
new file mode 100644
index 0000000..768dc51
Binary files /dev/null and b/src/icons/32x32/PathGreen.png differ
diff --git a/src/icons/32x32/PathOrange.png b/src/icons/32x32/PathOrange.png
new file mode 100644
index 0000000..c418ce8
Binary files /dev/null and b/src/icons/32x32/PathOrange.png differ
diff --git a/src/icons/48x48/DBProject.png b/src/icons/48x48/DBProject.png
new file mode 100644
index 0000000..4f9edfb
Binary files /dev/null and b/src/icons/48x48/DBProject.png differ
diff --git a/src/icons/48x48/Database.png b/src/icons/48x48/Database.png
new file mode 100644
index 0000000..b418ae1
Binary files /dev/null and b/src/icons/48x48/Database.png differ
diff --git a/src/icons/48x48/DatabaseSetup.png b/src/icons/48x48/DatabaseSetup.png
new file mode 100644
index 0000000..59bdc1e
Binary files /dev/null and b/src/icons/48x48/DatabaseSetup.png differ
diff --git a/src/icons/48x48/Link.png b/src/icons/48x48/Link.png
new file mode 100644
index 0000000..80d036d
Binary files /dev/null and b/src/icons/48x48/Link.png differ
diff --git a/src/icons/48x48/Path.png b/src/icons/48x48/Path.png
new file mode 100644
index 0000000..dbe6313
Binary files /dev/null and b/src/icons/48x48/Path.png differ
diff --git a/src/icons/48x48/PathBlue.png b/src/icons/48x48/PathBlue.png
new file mode 100644
index 0000000..dbe6313
Binary files /dev/null and b/src/icons/48x48/PathBlue.png differ
diff --git a/src/icons/48x48/PathGreen.png b/src/icons/48x48/PathGreen.png
new file mode 100644
index 0000000..806420b
Binary files /dev/null and b/src/icons/48x48/PathGreen.png differ
diff --git a/src/icons/48x48/PathOrange.png b/src/icons/48x48/PathOrange.png
new file mode 100644
index 0000000..d66803d
Binary files /dev/null and b/src/icons/48x48/PathOrange.png differ
diff --git a/src/icons/DBProject.svg b/src/icons/DBProject.svg
new file mode 100644
index 0000000..e678f8e
--- /dev/null
+++ b/src/icons/DBProject.svg
@@ -0,0 +1,180 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="64"
+   height="64"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="DBProject.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.229447"
+     inkscape:cx="-4.7335353"
+     inkscape:cy="18.171979"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="996"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2985"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Ebene 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-988.36218)">
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot3859"
+       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:12px;line-height:125%;letter-spacing:0px;word-spacing:0px"><flowRegion
+         id="flowRegion3861"><rect
+           id="rect3863"
+           width="75.35714"
+           height="62.142857"
+           x="-9.4642859"
+           y="2.2142856" /></flowRegion><flowPara
+         id="flowPara3865" /></flowRoot>    <text
+       xml:space="preserve"
+       style="font-size:14px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
+       x="-1022.3622"
+       y="25"
+       id="text3848"
+       sodipodi:linespacing="125%"
+       transform="matrix(0,-1,1,0,0,0)"><tspan
+         sodipodi:role="line"
+         id="tspan3850"
+         x="-1022.3622"
+         y="25"
+         style="font-size:18px">DB</tspan></text>
+    <path
+       style="fill:none;stroke:#800000;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 60.377929,1019.2812 c 0,0 -15,1 -22.999999,6 -6.836782,4.273 14.726779,4.2732 10.999999,8 -3.72678,3.7268 -28.376052,2.4145 -32.859374,5.1854 -2.005004,1.2391 -5.000001,5 -5.000001,5"
+       id="path3078"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="csssc" />
+    <g
+       id="g3856"
+       transform="matrix(0.47356685,0,0,0.57315765,24.681745,987.82111)"
+       style="stroke-width:3.38945651;stroke-miterlimit:4;stroke-dasharray:none">
+      <path
+         transform="matrix(0.97628959,0,0,0.90577639,0.75264714,41.745822)"
+         sodipodi:open="true"
+         sodipodi:end="12.08609"
+         sodipodi:start="5.8033439"
+         d="m 47.741363,16.691808 c 5.099118,2.449571 1.289691,5.468753 -8.508593,6.743533 -9.798284,1.274779 -21.875015,0.322423 -26.974133,-2.127149 -5.099118,-2.449571 -1.289691,-5.468753 8.508593,-6.743533 9.795241,-1.274383 21.86824,-0.32305 26.970076,2.125201"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012-6"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.60437727;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <rect
+         y="18.943857"
+         x="10.056155"
+         height="40"
+         width="40"
+         id="rect3032"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         transform="matrix(0.97628959,0,0,0.90577639,0.75264717,1.7458229)"
+         sodipodi:open="true"
+         sodipodi:end="12.08609"
+         sodipodi:start="5.8033439"
+         d="m 47.741363,16.691808 c 5.099118,2.449571 1.289691,5.468753 -8.508593,6.743533 -9.798284,1.274779 -21.875015,0.322423 -26.974133,-2.127149 -5.099118,-2.449571 -1.289691,-5.468753 8.508593,-6.743533 9.795241,-1.274383 21.86824,-0.32305 26.970076,2.125201"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.60437727;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:open="true"
+         transform="matrix(0.9793945,0,0,0.87054856,0.71290745,12.690707)"
+         sodipodi:end="3.0635271"
+         sodipodi:start="0.063511676"
+         d="M 49.959676,19.317345 C 49.258617,22.073201 39.754045,24.165184 28.73062,23.989919 18.795256,23.831954 10.837299,21.871211 10.060911,19.389931"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012-0"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.67074943;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:open="true"
+         transform="matrix(0.9793945,0,0,0.87054856,0.6219979,22.236163)"
+         sodipodi:end="3.0635271"
+         sodipodi:start="0.063511676"
+         d="M 49.959676,19.317345 C 49.258617,22.073201 39.754045,24.165184 28.73062,23.989919 18.795256,23.831954 10.837299,21.871211 10.060911,19.389931"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012-0-2"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.67074943;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:open="true"
+         transform="matrix(0.9793945,0,0,0.87054856,0.71290699,32.327076)"
+         sodipodi:end="3.0635271"
+         sodipodi:start="0.063511676"
+         d="M 49.959676,19.317345 C 49.258617,22.073201 39.754045,24.165184 28.73062,23.989919 18.795256,23.831954 10.837299,21.871211 10.060911,19.389931"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012-0-1"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.67074943;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3084"
+         d="m 10.454545,19 0,40"
+         style="fill:#ffffff;stroke:#000080;stroke-width:3.38945651;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3086"
+         d="m 49.545455,19 0,40"
+         style="fill:#ffffff;stroke:#000080;stroke-width:3.38945651;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    </g>
+  </g>
+</svg>
diff --git a/src/icons/Database.svg b/src/icons/Database.svg
new file mode 100644
index 0000000..d2cc9b5
--- /dev/null
+++ b/src/icons/Database.svg
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="64"
+   height="64"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="Database.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.229447"
+     inkscape:cx="-0.58383989"
+     inkscape:cy="18.171979"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="996"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid2985"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Ebene 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-988.36218)">
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot3859"
+       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:12px;line-height:125%;letter-spacing:0px;word-spacing:0px"><flowRegion
+         id="flowRegion3861"><rect
+           id="rect3863"
+           width="75.35714"
+           height="62.142857"
+           x="-9.4642859"
+           y="2.2142856" /></flowRegion><flowPara
+         id="flowPara3865" /></flowRoot>    <g
+       id="g3856"
+       transform="matrix(0.9270579,0,0,0.9609277,5.3800344,983.04727)"
+       style="stroke-width:3.38945651;stroke-miterlimit:4;stroke-dasharray:none">
+      <path
+         transform="matrix(0.97628959,0,0,0.90577639,0.75264714,41.745822)"
+         sodipodi:open="true"
+         sodipodi:end="12.08609"
+         sodipodi:start="5.8033439"
+         d="m 47.741363,16.691808 c 5.099118,2.449571 1.289691,5.468753 -8.508593,6.743533 -9.798284,1.274779 -21.875015,0.322423 -26.974133,-2.127149 -5.099118,-2.449571 -1.289691,-5.468753 8.508593,-6.743533 9.795241,-1.274383 21.86824,-0.32305 26.970076,2.125201"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012-6"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.60437727;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <rect
+         y="18.943857"
+         x="10.056155"
+         height="40"
+         width="40"
+         id="rect3032"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         transform="matrix(0.97628959,0,0,0.90577639,0.75264717,1.7458229)"
+         sodipodi:open="true"
+         sodipodi:end="12.08609"
+         sodipodi:start="5.8033439"
+         d="m 47.741363,16.691808 c 5.099118,2.449571 1.289691,5.468753 -8.508593,6.743533 -9.798284,1.274779 -21.875015,0.322423 -26.974133,-2.127149 -5.099118,-2.449571 -1.289691,-5.468753 8.508593,-6.743533 9.795241,-1.274383 21.86824,-0.32305 26.970076,2.125201"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.60437727;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:open="true"
+         transform="matrix(0.9793945,0,0,0.87054856,0.71290745,12.690707)"
+         sodipodi:end="3.0635271"
+         sodipodi:start="0.063511676"
+         d="M 49.959676,19.317345 C 49.258617,22.073201 39.754045,24.165184 28.73062,23.989919 18.795256,23.831954 10.837299,21.871211 10.060911,19.389931"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012-0"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.67074943;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:open="true"
+         transform="matrix(0.9793945,0,0,0.87054856,0.6219979,22.236163)"
+         sodipodi:end="3.0635271"
+         sodipodi:start="0.063511676"
+         d="M 49.959676,19.317345 C 49.258617,22.073201 39.754045,24.165184 28.73062,23.989919 18.795256,23.831954 10.837299,21.871211 10.060911,19.389931"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012-0-2"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.67074943;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:open="true"
+         transform="matrix(0.9793945,0,0,0.87054856,0.71290699,32.327076)"
+         sodipodi:end="3.0635271"
+         sodipodi:start="0.063511676"
+         d="M 49.959676,19.317345 C 49.258617,22.073201 39.754045,24.165184 28.73062,23.989919 18.795256,23.831954 10.837299,21.871211 10.060911,19.389931"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012-0-1"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.67074943;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3084"
+         d="m 10.454545,19 0,40"
+         style="fill:#ffffff;stroke:#000080;stroke-width:3.38945651;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3086"
+         d="m 49.545455,19 0,40"
+         style="fill:#ffffff;stroke:#000080;stroke-width:3.38945651;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    </g>
+    <rect
+       style="fill:none;stroke:none"
+       id="rect2997"
+       width="50"
+       height="50"
+       x="8.237051"
+       y="995.48077" />
+  </g>
+</svg>
diff --git a/src/icons/DatabaseSetup.svg b/src/icons/DatabaseSetup.svg
new file mode 100644
index 0000000..b5bb597
--- /dev/null
+++ b/src/icons/DatabaseSetup.svg
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="64px"
+   height="64px"
+   id="svg3376"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="DatabaseSetup.svg">
+  <defs
+     id="defs3378" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.48613591"
+     inkscape:cx="-134.17929"
+     inkscape:cy="361.52455"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="996"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3010" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3381">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <g
+       id="g3856"
+       transform="matrix(0.71058554,0,0,0.75774157,-0.04117188,7.6443063)"
+       style="stroke-width:3.38945651;stroke-miterlimit:4;stroke-dasharray:none">
+      <path
+         transform="matrix(0.97628959,0,0,0.90577639,0.75264714,41.745822)"
+         sodipodi:open="true"
+         sodipodi:end="12.08609"
+         sodipodi:start="5.8033439"
+         d="m 47.741363,16.691808 c 5.099118,2.449571 1.289691,5.468753 -8.508593,6.743533 -9.798284,1.274779 -21.875015,0.322423 -26.974133,-2.127149 -5.099118,-2.449571 -1.289691,-5.468753 8.508593,-6.743533 9.795241,-1.274383 21.86824,-0.32305 26.970076,2.125201"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012-6"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.60437727;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <rect
+         y="18.943857"
+         x="10.056155"
+         height="40"
+         width="40"
+         id="rect3032"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         transform="matrix(0.97628959,0,0,0.90577639,0.75264717,1.7458229)"
+         sodipodi:open="true"
+         sodipodi:end="12.08609"
+         sodipodi:start="5.8033439"
+         d="m 47.741363,16.691808 c 5.099118,2.449571 1.289691,5.468753 -8.508593,6.743533 -9.798284,1.274779 -21.875015,0.322423 -26.974133,-2.127149 -5.099118,-2.449571 -1.289691,-5.468753 8.508593,-6.743533 9.795241,-1.274383 21.86824,-0.32305 26.970076,2.125201"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.60437727;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:open="true"
+         transform="matrix(0.9793945,0,0,0.87054856,0.71290745,12.690707)"
+         sodipodi:end="3.0635271"
+         sodipodi:start="0.063511676"
+         d="M 49.959676,19.317345 C 49.258617,22.073201 39.754045,24.165184 28.73062,23.989919 18.795256,23.831954 10.837299,21.871211 10.060911,19.389931"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012-0"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.67074943;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:open="true"
+         transform="matrix(0.9793945,0,0,0.87054856,0.6219979,22.236163)"
+         sodipodi:end="3.0635271"
+         sodipodi:start="0.063511676"
+         d="M 49.959676,19.317345 C 49.258617,22.073201 39.754045,24.165184 28.73062,23.989919 18.795256,23.831954 10.837299,21.871211 10.060911,19.389931"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012-0-2"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.67074943;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:open="true"
+         transform="matrix(0.9793945,0,0,0.87054856,0.71290699,32.327076)"
+         sodipodi:end="3.0635271"
+         sodipodi:start="0.063511676"
+         d="M 49.959676,19.317345 C 49.258617,22.073201 39.754045,24.165184 28.73062,23.989919 18.795256,23.831954 10.837299,21.871211 10.060911,19.389931"
+         sodipodi:ry="5"
+         sodipodi:rx="20"
+         sodipodi:cy="19"
+         sodipodi:cx="30"
+         id="path3012-0-1"
+         style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000080;stroke-width:3.67074943;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3084"
+         d="m 10.454545,19 0,40"
+         style="fill:#ffffff;stroke:#000080;stroke-width:3.38945651;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3086"
+         d="m 49.545455,19 0,40"
+         style="fill:#ffffff;stroke:#000080;stroke-width:3.38945651;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    </g>
+    <path
+       style="fill:#808080;stroke:#808080;stroke-width:0.84843712999999998;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 31.618163,27.610511 -1.618084,0.05316 -0.477481,1.775579 0,0.212014 0.238741,1.510573 -2.25471,0.556533 -0.503977,-1.457558 -0.07944,-0.158998 -1.273239,-1.351575 -1.432395,0.689035 0.265236,1.855091 0.106201,0.158998 0.795757,1.298572 -1.83028,1.431085 -1.034511,-1.113052 -0.159192,-0.132587 -1.724176,-0.715507 -1.034535,1.21906 1.034535,1.590072 0.132552,0.105845 1.273251,0.848046 -1.087551,2.014114 -1.405899,-0.556533 -0.185617,-0.05304 -1.830292,0.05304 -0.477469,1.537069 [...]
+       id="path6034-2-1"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/src/icons/Link.svg b/src/icons/Link.svg
new file mode 100644
index 0000000..74b2e76
--- /dev/null
+++ b/src/icons/Link.svg
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="64px"
+   height="64px"
+   id="svg3513"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="Link.svg">
+  <defs
+     id="defs3515">
+    <marker
+       inkscape:stockid="Arrow2Mend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Mend"
+       style="overflow:visible;">
+      <path
+         id="path3901"
+         style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(0.6) rotate(180) translate(0,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow2Lend"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow2Lend"
+       style="overflow:visible;">
+      <path
+         id="path3895"
+         style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+         d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+         transform="scale(1.1) rotate(180) translate(1,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         id="path3880"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+         transform="scale(0.4) translate(10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0.0"
+       refX="0.0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3874"
+         d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+         transform="scale(0.8) translate(12.5,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11"
+     inkscape:cx="28.225016"
+     inkscape:cy="33.088874"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1012"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3090" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3518">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <g
+       id="g3891"
+       transform="translate(2.426321,-2)">
+      <rect
+         y="27.5"
+         x="6.5"
+         height="30"
+         width="30"
+         id="rect3095"
+         style="fill:none;stroke:#000080;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none" />
+      <rect
+         y="19"
+         x="5"
+         height="40"
+         width="40"
+         id="rect3889"
+         style="fill:none;stroke:none" />
+    </g>
+    <path
+       style="fill:#ffffff;stroke:#000080;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="M 14.745407,39.382701 28.762632,25.365476 21.897155,18.5 l 21.96633,1.942464 2.062836,22.0867 L 39.060843,35.663687 25.043618,49.680912 14.745407,39.382701"
+       id="path3052-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc"
+       inkscape:export-filename="/home/oeichler/Code/android/QLandkarteM/QLandkarteM/icons/32x32/next.png"
+       inkscape:export-xdpi="83"
+       inkscape:export-ydpi="83" />
+  </g>
+</svg>
diff --git a/src/icons/PathBlue.svg b/src/icons/PathBlue.svg
new file mode 100644
index 0000000..5b81aec
--- /dev/null
+++ b/src/icons/PathBlue.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="64px"
+   height="64px"
+   id="svg3376"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="Path.svg">
+  <defs
+     id="defs3378" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11"
+     inkscape:cx="-9.9920504"
+     inkscape:cy="38.868894"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="996"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3010" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3381">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <rect
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect3793"
+       width="40"
+       height="40"
+       x="4.3097157"
+       y="9.4960203" />
+    <g
+       id="g3789"
+       transform="matrix(0.86956521,0,0,0.83603134,0.56324111,3.1610331)">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3014"
+         d="m 6.8181815,14 -2,5 0,30 40.0000005,0 0,-30 -23,0 -2,-5 -13.0000005,0 z"
+         style="fill:#007cff;fill-opacity:1;stroke:#007cff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3016"
+         d="m 4.8181815,49 5,-25 40.0000005,0 -5,25 z"
+         style="fill:#000080;stroke:#000080;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+    </g>
+  </g>
+</svg>
diff --git a/src/icons/PathGreen.svg b/src/icons/PathGreen.svg
new file mode 100644
index 0000000..560bcf2
--- /dev/null
+++ b/src/icons/PathGreen.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="64px"
+   height="64px"
+   id="svg3376"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="PathOrange.svg">
+  <defs
+     id="defs3378" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11"
+     inkscape:cx="-9.9920504"
+     inkscape:cy="38.868894"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="996"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3010" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3381">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <rect
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect3793"
+       width="40"
+       height="40"
+       x="4.3097157"
+       y="9.4960203" />
+    <path
+       style="fill:#668000;fill-opacity:1;stroke:#668000;stroke-width:0.85263341999999998px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+       d="m 6.4920945,14.865472 -1.7391304,4.180157 0,25.08094 34.7826089,0 0,-25.08094 -20,0 -1.73913,-4.180157 -11.3043485,0 z"
+       id="path3014"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#445500;stroke:#445500;stroke-width:0.85263341999999998px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+       d="m 4.7529641,44.126569 4.3478261,-20.900784 34.7826088,0 -4.347826,20.900784 z"
+       id="path3016"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/src/icons/PathOrange.svg b/src/icons/PathOrange.svg
new file mode 100644
index 0000000..8b318f4
--- /dev/null
+++ b/src/icons/PathOrange.svg
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="64px"
+   height="64px"
+   id="svg3376"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="PathDarkBlue.svg">
+  <defs
+     id="defs3378" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11"
+     inkscape:cx="-9.9920504"
+     inkscape:cy="38.868894"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="996"
+     inkscape:window-x="-2"
+     inkscape:window-y="-3"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3010" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3381">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <rect
+       style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="rect3793"
+       width="40"
+       height="40"
+       x="4.3097157"
+       y="9.4960203" />
+    <path
+       style="fill:#ff6600;fill-opacity:1;stroke:#ff6600;stroke-width:0.85263341999999998px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+       d="m 6.4920945,14.865472 -1.7391304,4.180157 0,25.08094 34.7826089,0 0,-25.08094 -20,0 -1.73913,-4.180157 -11.3043485,0 z"
+       id="path3014"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#d45500;stroke:#d45500;stroke-width:0.85263341999999998px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
+       d="m 4.7529641,44.126569 4.3478261,-20.900784 34.7826088,0 -4.347826,20.900784 z"
+       id="path3016"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/src/locale/qmapshack_cs.ts b/src/locale/qmapshack_cs.ts
index d74cef2..175aa06 100644
--- a/src/locale/qmapshack_cs.ts
+++ b/src/locale/qmapshack_cs.ts
@@ -112,32 +112,32 @@
 <context>
     <name>CDetailsTrk</name>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="161"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="170"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="173"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="179"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="198"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="200"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="162"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="171"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="174"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="180"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="199"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="201"/>
         <source>%1 %2</source>
         <translation>%1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="225"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="226"/>
         <source><h4>Comment:</h4></source>
         <translation type="unfinished"><h4>Poznámka:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="228"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="229"/>
         <source><p>--- no comment ---</p></source>
         <translation type="unfinished"><p>--- žádná poznámka ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="235"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="236"/>
         <source><h4>Description:</h4></source>
         <translation type="unfinished"><h4>Popis:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="238"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="239"/>
         <source><p>--- no description ---</p></source>
         <translation type="unfinished"><p>--- žádný popis ---</p></translation>
     </message>
@@ -195,68 +195,78 @@
 <context>
     <name>CGisListWks</name>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="39"/>
+        <location filename="../gis/CGisListWks.cpp" line="47"/>
         <source>Save As...</source>
         <translation>Uložit jako...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="40"/>
+        <location filename="../gis/CGisListWks.cpp" line="48"/>
         <source>Save</source>
         <translation>Uložit</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="41"/>
+        <location filename="../gis/CGisListWks.cpp" line="49"/>
         <source>Close</source>
         <translation>Zavřít</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="47"/>
+        <location filename="../gis/CGisListWks.cpp" line="55"/>
         <source>Edit...</source>
         <translation>Upravit...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="48"/>
+        <location filename="../gis/CGisListWks.cpp" line="56"/>
         <source>Move Waypoint</source>
         <translation>Přesunout cestovní bod</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="49"/>
+        <location filename="../gis/CGisListWks.cpp" line="57"/>
         <source>Proj. Waypoint...</source>
         <translation>Promítnout cestovní bod...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="50"/>
+        <location filename="../gis/CGisListWks.cpp" line="58"/>
         <source>Track Profile</source>
         <translation>Sledovat profil</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="51"/>
+        <location filename="../gis/CGisListWks.cpp" line="59"/>
         <source>Select Range</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="52"/>
+        <location filename="../gis/CGisListWks.cpp" line="60"/>
         <source>Edit Track Points</source>
         <translation>Upravit body stopy</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="53"/>
+        <location filename="../gis/CGisListWks.cpp" line="61"/>
         <source>Reverse Track</source>
         <translation>Obrátit stopu</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="54"/>
+        <location filename="../gis/CGisListWks.cpp" line="62"/>
         <source>Combine Tracks</source>
         <translation>Spojit stopy</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="57"/>
+        <location filename="../gis/CGisListWks.cpp" line="63"/>
+        <source>Edit Area Points</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="66"/>
         <source>Delete</source>
         <translation>Smazat</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="555"/>
-        <source>New Project</source>
+        <location filename="../gis/CGisListWks.cpp" line="400"/>
+        <source>Saving workspace. Please wait.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="441"/>
+        <source>Loading workspace. Please wait.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -274,14 +284,22 @@
     </message>
 </context>
 <context>
+    <name>CHistoryListWidget</name>
+    <message>
+        <location filename="../helpers/CHistoryListWidget.cpp" line="32"/>
+        <source>Cut history</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>CMainWindow</name>
     <message>
-        <location filename="../CMainWindow.cpp" line="436"/>
+        <location filename="../CMainWindow.cpp" line="444"/>
         <source>Ele: %1%2</source>
         <translation>Výška: %1%2</translation>
     </message>
     <message>
-        <location filename="../CMainWindow.cpp" line="545"/>
+        <location filename="../CMainWindow.cpp" line="559"/>
         <source>Load GIS Data...</source>
         <translation>Nahrát data GIS...</translation>
     </message>
@@ -1282,6 +1300,24 @@ není platným vymezením soustavy souřadnic
     </message>
 </context>
 <context>
+    <name>CSetupDB</name>
+    <message>
+        <location filename="../gis/db/CSetupDB.cpp" line="55"/>
+        <source>Setup database...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/CSetupDB.cpp" line="55"/>
+        <source>Changes will become active after an application's restart.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/CSetupDB.cpp" line="63"/>
+        <source>Select database path...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>CTextEditWidget</name>
     <message>
         <location filename="../helpers/CTextEditWidget.cpp" line="73"/>
@@ -1840,161 +1876,166 @@ není platným vymezením soustavy souřadnic
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="119"/>
+        <location filename="../IMainWindow.ui" line="121"/>
         <source>Maps</source>
         <translation>Mapy</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="156"/>
+        <location filename="../IMainWindow.ui" line="158"/>
         <source>Dig. Elev. Model (DEM)</source>
         <translation>Digitální výškový model (DEM)</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="189"/>
+        <location filename="../IMainWindow.ui" line="191"/>
         <source>Data</source>
         <translation>Data</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="202"/>
+        <location filename="../IMainWindow.ui" line="204"/>
         <source>Add Map Workspace</source>
         <translation>Přidat pracovní oblast mapy</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="205"/>
+        <location filename="../IMainWindow.ui" line="207"/>
         <source>Ctrl+T</source>
         <translation>Ctrl+T</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="217"/>
+        <location filename="../IMainWindow.ui" line="219"/>
         <source>Show Scale</source>
         <translation>Ukázat měřítko</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="226"/>
+        <location filename="../IMainWindow.ui" line="228"/>
         <source>Setup Map Font</source>
         <translation>Nastavit písmo mapy</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="238"/>
+        <location filename="../IMainWindow.ui" line="240"/>
         <source>Show Grid</source>
         <translation>Ukázat mřížku</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="241"/>
+        <location filename="../IMainWindow.ui" line="243"/>
         <source>Ctrl+G</source>
         <translation>Ctrl+G</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="250"/>
+        <location filename="../IMainWindow.ui" line="252"/>
         <source>Setup Grid</source>
         <translation>Nastavit mřížku</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="253"/>
+        <location filename="../IMainWindow.ui" line="255"/>
         <source>Ctrl+Alt+G</source>
         <translation>Ctrl+Alt+G</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="265"/>
+        <location filename="../IMainWindow.ui" line="267"/>
         <source>Flip Mouse Wheel</source>
         <translation>Obrátit kolečko myši</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="274"/>
-        <location filename="../IMainWindow.ui" line="277"/>
+        <location filename="../IMainWindow.ui" line="276"/>
+        <location filename="../IMainWindow.ui" line="279"/>
         <source>Setup Map Paths</source>
         <translation>Nastavit cesty k mapám</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="289"/>
+        <location filename="../IMainWindow.ui" line="291"/>
         <source>POI Text</source>
         <translation>Text POI</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="301"/>
+        <location filename="../IMainWindow.ui" line="303"/>
         <source>Night / Day</source>
         <translation>Noc/Den</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="313"/>
+        <location filename="../IMainWindow.ui" line="315"/>
         <source>Map Tool Tip</source>
         <translation>Rada k nástroji pro mapu</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="322"/>
+        <location filename="../IMainWindow.ui" line="324"/>
         <source>Setup DEM Paths</source>
         <translation>Nastavit cesty k DEM</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="331"/>
+        <location filename="../IMainWindow.ui" line="333"/>
         <source>About</source>
         <translation>O programu</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="340"/>
+        <location filename="../IMainWindow.ui" line="342"/>
         <source>Help</source>
         <translation>Nápověda</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="349"/>
+        <location filename="../IMainWindow.ui" line="351"/>
         <source>Setup Map Workspace</source>
         <translation>Nastavit pracovní oblast mapy</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="358"/>
+        <location filename="../IMainWindow.ui" line="360"/>
         <source>Load GIS Data</source>
         <translation>Nahrát data GIS</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="361"/>
+        <location filename="../IMainWindow.ui" line="363"/>
         <source>Load projects from file</source>
         <translation>Nahrát projekty ze souboru</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="364"/>
+        <location filename="../IMainWindow.ui" line="366"/>
         <source>Ctrl+L</source>
         <translation>Ctrl+L</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="373"/>
+        <location filename="../IMainWindow.ui" line="375"/>
         <source>Save All GIS Data</source>
         <translation>Uložit všechna data GIS</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="376"/>
+        <location filename="../IMainWindow.ui" line="378"/>
         <source>Save all projects in the workspace</source>
         <translation>Uložit všechny projekty v pracovní oblasti</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="379"/>
+        <location filename="../IMainWindow.ui" line="381"/>
         <source>Ctrl+S</source>
         <translation>Ctrl+S</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="388"/>
+        <location filename="../IMainWindow.ui" line="390"/>
         <source>Setup Time Zone</source>
         <translation>Nastavit časové pásmo</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="397"/>
+        <location filename="../IMainWindow.ui" line="399"/>
         <source>Add empty project</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="409"/>
+        <location filename="../IMainWindow.ui" line="411"/>
         <source>Search Google</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="418"/>
+        <location filename="../IMainWindow.ui" line="420"/>
         <source>Close all projects</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="427"/>
+        <location filename="../IMainWindow.ui" line="429"/>
         <source>Setup Units</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="438"/>
+        <source>Setup Database</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>IMapList</name>
@@ -2545,6 +2586,54 @@ nebo
         <source>Select project from list or enter new project name.</source>
         <translation>Vybrat projekt ze seznamu nebo zadat nový název projektu.</translation>
     </message>
+    <message>
+        <location filename="../helpers/ISelectProjectDialog.ui" line="36"/>
+        <source>New project is created as:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../helpers/ISelectProjectDialog.ui" line="73"/>
+        <source>*.qms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../helpers/ISelectProjectDialog.ui" line="83"/>
+        <source>*.gpx</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ISetupDB</name>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="14"/>
+        <source>Setup database...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="35"/>
+        <source>save workspace on exit, and every</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="45"/>
+        <source>minutes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="62"/>
+        <source>Database path</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="69"/>
+        <source>...</source>
+        <translation type="unfinished">...</translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="92"/>
+        <source>-</source>
+        <translation type="unfinished">-</translation>
+    </message>
 </context>
 <context>
     <name>ITextEditWidget</name>
@@ -2762,13 +2851,13 @@ nebo
         <translation>Špatný polohový formát. Musí být: "[N|S] ddd mm.sss [W|E] ddd mm.sss"</translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="60"/>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="69"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="66"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="75"/>
         <source>Failed to read...</source>
         <translation>Nepodařilo se přečíst...</translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="60"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="66"/>
         <source>Failed to read: %1
 line %2, column %3:
  %4</source>
@@ -2777,132 +2866,169 @@ line %2, column %3:
 %4</translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="69"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="75"/>
         <source>Not a GPX file: </source>
         <translation>Není souborem GPX: </translation>
     </message>
     <message>
-        <location filename="../gis/IGisProject.cpp" line="141"/>
+        <location filename="../gis/IGisProject.cpp" line="112"/>
+        <source>
+Filename: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="128"/>
+        <source>
+Waypoints: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="132"/>
+        <source>
+Tracks: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="136"/>
+        <source>
+Routes: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="140"/>
+        <source>
+Areas: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="197"/>
         <source>Are you sure you want to delete '%1' from project '%2'?</source>
         <translation>Jste si jistý, že chcete smazat '%1' z projektu '%2'?</translation>
     </message>
     <message>
-        <location filename="../gis/IGisProject.cpp" line="142"/>
+        <location filename="../gis/IGisProject.cpp" line="198"/>
         <source>Delete...</source>
         <translation>Smazat...</translation>
     </message>
     <message>
-        <location filename="../gis/bin/CBinProject.cpp" line="35"/>
-        <location filename="../gis/bin/CBinProject.cpp" line="121"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="53"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="47"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="135"/>
         <source>Failed to open...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/bin/CBinProject.cpp" line="35"/>
-        <location filename="../gis/bin/CBinProject.cpp" line="121"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="53"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="47"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="135"/>
         <source>Failed to open %1</source>
         <translation type="unfinished">Nepodařilo se otevřít %1</translation>
     </message>
     <message>
-        <location filename="../gis/bin/CBinProject.cpp" line="77"/>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="145"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="151"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="90"/>
         <source>Save GIS data to...</source>
         <translation>Uložit data GIS do...</translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="215"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="222"/>
         <source>File exists ...</source>
         <translation>Soubor existuje...</translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="216"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="223"/>
         <source>The file exists and it has not been created by QMapShack. If you press 'yes' all data in this file will be lost. Even if this file contains GPX data and has been loaded by QMapShack, QMapShack might not be able to load and store all elements of this file.  Those elements will be lost. I recommend to use another file. <b>Do you really want to overwrite the file?</b></source>
         <translation>Soubor existuje a nebyl vytvořen programem QMapShack. Pokud stisknete Ano, budou všechna data v tomto souboru ztracena. I když by tento soubor obsahoval data GPX a byl nahrán programem QMapShack, QMapShack nemusí být schopen nahrát a uložit všechny prvky tohoto souboru.  Tyto prvky budou ztraceny. Doporučuje se použít jiný soubor. <b>Opravdu chcete soubor přepsat?</b></translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="282"/>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="292"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="289"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="299"/>
         <source>Saveing GIS data failed...</source>
         <translation>Nepodařilo se uložit data GIS...</translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="282"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="289"/>
         <source>Failed to create file '%1'</source>
         <translation>Nepodařilo se vytvořit soubor '%1'</translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="292"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="299"/>
         <source>Failed to write file '%1'</source>
         <translation>Nepodařilo se zapsat soubor '%1'</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="196"/>
+        <location filename="../gis/IGisItem.cpp" line="239"/>
         <source>Initial version.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="269"/>
+        <location filename="../gis/IGisItem.cpp" line="319"/>
         <source>This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press'Ok'.</source>
         <translation>Tento prvek je pravděpodobně pouze pro čtení, protože nebyl vytvořen v programu QMapShack. Obvykle nemáte zájem měnit zavedená data. Ale pokud si myslíte, že je to tentokrát na místě, stiskněte OK.</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="270"/>
+        <location filename="../gis/IGisItem.cpp" line="320"/>
         <source>Read Only Mode...</source>
         <translation>Režim pouze pro čtení...</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="343"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="319"/>
         <source>Length: %1 %2</source>
         <translation>Délka: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="350"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="326"/>
         <source>, %1%2 %3, %4%5 %6</source>
         <translation>, %1%2 %3, %4%5 %6</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="358"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="334"/>
         <source>Time: %1</source>
         <translation>Čas: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="361"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="371"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="337"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="347"/>
         <source>, Speed: %1 %2</source>
         <translation>, Rychlost: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="368"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="344"/>
         <source>Moving: %1</source>
         <translation>Pohyb: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="377"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
         <source>Start: %1</source>
         <translation>Začátek: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="382"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="358"/>
         <source>End: %1</source>
         <translation>Konec: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="386"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="362"/>
         <source>Points: %1 (%2)</source>
         <translation>Body: %1 (%2)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="452"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="427"/>
         <source>Ele.: %1 %2</source>
         <translation>Výška: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="967"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="430"/>
+        <source> slope: %1%3 (%2%)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="940"/>
         <source>Hide points.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1001"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="974"/>
         <source>Show points.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2911,57 +3037,56 @@ line %2, column %3:
         <translation type="obsolete"> sklon: %1°(%2%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="460"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="435"/>
         <source> speed: %1%2</source>
         <translation> rychlost: %1%2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="472"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="447"/>
         <source>Ascend: %1%2 (%3%)</source>
         <translation>Stoupání: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="476"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="451"/>
         <source>Ascend: - (-)</source>
         <translation>Stoupání: - (-)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="486"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="461"/>
         <source> Descend: - (-) </source>
         <translation> Klesání: - (-) </translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="507"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="482"/>
         <source> Moving: - (-) </source>
         <translation> Pohyb: - (-) </translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="482"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="457"/>
         <source> Descend: %1%2 (%3%)</source>
         <translation> Klesání: %1%2 (%3%) </translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="266"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="253"/>
         <source>Changed trackpoints, sacrificed all previous data.</source>
         <translation>Změněny body stop. Obětována veškerá předchozí data.</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="455"/>
         <source> slope: %1° (%2%)</source>
-        <translation> sklon: %1° (%2%)</translation>
+        <translation type="obsolete"> sklon: %1° (%2%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="493"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="468"/>
         <source>Dist.: %1%2 (%3%)</source>
         <translation>Vzdálenost: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="497"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="472"/>
         <source>Dist.: - (-)</source>
         <translation>Vzdálenost: - (-)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="503"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="478"/>
         <source> Moving: %1%2 (%3%)</source>
         <translation> Pohyb: %1%2 (%3%) </translation>
     </message>
@@ -2986,109 +3111,108 @@ line %2, column %3:
         <translation>Silný</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="430"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="418"/>
         <source>Changed area shape.</source>
         <translation>Změněn tvar oblasti.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="437"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="426"/>
         <source>Changed name.</source>
         <translation>Změněn název.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="443"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="432"/>
         <source>Changed border width.</source>
         <translation>Změněna šířka okraje.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="449"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="438"/>
         <source>Changed fill pattern.</source>
         <translation>Změněn vzor výplně.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="455"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="444"/>
         <source>Changed opacity.</source>
         <translation>Změněna neprůhlednost.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="461"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="450"/>
         <source>Changed comment.</source>
         <translation>Změněna poznámka.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="467"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="456"/>
         <source>Changed description.</source>
         <translation>Změněn popis.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="479"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1312"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="468"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1284"/>
         <source>Changed color</source>
         <translation>Změněná barva</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="229"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="211"/>
         <source>Elevation: %1 %2</source>
         <translation>Výška: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="237"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="219"/>
         <source>Proximity: %1 %2</source>
         <translation>Blízkost: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1289"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="302"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1261"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="284"/>
         <source>Changed name</source>
         <translation>Změněný název</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="555"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="821"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="803"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="811"/>
         <location filename="../gis/trk/CGisItemTrk.cpp" line="829"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="847"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="894"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1026"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="183"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="872"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="999"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="165"/>
         <location filename="../mouse/CMouseEditArea.cpp" line="100"/>
         <location filename="../mouse/CMouseEditTrk.cpp" line="106"/>
         <source>Edit name...</source>
         <translation>Upravit název...</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="183"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="165"/>
         <source>Enter new waypoint name.</source>
         <translation>Zadat nový název pro cestovní bod.</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="309"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="291"/>
         <source>Changed position</source>
         <translation>Změněná poloha</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="315"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="297"/>
         <source>Changed elevation</source>
         <translation>Změněná výška</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="321"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="303"/>
         <source>Changed proximity</source>
         <translation>Změněná blízkost</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="334"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="315"/>
         <source>Changed icon</source>
         <translation>Změněná ikona</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1295"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="340"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1267"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="321"/>
         <source>Changed comment</source>
         <translation>Změněná poznámka</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1301"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="346"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1273"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="327"/>
         <source>Changed description</source>
         <translation>Změněný popis</translation>
     </message>
@@ -3124,12 +3248,11 @@ line %2, column %3:
         <translation>Toto je souborový typ s neznámým druhem čáry. Nahlašte to, prosím!</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="555"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="821"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="803"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="811"/>
         <location filename="../gis/trk/CGisItemTrk.cpp" line="829"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="847"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="894"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1026"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="872"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="999"/>
         <location filename="../mouse/CMouseEditTrk.cpp" line="106"/>
         <source>Enter new track name.</source>
         <translation>Zadat název nové stopy.</translation>
diff --git a/src/locale/qmapshack_de.ts b/src/locale/qmapshack_de.ts
index 26d1966..6a9847a 100644
--- a/src/locale/qmapshack_de.ts
+++ b/src/locale/qmapshack_de.ts
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
-<TS version="2.0" language="de_DE">
+<TS version="2.1" language="de_DE">
 <context>
     <name>CCanvas</name>
     <message>
@@ -32,7 +32,7 @@
     <message>
         <location filename="../dem/CDemPathSetup.cpp" line="55"/>
         <source>Select DEM file path...</source>
-        <translation>Pfad für DEM Dateien auswählen...</translation>
+        <translation>Pfad für DEM Dateien wählen...</translation>
     </message>
 </context>
 <context>
@@ -58,7 +58,7 @@
     </message>
     <message>
         <source>DEM must have one band with 16 bit or 32 bit data.</source>
-        <translation type="obsolete">Das DEM muss aus einem Satz mit 16 bit oder 32 bit Daten bestehen.</translation>
+        <translation type="vanished">Das DEM muss aus einem Satz mit 16 bit oder 32 bit Daten bestehen.</translation>
     </message>
     <message>
         <location filename="../dem/CDemVRT.cpp" line="84"/>
@@ -83,115 +83,103 @@
 <context>
     <name>CDetailsOvlArea</name>
     <message>
-        <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="130"/>
+        <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="131"/>
         <source>Edit name...</source>
-        <translation>Name ändern...</translation>
+        <translation>Name bearbeiten...</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="130"/>
+        <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="131"/>
         <source>Enter new waypoint name.</source>
         <translation>Geben Sie einen neuen Namen ein.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="221"/>
         <source><h4>Comment:</h4></source>
-        <translation><h4>Kommentar:</h4></translation>
+        <translation type="vanished"><h4>Kommentar:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="224"/>
         <source><p>--- no comment ---</p></source>
-        <translation><p>--- kein Kommentar ---</p></translation>
+        <translation type="vanished"><p>--- kein Kommentar ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="231"/>
         <source><h4>Description:</h4></source>
-        <translation><h4>Beschreibung:</h4></translation>
+        <translation type="vanished"><h4>Beschreibung:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="234"/>
         <source><p>--- no description ---</p></source>
-        <translation><p>--- keine Beschreibung ---</p></translation>
+        <translation type="vanished"><p>--- keine Beschreibung ---</p></translation>
     </message>
 </context>
 <context>
     <name>CDetailsTrk</name>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="161"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="170"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="173"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="179"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="198"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="200"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="154"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="163"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="166"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="172"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="191"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="193"/>
         <source>%1 %2</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="225"/>
         <source><h4>Comment:</h4></source>
-        <translation><h4>Kommentar:</h4></translation>
+        <translation type="vanished"><h4>Kommentar:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="228"/>
         <source><p>--- no comment ---</p></source>
-        <translation><p>--- kein Kommentar ---</p></translation>
+        <translation type="vanished"><p>--- kein Kommentar ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="235"/>
         <source><h4>Description:</h4></source>
-        <translation><h4>Beschreibung:</h4></translation>
+        <translation type="vanished"><h4>Beschreibung:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="238"/>
         <source><p>--- no description ---</p></source>
-        <translation><p>--- keine Beschreibung ---</p></translation>
+        <translation type="vanished"><p>--- keine Beschreibung ---</p></translation>
     </message>
 </context>
 <context>
     <name>CDetailsWpt</name>
     <message>
         <source>no comment</source>
-        <translation type="obsolete">kein Kommentar vorhanden</translation>
+        <translation type="vanished">kein Kommentar vorhanden</translation>
     </message>
     <message>
         <source>no description</source>
-        <translation type="obsolete">keine Beschreibung vorhanden</translation>
+        <translation type="vanished">keine Beschreibung vorhanden</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CDetailsWpt.cpp" line="130"/>
         <source><h4>Comment:</h4></source>
-        <translation><h4>Kommentar:</h4></translation>
+        <translation type="vanished"><h4>Kommentar:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CDetailsWpt.cpp" line="133"/>
         <source><p>--- no comment ---</p></source>
-        <translation><p>--- kein Kommentar ---</p></translation>
+        <translation type="vanished"><p>--- kein Kommentar ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CDetailsWpt.cpp" line="140"/>
         <source><h4>Description:</h4></source>
-        <translation><h4>Beschreibung:</h4></translation>
+        <translation type="vanished"><h4>Beschreibung:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CDetailsWpt.cpp" line="143"/>
         <source><p>--- no description ---</p></source>
-        <translation><p>--- keine Beschreibung ---</p></translation>
+        <translation type="vanished"><p>--- keine Beschreibung ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CDetailsWpt.cpp" line="163"/>
+        <location filename="../gis/wpt/CDetailsWpt.cpp" line="130"/>
         <source>Edit name...</source>
-        <translation>Name ändern...</translation>
+        <translation>Name bearbeiten...</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CDetailsWpt.cpp" line="163"/>
+        <location filename="../gis/wpt/CDetailsWpt.cpp" line="130"/>
         <source>Enter new waypoint name.</source>
         <translation>Geben Sie einen neuen Namen ein.</translation>
     </message>
     <message>
         <source>Enter new elevation.</source>
-        <translation type="obsolete">Geben Sie eine Höhe ein.</translation>
+        <translation type="vanished">Geben Sie eine Höhe ein.</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CDetailsWpt.cpp" line="182"/>
+        <location filename="../gis/wpt/CDetailsWpt.cpp" line="149"/>
         <source>Enter new proximity range.</source>
         <translation>Geben Sie einen Abstandsalarm ein.</translation>
     </message>
@@ -201,79 +189,97 @@
     <message>
         <location filename="../helpers/CElevationDialog.cpp" line="85"/>
         <source>No DEM data found for that point.</source>
-        <translation>Keine Höhendaten für den Punkt gefunden.</translation>
+        <translation>Keine Höhendaten für diesen Punkt gefunden.</translation>
     </message>
 </context>
 <context>
     <name>CGisListWks</name>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="40"/>
+        <location filename="../gis/CGisListWks.cpp" line="48"/>
         <source>Save</source>
         <translation>Speichern</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="39"/>
+        <location filename="../gis/CGisListWks.cpp" line="47"/>
         <source>Save As...</source>
         <translation>Speichern als...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="41"/>
+        <location filename="../gis/CGisListWks.cpp" line="49"/>
         <source>Close</source>
         <translation>Schließen</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="47"/>
+        <location filename="../gis/CGisListWks.cpp" line="55"/>
         <source>Edit...</source>
         <translation>Ändern...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="48"/>
+        <location filename="../gis/CGisListWks.cpp" line="56"/>
         <source>Move Waypoint</source>
         <translation>Wegpunkt verschieben</translation>
     </message>
     <message>
         <source>Move Waypoint...</source>
-        <translation type="obsolete">Wegpunkt verschieben...</translation>
+        <translation type="vanished">Wegpunkt verschieben...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="49"/>
+        <location filename="../gis/CGisListWks.cpp" line="57"/>
         <source>Proj. Waypoint...</source>
         <translation>Wegpunkt Projektion...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="50"/>
+        <location filename="../gis/CGisListWks.cpp" line="58"/>
         <source>Track Profile</source>
         <translation>Trackprofil</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="51"/>
+        <location filename="../gis/CGisListWks.cpp" line="59"/>
         <source>Select Range</source>
-        <translation>Teilstrecke auswählen</translation>
+        <translation>Bereich wählen</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="52"/>
+        <location filename="../gis/CGisListWks.cpp" line="60"/>
         <source>Edit Track Points</source>
         <translation>Wegpunkte bearbeiten</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="53"/>
+        <location filename="../gis/CGisListWks.cpp" line="61"/>
         <source>Reverse Track</source>
         <translation>Track umkehren</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="54"/>
+        <location filename="../gis/CGisListWks.cpp" line="62"/>
         <source>Combine Tracks</source>
         <translation>Tracks verbinden</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="57"/>
+        <location filename="../gis/CGisListWks.cpp" line="63"/>
+        <source>Edit Area Points</source>
+        <translation>Flächenpunkte bearbeiten</translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="66"/>
         <source>Delete</source>
         <translation>Löschen</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="555"/>
+        <location filename="../gis/CGisListWks.cpp" line="400"/>
+        <source>Saving workspace. Please wait.</source>
+        <translation>Ansicht speichern. Bitte warten.</translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="441"/>
+        <source>Loading workspace. Please wait.</source>
+        <translation>Ansicht laden. Bitte warten.</translation>
+    </message>
+    <message>
+        <source>Add Empty Project</source>
+        <translation type="vanished">Leeres Projekt hinzufügen</translation>
+    </message>
+    <message>
         <source>New Project</source>
-        <translation>Neues Projekt</translation>
+        <translation type="vanished">Neues Projekt</translation>
     </message>
 </context>
 <context>
@@ -290,14 +296,22 @@
     </message>
 </context>
 <context>
+    <name>CHistoryListWidget</name>
+    <message>
+        <location filename="../helpers/CHistoryListWidget.cpp" line="32"/>
+        <source>Cut history</source>
+        <translation>Historie kürzen</translation>
+    </message>
+</context>
+<context>
     <name>CMainWindow</name>
     <message>
-        <location filename="../CMainWindow.cpp" line="436"/>
+        <location filename="../CMainWindow.cpp" line="444"/>
         <source>Ele: %1%2</source>
         <translation>Höhe: %1%2</translation>
     </message>
     <message>
-        <location filename="../CMainWindow.cpp" line="545"/>
+        <location filename="../CMainWindow.cpp" line="559"/>
         <source>Load GIS Data...</source>
         <translation>Lade GIS Daten...</translation>
     </message>
@@ -973,9 +987,9 @@
         <translation>Hinzufügen oder entfernen von Karten. In einem Verzeichnis können mehrere Karten liegen. Unterverzeichnisse werden jedoch nicht durchsucht. Unterstützte Formate sind: %1 </translation>
     </message>
     <message>
-        <location filename="../map/CMapPathSetup.cpp" line="54"/>
+        <location filename="../map/CMapPathSetup.cpp" line="55"/>
         <source>Select map path...</source>
-        <translation>Kartenpfad auswählen...</translation>
+        <translation>Kartenpfad wählen...</translation>
     </message>
 </context>
 <context>
@@ -1058,7 +1072,7 @@ Zeile %2, Spalte %3:
     </message>
     <message>
         <source>--- All ---</source>
-        <translation type="obsolete">--- Alle ---</translation>
+        <translation type="vanished">--- Alle ---</translation>
     </message>
     <message>
         <location filename="../map/CMapTMS.cpp" line="288"/>
@@ -1132,7 +1146,7 @@ Unbekannte Struktur.</translation>
     </message>
     <message>
         <source>--- All ---</source>
-        <translation type="obsolete">--- Alle ---</translation>
+        <translation type="vanished">--- Alle ---</translation>
     </message>
     <message>
         <location filename="../map/CMapWMTS.cpp" line="385"/>
@@ -1141,11 +1155,11 @@ Unbekannte Struktur.</translation>
     </message>
     <message>
         <source>%1: %2 tiles pending</source>
-        <translation type="obsolete">%1: %2 unerledigte Kacheln</translation>
+        <translation type="vanished">%1: %2 unerledigte Kacheln</translation>
     </message>
     <message>
         <source>Unexpexted service. 'OGC WMTS 1.0.0' is expected. '%1 %2' is read.</source>
-        <translation type="obsolete">Unerwarterter Dienst. 'OGC WMTS 1.0.0' Wird erwartet. '%1 %2' wird gelesen.</translation>
+        <translation type="vanished">Unerwarterter Dienst. 'OGC WMTS 1.0.0' Wird erwartet. '%1 %2' wird gelesen.</translation>
     </message>
     <message>
         <location filename="../map/CMapWMTS.cpp" line="198"/>
@@ -1165,19 +1179,19 @@ Unbekannte Struktur.</translation>
     <name>CMouseEditLine</name>
     <message>
         <source>Add points?</source>
-        <translation type="obsolete">Punkte hinzufügen?</translation>
+        <translation type="vanished">Punkte hinzufügen?</translation>
     </message>
     <message>
         <source>Add points to temporary line?</source>
-        <translation type="obsolete">Punkte zur temporären Linie hinzufügen?</translation>
+        <translation type="vanished">Punkte zur temporären Linie hinzufügen?</translation>
     </message>
     <message>
         <source>Warning!</source>
-        <translation type="obsolete">Warnung!</translation>
+        <translation type="vanished">Warnung!</translation>
     </message>
     <message>
         <source>This will replace all data of the orignal by a simple line of coordinates. All other data will be lost permanently.</source>
-        <translation type="obsolete">Alle ursprünglichen Daten werden durch eine einfache Koordinatenlinie ersetzt. Alle anderen Daten sind dauerhaft verloren.</translation>
+        <translation type="vanished">Alle ursprünglichen Daten werden durch eine einfache Koordinatenlinie ersetzt. Alle anderen Daten sind dauerhaft verloren.</translation>
     </message>
 </context>
 <context>
@@ -1307,7 +1321,7 @@ ist keine gültige Koordinatensystemdefinition:
     <message>
         <location filename="../gis/wpt/CProjWpt.cpp" line="63"/>
         <source>Edit name...</source>
-        <translation>Name ändern...</translation>
+        <translation>Name bearbeiten...</translation>
     </message>
     <message>
         <location filename="../gis/wpt/CProjWpt.cpp" line="63"/>
@@ -1329,6 +1343,24 @@ ist keine gültige Koordinatensystemdefinition:
     </message>
 </context>
 <context>
+    <name>CSetupDB</name>
+    <message>
+        <location filename="../gis/db/CSetupDB.cpp" line="55"/>
+        <source>Setup database...</source>
+        <translation>Datenbank einrichten...</translation>
+    </message>
+    <message>
+        <location filename="../gis/db/CSetupDB.cpp" line="55"/>
+        <source>Changes will become active after an application's restart.</source>
+        <translation>Änderungen werden nach Neustart der Anwendung aktiv.</translation>
+    </message>
+    <message>
+        <location filename="../gis/db/CSetupDB.cpp" line="63"/>
+        <source>Select database path...</source>
+        <translation>Datenbankpfad w#ählen...</translation>
+    </message>
+</context>
+<context>
     <name>CTextEditWidget</name>
     <message>
         <location filename="../helpers/CTextEditWidget.cpp" line="73"/>
@@ -1376,7 +1408,7 @@ ist keine gültige Koordinatensystemdefinition:
         <source>This software is licensed under GPL3 or any later version</source>
         <translation>Diese Software steht unter der GPL3 Lizenz (oder spätere Versionen)</translation>
     </message>
-    <message utf8="true">
+    <message>
         <location filename="../IAbout.ui" line="145"/>
         <source>© 2014 Oliver Eichler (oliver.eichler at gmx.de)</source>
         <translation></translation>
@@ -1632,7 +1664,6 @@ ist keine gültige Koordinatensystemdefinition:
     <message>
         <location filename="../gis/trk/IDetailsTrk.ui" line="251"/>
         <source>Progress</source>
-        <translatorcomment>?</translatorcomment>
         <translation>Verlauf</translation>
     </message>
     <message>
@@ -1658,8 +1689,7 @@ ist keine gültige Koordinatensystemdefinition:
     <message>
         <location filename="../gis/trk/IDetailsTrk.ui" line="360"/>
         <source>Delta</source>
-        <translatorcomment>?</translatorcomment>
-        <translation></translation>
+        <translation>Delta</translation>
     </message>
     <message>
         <location filename="../gis/trk/IDetailsTrk.ui" line="365"/>
@@ -1703,7 +1733,7 @@ ist keine gültige Koordinatensystemdefinition:
     </message>
     <message>
         <source>TextLabel</source>
-        <translation type="obsolete">Bezeichnung</translation>
+        <translation type="vanished">Bezeichnung</translation>
     </message>
 </context>
 <context>
@@ -1715,7 +1745,7 @@ ist keine gültige Koordinatensystemdefinition:
     </message>
     <message>
         <source><html><head/><body><p>Edit comment.</p></body></html></source>
-        <translation type="obsolete"><html><head/><body><p>Kommentar bearbeiten.</p></body></html></translation>
+        <translation type="vanished"><html><head/><body><p>Kommentar bearbeiten.</p></body></html></translation>
     </message>
     <message>
         <location filename="../gis/wpt/IDetailsWpt.ui" line="121"/>
@@ -1730,7 +1760,7 @@ ist keine gültige Koordinatensystemdefinition:
     </message>
     <message>
         <source><html><head/><body><p>Edit description.</p></body></html></source>
-        <translation type="obsolete"><html><head/><body><p>Beschreibung bearbeiten.</p></body></html></translation>
+        <translation type="vanished"><html><head/><body><p>Beschreibung bearbeiten.</p></body></html></translation>
     </message>
     <message>
         <location filename="../gis/wpt/IDetailsWpt.ui" line="155"/>
@@ -1772,7 +1802,7 @@ ist keine gültige Koordinatensystemdefinition:
     <message>
         <location filename="../helpers/IElevationDialog.ui" line="14"/>
         <source>Edit elevation...</source>
-        <translation>Höhe ändern ...</translation>
+        <translation>Höhenangabe bearbeiten...</translation>
     </message>
     <message>
         <location filename="../helpers/IElevationDialog.ui" line="22"/>
@@ -1787,7 +1817,7 @@ ist keine gültige Koordinatensystemdefinition:
     <message>
         <location filename="../helpers/IElevationDialog.ui" line="39"/>
         <source>Get elevation from active digital elevation model.</source>
-        <translation>Die aus dem aktiven Höhenmodell lesen.</translation>
+        <translation>Höhe aus aktivem digitalen Höhenmodell entnehmen.</translation>
     </message>
     <message>
         <location filename="../helpers/IElevationDialog.ui" line="42"/>
@@ -1868,6 +1898,36 @@ ist keine gültige Koordinatensystemdefinition:
     </message>
 </context>
 <context>
+    <name>ILinksDialog</name>
+    <message>
+        <location filename="../helpers/ILinksDialog.ui" line="14"/>
+        <source>Links...</source>
+        <translation>Verbindungen...</translation>
+    </message>
+    <message>
+        <location filename="../helpers/ILinksDialog.ui" line="23"/>
+        <source>Type</source>
+        <translation>Typ</translation>
+    </message>
+    <message>
+        <location filename="../helpers/ILinksDialog.ui" line="28"/>
+        <source>Text</source>
+        <translation>Text</translation>
+    </message>
+    <message>
+        <location filename="../helpers/ILinksDialog.ui" line="33"/>
+        <source>Uri</source>
+        <translatorcomment>?</translatorcomment>
+        <translation>URL</translation>
+    </message>
+    <message>
+        <location filename="../helpers/ILinksDialog.ui" line="43"/>
+        <location filename="../helpers/ILinksDialog.ui" line="63"/>
+        <source>...</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
     <name>IMainWindow</name>
     <message>
         <location filename="../IMainWindow.ui" line="14"/>
@@ -1900,160 +1960,165 @@ ist keine gültige Koordinatensystemdefinition:
         <translation>Projekt</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="119"/>
+        <location filename="../IMainWindow.ui" line="121"/>
         <source>Maps</source>
         <translation>Karten</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="156"/>
+        <location filename="../IMainWindow.ui" line="158"/>
         <source>Dig. Elev. Model (DEM)</source>
         <translation>Höhenmodell (DEM)</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="189"/>
+        <location filename="../IMainWindow.ui" line="191"/>
         <source>Data</source>
         <translation>Daten</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="202"/>
+        <location filename="../IMainWindow.ui" line="204"/>
         <source>Add Map Workspace</source>
         <translation>Ansicht hinzufügen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="205"/>
+        <location filename="../IMainWindow.ui" line="207"/>
         <source>Ctrl+T</source>
         <translation>Crtl+T</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="217"/>
+        <location filename="../IMainWindow.ui" line="219"/>
         <source>Show Scale</source>
         <translation>Maßstab</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="226"/>
+        <location filename="../IMainWindow.ui" line="228"/>
         <source>Setup Map Font</source>
         <translation>Kartenfont einstellen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="238"/>
+        <location filename="../IMainWindow.ui" line="240"/>
         <source>Show Grid</source>
         <translation>Gitter</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="241"/>
+        <location filename="../IMainWindow.ui" line="243"/>
         <source>Ctrl+G</source>
         <translation>Crtl+G</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="250"/>
+        <location filename="../IMainWindow.ui" line="252"/>
         <source>Setup Grid</source>
         <translation>Gitter einstellen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="253"/>
+        <location filename="../IMainWindow.ui" line="255"/>
         <source>Ctrl+Alt+G</source>
         <translation>Ctrl+Alt+G</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="265"/>
+        <location filename="../IMainWindow.ui" line="267"/>
         <source>Flip Mouse Wheel</source>
         <translation>Mausrad umdrehen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="274"/>
-        <location filename="../IMainWindow.ui" line="277"/>
+        <location filename="../IMainWindow.ui" line="276"/>
+        <location filename="../IMainWindow.ui" line="279"/>
         <source>Setup Map Paths</source>
         <translation>Kartenverzeichnisse angeben</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="289"/>
+        <location filename="../IMainWindow.ui" line="291"/>
         <source>POI Text</source>
         <translation>POI Text</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="301"/>
+        <location filename="../IMainWindow.ui" line="303"/>
         <source>Night / Day</source>
         <translation>Nacht / Tag</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="313"/>
+        <location filename="../IMainWindow.ui" line="315"/>
         <source>Map Tool Tip</source>
         <translation>Kartentooltip</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="322"/>
+        <location filename="../IMainWindow.ui" line="324"/>
         <source>Setup DEM Paths</source>
         <translation>DEM Verzeichnisse angeben</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="331"/>
+        <location filename="../IMainWindow.ui" line="333"/>
         <source>About</source>
         <translation>Über</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="340"/>
+        <location filename="../IMainWindow.ui" line="342"/>
         <source>Help</source>
         <translation>Hilfe</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="349"/>
+        <location filename="../IMainWindow.ui" line="351"/>
         <source>Setup Map Workspace</source>
         <translation>Kartenansicht einstellen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="358"/>
+        <location filename="../IMainWindow.ui" line="360"/>
         <source>Load GIS Data</source>
         <translation>GIS Daten laden</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="361"/>
+        <location filename="../IMainWindow.ui" line="363"/>
         <source>Load projects from file</source>
         <translation>Lade Datei als Projekt</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="364"/>
+        <location filename="../IMainWindow.ui" line="366"/>
         <source>Ctrl+L</source>
         <translation>Ctrl+L</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="373"/>
+        <location filename="../IMainWindow.ui" line="375"/>
         <source>Save All GIS Data</source>
         <translation>Alle GIS Daten speichern</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="376"/>
+        <location filename="../IMainWindow.ui" line="378"/>
         <source>Save all projects in the workspace</source>
         <translation>Alle Projekte im Arbeitsplatz speichern</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="379"/>
+        <location filename="../IMainWindow.ui" line="381"/>
         <source>Ctrl+S</source>
         <translation>Ctrl+S</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="388"/>
+        <location filename="../IMainWindow.ui" line="390"/>
         <source>Setup Time Zone</source>
         <translation>Zeitzone einstellen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="397"/>
+        <location filename="../IMainWindow.ui" line="399"/>
         <source>Add empty project</source>
-        <translation>Ein leeres Projekt hinzufügen</translation>
+        <translation>Leeres Projekt hinzufügen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="409"/>
+        <location filename="../IMainWindow.ui" line="411"/>
         <source>Search Google</source>
         <translation>Mit Google suchen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="418"/>
+        <location filename="../IMainWindow.ui" line="420"/>
         <source>Close all projects</source>
         <translation>Alle Projekte schließen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="427"/>
+        <location filename="../IMainWindow.ui" line="429"/>
         <source>Setup Units</source>
-        <translation>Einheiten einstellen</translation>
+        <translation>Einheiten einrichten</translation>
+    </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="438"/>
+        <source>Setup Database</source>
+        <translation>Datenbank einrichten</translation>
     </message>
 </context>
 <context>
@@ -2065,7 +2130,7 @@ ist keine gültige Koordinatensystemdefinition:
     </message>
     <message>
         <source>To add maps use File->Setup Map Pathss. </source>
-        <translation type="obsolete">Um Karten zuzufügen -> Menü Datei - Kartenverzeichnisse angeben.</translation>
+        <translation type="vanished">Um Karten zuzufügen -> Menü Datei - Kartenverzeichnisse angeben.</translation>
     </message>
     <message>
         <location filename="../map/IMapList.ui" line="103"/>
@@ -2308,7 +2373,7 @@ sein</translation>
         <source>m</source>
         <translation></translation>
     </message>
-    <message utf8="true">
+    <message>
         <location filename="../gis/wpt/IProjWpt.ui" line="69"/>
         <source>°</source>
         <translation></translation>
@@ -2441,7 +2506,7 @@ sein</translation>
     </message>
     <message>
         <source>Hide points.</source>
-        <translation type="obsolete">Pukte ausblenden.</translation>
+        <translation type="vanished">Pukte ausblenden.</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptRangeTrk.ui" line="43"/>
@@ -2452,11 +2517,11 @@ sein</translation>
     </message>
     <message>
         <source>Show points.</source>
-        <translation type="obsolete">Punkte anzeigen.</translation>
+        <translation type="vanished">Punkte anzeigen.</translation>
     </message>
     <message>
         <source>Copy track points to clipboard</source>
-        <translation type="obsolete">Trackpunkte in die Zwischenablage kopieren</translation>
+        <translation type="vanished">Trackpunkte in die Zwischenablage kopieren</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptRangeTrk.ui" line="103"/>
@@ -2537,11 +2602,11 @@ sein</translation>
     </message>
     <message>
         <source><html><head/><body><p>View details &amp; Edit</p></body></html></source>
-        <translation type="obsolete"><html><head/><body><p>Details anzeigen &amp; Bearbeiten</p></body></html></translation>
+        <translation type="vanished"><html><head/><body><p>Details anzeigen &amp; Bearbeiten</p></body></html></translation>
     </message>
     <message>
         <source><html><head/><body><p>View details &amp; Edit properties of track.</p></body></html></source>
-        <translation type="obsolete"><html><head/><body><p>Detailansicht &amp; Trackeigenschaften bearbeiten..</p></body></html></translation>
+        <translation type="vanished"><html><head/><body><p>Detailansicht &amp; Trackeigenschaften bearbeiten..</p></body></html></translation>
     </message>
     <message>
         <location filename="../gis/trk/IScrOptTrk.ui" line="43"/>
@@ -2557,19 +2622,19 @@ sein</translation>
     </message>
     <message>
         <source><html><head/><body><p>Delete</p></body></html></source>
-        <translation type="obsolete"><html><head/><body><p>Löschen</p></body></html></translation>
+        <translation type="vanished"><html><head/><body><p>Löschen</p></body></html></translation>
     </message>
     <message>
         <source><html><head/><body><p>Show on-screen profile and detailed information about points.</p></body></html></source>
-        <translation type="obsolete"><html><head/><body><p>Zeigt das Profil und detaillierte Informationen der Punkte.</p></body></html></translation>
+        <translation type="vanished"><html><head/><body><p>Zeigt das Profil und detaillierte Informationen der Punkte.</p></body></html></translation>
     </message>
     <message>
         <source><html><head/><body><p>Cut track at selected point into two tracks.</p></body></html></source>
-        <translation type="obsolete"><html><head/><body><p>Teilt den Track am selektierten Punkt in zwei Teile.</p></body></html></translation>
+        <translation type="vanished"><html><head/><body><p>Teilt den Track am selektierten Punkt in zwei Teile.</p></body></html></translation>
     </message>
     <message>
         <source><html><head/><body><p>Edit position of track points.</p></body></html></source>
-        <translation type="obsolete"><html><head/><body><p>Bearbeiten der Position von Trackpunkten.</p></body></html></translation>
+        <translation type="vanished"><html><head/><body><p>Bearbeiten der Position von Trackpunkten.</p></body></html></translation>
     </message>
     <message>
         <location filename="../gis/trk/IScrOptTrk.ui" line="174"/>
@@ -2622,7 +2687,7 @@ sein</translation>
     <name>ISelectProjectDialog</name>
     <message>
         <source>Dialog</source>
-        <translation type="obsolete">Dialog</translation>
+        <translation type="vanished">Dialog</translation>
     </message>
     <message>
         <location filename="../helpers/ISelectProjectDialog.ui" line="14"/>
@@ -2634,13 +2699,61 @@ sein</translation>
         <source>Select project from list or enter new project name.</source>
         <translation>Wähle ein Projekt aus der Liste oder gib einen neuen Projektnamen ein.</translation>
     </message>
+    <message>
+        <location filename="../helpers/ISelectProjectDialog.ui" line="36"/>
+        <source>New project is created as:</source>
+        <translation>Das neue Projekt wird erstellt als:</translation>
+    </message>
+    <message>
+        <location filename="../helpers/ISelectProjectDialog.ui" line="73"/>
+        <source>*.qms</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../helpers/ISelectProjectDialog.ui" line="83"/>
+        <source>*.gpx</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
+    <name>ISetupDB</name>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="14"/>
+        <source>Setup database...</source>
+        <translation>Datenbank einrichten...</translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="35"/>
+        <source>save workspace on exit, and every</source>
+        <translation>Ansicht beim Beenden speichern, und alle</translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="45"/>
+        <source>minutes</source>
+        <translation>Minuten</translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="62"/>
+        <source>Database path</source>
+        <translation>Datenbankpfad</translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="69"/>
+        <source>...</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="92"/>
+        <source>-</source>
+        <translation></translation>
+    </message>
 </context>
 <context>
     <name>ITextEditWidget</name>
     <message>
         <location filename="../helpers/ITextEditWidget.ui" line="14"/>
         <source>Edit text...</source>
-        <translation>Text eingeben...</translation>
+        <translation>Text bearbeiten...</translation>
     </message>
     <message>
         <location filename="../helpers/ITextEditWidget.ui" line="25"/>
@@ -2808,22 +2921,22 @@ sein</translation>
     <message>
         <location filename="../units/IUnitsSetup.ui" line="14"/>
         <source>Setup units...</source>
-        <translation>Einheiten einstellen...</translation>
+        <translation>Einheiten einrichten...</translation>
     </message>
     <message>
         <location filename="../units/IUnitsSetup.ui" line="22"/>
         <source>Metric</source>
-        <translation>Metrisch</translation>
+        <translation>metrisch</translation>
     </message>
     <message>
         <location filename="../units/IUnitsSetup.ui" line="29"/>
         <source>Imperial</source>
-        <translation>Imperial</translation>
+        <translation>imperial</translation>
     </message>
     <message>
         <location filename="../units/IUnitsSetup.ui" line="36"/>
         <source>Nautic</source>
-        <translation>Nautisch</translation>
+        <translation>nautisch</translation>
     </message>
 </context>
 <context>
@@ -2847,13 +2960,13 @@ sein</translation>
         <translation>Falsches Positionsformat. Richtig: [N|S] ddd mm.sss [W|E] ddd mm.sss </translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="60"/>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="69"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="66"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="75"/>
         <source>Failed to read...</source>
         <translation>Lesen fehlgeschlagen...</translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="60"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="66"/>
         <source>Failed to read: %1
 line %2, column %3:
  %4</source>
@@ -2862,176 +2975,212 @@ Zeile %2, Spalte %3:
 %4</translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="69"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="75"/>
         <source>Not a GPX file: </source>
         <translation>Keien GPX Datei:</translation>
     </message>
     <message>
-        <location filename="../gis/IGisProject.cpp" line="141"/>
+        <location filename="../gis/IGisProject.cpp" line="112"/>
+        <source>
+Filename: %1</source>
+        <translation>Dateiname: %1</translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="128"/>
+        <source>
+Waypoints: %1</source>
+        <translation>Wegpunkte: %1</translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="132"/>
+        <source>
+Tracks: %1</source>
+        <translation>Tracks: %1</translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="136"/>
+        <source>
+Routes: %1</source>
+        <translation>Routen: %1</translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="140"/>
+        <source>
+Areas: %1</source>
+        <translation>Fläche: %1</translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="197"/>
         <source>Are you sure you want to delete '%1' from project '%2'?</source>
         <translation>Sind Sie sicher, dass Sie '%1' aus dem Projekt '%2' löschen wollen? </translation>
     </message>
     <message>
-        <location filename="../gis/IGisProject.cpp" line="142"/>
+        <location filename="../gis/IGisProject.cpp" line="198"/>
         <source>Delete...</source>
         <translation>Löschen...</translation>
     </message>
     <message>
-        <location filename="../gis/bin/CBinProject.cpp" line="35"/>
-        <location filename="../gis/bin/CBinProject.cpp" line="121"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="53"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="47"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="135"/>
         <source>Failed to open...</source>
         <translation>Öffnen fehlgeschlagen...</translation>
     </message>
     <message>
-        <location filename="../gis/bin/CBinProject.cpp" line="35"/>
-        <location filename="../gis/bin/CBinProject.cpp" line="121"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="53"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="47"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="135"/>
         <source>Failed to open %1</source>
         <translation>Öffnen fehlgeschlagen: %1</translation>
     </message>
     <message>
-        <location filename="../gis/bin/CBinProject.cpp" line="77"/>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="145"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="151"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="90"/>
         <source>Save GIS data to...</source>
         <translation>GIS Daten speichern in...</translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="215"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="222"/>
         <source>File exists ...</source>
         <translation>Datei existiert...</translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="216"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="223"/>
         <source>The file exists and it has not been created by QMapShack. If you press 'yes' all data in this file will be lost. Even if this file contains GPX data and has been loaded by QMapShack, QMapShack might not be able to load and store all elements of this file.  Those elements will be lost. I recommend to use another file. <b>Do you really want to overwrite the file?</b></source>
         <translation>Diese Datei wurde nicht mit QMapShack erstellt. Wenn Sie 'Ja' drücken werden alle Daten dieser Datei gelöscht. Selbst wenn diese Datei GPX Daten enthält und mit QMapShack geladen wurde, können nicht alle Elemente dieser Datei durch QMapShack geladen und gespeichert werden. Diese Elemente sind verloren. Ich empfehle die Nutzung einer anderen Datei. <b>Wollen Sie die Datei wirklich überschreiben?</b></translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="282"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="289"/>
         <source>Failed to create file '%1'</source>
         <translation>Datei %1' konnte nicht erstellt werden</translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="282"/>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="292"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="289"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="299"/>
         <source>Saveing GIS data failed...</source>
         <translation>Speichern der GIS DAten fehlgeschlagen...</translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="292"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="299"/>
         <source>Failed to write file '%1'</source>
         <translation>Datei %1' konnte nicht gespeichert werden</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="266"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="253"/>
         <source>Changed trackpoints, sacrificed all previous data.</source>
         <translation>Wegpunkte geändert, alle vorherigen Daten sind verloren.</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="343"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="319"/>
         <source>Length: %1 %2</source>
         <translation>Länge: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="350"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="326"/>
         <source>, %1%2 %3, %4%5 %6</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="358"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="334"/>
         <source>Time: %1</source>
         <translation>Zeit: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="361"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="371"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="337"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="347"/>
         <source>, Speed: %1 %2</source>
         <translation>, Geschw.: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="368"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="344"/>
         <source>Moving: %1</source>
         <translation>Bewegung: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="377"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
         <source>Start: %1</source>
         <translation>Beginn: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="382"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="358"/>
         <source>End: %1</source>
         <translation>Ende: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="386"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="362"/>
         <source>Points: %1 (%2)</source>
         <translation>Punkte: %1 (%2)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="452"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="427"/>
         <source>Ele.: %1 %2</source>
         <translation>Höhe: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="455"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="430"/>
+        <source> slope: %1%3 (%2%)</source>
+        <translation>Neigung: %1%3 (%2%)</translation>
+    </message>
+    <message>
         <source> slope: %1° (%2%)</source>
-        <translation> Neigung: %1° (%2%)</translation>
+        <translation type="vanished"> Neigung: %1° (%2%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="967"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="940"/>
         <source>Hide points.</source>
-        <translation>Pukte ausblenden.</translation>
+        <translation>Punkte ausblenden.</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1001"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="974"/>
         <source>Show points.</source>
         <translation>Punkte anzeigen.</translation>
     </message>
     <message>
         <source> slope: %1°(%2%)</source>
-        <translation type="obsolete">Neigung: %1°(%2%)</translation>
+        <translation type="vanished">Neigung: %1°(%2%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="460"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="435"/>
         <source> speed: %1%2</source>
         <translation>Geschwindigkeit: %1%2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="472"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="447"/>
         <source>Ascend: %1%2 (%3%)</source>
         <translation>Anstieg: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="476"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="451"/>
         <source>Ascend: - (-)</source>
         <translation>Anstieg: - (-)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="482"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="457"/>
         <source> Descend: %1%2 (%3%)</source>
         <translation> Abstieg: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="486"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="461"/>
         <source> Descend: - (-) </source>
         <translation> Abstieg: - (-) </translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="493"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="468"/>
         <source>Dist.: %1%2 (%3%)</source>
         <translation>Entf.: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="497"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="472"/>
         <source>Dist.: - (-)</source>
         <translation>Entf.: - (-)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="503"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="478"/>
         <source> Moving: %1%2 (%3%)</source>
         <translation>Bewegung: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="507"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="482"/>
         <source> Moving: - (-) </source>
         <translation> Bewegung: - (-) </translation>
     </message>
@@ -3056,109 +3205,115 @@ Zeile %2, Spalte %3:
         <translation>stark</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="430"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="418"/>
         <source>Changed area shape.</source>
         <translation>Flächenform geändert.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="437"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="426"/>
         <source>Changed name.</source>
         <translation>Name geändert.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="443"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="432"/>
         <source>Changed border width.</source>
         <translation>Umrnadungsbreite geändert.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="449"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="438"/>
         <source>Changed fill pattern.</source>
         <translation>Füllung geändert.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="455"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="444"/>
         <source>Changed opacity.</source>
         <translation>Durchsichtigkeit geändert.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="461"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="450"/>
         <source>Changed comment.</source>
         <translation>Kommentar geändert.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="467"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="456"/>
         <source>Changed description.</source>
         <translation>Beschreibung geändert.</translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="479"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1312"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="462"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1279"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="333"/>
+        <source>Changed links</source>
+        <translation>Geänderte Verbindungen</translation>
+    </message>
+    <message>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="474"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1291"/>
         <source>Changed color</source>
         <translation>Farbe geändert</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="555"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="821"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="803"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="811"/>
         <location filename="../gis/trk/CGisItemTrk.cpp" line="829"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="847"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="894"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1026"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="183"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="872"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="999"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="165"/>
         <location filename="../mouse/CMouseEditArea.cpp" line="100"/>
         <location filename="../mouse/CMouseEditTrk.cpp" line="106"/>
         <source>Edit name...</source>
-        <translation>Name ändern...</translation>
+        <translation>Name bearbeiten...</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="183"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="165"/>
         <source>Enter new waypoint name.</source>
-        <translation>Geben Sie einen neuen Namen ein.</translation>
+        <translation>Name eingeben.</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="229"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="211"/>
         <source>Elevation: %1 %2</source>
         <translation>Höhe: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="237"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="219"/>
         <source>Proximity: %1 %2</source>
         <translation>Abstand: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1289"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="302"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1261"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="284"/>
         <source>Changed name</source>
         <translation>Name geändert</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="309"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="291"/>
         <source>Changed position</source>
         <translation>Position geändert</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="315"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="297"/>
         <source>Changed elevation</source>
         <translation>Höhe geändert</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="321"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="303"/>
         <source>Changed proximity</source>
         <translation>Abstandsalarm geändert</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="334"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="315"/>
         <source>Changed icon</source>
         <translation>Symbol geändert</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1295"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="340"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1267"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="321"/>
         <source>Changed comment</source>
         <translation>Kommentar geändert</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1301"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="346"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1273"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="327"/>
         <source>Changed description</source>
         <translation>Beschreibung geändert</translation>
     </message>
@@ -3186,35 +3341,64 @@ Zeile %2, Spalte %3:
     <message>
         <location filename="../map/garmin/CGarminTyp.cpp" line="459"/>
         <source>This is a typ file with unknown polygon encoding. Please report!</source>
-        <translation>Dieser Dateityp hat eine unbekannte Polygon Kodierung. Bitte berichten!</translation>
+        <translation>Dieser Dateityp hat eine unbekannte Polygon Kodierung. Bitte mitteilen!</translation>
     </message>
     <message>
         <location filename="../map/garmin/CGarminTyp.cpp" line="834"/>
         <source>This is a typ file with unknown polyline encoding. Please report!</source>
-        <translation>Dieser Dateityp hat eine unbekannte Polyline Kodierung. Bitte berichten!</translation>
+        <translation>Dieser Dateityp hat eine unbekannte Polyline Kodierung. Bitte mitteilen!</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="196"/>
+        <location filename="../gis/IGisItem.cpp" line="239"/>
         <source>Initial version.</source>
-        <translation>initiale Version</translation>
+        <translation>Erstversion.</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="269"/>
+        <location filename="../gis/IGisItem.cpp" line="323"/>
         <source>This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press'Ok'.</source>
         <translation>Diese Element ist vermutlich schreibgeschützt, da nicht mit QMapShack erstellt. Normalerweise sollten importierte Daten nicht geändert werden. Wenn doch, drücken Sie 'OK'.</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="270"/>
+        <location filename="../gis/IGisItem.cpp" line="324"/>
         <source>Read Only Mode...</source>
         <translation>Schreibgeschützt...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="555"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="821"/>
+        <location filename="../gis/IGisItem.cpp" line="513"/>
+        <source><h4>Comment:</h4></source>
+        <translation><h4>Kommentar:</h4></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisItem.cpp" line="516"/>
+        <source><p>--- no comment ---</p></source>
+        <translation><p>--- kein Kommentar ---</p></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisItem.cpp" line="523"/>
+        <source><h4>Description:</h4></source>
+        <translation><h4>Beschreibung:</h4></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisItem.cpp" line="526"/>
+        <source><p>--- no description ---</p></source>
+        <translation><p>--- keine Beschreibung ---</p></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisItem.cpp" line="533"/>
+        <source><h4>Links:</h4></source>
+        <translation><h4>Verbindungen:</h4></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisItem.cpp" line="536"/>
+        <source><p>--- no links ---</p></source>
+        <translation><h4>keine Verbindungen:</h4></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="803"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="811"/>
         <location filename="../gis/trk/CGisItemTrk.cpp" line="829"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="847"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="894"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1026"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="872"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="999"/>
         <location filename="../mouse/CMouseEditTrk.cpp" line="106"/>
         <source>Enter new track name.</source>
         <translation>Name eingeben.</translation>
@@ -3222,7 +3406,7 @@ Zeile %2, Spalte %3:
     <message>
         <location filename="../mouse/CMouseEditArea.cpp" line="100"/>
         <source>Enter new area name.</source>
-        <translation>Geben Sie einen Namen für das Gebiet an.</translation>
+        <translation>Name eingeben.</translation>
     </message>
 </context>
 </TS>
diff --git a/src/locale/qmapshack_es.ts b/src/locale/qmapshack_es.ts
index 7b30882..be91345 100644
--- a/src/locale/qmapshack_es.ts
+++ b/src/locale/qmapshack_es.ts
@@ -112,32 +112,32 @@
 <context>
     <name>CDetailsTrk</name>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="161"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="170"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="173"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="179"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="198"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="200"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="162"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="171"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="174"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="180"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="199"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="201"/>
         <source>%1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="225"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="226"/>
         <source><h4>Comment:</h4></source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="228"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="229"/>
         <source><p>--- no comment ---</p></source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="235"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="236"/>
         <source><h4>Description:</h4></source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="238"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="239"/>
         <source><p>--- no description ---</p></source>
         <translation type="unfinished"></translation>
     </message>
@@ -191,68 +191,78 @@
 <context>
     <name>CGisListWks</name>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="40"/>
+        <location filename="../gis/CGisListWks.cpp" line="48"/>
         <source>Save</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="39"/>
+        <location filename="../gis/CGisListWks.cpp" line="47"/>
         <source>Save As...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="41"/>
+        <location filename="../gis/CGisListWks.cpp" line="49"/>
         <source>Close</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="47"/>
+        <location filename="../gis/CGisListWks.cpp" line="55"/>
         <source>Edit...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="48"/>
+        <location filename="../gis/CGisListWks.cpp" line="56"/>
         <source>Move Waypoint</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="49"/>
+        <location filename="../gis/CGisListWks.cpp" line="57"/>
         <source>Proj. Waypoint...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="50"/>
+        <location filename="../gis/CGisListWks.cpp" line="58"/>
         <source>Track Profile</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="51"/>
+        <location filename="../gis/CGisListWks.cpp" line="59"/>
         <source>Select Range</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="52"/>
+        <location filename="../gis/CGisListWks.cpp" line="60"/>
         <source>Edit Track Points</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="53"/>
+        <location filename="../gis/CGisListWks.cpp" line="61"/>
         <source>Reverse Track</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="54"/>
+        <location filename="../gis/CGisListWks.cpp" line="62"/>
         <source>Combine Tracks</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="57"/>
+        <location filename="../gis/CGisListWks.cpp" line="63"/>
+        <source>Edit Area Points</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="66"/>
         <source>Delete</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="555"/>
-        <source>New Project</source>
+        <location filename="../gis/CGisListWks.cpp" line="400"/>
+        <source>Saving workspace. Please wait.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="441"/>
+        <source>Loading workspace. Please wait.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -270,14 +280,22 @@
     </message>
 </context>
 <context>
+    <name>CHistoryListWidget</name>
+    <message>
+        <location filename="../helpers/CHistoryListWidget.cpp" line="32"/>
+        <source>Cut history</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>CMainWindow</name>
     <message>
-        <location filename="../CMainWindow.cpp" line="436"/>
+        <location filename="../CMainWindow.cpp" line="444"/>
         <source>Ele: %1%2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../CMainWindow.cpp" line="545"/>
+        <location filename="../CMainWindow.cpp" line="559"/>
         <source>Load GIS Data...</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1265,6 +1283,24 @@ is not a valid coordinate system definition:
     </message>
 </context>
 <context>
+    <name>CSetupDB</name>
+    <message>
+        <location filename="../gis/db/CSetupDB.cpp" line="55"/>
+        <source>Setup database...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/CSetupDB.cpp" line="55"/>
+        <source>Changes will become active after an application's restart.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/CSetupDB.cpp" line="63"/>
+        <source>Select database path...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>CTextEditWidget</name>
     <message>
         <location filename="../helpers/CTextEditWidget.cpp" line="73"/>
@@ -1822,161 +1858,166 @@ is not a valid coordinate system definition:
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="119"/>
+        <location filename="../IMainWindow.ui" line="121"/>
         <source>Maps</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="156"/>
+        <location filename="../IMainWindow.ui" line="158"/>
         <source>Dig. Elev. Model (DEM)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="189"/>
+        <location filename="../IMainWindow.ui" line="191"/>
         <source>Data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="202"/>
+        <location filename="../IMainWindow.ui" line="204"/>
         <source>Add Map Workspace</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="205"/>
+        <location filename="../IMainWindow.ui" line="207"/>
         <source>Ctrl+T</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="217"/>
+        <location filename="../IMainWindow.ui" line="219"/>
         <source>Show Scale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="226"/>
+        <location filename="../IMainWindow.ui" line="228"/>
         <source>Setup Map Font</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="238"/>
+        <location filename="../IMainWindow.ui" line="240"/>
         <source>Show Grid</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="241"/>
+        <location filename="../IMainWindow.ui" line="243"/>
         <source>Ctrl+G</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="250"/>
+        <location filename="../IMainWindow.ui" line="252"/>
         <source>Setup Grid</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="253"/>
+        <location filename="../IMainWindow.ui" line="255"/>
         <source>Ctrl+Alt+G</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="265"/>
+        <location filename="../IMainWindow.ui" line="267"/>
         <source>Flip Mouse Wheel</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="274"/>
-        <location filename="../IMainWindow.ui" line="277"/>
+        <location filename="../IMainWindow.ui" line="276"/>
+        <location filename="../IMainWindow.ui" line="279"/>
         <source>Setup Map Paths</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="289"/>
+        <location filename="../IMainWindow.ui" line="291"/>
         <source>POI Text</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="301"/>
+        <location filename="../IMainWindow.ui" line="303"/>
         <source>Night / Day</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="313"/>
+        <location filename="../IMainWindow.ui" line="315"/>
         <source>Map Tool Tip</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="322"/>
+        <location filename="../IMainWindow.ui" line="324"/>
         <source>Setup DEM Paths</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="331"/>
+        <location filename="../IMainWindow.ui" line="333"/>
         <source>About</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="340"/>
+        <location filename="../IMainWindow.ui" line="342"/>
         <source>Help</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="349"/>
+        <location filename="../IMainWindow.ui" line="351"/>
         <source>Setup Map Workspace</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="358"/>
+        <location filename="../IMainWindow.ui" line="360"/>
         <source>Load GIS Data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="361"/>
+        <location filename="../IMainWindow.ui" line="363"/>
         <source>Load projects from file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="364"/>
+        <location filename="../IMainWindow.ui" line="366"/>
         <source>Ctrl+L</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="373"/>
+        <location filename="../IMainWindow.ui" line="375"/>
         <source>Save All GIS Data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="376"/>
+        <location filename="../IMainWindow.ui" line="378"/>
         <source>Save all projects in the workspace</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="379"/>
+        <location filename="../IMainWindow.ui" line="381"/>
         <source>Ctrl+S</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="388"/>
+        <location filename="../IMainWindow.ui" line="390"/>
         <source>Setup Time Zone</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="397"/>
+        <location filename="../IMainWindow.ui" line="399"/>
         <source>Add empty project</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="409"/>
+        <location filename="../IMainWindow.ui" line="411"/>
         <source>Search Google</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="418"/>
+        <location filename="../IMainWindow.ui" line="420"/>
         <source>Close all projects</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="427"/>
+        <location filename="../IMainWindow.ui" line="429"/>
         <source>Setup Units</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="438"/>
+        <source>Setup Database</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>IMapList</name>
@@ -2508,6 +2549,54 @@ or
         <source>Select project from list or enter new project name.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../helpers/ISelectProjectDialog.ui" line="36"/>
+        <source>New project is created as:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../helpers/ISelectProjectDialog.ui" line="73"/>
+        <source>*.qms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../helpers/ISelectProjectDialog.ui" line="83"/>
+        <source>*.gpx</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ISetupDB</name>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="14"/>
+        <source>Setup database...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="35"/>
+        <source>save workspace on exit, and every</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="45"/>
+        <source>minutes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="62"/>
+        <source>Database path</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="69"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/db/ISetupDB.ui" line="92"/>
+        <source>-</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>ITextEditWidget</name>
@@ -2721,185 +2810,217 @@ or
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="60"/>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="69"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="66"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="75"/>
         <source>Failed to read...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="60"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="66"/>
         <source>Failed to read: %1
 line %2, column %3:
  %4</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="69"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="75"/>
         <source>Not a GPX file: </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisProject.cpp" line="141"/>
+        <location filename="../gis/IGisProject.cpp" line="112"/>
+        <source>
+Filename: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="128"/>
+        <source>
+Waypoints: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="132"/>
+        <source>
+Tracks: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="136"/>
+        <source>
+Routes: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="140"/>
+        <source>
+Areas: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/IGisProject.cpp" line="197"/>
         <source>Are you sure you want to delete '%1' from project '%2'?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisProject.cpp" line="142"/>
+        <location filename="../gis/IGisProject.cpp" line="198"/>
         <source>Delete...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/bin/CBinProject.cpp" line="35"/>
-        <location filename="../gis/bin/CBinProject.cpp" line="121"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="53"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="47"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="135"/>
         <source>Failed to open...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/bin/CBinProject.cpp" line="35"/>
-        <location filename="../gis/bin/CBinProject.cpp" line="121"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="53"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="47"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="135"/>
         <source>Failed to open %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/bin/CBinProject.cpp" line="77"/>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="145"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="151"/>
+        <location filename="../gis/qms/CQmsProject.cpp" line="90"/>
         <source>Save GIS data to...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="215"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="222"/>
         <source>File exists ...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="216"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="223"/>
         <source>The file exists and it has not been created by QMapShack. If you press 'yes' all data in this file will be lost. Even if this file contains GPX data and has been loaded by QMapShack, QMapShack might not be able to load and store all elements of this file.  Those elements will be lost. I recommend to use another file. <b>Do you really want to overwrite the file?</b></source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="282"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="289"/>
         <source>Failed to create file '%1'</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="282"/>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="292"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="289"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="299"/>
         <source>Saveing GIS data failed...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/gpx/CGpxProject.cpp" line="292"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="299"/>
         <source>Failed to write file '%1'</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="343"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="319"/>
         <source>Length: %1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="350"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="326"/>
         <source>, %1%2 %3, %4%5 %6</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="358"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="334"/>
         <source>Time: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="361"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="371"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="337"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="347"/>
         <source>, Speed: %1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="368"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="344"/>
         <source>Moving: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="377"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
         <source>Start: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="382"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="358"/>
         <source>End: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="386"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="362"/>
         <source>Points: %1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="452"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="427"/>
         <source>Ele.: %1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="460"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="430"/>
+        <source> slope: %1%3 (%2%)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="435"/>
         <source> speed: %1%2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="472"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="447"/>
         <source>Ascend: %1%2 (%3%)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="476"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="451"/>
         <source>Ascend: - (-)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="486"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="461"/>
         <source> Descend: - (-) </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="507"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="482"/>
         <source> Moving: - (-) </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="967"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="940"/>
         <source>Hide points.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1001"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="974"/>
         <source>Show points.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="482"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="457"/>
         <source> Descend: %1%2 (%3%)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="266"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="253"/>
         <source>Changed trackpoints, sacrificed all previous data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="455"/>
-        <source> slope: %1° (%2%)</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="493"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="468"/>
         <source>Dist.: %1%2 (%3%)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="497"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="472"/>
         <source>Dist.: - (-)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="503"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="478"/>
         <source> Moving: %1%2 (%3%)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2924,109 +3045,108 @@ line %2, column %3:
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="430"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="418"/>
         <source>Changed area shape.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="437"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="426"/>
         <source>Changed name.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="443"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="432"/>
         <source>Changed border width.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="449"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="438"/>
         <source>Changed fill pattern.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="455"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="444"/>
         <source>Changed opacity.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="461"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="450"/>
         <source>Changed comment.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="467"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="456"/>
         <source>Changed description.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="479"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1312"/>
+        <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="468"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1284"/>
         <source>Changed color</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="229"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="211"/>
         <source>Elevation: %1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="237"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="219"/>
         <source>Proximity: %1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1289"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="302"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1261"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="284"/>
         <source>Changed name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="555"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="821"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="803"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="811"/>
         <location filename="../gis/trk/CGisItemTrk.cpp" line="829"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="847"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="894"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1026"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="183"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="872"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="999"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="165"/>
         <location filename="../mouse/CMouseEditArea.cpp" line="100"/>
         <location filename="../mouse/CMouseEditTrk.cpp" line="106"/>
         <source>Edit name...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="183"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="165"/>
         <source>Enter new waypoint name.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="309"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="291"/>
         <source>Changed position</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="315"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="297"/>
         <source>Changed elevation</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="321"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="303"/>
         <source>Changed proximity</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="334"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="315"/>
         <source>Changed icon</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1295"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="340"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1267"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="321"/>
         <source>Changed comment</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1301"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="346"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1273"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="327"/>
         <source>Changed description</source>
         <translation type="unfinished"></translation>
     </message>
@@ -3062,27 +3182,26 @@ line %2, column %3:
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="196"/>
+        <location filename="../gis/IGisItem.cpp" line="239"/>
         <source>Initial version.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="269"/>
+        <location filename="../gis/IGisItem.cpp" line="319"/>
         <source>This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press'Ok'.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="270"/>
+        <location filename="../gis/IGisItem.cpp" line="320"/>
         <source>Read Only Mode...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="555"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="821"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="803"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="811"/>
         <location filename="../gis/trk/CGisItemTrk.cpp" line="829"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="847"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="894"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1026"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="872"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="999"/>
         <location filename="../mouse/CMouseEditTrk.cpp" line="106"/>
         <source>Enter new track name.</source>
         <translation type="unfinished"></translation>
diff --git a/src/map/CMapIMG.cpp b/src/map/CMapIMG.cpp
index c4b30aa..6b241f6 100644
--- a/src/map/CMapIMG.cpp
+++ b/src/map/CMapIMG.cpp
@@ -642,6 +642,18 @@ void CMapIMG::readBasics()
 
         ++subfile;
     }
+
+    // combine copyright sections
+    copyright.clear();
+    foreach(const QString& str, copyrights)
+    {
+        if(!copyright.isEmpty())
+        {
+            copyright += "\n";
+        }
+        copyright += str;
+    }
+
     qDebug() << "dimensions:\t" << "N" << (maparea.bottom()*RAD_TO_DEG) << "E" << (maparea.right()*RAD_TO_DEG) << "S" << (maparea.top()*RAD_TO_DEG) << "W" << (maparea.left()*RAD_TO_DEG);
 }
 
@@ -667,6 +679,8 @@ void CMapIMG::readSubfileBasics(subfile_desc_t& subfile, CFileExt &file)
     qDebug() << "TRE2 size          :" << dec << gar_load(uint32_t, pTreHdr->tre2_size);
 #endif                       // DEBUG_SHOW_TRE_DATA
 
+    copyrights << QString(file.data(subfile.parts["TRE"].offset + gar_load(uint16_t, pTreHdr->length)));
+
     // read map boundaries from header
     qint32 i32;
     i32 = gar_ptr_load(int24_t, &pTreHdr->northbound);
diff --git a/src/map/CMapIMG.h b/src/map/CMapIMG.h
index 6bf41ce..3e756d9 100644
--- a/src/map/CMapIMG.h
+++ b/src/map/CMapIMG.h
@@ -555,6 +555,7 @@ class CMapIMG : public IMap
 
         QVector<textpath_t> textpaths;
         qint8 selectedLanguage;
+        QSet<QString> copyrights;
 };
 
 #endif //CMAPIMG_H
diff --git a/src/map/CMapPathSetup.cpp b/src/map/CMapPathSetup.cpp
index cb5104c..dfe3050 100644
--- a/src/map/CMapPathSetup.cpp
+++ b/src/map/CMapPathSetup.cpp
@@ -43,6 +43,7 @@ CMapPathSetup::~CMapPathSetup()
 {
 
 }
+
 void CMapPathSetup::slotItemSelectionChanged()
 {
     QList<QListWidgetItem*> items = listWidget->selectedItems();
diff --git a/src/mouse/IScrOptEditLine.ui b/src/mouse/IScrOptEditLine.ui
index 52c18c4..cd0b1ac 100644
--- a/src/mouse/IScrOptEditLine.ui
+++ b/src/mouse/IScrOptEditLine.ui
@@ -25,9 +25,6 @@
   <property name="windowTitle">
    <string>Form</string>
   </property>
-  <property name="styleSheet">
-   <string notr="true">background-color: rgb(255, 255, 255);</string>
-  </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
diff --git a/src/resources.qrc b/src/resources.qrc
index cea6e0a..d3a9001 100644
--- a/src/resources.qrc
+++ b/src/resources.qrc
@@ -69,6 +69,7 @@
         <file>icons/32x32/LoadGIS.png</file>
         <file>icons/32x32/GpxProject.png</file>
         <file>icons/32x32/QmsProject.png</file>
+        <file>icons/32x32/DBProject.png</file>
         <file>icons/32x32/Route.png</file>
         <file>icons/32x32/Close.png</file>
         <file>icons/32x32/Track.png</file>
@@ -115,6 +116,12 @@
         <file>icons/32x32/SetEle.png</file>
         <file>icons/32x32/Pattern.png</file>
         <file>icons/32x32/Opacity.png</file>
+        <file>icons/32x32/DatabaseSetup.png</file>
+        <file>icons/32x32/PathBlue.png</file>
+        <file>icons/32x32/PathOrange.png</file>
+        <file>icons/32x32/PathGreen.png</file>
+        <file>icons/32x32/Link.png</file>
+        <file>icons/32x32/Database.png</file>
 
 
         <file>icons/48x48/2DFix.png</file>
@@ -167,6 +174,7 @@
         <file>icons/48x48/LoadGIS.png</file>
         <file>icons/48x48/GpxProject.png</file>
         <file>icons/48x48/QmsProject.png</file>
+        <file>icons/48x48/DBProject.png</file>
         <file>icons/48x48/Route.png</file>
         <file>icons/48x48/Close.png</file>
         <file>icons/48x48/Track.png</file>
@@ -213,6 +221,12 @@
         <file>icons/48x48/SetEle.png</file>
         <file>icons/48x48/Pattern.png</file>
         <file>icons/48x48/Opacity.png</file>
+        <file>icons/48x48/DatabaseSetup.png</file>
+        <file>icons/48x48/PathBlue.png</file>
+        <file>icons/48x48/PathOrange.png</file>
+        <file>icons/48x48/PathGreen.png</file>
+        <file>icons/48x48/Link.png</file>
+        <file>icons/48x48/Database.png</file>
 
 
         <file>icons/cache/32x32/bluepin.png</file>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/qmapshack.git



More information about the Pkg-grass-devel mailing list