[qmapshack] 01/02: Imported Upstream version 0.7.0

Jaromír Mikeš mira-guest at moszumanska.debian.org
Wed Oct 29 17:38:01 UTC 2014


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

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

commit 77575edf86dbaed4e91c19fa21d676339a074c19
Author: Jaromír Mikeš <mira.mikes at seznam.cz>
Date:   Wed Oct 29 18:37:57 2014 +0100

    Imported Upstream version 0.7.0
---
 CMakeLists.txt                                     |   2 +-
 CMakeLists.txt.user                                |  65 ++-
 changelog.txt                                      |   5 +
 qmapshack.desktop                                  |   3 +-
 src/CMainWindow.cpp                                |   2 +-
 src/CMakeLists.txt                                 |  36 +-
 src/GeoMath.cpp                                    | 197 ++++++-
 src/GeoMath.h                                      |  18 +
 src/IMainWindow.ui                                 |  41 +-
 src/canvas/CCanvas.cpp                             |   7 +-
 src/canvas/CCanvas.h                               |  14 +
 src/canvas/IDrawObject.cpp                         |   2 +
 src/gis/CGisListWks.cpp                            | 100 +++-
 src/gis/CGisListWks.h                              |  16 +-
 src/gis/CGisSerialization.cpp                      | 215 ++++++++
 .../IDiskCache.cpp => gis/CGisSerialization.h}     |  17 +-
 src/gis/CGisWidget.cpp                             |  37 +-
 src/gis/CGisWidget.h                               |   6 +-
 src/gis/IGisItem.cpp                               |  12 +-
 src/gis/IGisItem.h                                 |  84 ++-
 src/gis/IGisProject.cpp                            | 193 +++++++
 src/gis/{CGisProject.h => IGisProject.h}           | 103 +---
 src/gis/IGisWidget.ui                              |   2 +-
 src/gis/{CGisProject.cpp => gpx/CGpxProject.cpp}   | 196 +------
 src/gis/{CGisProject.h => gpx/CGpxProject.h}       |  56 +-
 src/gis/ovl/CDetailsOvlArea.cpp                    |   8 +-
 src/gis/ovl/CGisItemOvlArea.cpp                    |   8 +-
 src/gis/ovl/CGisItemOvlArea.h                      |   8 +-
 src/gis/ovl/IDetailsOvlArea.ui                     |   8 +-
 src/gis/rte/CGisItemRte.cpp                        |   6 +-
 src/gis/rte/CGisItemRte.h                          |   6 +-
 src/gis/search/CSearchGoogle.cpp                   | 172 +++++++
 .../search/CSearchGoogle.h}                        |  31 +-
 src/gis/trk/CCombineTrk.cpp                        |   4 +-
 src/gis/trk/CCombineTrk.h                          |   6 +-
 src/gis/trk/CDetailsTrk.cpp                        |  76 ++-
 src/gis/trk/CDetailsTrk.h                          |   2 +
 src/gis/trk/CGisItemTrk.cpp                        |  72 ++-
 src/gis/trk/CGisItemTrk.h                          |  70 ++-
 src/gis/trk/IDetailsTrk.ui                         | 329 +++++++-----
 src/gis/wpt/CDetailsWpt.cpp                        |   8 +-
 src/gis/wpt/CGisItemWpt.cpp                        |  10 +-
 src/gis/wpt/CGisItemWpt.h                          |  11 +-
 src/gis/wpt/CProjWpt.cpp                           |   4 +-
 src/gis/wpt/IDetailsWpt.ui                         |  10 +-
 src/helpers/CSelectProjectDialog.cpp               |   4 +-
 src/helpers/CWptIconDialog.cpp                     |  32 +-
 src/helpers/CWptIconDialog.h                       |   7 +-
 src/helpers/ITextEditWidget.ui                     |   4 +-
 src/icons/32x32/AddProject.png                     | Bin 0 -> 1234 bytes
 src/icons/32x32/Error.png                          | Bin 0 -> 1130 bytes
 src/icons/32x32/MimeTMS.png                        | Bin 0 -> 1259 bytes
 src/icons/32x32/SearchGoogle.png                   | Bin 0 -> 1915 bytes
 src/icons/48x48/AddProject.png                     | Bin 0 -> 1713 bytes
 src/icons/48x48/Error.png                          | Bin 0 -> 1863 bytes
 src/icons/48x48/MimeTMS.png                        | Bin 0 -> 2073 bytes
 src/icons/48x48/SearchGoogle.png                   | Bin 0 -> 3068 bytes
 src/icons/AddProject.svg                           | 106 ++++
 src/icons/Error.svg                                |  79 +++
 src/icons/MimeTMS.svg                              |  98 ++++
 src/icons/SearchGoogle.svg                         |  73 +++
 src/locale/qmapshack_cs.ts                         | 566 ++++++++++++---------
 src/locale/qmapshack_de.ts                         | 412 +++++++++------
 src/locale/qmapshack_es.ts                         | 372 +++++++++-----
 src/map/CMapDraw.cpp                               |  52 +-
 src/map/CMapDraw.h                                 |  14 +
 src/map/CMapIMG.cpp                                | 112 +++-
 src/map/CMapIMG.h                                  |  15 +
 src/map/CMapItem.cpp                               |  12 +
 src/map/CMapJNX.cpp                                |   3 +-
 src/map/CMapTMS.cpp                                | 501 ++++++++++++++++++
 src/map/{CMapWMTS.h => CMapTMS.h}                  |  79 ++-
 src/map/CMapWMTS.cpp                               |  77 ++-
 src/map/CMapWMTS.h                                 |   9 +
 src/map/IMap.cpp                                   |   9 +
 src/map/IMap.h                                     |  21 +
 src/map/{wmts => cache}/CDiskCache.cpp             |  19 +-
 src/map/{wmts => cache}/CDiskCache.h               |   2 +-
 src/map/{wmts => cache}/IDiskCache.cpp             |   0
 src/map/{wmts => cache}/IDiskCache.h               |   0
 src/map/garmin/CGarminPolygon.cpp                  |  38 +-
 src/map/garmin/CGarminPolygon.h                    |   7 +-
 src/mouse/CMouseEditArea.cpp                       |  16 +-
 src/mouse/CMouseEditArea.h                         |   2 +
 src/mouse/CMouseEditTrk.cpp                        |  21 +-
 src/mouse/CMouseEditTrk.h                          |   5 +-
 src/mouse/CMouseNormal.cpp                         |   4 +-
 src/mouse/CScrOptUnclutter.cpp                     |  78 ++-
 src/mouse/CScrOptUnclutter.h                       |   2 +-
 src/mouse/IMouse.cpp                               |   1 +
 src/mouse/IMouse.h                                 |   6 +-
 src/mouse/IMouseEditLine.cpp                       | 152 +++++-
 src/mouse/IMouseEditLine.h                         |  10 +-
 src/plot/CPlotDistance.cpp                         |   2 +-
 src/plot/CPlotProfile.cpp                          |   2 +-
 src/plot/CPlotSpeed.cpp                            |   2 +-
 src/plot/CPlotTrack.cpp                            |   2 +-
 src/resources.qrc                                  |   8 +
 98 files changed, 3973 insertions(+), 1341 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ae04ec5..60f874f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -20,7 +20,7 @@ endif(WIN32)
 set(APPLICATION_NAME qmapshack)
 
 set(APPLICATION_VERSION_MAJOR "0")
-set(APPLICATION_VERSION_MINOR "6")
+set(APPLICATION_VERSION_MINOR "7")
 set(APPLICATION_VERSION_PATCH "0")
 
 add_definitions(-DVER_MAJOR=${APPLICATION_VERSION_MAJOR} -DVER_MINOR=${APPLICATION_VERSION_MINOR} -DVER_STEP=${APPLICATION_VERSION_PATCH} -DAPPLICATION_NAME=${PROJECT_NAME})
diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user
index 0d188d1..216fc60 100644
--- a/CMakeLists.txt.user
+++ b/CMakeLists.txt.user
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 3.1.2, 2014-10-15T08:28:32. -->
+<!-- Written by QtCreator 3.1.1, 2014-10-25T11:34:24. -->
 <qtcreator>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
@@ -54,12 +54,12 @@
  <data>
   <variable>ProjectExplorer.Project.Target.0</variable>
   <valuemap type="QVariantMap">
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.3 GCC 64bit</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.3 GCC 64bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.3.0 GCC 64bit</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.3.0 GCC 64bit</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.53.gcc_64_kit</value>
    <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
-   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">1</value>
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
     <value type="bool" key="CMakeProjectManager.CMakeBuildConfiguration.UseNinja">false</value>
     <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/oeichler/Code/cpp/build_QMapShack</value>
@@ -152,10 +152,61 @@
      <value type="int">13</value>
      <value type="int">14</value>
     </valuelist>
-    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguation.Title">qmapshack</value>
+    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguation.Title">maproom</value>
     <value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.Arguments"></value>
     <value type="bool" key="CMakeProjectManager.CMakeRunConfiguration.UseTerminal">false</value>
     <value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory"></value>
+    <value type="int" key="PE.EnvironmentAspect.Base">-1</value>
+    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">maproom (deaktiviert)</value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
+    <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.maproom</value>
+    <value type="uint" key="RunConfiguration.QmlDebugServerPort">3768</value>
+    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
+    <value type="bool" key="RunConfiguration.UseMultiProcess">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
+    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
+   </valuemap>
+   <valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
+    <value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
+    <value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
+    <value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
+    <value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
+    <value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
+    <value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
+    <value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
+    <value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
+    <value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
+    <value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
+    <valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
+     <value type="int">0</value>
+     <value type="int">1</value>
+     <value type="int">2</value>
+     <value type="int">3</value>
+     <value type="int">4</value>
+     <value type="int">5</value>
+     <value type="int">6</value>
+     <value type="int">7</value>
+     <value type="int">8</value>
+     <value type="int">9</value>
+     <value type="int">10</value>
+     <value type="int">11</value>
+     <value type="int">12</value>
+     <value type="int">13</value>
+     <value type="int">14</value>
+    </valuelist>
+    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguation.Title">qmapshack</value>
+    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.Arguments">-d</value>
+    <value type="bool" key="CMakeProjectManager.CMakeRunConfiguration.UseTerminal">false</value>
+    <value type="QString" key="CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory"></value>
     <value type="int" key="PE.EnvironmentAspect.Base">2</value>
     <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
     <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmapshack</value>
@@ -168,7 +219,7 @@
     <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
     <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
    </valuemap>
-   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
+   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">2</value>
   </valuemap>
  </data>
  <data>
@@ -177,7 +228,7 @@
  </data>
  <data>
   <variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
-  <value type="QByteArray">{aef9f59c-83a3-4ac3-bddf-77d643de0ead}</value>
+  <value type="QByteArray">{044d553a-749a-4a4b-b707-1344605bd255}</value>
  </data>
  <data>
   <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
diff --git a/changelog.txt b/changelog.txt
index f225f6a..08cb6fc 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,3 +1,8 @@
+V 0.7.0
+* Add Google GIS search
+* Add support for TMS maps
+* Snap to line for track and area edit
+
 V 0.6.0
 * Reverse tracks
 * Add dialog to combine tracks
diff --git a/qmapshack.desktop b/qmapshack.desktop
index 8007a85..56dc9d1 100644
--- a/qmapshack.desktop
+++ b/qmapshack.desktop
@@ -9,4 +9,5 @@ X-MultipleArgs=false
 Categories=Qt;Utility;Geography;
 GenericName=GPS device mapping utility
 Keywords=map;GPS;geocaching;waypoints;tracks;
-MimeType=application/x-gpx;
\ No newline at end of file
+MimeType=application/x-gpx;
+StartupNotify=true
\ No newline at end of file
diff --git a/src/CMainWindow.cpp b/src/CMainWindow.cpp
index 3f0b300..5060f3f 100644
--- a/src/CMainWindow.cpp
+++ b/src/CMainWindow.cpp
@@ -45,7 +45,7 @@ CMainWindow::CMainWindow()
 
     initWptIcons();
 
-    gisWidget = new CGisWidget(this);
+    gisWidget = new CGisWidget(menuProject, this);
     dockGis->setWidget(gisWidget);
 
     IUnit::self().setUnitType(IUnit::eTypeMetric, this);
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index aaaa497..bd560ae 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -8,6 +8,7 @@ set(CMAKE_AUTOMOC ON)
 find_package(Qt5Widgets)
 find_package(Qt5Core)
 find_package(Qt5Xml)
+find_package(Qt5Script)
 find_package(Qt5WebKitWidgets)
 find_package(Qt5LinguistTools)
 find_package(GDAL REQUIRED)
@@ -46,6 +47,7 @@ set( SRCS
     map/CMapMAP.cpp
     map/CMapVRT.cpp
     map/CMapWMTS.cpp
+    map/CMapTMS.cpp
     map/CMapPathSetup.cpp    
     map/CMapPropSetup.cpp
     map/garmin/IGarminStrTbl.cpp
@@ -55,8 +57,8 @@ set( SRCS
     map/garmin/CGarminPoint.cpp
     map/garmin/CGarminPolygon.cpp
     map/garmin/CGarminTyp.cpp
-    map/wmts/CDiskCache.cpp
-    map/wmts/IDiskCache.cpp
+    map/cache/CDiskCache.cpp
+    map/cache/IDiskCache.cpp
     map/mapsforge/types.cpp
     units/IUnit.cpp
     units/CUnitImperial.cpp
@@ -84,6 +86,11 @@ set( SRCS
     gis/CGisDraw.cpp
     gis/IGisItem.cpp
     gis/IGisLine.cpp
+    gis/CGisWidget.cpp
+    gis/CGisListDB.cpp
+    gis/CGisListWks.cpp
+    gis/IGisProject.cpp
+    gis/CGisSerialization.cpp
     gis/wpt/CGisItemWpt.cpp
     gis/wpt/CScrOptWpt.cpp
     gis/wpt/CDetailsWpt.cpp
@@ -98,10 +105,8 @@ set( SRCS
     gis/ovl/CGisItemOvlArea.cpp
     gis/ovl/CScrOptOvlArea.cpp
     gis/ovl/CDetailsOvlArea.cpp
-    gis/CGisWidget.cpp
-    gis/CGisListDB.cpp
-    gis/CGisListWks.cpp
-    gis/CGisProject.cpp
+    gis/gpx/CGpxProject.cpp
+    gis/search/CSearchGoogle.cpp
     plot/IPlot.cpp
     plot/CPlotAxis.cpp
     plot/CPlotAxisTime.cpp    
@@ -150,6 +155,7 @@ set( HDRS
     map/CMapMAP.h
     map/CMapVRT.h
     map/CMapWMTS.h
+    map/CMapTMS.h
     map/CMapPathSetup.h
     map/CMapPropSetup.h    
     map/garmin/Garmin.h
@@ -160,8 +166,8 @@ set( HDRS
     map/garmin/CGarminPoint.h
     map/garmin/CGarminPolygon.h
     map/garmin/CGarminTyp.h
-    map/wmts/CDiskCache.h
-    map/wmts/IDiskCache.h
+    map/cache/CDiskCache.h
+    map/cache/IDiskCache.h
     map/mapsforge/types.h
     units/IUnit.h
     units/CUnitImperial.h
@@ -189,6 +195,11 @@ set( HDRS
     gis/CGisDraw.h
     gis/IGisItem.h
     gis/IGisLine.h
+    gis/IGisProject.h
+    gis/CGisWidget.h
+    gis/CGisListDB.h
+    gis/CGisListWks.h
+    gis/CGisSerialization.h
     gis/wpt/CGisItemWpt.h
     gis/wpt/CScrOptWpt.h
     gis/wpt/CDetailsWpt.h
@@ -202,11 +213,9 @@ set( HDRS
     gis/rte/CScrOptRte.h
     gis/ovl/CGisItemOvlArea.h
     gis/ovl/CScrOptOvlArea.h
-    gis/ovl/CDetailsOvlArea.h
-    gis/CGisWidget.h
-    gis/CGisListDB.h
-    gis/CGisListWks.h
-    gis/CGisProject.h    
+    gis/ovl/CDetailsOvlArea.h    
+    gis/gpx/CGpxProject.h
+    gis/search/CSearchGoogle.h
     plot/IPlot.h
     plot/CPlotAxis.h
     plot/CPlotAxisTime.h
@@ -299,6 +308,7 @@ add_executable(${APPLICATION_NAME} WIN32 ${ALLINP})
 target_link_libraries(${APPLICATION_NAME}
     Qt5::Widgets
     Qt5::Xml
+    Qt5::Script
     Qt5::WebKitWidgets
     CGetOpt
     ${GDAL_LIBRARIES}
diff --git a/src/GeoMath.cpp b/src/GeoMath.cpp
index 2ee865e..8b11fb2 100644
--- a/src/GeoMath.cpp
+++ b/src/GeoMath.cpp
@@ -18,6 +18,7 @@
 **********************************************************************************************/
 
 #include "GeoMath.h"
+#include "canvas/IDrawContext.h"
 #include <math.h>
 #include <stdlib.h>
 #include <proj_api.h>
@@ -90,13 +91,13 @@ bool GPS_Math_Str_To_Deg(const QString& str, qreal& lon, qreal& lat)
     }
 
     bool signLat    = re.cap(1) == "S";
-    int degLat      = re.cap(2).toInt();
+    qint32 degLat      = re.cap(2).toInt();
     qreal minLat   = re.cap(3).toDouble();
 
     GPS_Math_DegMin_To_Deg(signLat, degLat, minLat, lat);
 
     bool signLon    = re.cap(4) == "W";
-    int degLon      = re.cap(5).toInt();
+    qint32 degLon      = re.cap(5).toInt();
     qreal minLon   = re.cap(6).toDouble();
 
     GPS_Math_DegMin_To_Deg(signLon, degLon, minLon, lon);
@@ -287,13 +288,13 @@ void GPS_Math_DouglasPeucker(QVector<pointDP> &line, qreal d)
 
     while(!stack.isEmpty())
     {
-        int idx = -1;
+        qint32 idx = -1;
         segment seg = stack.pop();
 
         pointDP& x1 = line[seg.idx1];
         pointDP& x2 = line[seg.idx2];
 
-        for(int i = seg.idx1 + 1; i < seg.idx2; i++)
+        for(qint32 i = seg.idx1 + 1; i < seg.idx2; i++)
         {
             qreal distance = GPS_Math_distPointLine3D(x1, x2, line[i]);
             if(distance > d)
@@ -310,7 +311,7 @@ void GPS_Math_DouglasPeucker(QVector<pointDP> &line, qreal d)
         }
         else
         {
-            for(int i = seg.idx1 + 1; i < seg.idx2; i++)
+            for(qint32 i = seg.idx1 + 1; i < seg.idx2; i++)
             {
                 line[i].used = false;
             }
@@ -360,3 +361,189 @@ bool GPS_Math_LineCrossesRect(const QPointF &p1, const QPointF &p2, const QRectF
 
     return true;
 }
+
+
+void GPS_Math_SubPolyline(const QPointF& pt1, const QPointF& pt2, qint32 threshold, const QPolygonF& pixel, segment_t &result)
+{
+    qint32 i, len;
+    projXY p1, p2;
+    qreal dx,dy;                // delta x and y defined by p1 and p2
+    qreal d_p1_p2;              // distance between p1 and p2
+    qreal u;                    // ratio u the tangent point will divide d_p1_p2
+    qreal x,y;                  // coord. (x,y) of the point on line defined by [p1,p2] close to pt
+    qreal distance;             // the distance to the polyline
+    qreal shortest1 = threshold;
+    qreal shortest2 = threshold;
+    qint32 idx11 = -1, idx21 = -1, idx12 = -1;
+
+    QPointF pt11;
+    QPointF pt21;
+
+    len = pixel.size();
+
+    // find points on line closest to pt1 and pt2
+    for(i=1; i<len; ++i)
+    {
+        p1.u = pixel[i - 1].x();
+        p1.v = pixel[i - 1].y();
+        p2.u = pixel[i].x();
+        p2.v = pixel[i].y();
+
+        dx = p2.u - p1.u;
+        dy = p2.v - p1.v;
+        d_p1_p2 = sqrt(dx * dx + dy * dy);
+
+        // find point on line closest to pt1
+        u = ((pt1.x() - p1.u) * dx + (pt1.y() - p1.v) * dy) / (d_p1_p2 * d_p1_p2);
+
+        if(u >= 0.0 && u <= 1.0)
+        {
+            x = p1.u + u * dx;
+            y = p1.v + u * dy;
+
+            distance = sqrt((x - pt1.x())*(x - pt1.x()) + (y - pt1.y())*(y - pt1.y()));
+
+            if(distance < shortest1)
+            {
+                idx11 = i - 1;
+                idx12 = i;
+                pt11.setX(x);
+                pt11.setY(y);
+                shortest1 = distance;
+            }
+        }
+
+        // find point on line closest to pt2
+        u = ((pt2.x() - p1.u) * dx + (pt2.y() - p1.v) * dy) / (d_p1_p2 * d_p1_p2);
+
+        if(u >= 0.0 && u <= 1.0)
+        {
+
+            x = p1.u + u * dx;
+            y = p1.v + u * dy;
+
+            distance = sqrt((x - pt2.x())*(x - pt2.x()) + (y - pt2.y())*(y - pt2.y()));
+
+            if(distance < shortest2)
+            {
+                idx21 = i - 1;
+                pt21.setX(x);
+                pt21.setY(y);
+                shortest2 = distance;
+            }
+        }
+    }
+
+    // if 1st point can't be found test for distance to both ends
+    if(idx11 == -1)
+    {
+        QPointF px = pixel.first();
+        distance = sqrt((qreal)((px.x() - pt1.x())*(px.x() - pt1.x()) + (px.y() - pt1.y())*(px.y() - pt1.y())));
+        if(distance < (threshold<<1))
+        {
+            idx11 = 0;
+            idx12 = 1;
+            pt11 = px;
+        }
+        else
+        {
+            px = pixel.last();
+            distance = sqrt((qreal)((px.x() - pt1.x())*(px.x() - pt1.x()) + (px.y() - pt1.y())*(px.y() - pt1.y())));
+            if(distance < (threshold<<1))
+            {
+                idx11 = pixel.size() - 2;
+                idx12 = pixel.size() - 1;
+                pt11 = px;
+            }
+        }
+    }
+
+    // if 2nd point can't be found test for distance to both ends
+    if(idx21 == -1)
+    {
+        QPointF px = pixel.first();
+        distance = sqrt((qreal)((px.x() - pt2.x())*(px.x() - pt2.x()) + (px.y() - pt2.y())*(px.y() - pt2.y())));
+
+        if(distance < (threshold<<1))
+        {
+            idx21 = 0;
+            pt21 = px;
+        }
+        else
+        {
+            px = pixel.last();
+            distance = sqrt((qreal)((px.x() - pt2.x())*(px.x() - pt2.x()) + (px.y() - pt2.y())*(px.y() - pt2.y())));
+            if(distance < (threshold<<1))
+            {
+                idx21 = pixel.size() - 2;
+                pt21 = px;
+            }
+        }
+    }
+
+    //    qDebug() << pixel.size() << idx11 << idx12 << idx21 << pt1 << pt2 << pt11 << pt21;
+
+    result.idx11 = idx11;
+    result.idx12 = idx12;
+    result.idx21 = idx21;
+    result.px1   = pt11;
+    result.px2   = pt21;
+}
+
+void segment_t::apply(const QPolygonF& coords, const QPolygonF& pixel, QPolygonF& segCoord, QPolygonF& segPixel, IDrawContext * context)
+{
+
+    QPointF pt1 = px1;
+    QPointF pt2 = px2;
+
+    context->convertPx2Rad(pt1);
+    context->convertPx2Rad(pt2);
+
+    if(idx11 != -1 && idx21 != -1)
+    {
+        if(idx11 == idx21)
+        {
+            segPixel.push_back(px1);
+            segPixel.push_back(px2);
+
+            segCoord.push_back(pt1);
+            segCoord.push_back(pt2);
+
+        }
+        else if(idx12 == idx21)
+        {
+            segPixel.push_back(px1);
+            segPixel.push_back(pixel[idx12]);
+            segPixel.push_back(px2);
+
+            segCoord.push_back(pt1);
+            segCoord.push_back(coords[idx12]);
+            segCoord.push_back(pt2);
+
+        }
+        else if(idx11 < idx21)
+        {
+            segPixel.push_back(px1);
+            segCoord.push_back(pt1);
+            for(int i = idx12; i <= idx21; i++)
+            {
+                segPixel.push_back(pixel[i]);
+                segCoord.push_back(coords[i]);
+            }
+            segPixel.push_back(px2);
+            segCoord.push_back(pt2);
+        }
+        else if(idx11 > idx21)
+        {
+            segPixel.push_back(px1);
+            segCoord.push_back(pt1);
+            for(int i = idx11; i > idx21; i--)
+            {
+                segPixel.push_back(pixel[i]);
+                segCoord.push_back(coords[i]);
+            }
+            segPixel.push_back(px2);
+            segCoord.push_back(pt2);
+        }
+    }
+}
diff --git a/src/GeoMath.h b/src/GeoMath.h
index 591f6ee..5ad19a4 100644
--- a/src/GeoMath.h
+++ b/src/GeoMath.h
@@ -25,6 +25,9 @@
 
 #include <stdint.h>
 
+class QPolygonF;
+class IDrawContext;
+
 struct point3D
 {
     qreal x;
@@ -38,6 +41,20 @@ struct pointDP : public point3D
     bool used;
 };
 
+struct segment_t
+{
+    segment_t() : idx11(-1), idx12(-1), idx21(-1){}
+
+    void apply(const QPolygonF& coords, const QPolygonF& pixel, QPolygonF& segCoord, QPolygonF& segPixel, IDrawContext * context);
+
+    qint32 idx11;
+    qint32 idx12;
+    qint32 idx21;
+
+    QPointF px1;
+    QPointF px2;
+};
+
 extern void     GPS_Math_Deg_To_Str(const qreal& x, const qreal& y, QString& str);
 extern bool     GPS_Math_Str_To_Deg(const QString& str, qreal& lon, qreal& lat);
 extern void     GPS_Math_DegMin_To_Deg(bool sign, const qint32 d, const qreal m, qreal& deg);
@@ -51,6 +68,7 @@ extern void     GPS_Math_Wpt_Projection(const qreal lon1, const qreal lat1, cons
 extern void     GPS_Math_DouglasPeucker(QVector<pointDP>& line, qreal d);
 extern QPointF  GPS_Math_Wpt_Projection(const QPointF& pt1, qreal distance, qreal bearing);
 extern bool     GPS_Math_LineCrossesRect(const QPointF& p1, const QPointF& p2, const QRectF& rect);
+extern void     GPS_Math_SubPolyline(const QPointF& pt1, const QPointF& pt2, qint32 threshold, const QPolygonF& pixel, segment_t& result);
 
 #endif                           //GEOMATH_H
 
diff --git a/src/IMainWindow.ui b/src/IMainWindow.ui
index 7134415..5a44ac3 100644
--- a/src/IMainWindow.ui
+++ b/src/IMainWindow.ui
@@ -52,7 +52,7 @@
      <x>0</x>
      <y>0</y>
      <width>800</width>
-     <height>23</height>
+     <height>20</height>
     </rect>
    </property>
    <widget class="QMenu" name="menuFile">
@@ -95,7 +95,16 @@
     <addaction name="actionAbout"/>
     <addaction name="actionHelp"/>
    </widget>
+   <widget class="QMenu" name="menuProject">
+    <property name="title">
+     <string>Project</string>
+    </property>
+    <addaction name="actionAddEmptyProject"/>
+    <addaction name="actionSearchGoogle"/>
+    <addaction name="actionCloseAllProjects"/>
+   </widget>
    <addaction name="menuFile"/>
+   <addaction name="menuProject"/>
    <addaction name="menuView"/>
    <addaction name="menuWindow"/>
    <addaction name="menu"/>
@@ -378,6 +387,36 @@
     <string>Setup Time Zone</string>
    </property>
   </action>
+  <action name="actionAddEmptyProject">
+   <property name="icon">
+    <iconset resource="resources.qrc">
+     <normaloff>:/icons/32x32/AddProject.png</normaloff>:/icons/32x32/AddProject.png</iconset>
+   </property>
+   <property name="text">
+    <string>Add empty project</string>
+   </property>
+  </action>
+  <action name="actionSearchGoogle">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="icon">
+    <iconset resource="resources.qrc">
+     <normaloff>:/icons/32x32/SearchGoogle.png</normaloff>:/icons/32x32/SearchGoogle.png</iconset>
+   </property>
+   <property name="text">
+    <string>Search Google</string>
+   </property>
+  </action>
+  <action name="actionCloseAllProjects">
+   <property name="icon">
+    <iconset resource="resources.qrc">
+     <normaloff>:/icons/32x32/DeleteMultiple.png</normaloff>:/icons/32x32/DeleteMultiple.png</iconset>
+   </property>
+   <property name="text">
+    <string>Close all projects</string>
+   </property>
+  </action>
  </widget>
  <resources>
   <include location="resources.qrc"/>
diff --git a/src/canvas/CCanvas.cpp b/src/canvas/CCanvas.cpp
index 6db7200..0fcee24 100644
--- a/src/canvas/CCanvas.cpp
+++ b/src/canvas/CCanvas.cpp
@@ -98,7 +98,6 @@ CCanvas::CCanvas(QWidget *parent)
     labelStatusMessages = new QLabel(this);
     labelStatusMessages->hide();
 
-
     connect(map, SIGNAL(sigStartThread()), mapLoadIndicator, SLOT(show()));
     connect(map, SIGNAL(sigStopThread()), mapLoadIndicator, SLOT(hide()));
 
@@ -162,6 +161,7 @@ void CCanvas::setMouseMoveWpt(CGisItemWpt& wpt)
 
 void CCanvas::setMouseEditTrk(const QPointF &pt)
 {
+
     mouse->deleteLater();
     mouse = new CMouseEditTrk(pt, gis, this);
     if(underMouse())
@@ -702,3 +702,8 @@ void CCanvas::setZoom(bool in, redraw_e& needsRedraw)
     dem->zoom(map->zoom());
     gis->zoom(map->zoom());
 }
+
+bool CCanvas::findPolylineCloseBy(QPointF& pt1, QPointF& pt2, qint32 threshold, QPolygonF& polyline)
+{
+    return map->findPolylineCloseBy(pt1, pt2, threshold, polyline);
+}
diff --git a/src/canvas/CCanvas.h b/src/canvas/CCanvas.h
index e3d1851..973c693 100644
--- a/src/canvas/CCanvas.h
+++ b/src/canvas/CCanvas.h
@@ -119,6 +119,20 @@ class CCanvas : public QWidget
          */
         void reportStatus(const QString& key, const QString& msg);
 
+        /**
+           @brief Find a matching street polyline
+
+           The polyline must be close enough in terms of pixel to point 1 and 2. "Close enough" is defined by
+           the threshold. The returned poylline uses lon/lat as coordinates.
+
+           @param pt1           first point in [rad]
+           @param pt2           second point in [rad]
+           @param threshold     the "close enough" threshold in [pixel]
+           @param polyline      the resulting polyline, if any, in [rad]
+           @return              Return true if a line has been found.
+        */
+        bool findPolylineCloseBy(QPointF& pt1, QPointF& pt2, qint32 threshold, QPolygonF& polyline);
+
     signals:
         void sigMousePosition(const QPointF& pos, qreal ele);
 
diff --git a/src/canvas/IDrawObject.cpp b/src/canvas/IDrawObject.cpp
index 3bffae1..6404a1e 100644
--- a/src/canvas/IDrawObject.cpp
+++ b/src/canvas/IDrawObject.cpp
@@ -52,6 +52,8 @@ void IDrawObject::saveConfig(QSettings& cfg)
     cfg.setValue("cachePath", cachePath);
     cfg.setValue("cacheSizeMB", cacheSizeMB);
     cfg.setValue("cacheExpiration", cacheExpiration);
+
+
 }
 
 void IDrawObject::loadConfig(QSettings& cfg)
diff --git a/src/gis/CGisListWks.cpp b/src/gis/CGisListWks.cpp
index 23e8545..4f08b19 100644
--- a/src/gis/CGisListWks.cpp
+++ b/src/gis/CGisListWks.cpp
@@ -17,19 +17,22 @@
 **********************************************************************************************/
 
 #include "gis/CGisListWks.h"
-#include "gis/CGisProject.h"
+#include "gis/IGisProject.h"
 #include "gis/IGisItem.h"
 #include "gis/CGisWidget.h"
+#include "gis/gpx/CGpxProject.h"
 #include "gis/wpt/CGisItemWpt.h"
 #include "gis/trk/CGisItemTrk.h"
 #include "gis/rte/CGisItemRte.h"
 #include "gis/ovl/CGisItemOvlArea.h"
+#include "gis/search/CSearchGoogle.h"
 #include "CMainWindow.h"
 
 #include <QtWidgets>
 
 CGisListWks::CGisListWks(QWidget *parent)
     : QTreeWidget(parent)
+    , menuNone(0)
 {
 
     menuProject     = new QMenu(this);
@@ -45,13 +48,13 @@ CGisListWks::CGisListWks(QWidget *parent)
     actionMoveWpt   = menuItem->addAction(QIcon("://icons/32x32/WptMove.png"),tr("Move Waypoint"), this, SLOT(slotMoveWpt()));
     actionProjWpt   = menuItem->addAction(QIcon("://icons/32x32/WptProj.png"),tr("Proj. Waypoint..."), this, SLOT(slotProjWpt()));
     actionFocusTrk  = menuItem->addAction(QIcon("://icons/32x32/TrkProfile.png"),tr("Track Profile"));
+    actionRangeTrk  = menuItem->addAction(QIcon("://icons/32x32/SelectRange.png"),tr("Select Range"), this, SLOT(slotRangeTrk()));
     actionEditTrk   = menuItem->addAction(QIcon("://icons/32x32/LineMove.png"),tr("Edit Track Points"), this, SLOT(slotEditTrk()));
     actionReverseTrk = menuItem->addAction(QIcon("://icons/32x32/Reverse.png"),tr("Reverse Track"), this, SLOT(slotReverseTrk()));
     actionCombineTrk = menuItem->addAction(QIcon("://icons/32x32/Combine.png"),tr("Combine Tracks"), this, SLOT(slotCombineTrk()));
     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()));    
 }
 
 CGisListWks::~CGisListWks()
@@ -59,6 +62,14 @@ CGisListWks::~CGisListWks()
 
 }
 
+void CGisListWks::setExternalMenu(QMenu * project)
+{
+    menuNone = project;
+    connect(CMainWindow::self().findChild<QAction*>("actionAddEmptyProject"), SIGNAL(triggered()), this, SLOT(slotAddEmptyProject()));
+    connect(CMainWindow::self().findChild<QAction*>("actionCloseAllProjects"), SIGNAL(triggered(bool)), this, SLOT(slotCloseAllProjects()));
+    connect(CMainWindow::self().findChild<QAction*>("actionSearchGoogle"), SIGNAL(triggered(bool)), this, SLOT(slotSearchGoogle(bool)));
+}
+
 void CGisListWks::dragMoveEvent (QDragMoveEvent  * e )
 {
     /*
@@ -142,7 +153,7 @@ void CGisListWks::dragMoveEvent (QDragMoveEvent  * e )
 
     }
 
-    CGisProject * proj = dynamic_cast<CGisProject*>(itemAt(e->pos()));
+    IGisProject * proj = dynamic_cast<IGisProject*>(itemAt(e->pos()));
     if(proj && proj != currentItem()->parent())
     {
         e->setDropAction(Qt::CopyAction);
@@ -189,7 +200,7 @@ void CGisListWks::dropEvent ( QDropEvent  * e )
         }
         else
         {
-            CGisProject * project = dynamic_cast<CGisProject*>(wpt2->parent());
+            IGisProject * project = dynamic_cast<IGisProject*>(wpt2->parent());
             if(project)
             {
                 new CGisItemWpt(*wpt1,project, project->indexOfChild(wpt2) + off);
@@ -210,7 +221,7 @@ void CGisListWks::dropEvent ( QDropEvent  * e )
         }
         else
         {
-            CGisProject * project = dynamic_cast<CGisProject*>(trk2->parent());
+            IGisProject * project = dynamic_cast<IGisProject*>(trk2->parent());
             if(project)
             {
                 new CGisItemTrk(*trk1,project, project->indexOfChild(trk2) + off);
@@ -231,7 +242,7 @@ void CGisListWks::dropEvent ( QDropEvent  * e )
         }
         else
         {
-            CGisProject * project = dynamic_cast<CGisProject*>(rte2->parent());
+            IGisProject * project = dynamic_cast<IGisProject*>(rte2->parent());
             if(project)
             {
                 new CGisItemRte(*rte1,project, project->indexOfChild(rte2) + off);
@@ -252,7 +263,7 @@ void CGisListWks::dropEvent ( QDropEvent  * e )
         }
         else
         {
-            CGisProject * project = dynamic_cast<CGisProject*>(area2->parent());
+            IGisProject * project = dynamic_cast<IGisProject*>(area2->parent());
             if(project)
             {
                 new CGisItemOvlArea(*area1,project, project->indexOfChild(area2) + off);
@@ -263,7 +274,7 @@ void CGisListWks::dropEvent ( QDropEvent  * e )
     }
 
 
-    CGisProject * project = dynamic_cast<CGisProject*>(itemAt(e->pos()));
+    IGisProject * project = dynamic_cast<IGisProject*>(itemAt(e->pos()));
     if(project && project != currentItem()->parent())
     {
         if(wpt1 != 0)
@@ -293,7 +304,7 @@ bool CGisListWks::hasProject(const QString& key)
     QMutexLocker lock(&IGisItem::mutexItems);
     for(int i = 0; i < topLevelItemCount(); i++)
     {
-        CGisProject * item = dynamic_cast<CGisProject*>(topLevelItem(i));
+        IGisProject * item = dynamic_cast<IGisProject*>(topLevelItem(i));
         if(item && item->getKey() == key)
         {
             return true;
@@ -304,11 +315,20 @@ bool CGisListWks::hasProject(const QString& key)
 
 void CGisListWks::slotContextMenu(const QPoint& point)
 {
-    CGisProject * project = dynamic_cast<CGisProject*>(currentItem());
+
+    if(selectedItems().isEmpty() && menuNone)
+    {
+        QPoint p = mapToGlobal(point);
+        menuNone->exec(p);
+        return;
+    }
+
+    CGpxProject * project = dynamic_cast<CGpxProject*>(currentItem());
     if(project != 0)
     {
         QPoint p = mapToGlobal(point);
         menuProject->exec(p);
+        return;
     }
 
     IGisItem * gisItem = dynamic_cast<IGisItem*>(currentItem());
@@ -337,6 +357,7 @@ void CGisListWks::slotContextMenu(const QPoint& point)
             actionEditTrk->setVisible(false);
             actionReverseTrk->setVisible(false);
             actionCombineTrk->setVisible(false);
+            actionRangeTrk->setVisible(false);
         }
         else
         {
@@ -344,14 +365,15 @@ void CGisListWks::slotContextMenu(const QPoint& point)
             actionEditTrk->setVisible(true);
             actionReverseTrk->setVisible(true);
             actionCombineTrk->setVisible(true);
+            actionRangeTrk->setVisible(true);
             actionFocusTrk->setChecked(trk->hasUserFocus());
             actionEditTrk->setEnabled(!trk->isReadOnly());            
         }
         // display menu
         QPoint p = mapToGlobal(point);
         menuItem->exec(p);
+        return;
     }
-
 }
 
 void CGisListWks::slotCloseProject()
@@ -360,7 +382,7 @@ void CGisListWks::slotCloseProject()
     QList<QTreeWidgetItem*> items = selectedItems();
     foreach(QTreeWidgetItem * item, items)
     {
-        CGisProject * project = dynamic_cast<CGisProject*>(item);
+        IGisProject * project = dynamic_cast<IGisProject*>(item);
         if(project != 0)
         {
             delete project;
@@ -377,7 +399,7 @@ void CGisListWks::slotSaveProject()
     QList<QTreeWidgetItem*> items = selectedItems();
     foreach(QTreeWidgetItem * item, items)
     {
-        CGisProject * project = dynamic_cast<CGisProject*>(item);
+        CGpxProject * project = dynamic_cast<CGpxProject*>(item);
         if(project != 0)
         {
             project->save();
@@ -394,7 +416,7 @@ void CGisListWks::slotSaveAsProject()
     QList<QTreeWidgetItem*> items = selectedItems();
     foreach(QTreeWidgetItem * item, items)
     {
-        CGisProject * project = dynamic_cast<CGisProject*>(item);
+        CGpxProject * project = dynamic_cast<CGpxProject*>(item);
         if(project != 0)
         {
             project->saveAs();
@@ -515,3 +537,51 @@ void CGisListWks::slotCombineTrk()
     }
     IGisItem::mutexItems.unlock();
 }
+
+void CGisListWks::slotRangeTrk()
+{
+    IGisItem::mutexItems.lock();
+    CGisItemTrk * gisItem = dynamic_cast<CGisItemTrk*>(currentItem());
+    if(gisItem != 0)
+    {
+        QString key = gisItem->getKey();
+        CGisWidget::self().rangeTrkByKey(key);
+    }
+    IGisItem::mutexItems.unlock();
+}
+
+void CGisListWks::slotAddEmptyProject()
+{
+    QString name = QInputDialog::getText(0, QObject::tr("Edit name..."), QObject::tr("Enter new track name."), QLineEdit::Normal, tr("New Project"));
+    if(name.isEmpty())
+    {
+        return;
+    }
+
+    new CGpxProject(name, this);
+}
+
+void CGisListWks::slotCloseAllProjects()
+{
+    QMutexLocker lock(&IGisItem::mutexItems);
+    QList<QTreeWidgetItem*> items = findItems("*", Qt::MatchWildcard);
+    foreach(QTreeWidgetItem * item, items)
+    {
+        IGisProject * project = dynamic_cast<IGisProject*>(item);
+        if(project != 0)
+        {
+            delete project;
+        }
+    }
+    emit sigChanged();
+}
+
+void CGisListWks::slotSearchGoogle(bool on)
+{
+    delete searchGoogle;
+    if(on)
+    {
+        searchGoogle = new CSearchGoogle(this);
+    }
+}
+
diff --git a/src/gis/CGisListWks.h b/src/gis/CGisListWks.h
index 185da30..1b89604 100644
--- a/src/gis/CGisListWks.h
+++ b/src/gis/CGisListWks.h
@@ -20,8 +20,10 @@
 #define CGISLISTWKS_H
 
 #include <QTreeWidget>
+#include <QPointer>
 
 class QAction;
+class CSearchGoogle;
 
 class CGisListWks : public QTreeWidget
 {
@@ -30,7 +32,9 @@ class CGisListWks : public QTreeWidget
         CGisListWks(QWidget * parent);
         virtual ~CGisListWks();
 
-        bool hasProject(const QString& key);
+        void setExternalMenu(QMenu * project);
+
+        bool hasProject(const QString& key);        
 
     signals:
         void sigChanged();
@@ -53,8 +57,13 @@ class CGisListWks : public QTreeWidget
         void slotEditTrk();
         void slotReverseTrk();
         void slotCombineTrk();
+        void slotRangeTrk();
+        void slotAddEmptyProject();
+        void slotCloseAllProjects();
+        void slotSearchGoogle(bool on);
+
 
-    private:
+    private:                
         QMenu * menuProject;
         QAction  * actionSave;
         QAction  * actionSaveAs;
@@ -69,8 +78,11 @@ class CGisListWks : public QTreeWidget
         QAction * actionEditTrk;
         QAction * actionReverseTrk;
         QAction * actionCombineTrk;
+        QAction * actionRangeTrk;
 
+        QMenu * menuNone;
 
+        QPointer<CSearchGoogle> searchGoogle;
 };
 
 #endif //CGISLISTWKS_H
diff --git a/src/gis/CGisSerialization.cpp b/src/gis/CGisSerialization.cpp
new file mode 100644
index 0000000..408ed65
--- /dev/null
+++ b/src/gis/CGisSerialization.cpp
@@ -0,0 +1,215 @@
+/**********************************************************************************************
+    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/CGisSerialization.h"
+#include "gis/trk/CGisItemTrk.h"
+
+#include <QtWidgets>
+
+#define VER_TRK     quint8(1)
+#define VER_WPT     quint8(1)
+#define VER_RTE     quint8(1)
+#define VER_AREA    quint8(1)
+#define VER_LINK    quint8(1)
+#define VER_TRKSEG  quint8(1)
+#define VER_TRKPT   quint8(1)
+#define VER_WPT_T   quint8(1)
+
+#define MAGIC_SIZE  10
+#define MAGIC_TRK   "QMTrk     "
+#define MAGIC_WPT   "QMWpt     "
+#define MAGIC_RTE   "QMRte     "
+#define MAGIC_AREA  "QMArea    "
+
+
+QDataStream& operator<<(QDataStream& stream, const IGisItem::link_t& link)
+{
+    stream << VER_LINK << link.uri << link.text << link.type;
+    return stream;
+}
+
+QDataStream& operator>>(QDataStream& stream, IGisItem::link_t& link)
+{
+    quint8 version;
+    stream >> version >> link.uri >> link.text >> link.type;
+    return stream;
+}
+
+QDataStream& operator<<(QDataStream& stream, const IGisItem::wpt_t& wpt)
+{
+    stream << VER_WPT_T;
+    stream << wpt.lat;
+    stream << wpt.lon;
+    stream << wpt.ele;
+    stream << wpt.time;
+    stream << wpt.magvar;
+    stream << wpt.geoidheight;
+    stream << wpt.name;
+    stream << wpt.cmt;
+    stream << wpt.desc;
+    stream << wpt.src;
+    stream << wpt.links;
+    stream << wpt.sym;
+    stream << wpt.type;
+    stream << wpt.fix;
+    stream << wpt.sat;
+    stream << wpt.hdop;
+    stream << wpt.vdop;
+    stream << wpt.pdop;
+    stream << wpt.ageofdgpsdata;
+    stream << wpt.dgpsid;
+    return stream;
+}
+
+QDataStream& operator>>(QDataStream& stream, IGisItem::wpt_t& wpt)
+{
+    quint8 version;
+    stream >> version;
+    stream >> wpt.lat;
+    stream >> wpt.lon;
+    stream >> wpt.ele;
+    stream >> wpt.time;
+    stream >> wpt.magvar;
+    stream >> wpt.geoidheight;
+    stream >> wpt.name;
+    stream >> wpt.cmt;
+    stream >> wpt.desc;
+    stream >> wpt.src;
+    stream >> wpt.links;
+    stream >> wpt.sym;
+    stream >> wpt.type;
+    stream >> wpt.fix;
+    stream >> wpt.sat;
+    stream >> wpt.hdop;
+    stream >> wpt.vdop;
+    stream >> wpt.pdop;
+    stream >> wpt.ageofdgpsdata;
+    stream >> wpt.dgpsid;
+
+    return stream;
+}
+
+
+QDataStream& operator<<(QDataStream& stream, const CGisItemTrk::trkseg_t& seg)
+{
+    stream << VER_TRKSEG << seg.pts;
+    return stream;
+}
+
+QDataStream& operator>>(QDataStream& stream, CGisItemTrk::trkseg_t& seg)
+{
+    quint8 version;
+    stream >> version >> seg.pts;
+    return stream;
+}
+
+QDataStream& operator<<(QDataStream& stream, const CGisItemTrk::trkpt_t& pt)
+{
+    stream << VER_TRKPT << pt.flags << pt.shdwLon << pt.shdwLat << pt.shdwEle << pt.shdwTime;
+    stream << (const IGisItem::wpt_t&)pt;
+    return stream;
+}
+
+QDataStream& operator>>(QDataStream& stream, CGisItemTrk::trkpt_t& pt)
+{
+    quint8 version;
+    stream >> version >> pt.flags >> pt.shdwLon >> pt.shdwLat >> pt.shdwEle >> pt.shdwTime;
+    stream >> (IGisItem::wpt_t&)pt;
+    return stream;
+}
+
+QDataStream& CGisItemTrk::operator>>(QDataStream& stream)
+{
+    QByteArray  buffer;
+    QDataStream out(&buffer, QIODevice::WriteOnly);
+    out.setByteOrder(QDataStream::LittleEndian);
+    out.setVersion(QDataStream::Qt_5_3);
+
+    out << key;
+    out << flags;
+    out << trk.name;
+    out << trk.cmt;
+    out << trk.desc;
+    out << trk.src;
+    out << trk.links;
+    out << trk.number;
+    out << trk.type;
+    out << trk.color;
+    out << trk.segs;
+
+    stream.writeRawData(MAGIC_TRK, MAGIC_SIZE);
+    stream << VER_TRK;
+    stream << qCompress(buffer,9);
+    return stream;
+}
+
+QDataStream& CGisItemTrk::operator<<(QDataStream& stream)
+{
+    quint8      version;
+    QByteArray  buffer;
+    QIODevice * dev = stream.device();
+    qint64      pos = dev->pos();
+
+    char magic[10];
+    stream.readRawData(magic,MAGIC_SIZE);
+
+    if(strncmp(magic,MAGIC_TRK,MAGIC_SIZE))
+    {
+        dev->seek(pos);
+        return stream;
+    }
+
+    stream >> version;
+    stream >> buffer;
+    buffer = qUncompress(buffer);
+
+    QDataStream in(&buffer, QIODevice::ReadOnly);
+    in.setByteOrder(QDataStream::LittleEndian);
+    in.setVersion(QDataStream::Qt_5_3);
+
+    in >> key;
+    in >> flags;
+    in >> trk.name;
+    in >> trk.cmt;
+    in >> trk.desc;
+    in >> trk.src;
+    in >> trk.links;
+    in >> trk.number;
+    in >> trk.type;
+    in >> trk.color;
+    setColor(trk.color);
+
+    trk.segs.clear();
+    in >> trk.segs;
+
+    deriveSecondaryData();
+
+    return stream;
+}
+
+
+CGisSerialization::CGisSerialization()
+{
+
+}
+
+CGisSerialization::~CGisSerialization()
+{
+
+}
+
diff --git a/src/map/wmts/IDiskCache.cpp b/src/gis/CGisSerialization.h
similarity index 82%
copy from src/map/wmts/IDiskCache.cpp
copy to src/gis/CGisSerialization.h
index a89ce85..7273a21 100644
--- a/src/map/wmts/IDiskCache.cpp
+++ b/src/gis/CGisSerialization.h
@@ -16,16 +16,15 @@
 
 **********************************************************************************************/
 
-#include "IDiskCache.h"
+#ifndef CGISSERIALIZATION_H
+#define CGISSERIALIZATION_H
 
-IDiskCache::IDiskCache(QObject *parent)
-    : QObject(parent)
+class CGisSerialization
 {
+    public:
+        CGisSerialization();
+        virtual ~CGisSerialization();
+};
 
-}
-
-IDiskCache::~IDiskCache()
-{
-
-}
+#endif //CGISSERIALIZATION_H
 
diff --git a/src/gis/CGisWidget.cpp b/src/gis/CGisWidget.cpp
index cea7831..dd5528e 100644
--- a/src/gis/CGisWidget.cpp
+++ b/src/gis/CGisWidget.cpp
@@ -17,9 +17,10 @@
 **********************************************************************************************/
 
 #include "gis/CGisWidget.h"
-#include "gis/CGisProject.h"
+#include "gis/IGisProject.h"
 #include "gis/IGisItem.h"
 #include "gis/CGisDraw.h"
+#include "gis/gpx/CGpxProject.h"
 #include "gis/wpt/CGisItemWpt.h"
 #include "gis/wpt/CProjWpt.h"
 #include "gis/trk/CGisItemTrk.h"
@@ -33,12 +34,14 @@
 
 CGisWidget * CGisWidget::pSelf = 0;
 
-CGisWidget::CGisWidget(QWidget *parent)
+CGisWidget::CGisWidget(QMenu *menuProject, QWidget *parent)
     : QWidget(parent)
 {
     pSelf = this;
     setupUi(this);
 
+    treeWks->setExternalMenu(menuProject);
+
     SETTINGS;
     treeWks->header()->resizeSection(0, cfg.value("Workspace/treeWks/colum0/size", 100).toInt());
 
@@ -72,7 +75,7 @@ void CGisWidget::loadGpx(const QString& filename)
     // add project to workspace
     QApplication::setOverrideCursor(Qt::WaitCursor);
     IGisItem::mutexItems.lock();
-    CGisProject * item = new CGisProject(filename, key, treeWks);
+    CGpxProject * item = new CGpxProject(filename, key, treeWks);
     if(!item->isValid())
     {
         delete item;
@@ -89,7 +92,7 @@ void CGisWidget::slotSaveAll()
     IGisItem::mutexItems.lock();
     for(int i = 0; i < treeWks->topLevelItemCount(); i++)
     {
-        CGisProject * item = dynamic_cast<CGisProject*>(treeWks->topLevelItem(i));
+        CGpxProject * item = dynamic_cast<CGpxProject*>(treeWks->topLevelItem(i));
         if(item == 0)
         {
             continue;
@@ -100,20 +103,20 @@ void CGisWidget::slotSaveAll()
     QApplication::restoreOverrideCursor();
 }
 
-CGisProject * CGisWidget::selectProject()
+IGisProject * CGisWidget::selectProject()
 {
     QString key, name;
 
     CSelectProjectDialog dlg(key, name, treeWks);
     dlg.exec();
 
-    CGisProject * project = 0;
+    IGisProject * project = 0;
     if(!key.isEmpty())
     {
         IGisItem::mutexItems.lock();
         for(int i = 0; i < treeWks->topLevelItemCount(); i++)
         {
-            project = dynamic_cast<CGisProject*>(treeWks->topLevelItem(i));
+            project = dynamic_cast<IGisProject*>(treeWks->topLevelItem(i));
             if(project == 0)
             {
                 continue;
@@ -128,7 +131,7 @@ CGisProject * CGisWidget::selectProject()
     else if(!name.isEmpty())
     {
         IGisItem::mutexItems.lock();
-        project = new CGisProject(name, treeWks);
+        project = new CGpxProject(name, treeWks);
         IGisItem::mutexItems.unlock();
     }
 
@@ -140,7 +143,7 @@ void CGisWidget::getItemsByPos(const QPointF& pos, QList<IGisItem*>& items)
     IGisItem::mutexItems.lock();
     for(int i = 0; i < treeWks->topLevelItemCount(); i++)
     {
-        CGisProject * project = dynamic_cast<CGisProject*>(treeWks->topLevelItem(i));
+        IGisProject * project = dynamic_cast<IGisProject*>(treeWks->topLevelItem(i));
         if(project == 0)
         {
             continue;
@@ -156,7 +159,7 @@ IGisItem * CGisWidget::getItemByKey(const QString& key)
     IGisItem::mutexItems.lock();
     for(int i = 0; i < treeWks->topLevelItemCount(); i++)
     {
-        CGisProject * project = dynamic_cast<CGisProject*>(treeWks->topLevelItem(i));
+        IGisProject * project = dynamic_cast<IGisProject*>(treeWks->topLevelItem(i));
         if(project == 0)
         {
             continue;
@@ -176,16 +179,12 @@ void CGisWidget::delItemByKey(const QString& key)
     IGisItem::mutexItems.lock();
     for(int i = 0; i < treeWks->topLevelItemCount(); i++)
     {
-        CGisProject * project = dynamic_cast<CGisProject*>(treeWks->topLevelItem(i));
+        IGisProject * project = dynamic_cast<IGisProject*>(treeWks->topLevelItem(i));
         if(project == 0)
         {
             continue;
         }
         project->delItemByKey(key);
-        if(project->childCount() == 0)
-        {
-            delete project;
-        }
     }
 
     IGisItem::mutexItems.unlock();
@@ -198,7 +197,7 @@ void CGisWidget::editItemByKey(const QString& key)
     IGisItem::mutexItems.lock();
     for(int i = 0; i < treeWks->topLevelItemCount(); i++)
     {
-        CGisProject * project = dynamic_cast<CGisProject*>(treeWks->topLevelItem(i));
+        IGisProject * project = dynamic_cast<IGisProject*>(treeWks->topLevelItem(i));
         if(project == 0)
         {
             continue;
@@ -361,7 +360,7 @@ void CGisWidget::draw(QPainter& p, const QRectF& viewport, CGisDraw * gis)
             break;
         }
 
-        CGisProject * project = dynamic_cast<CGisProject*>(treeWks->topLevelItem(i));
+        IGisProject * project = dynamic_cast<IGisProject*>(treeWks->topLevelItem(i));
         if(project == 0)
         {
             continue;
@@ -380,7 +379,7 @@ void CGisWidget::draw(QPainter& p, const QRectF& viewport, CGisDraw * gis)
             break;
         }
 
-        CGisProject * project = dynamic_cast<CGisProject*>(treeWks->topLevelItem(i));
+        IGisProject * project = dynamic_cast<IGisProject*>(treeWks->topLevelItem(i));
         if(project == 0)
         {
             continue;
@@ -399,7 +398,7 @@ void CGisWidget::fastDraw(QPainter& p, const QRectF& viewport, CGisDraw *gis)
     //IGisItem::mutexItems.lock();
     for(int i = 0; i < treeWks->topLevelItemCount(); i++)
     {
-        CGisProject * project = dynamic_cast<CGisProject*>(treeWks->topLevelItem(i));
+        IGisProject * project = dynamic_cast<IGisProject*>(treeWks->topLevelItem(i));
         if(project == 0)
         {
             continue;
diff --git a/src/gis/CGisWidget.h b/src/gis/CGisWidget.h
index 47787b2..3cfa842 100644
--- a/src/gis/CGisWidget.h
+++ b/src/gis/CGisWidget.h
@@ -24,7 +24,7 @@
 
 class CGisDraw;
 class IGisItem;
-class CGisProject;
+class IGisProject;
 
 class CGisWidget : public QWidget, private Ui::IGisWidget
 {
@@ -134,7 +134,7 @@ class CGisWidget : public QWidget, private Ui::IGisWidget
 
            @return 0 if no project was selected.
          */
-        CGisProject * selectProject();
+        IGisProject * selectProject();
 
     signals:
         void sigChanged();
@@ -145,7 +145,7 @@ class CGisWidget : public QWidget, private Ui::IGisWidget
 
     private:
         friend class CMainWindow;
-        CGisWidget(QWidget * parent);
+        CGisWidget(QMenu * menuProject, QWidget * parent);
 
         static CGisWidget * pSelf;
 };
diff --git a/src/gis/IGisItem.cpp b/src/gis/IGisItem.cpp
index 6923d26..ab01a2d 100644
--- a/src/gis/IGisItem.cpp
+++ b/src/gis/IGisItem.cpp
@@ -17,7 +17,7 @@
 **********************************************************************************************/
 
 #include "gis/IGisItem.h"
-#include "gis/CGisProject.h"
+#include "gis/IGisProject.h"
 #include "gis/trk/CGisItemTrk.h"
 #include "gis/wpt/CGisItemWpt.h"
 #include "gis/rte/CGisItemRte.h"
@@ -71,7 +71,7 @@ IGisItem::IGisItem(QTreeWidgetItem *parent, type_e typ, int idx)
             for(int n = parent->childCount() - 2; n >= 0; n--)
             {
                 /** @note   The order of item types to test is given by the order items read from
-                            the GPX file in the CGisProject constructor.  */
+                            the GPX file in the CGpxProject constructor.  */
 
                 int childType = parent->child(n)->type();
                 if(childType == eTypeTrk)
@@ -87,7 +87,7 @@ IGisItem::IGisItem(QTreeWidgetItem *parent, type_e typ, int idx)
             for(int n = parent->childCount() - 2; n >= 0; n--)
             {
                 /** @note   The order of item types to test is given by the order items read from
-                            the GPX file in the CGisProject constructor.  */
+                            the GPX file in the CGpxProject constructor.  */
 
                 int childType = parent->child(n)->type();
                 if( childType == eTypeRte || childType == eTypeTrk)
@@ -103,7 +103,7 @@ IGisItem::IGisItem(QTreeWidgetItem *parent, type_e typ, int idx)
             for(int n = parent->childCount() - 2; n >= 0; n--)
             {
                 /** @note   The order of item types to test is given by the order items read from
-                            the GPX file in the CGisProject constructor.  */
+                            the GPX file in the CGpxProject constructor.  */
 
                 int childType = parent->child(n)->type();
                 if(childType == eTypeWpt || childType == eTypeRte || childType == eTypeTrk)
@@ -119,7 +119,7 @@ IGisItem::IGisItem(QTreeWidgetItem *parent, type_e typ, int idx)
             for(int n = parent->childCount() - 2; n >= 0; n--)
             {
                 /** @note   The order of item types to test is given by the order items read from
-                            the GPX file in the CGisProject constructor.  */
+                            the GPX file in the CGpxProject constructor.  */
 
                 int childType = parent->child(n)->type();
                 if(childType == eTypeOvl || childType == eTypeWpt || childType == eTypeRte || childType == eTypeTrk)
@@ -144,7 +144,7 @@ void IGisItem::changed(const QString &what)
     setText(1,"*");
     setToolTip(0,getInfo());
 
-    CGisProject * project = dynamic_cast<CGisProject*>(parent());
+    IGisProject * project = dynamic_cast<IGisProject*>(parent());
     if(project)
     {
         project->setText(1,"*");
diff --git a/src/gis/IGisItem.h b/src/gis/IGisItem.h
index 992af98..b9dde39 100644
--- a/src/gis/IGisItem.h
+++ b/src/gis/IGisItem.h
@@ -51,6 +51,46 @@ class IGisItem : public QTreeWidgetItem
             QString type;
         };
 
+        struct wpt_t
+        {
+            wpt_t() :
+                lat(NOFLOAT),
+                lon(NOFLOAT),
+                ele(NOINT),
+                magvar(NOINT),
+                geoidheight(NOINT),
+                sat(NOINT),
+                hdop(NOINT),
+                vdop(NOINT),
+                pdop(NOINT),
+                ageofdgpsdata(NOINT),
+                dgpsid(NOINT)
+            {}
+            // -- all gpx tags - start
+            qreal lat;
+            qreal lon;
+            qint32 ele;
+            QDateTime time;
+            qint32 magvar;
+            qint32 geoidheight;
+            QString name;
+            QString cmt;
+            QString desc;
+            QString src;
+            QList<link_t> links;
+            QString sym;
+            QString type;
+            QString fix;
+            qint32 sat;
+            qint32 hdop;
+            qint32 vdop;
+            qint32 pdop;
+            qint32 ageofdgpsdata;
+            qint32 dgpsid;
+            // -- all gpx tags - stop
+            QMap<QString, QVariant> extensions;
+        };
+
         enum type_e
         {
               eTypeTrk
@@ -166,9 +206,8 @@ class IGisItem : public QTreeWidgetItem
         static QString removeHtml(const QString &str);
 
     protected:
-        friend class CGisProject;
-        struct wpt_t;
         struct color_t;
+        friend class CGpxProject;
 
         /// read waypoint data from an XML snippet
         void readWpt(const QDomNode& xml, wpt_t &wpt);
@@ -201,47 +240,6 @@ class IGisItem : public QTreeWidgetItem
         };
 
 
-
-        struct wpt_t
-        {
-            wpt_t() :
-                lat(NOFLOAT),
-                lon(NOFLOAT),
-                ele(NOINT),
-                magvar(NOINT),
-                geoidheight(NOINT),
-                sat(NOINT),
-                hdop(NOINT),
-                vdop(NOINT),
-                pdop(NOINT),
-                ageofdgpsdata(NOINT),
-                dgpsid(NOINT)
-            {}
-            // -- all gpx tags - start
-            qreal lat;
-            qreal lon;
-            qint32 ele;
-            QDateTime time;
-            qint32 magvar;
-            qint32 geoidheight;
-            QString name;
-            QString cmt;
-            QString desc;
-            QString src;
-            QList<link_t> links;
-            QString sym;
-            QString type;
-            QString fix;
-            qint32 sat;
-            qint32 hdop;
-            qint32 vdop;
-            qint32 pdop;
-            qint32 ageofdgpsdata;
-            qint32 dgpsid;
-            // -- all gpx tags - stop
-            QMap<QString, QVariant> extensions;
-        };
-
         enum flags_e
         {
              eFlagCreatedInQms  = 0x00000001
diff --git a/src/gis/IGisProject.cpp b/src/gis/IGisProject.cpp
new file mode 100644
index 0000000..a24991a
--- /dev/null
+++ b/src/gis/IGisProject.cpp
@@ -0,0 +1,193 @@
+/**********************************************************************************************
+    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/IGisProject.h"
+#include "gis/IGisItem.h"
+#include "gis/CGisListWks.h"
+#include "gis/CGisDraw.h"
+
+#include <QtWidgets>
+
+IGisProject::IGisProject(const QString& key, CGisListWks *parent)
+    : QTreeWidgetItem(parent)
+    , key(key)
+{
+    if(key.isEmpty())
+    {
+        QCryptographicHash md5(QCryptographicHash::Md5);
+        md5.addData((char*)this, sizeof(*this));
+        this->key = md5.result().toHex();
+    }
+}
+
+IGisProject::~IGisProject()
+{
+
+}
+
+IGisItem * IGisProject::getItemByKey(const QString& key)
+{
+    for(int i = 0; i < childCount(); i++)
+    {
+
+        IGisItem * item = dynamic_cast<IGisItem*>(child(i));
+        if(item == 0)
+        {
+            continue;
+        }
+
+        if(item->getKey() == key)
+        {
+            return item;
+        }
+    }
+    return 0;
+}
+
+void IGisProject::getItemByPos(const QPointF& pos, QList<IGisItem *> &items)
+{
+    for(int i = 0; i < childCount(); i++)
+    {
+
+        IGisItem * item = dynamic_cast<IGisItem*>(child(i));
+        if(item == 0)
+        {
+            continue;
+        }
+
+        if(item->isCloseTo(pos))
+        {
+            items << item;
+        }
+    }
+}
+
+
+void IGisProject::delItemByKey(const QString& key)
+{
+    QList<QTreeWidgetItem*> items;
+    for(int i = childCount(); i > 0; i--)
+    {
+        IGisItem * item = dynamic_cast<IGisItem*>(child(i-1));
+        if(item == 0)
+        {
+            continue;
+        }
+
+        if(item->getKey() == key)
+        {
+            QString msg = QObject::tr("Are you sure you want to delete '%1' from project '%2'?").arg(item->getName()).arg(text(0));
+            QMessageBox::StandardButtons res = QMessageBox::question(0, QObject::tr("Delete..."), msg, QMessageBox::Ok|QMessageBox::No, QMessageBox::Ok);
+            if(res != QMessageBox::Ok)
+            {
+                continue;
+            }
+
+            items << takeChild(i-1);
+            setText(1,"*");
+        }
+    }
+    qDeleteAll(items);
+}
+
+void IGisProject::editItemByKey(const QString& key)
+{
+    for(int i = childCount(); i > 0; i--)
+    {
+        IGisItem * item = dynamic_cast<IGisItem*>(child(i-1));
+        if(item == 0)
+        {
+            continue;
+        }
+
+        if(item->getKey() == key)
+        {
+            item->edit();
+        }
+    }
+}
+
+void IGisProject::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, QSet<QString> &seenKeys, CGisDraw * gis)
+{
+    for(int i = 0; i < childCount(); i++)
+    {
+        if(gis->needsRedraw())
+        {
+            break;
+        }
+
+        IGisItem * item = dynamic_cast<IGisItem*>(child(i));
+        if(item == 0)
+        {
+            continue;
+        }
+
+        if(seenKeys.contains(item->getKey()))
+        {
+            continue;
+        }
+        seenKeys << item->getKey();
+
+        item->drawItem(p, viewport, blockedAreas, gis);
+    }
+
+}
+
+void IGisProject::drawItem(QPainter& p, const QRectF& viewport, CGisDraw * gis)
+{
+    for(int i = 0; i < childCount(); i++)
+    {
+
+        IGisItem * item = dynamic_cast<IGisItem*>(child(i));
+        if(item == 0)
+        {
+            continue;
+        }
+
+
+        item->drawItem(p, viewport, gis);
+    }
+
+}
+
+void IGisProject::drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, QSet<QString> &seenKeys, const QFontMetricsF& fm, CGisDraw * gis)
+{
+
+    for(int i = 0; i < childCount(); i++)
+    {
+        if(gis->needsRedraw())
+        {
+            break;
+        }
+
+        IGisItem * item = dynamic_cast<IGisItem*>(child(i));
+        if(item == 0)
+        {
+            continue;
+        }
+
+        if(seenKeys.contains(item->getKey()))
+        {
+            continue;
+        }
+        seenKeys << item->getKey();
+
+        item->drawLabel(p, viewport, blockedAreas, fm, gis);
+    }
+
+}
diff --git a/src/gis/CGisProject.h b/src/gis/IGisProject.h
similarity index 54%
copy from src/gis/CGisProject.h
copy to src/gis/IGisProject.h
index db55343..9abc966 100644
--- a/src/gis/CGisProject.h
+++ b/src/gis/IGisProject.h
@@ -16,35 +16,20 @@
 
 **********************************************************************************************/
 
-#ifndef CGISPROJECT_H
-#define CGISPROJECT_H
-
-#include "gis/IGisItem.h"
+#ifndef IGISPROJECT_H
+#define IGISPROJECT_H
 
 #include <QTreeWidgetItem>
-#include <QDomElement>
-#include <QDateTime>
-#include <QUrl>
 
 class CGisListWks;
+class IGisItem;
 class CGisDraw;
 
-
-class CGisProject : public QTreeWidgetItem
+class IGisProject : public QTreeWidgetItem
 {
     public:
-        CGisProject(const QString &name, CGisListWks * parent);
-        CGisProject(const QString& filename, const QString &key, CGisListWks * parent);
-        virtual ~CGisProject();
-
-        /**
-           @brief Check if the project was initialized correctly.
-
-           For example a if a GPX file does not load correctly the project is invalid.
-
-           @return True if project is valid
-         */
-        bool  isValid(){return valid;}
+        IGisProject(const QString &key, CGisListWks * parent);
+        virtual ~IGisProject();
 
         /**
            @brief Get unique project key.
@@ -53,6 +38,13 @@ class CGisProject : public QTreeWidgetItem
         const QString& getKey(){return key;}
 
         /**
+           @brief Get a temporary pointer to the item with matching key
+           @param key
+           @return If no item is found 0 is returned.
+        */
+        IGisItem * getItemByKey(const QString& key);
+
+        /**
            @brief Get a list of items that are close to a given pixel coordinate of the screen
 
            @note: The returned pointers are just for temporary use. Best you use them to get the item's key.
@@ -62,12 +54,6 @@ class CGisProject : public QTreeWidgetItem
         */
         void getItemByPos(const QPointF& pos, QList<IGisItem*>& items);
 
-        /**
-           @brief Get a temporary pointer to the item with matching key
-           @param key
-           @return If no item is found 0 is returned.
-        */
-        IGisItem * getItemByKey(const QString& key);
 
         /**
            @brief Delete items with matching key
@@ -82,73 +68,14 @@ class CGisProject : public QTreeWidgetItem
          */
         void editItemByKey(const QString& key);
 
+
         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);
 
-        void save();
-        void saveAs();
-
-        QString getInfo();
-
-        // Those are the URIs of the GPX extensions we support
-        static const QString gpxx_ns;
-        static const QString gpxtpx_ns;
-        static const QString wptx1_ns;
-        static const QString rmc_ns;
-        static const QString ql_ns;
-        static const QString gs_ns;
-
     private:
-        struct metadata_t;
-
-        void saveGpx(const QString& fn);
-        QDomNode writeMetadata(QDomDocument& doc);
-        void readMetadata(const QDomNode& xml, metadata_t& metadata);
-
-        // Those are standard GPX/XML namespaces
-        static const QString gpx_ns;
-        static const QString xsi_ns;
-
-        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;
-
-        };
-
         QString key;
-
-        metadata_t metadata;
-        QString filename;
-
-        QDomElement xmlGpx;
-
-        bool valid;
 };
 
-#endif //CGISPROJECT_H
+#endif //IGISPROJECT_H
 
diff --git a/src/gis/IGisWidget.ui b/src/gis/IGisWidget.ui
index c94920a..a43427f 100644
--- a/src/gis/IGisWidget.ui
+++ b/src/gis/IGisWidget.ui
@@ -41,7 +41,7 @@
       <enum>QAbstractItemView::InternalMove</enum>
      </property>
      <property name="selectionMode">
-      <enum>QAbstractItemView::SingleSelection</enum>
+      <enum>QAbstractItemView::ExtendedSelection</enum>
      </property>
      <property name="iconSize">
       <size>
diff --git a/src/gis/CGisProject.cpp b/src/gis/gpx/CGpxProject.cpp
similarity index 75%
rename from src/gis/CGisProject.cpp
rename to src/gis/gpx/CGpxProject.cpp
index 3c1875d..a4144e9 100644
--- a/src/gis/CGisProject.cpp
+++ b/src/gis/gpx/CGpxProject.cpp
@@ -16,7 +16,7 @@
 
 **********************************************************************************************/
 
-#include "gis/CGisProject.h"
+#include "gis/gpx/CGpxProject.h"
 #include "gis/CGisListWks.h"
 #include "gis/wpt/CGisItemWpt.h"
 #include "gis/trk/CGisItemTrk.h"
@@ -30,32 +30,27 @@
 #include <QtWidgets>
 #include <QtXml>
 
-const QString CGisProject::gpx_ns      = "http://www.topografix.com/GPX/1/1";
-const QString CGisProject::xsi_ns      = "http://www.w3.org/2001/XMLSchema-instance";
-const QString CGisProject::gpxx_ns     = "http://www.garmin.com/xmlschemas/GpxExtensions/v3";
-const QString CGisProject::gpxtpx_ns   = "http://www.garmin.com/xmlschemas/TrackPointExtension/v1";
-const QString CGisProject::wptx1_ns    = "http://www.garmin.com/xmlschemas/WaypointExtension/v1";
-const QString CGisProject::rmc_ns      = "urn:net:trekbuddy:1.0:nmea:rmc";
-const QString CGisProject::ql_ns       = "http://www.qlandkarte.org/xmlschemas/v1.1";
-const QString CGisProject::gs_ns       = "http://www.groundspeak.com/cache/1/0";
-
-CGisProject::CGisProject(const QString &name, CGisListWks * parent)
-    : QTreeWidgetItem(parent)
+const QString CGpxProject::gpx_ns      = "http://www.topografix.com/GPX/1/1";
+const QString CGpxProject::xsi_ns      = "http://www.w3.org/2001/XMLSchema-instance";
+const QString CGpxProject::gpxx_ns     = "http://www.garmin.com/xmlschemas/GpxExtensions/v3";
+const QString CGpxProject::gpxtpx_ns   = "http://www.garmin.com/xmlschemas/TrackPointExtension/v1";
+const QString CGpxProject::wptx1_ns    = "http://www.garmin.com/xmlschemas/WaypointExtension/v1";
+const QString CGpxProject::rmc_ns      = "urn:net:trekbuddy:1.0:nmea:rmc";
+const QString CGpxProject::ql_ns       = "http://www.qlandkarte.org/xmlschemas/v1.1";
+const QString CGpxProject::gs_ns       = "http://www.groundspeak.com/cache/1/0";
+
+CGpxProject::CGpxProject(const QString &name,  CGisListWks * parent)
+    : IGisProject("", parent)
     , valid(true)
 {
-    QCryptographicHash md5(QCryptographicHash::Md5);
-    md5.addData(name.toUtf8());
-    key = md5.result().toHex();
-
     setText(0, name);
     setIcon(0,QIcon("://icons/32x32/GisProject.png"));
 
     setToolTip(0, getInfo());
 }
 
-CGisProject::CGisProject(const QString &filename, const QString& key, CGisListWks *parent)
-    : QTreeWidgetItem(parent)
-    , key(key)
+CGpxProject::CGpxProject(const QString &filename, const QString& key, CGisListWks *parent)
+    : IGisProject(key, parent)
     , filename(filename)
     , valid(false)
 {
@@ -142,12 +137,12 @@ CGisProject::CGisProject(const QString &filename, const QString& key, CGisListWk
     valid = true;
 }
 
-CGisProject::~CGisProject()
+CGpxProject::~CGpxProject()
 {
 
 }
 
-QString CGisProject::getInfo()
+QString CGpxProject::getInfo()
 {
     QString str = metadata.name.isEmpty() ? text(0) : metadata.name;
 
@@ -176,7 +171,7 @@ QString CGisProject::getInfo()
     return str;
 }
 
-void CGisProject::readMetadata(const QDomNode& xml, metadata_t& metadata)
+void CGpxProject::readMetadata(const QDomNode& xml, metadata_t& metadata)
 {
 
     IGisItem::readXml(xml,"name", metadata.name);
@@ -227,7 +222,7 @@ void CGisProject::readMetadata(const QDomNode& xml, metadata_t& metadata)
     }
 }
 
-QDomNode CGisProject::writeMetadata(QDomDocument& doc)
+QDomNode CGpxProject::writeMetadata(QDomDocument& doc)
 {
     QDomElement gpx = doc.createElement("gpx");
     doc.appendChild(gpx);
@@ -314,158 +309,9 @@ QDomNode CGisProject::writeMetadata(QDomDocument& doc)
 }
 
 
-void CGisProject::getItemByPos(const QPointF& pos, QList<IGisItem *> &items)
-{
-    for(int i = 0; i < childCount(); i++)
-    {
-
-        IGisItem * item = dynamic_cast<IGisItem*>(child(i));
-        if(item == 0)
-        {
-            continue;
-        }
-
-        if(item->isCloseTo(pos))
-        {
-            items << item;
-        }
-    }
-}
-
-IGisItem * CGisProject::getItemByKey(const QString& key)
-{
-    for(int i = 0; i < childCount(); i++)
-    {
-
-        IGisItem * item = dynamic_cast<IGisItem*>(child(i));
-        if(item == 0)
-        {
-            continue;
-        }
-
-        if(item->getKey() == key)
-        {
-            return item;
-        }
-    }
-    return 0;
-}
-
-void CGisProject::delItemByKey(const QString& key)
-{
-    QList<QTreeWidgetItem*> items;
-    for(int i = childCount(); i > 0; i--)
-    {
-        IGisItem * item = dynamic_cast<IGisItem*>(child(i-1));
-        if(item == 0)
-        {
-            continue;
-        }
-
-        if(item->getKey() == key)
-        {
-            QString msg = QObject::tr("Are you sure you want to delete '%1' from project '%2'?").arg(item->getName()).arg(text(0));
-            QMessageBox::StandardButtons res = QMessageBox::question(0, QObject::tr("Delete..."), msg, QMessageBox::Ok|QMessageBox::No, QMessageBox::Ok);
-            if(res != QMessageBox::Ok)
-            {
-                continue;
-            }
-
-            items << takeChild(i-1);
-            setText(1,"*");
-        }
-    }
-    qDeleteAll(items);
-}
-
-void CGisProject::editItemByKey(const QString& key)
-{
-    for(int i = childCount(); i > 0; i--)
-    {
-        IGisItem * item = dynamic_cast<IGisItem*>(child(i-1));
-        if(item == 0)
-        {
-            continue;
-        }
-
-        if(item->getKey() == key)
-        {
-            item->edit();
-        }
-    }
-}
-
-void CGisProject::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, QSet<QString> &seenKeys, CGisDraw * gis)
-{
-    for(int i = 0; i < childCount(); i++)
-    {
-        if(gis->needsRedraw())
-        {
-            break;
-        }
-
-        IGisItem * item = dynamic_cast<IGisItem*>(child(i));
-        if(item == 0)
-        {
-            continue;
-        }
-
-        if(seenKeys.contains(item->getKey()))
-        {
-            continue;
-        }
-        seenKeys << item->getKey();
-
-        item->drawItem(p, viewport, blockedAreas, gis);
-    }
-
-}
-
-void CGisProject::drawItem(QPainter& p, const QRectF& viewport, CGisDraw * gis)
-{
-    for(int i = 0; i < childCount(); i++)
-    {
-
-        IGisItem * item = dynamic_cast<IGisItem*>(child(i));
-        if(item == 0)
-        {
-            continue;
-        }
-
-
-        item->drawItem(p, viewport, gis);
-    }
-
-}
-
-void CGisProject::drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, QSet<QString> &seenKeys, const QFontMetricsF& fm, CGisDraw * gis)
-{
-
-    for(int i = 0; i < childCount(); i++)
-    {
-        if(gis->needsRedraw())
-        {
-            break;
-        }
 
-        IGisItem * item = dynamic_cast<IGisItem*>(child(i));
-        if(item == 0)
-        {
-            continue;
-        }
-
-        if(seenKeys.contains(item->getKey()))
-        {
-            continue;
-        }
-        seenKeys << item->getKey();
-
-        item->drawLabel(p, viewport, blockedAreas, fm, gis);
-    }
-
-}
 
-void CGisProject::save()
+void CGpxProject::save()
 {
     if(filename.isEmpty())
     {
@@ -477,7 +323,7 @@ void CGisProject::save()
     }
 }
 
-void CGisProject::saveAs()
+void CGpxProject::saveAs()
 {
     SETTINGS;
     QString path = cfg.value("Paths/lastGisPath", QDir::homePath()).toString();
@@ -494,7 +340,7 @@ void CGisProject::saveAs()
     cfg.setValue("Paths/lastGisPath", path);
 }
 
-void CGisProject::saveGpx(const QString& fn)
+void CGpxProject::saveGpx(const QString& fn)
 {
     QString _fn_ = fn;
 
diff --git a/src/gis/CGisProject.h b/src/gis/gpx/CGpxProject.h
similarity index 61%
rename from src/gis/CGisProject.h
rename to src/gis/gpx/CGpxProject.h
index db55343..79c1290 100644
--- a/src/gis/CGisProject.h
+++ b/src/gis/gpx/CGpxProject.h
@@ -16,12 +16,12 @@
 
 **********************************************************************************************/
 
-#ifndef CGISPROJECT_H
-#define CGISPROJECT_H
+#ifndef CGPXPROJECT_H
+#define CGPXPROJECT_H
 
 #include "gis/IGisItem.h"
+#include "gis/IGisProject.h"
 
-#include <QTreeWidgetItem>
 #include <QDomElement>
 #include <QDateTime>
 #include <QUrl>
@@ -30,12 +30,12 @@ class CGisListWks;
 class CGisDraw;
 
 
-class CGisProject : public QTreeWidgetItem
+class CGpxProject : public IGisProject
 {
     public:
-        CGisProject(const QString &name, CGisListWks * parent);
-        CGisProject(const QString& filename, const QString &key, CGisListWks * parent);
-        virtual ~CGisProject();
+        CGpxProject(const QString &name, CGisListWks * parent);
+        CGpxProject(const QString& filename, const QString &key, CGisListWks * parent);
+        virtual ~CGpxProject();
 
         /**
            @brief Check if the project was initialized correctly.
@@ -46,46 +46,6 @@ class CGisProject : public QTreeWidgetItem
          */
         bool  isValid(){return valid;}
 
-        /**
-           @brief Get unique project key.
-           @return A MD5 hash string
-         */
-        const QString& getKey(){return key;}
-
-        /**
-           @brief Get a list of items that are close to a given pixel coordinate of the screen
-
-           @note: The returned pointers are just for temporary use. Best you use them to get the item's key.
-
-           @param pos       the coordinate on the screen in pixel
-           @param items     a list the item's pointer is stored to.
-        */
-        void getItemByPos(const QPointF& pos, QList<IGisItem*>& items);
-
-        /**
-           @brief Get a temporary pointer to the item with matching key
-           @param key
-           @return If no item is found 0 is returned.
-        */
-        IGisItem * getItemByKey(const QString& key);
-
-        /**
-           @brief Delete items with matching key
-           @param key
-        */
-        void delItemByKey(const QString& key);
-
-        /**
-           @brief Call IGisItem::edit() method for items with given key
-
-           @param key   a MD5 hash key
-         */
-        void editItemByKey(const QString& key);
-
-        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);
-
         void save();
         void saveAs();
 
@@ -150,5 +110,5 @@ class CGisProject : public QTreeWidgetItem
         bool valid;
 };
 
-#endif //CGISPROJECT_H
+#endif //CGPXPROJECT_H
 
diff --git a/src/gis/ovl/CDetailsOvlArea.cpp b/src/gis/ovl/CDetailsOvlArea.cpp
index ffda13d..c7b1d20 100644
--- a/src/gis/ovl/CDetailsOvlArea.cpp
+++ b/src/gis/ovl/CDetailsOvlArea.cpp
@@ -143,9 +143,9 @@ void CDetailsOvlArea::slotLinkActivated(const QUrl& url)
         dlg.setHtml(area.getComment());
         if(dlg.exec() == QDialog::Accepted)
         {
-            area.setComment(dlg.getHtml());
-            setupGui();
+            area.setComment(dlg.getHtml());            
         }
+        setupGui();
 
     }
     else if(url.toString() == "description")
@@ -154,9 +154,9 @@ void CDetailsOvlArea::slotLinkActivated(const QUrl& url)
         dlg.setHtml(area.getDescription());
         if(dlg.exec() == QDialog::Accepted)
         {
-            area.setDescription(dlg.getHtml());
-            setupGui();
+            area.setDescription(dlg.getHtml());            
         }
+        setupGui();
     }
     else
     {
diff --git a/src/gis/ovl/CGisItemOvlArea.cpp b/src/gis/ovl/CGisItemOvlArea.cpp
index f28afe4..232c8e3 100644
--- a/src/gis/ovl/CGisItemOvlArea.cpp
+++ b/src/gis/ovl/CGisItemOvlArea.cpp
@@ -19,7 +19,7 @@
 #include "gis/ovl/CGisItemOvlArea.h"
 #include "gis/ovl/CScrOptOvlArea.h"
 #include "gis/ovl/CDetailsOvlArea.h"
-#include "gis/CGisProject.h"
+#include "gis/IGisProject.h"
 #include "gis/CGisDraw.h"
 
 #include <QtWidgets>
@@ -112,7 +112,7 @@ const Qt::BrushStyle CGisItemOvlArea::brushStyles[OVL_N_STYLES] =
 
 QString CGisItemOvlArea::keyUserFocus;
 
-CGisItemOvlArea::CGisItemOvlArea(const QPolygonF& line, const QString &name, CGisProject * project, int idx)
+CGisItemOvlArea::CGisItemOvlArea(const QPolygonF& line, const QString &name, IGisProject * project, int idx)
     : IGisItem(project, eTypeOvl, idx)
     , penForeground(Qt::blue, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
     , penBackground(Qt::white, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
@@ -130,7 +130,7 @@ CGisItemOvlArea::CGisItemOvlArea(const QPolygonF& line, const QString &name, CGi
     project->setText(1,"*");
 }
 
-CGisItemOvlArea::CGisItemOvlArea(const CGisItemOvlArea& parentArea, CGisProject * project, int idx)
+CGisItemOvlArea::CGisItemOvlArea(const CGisItemOvlArea& parentArea, IGisProject * project, int idx)
     : IGisItem(project, eTypeTrk, idx)
     , penForeground(Qt::blue, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
     , penBackground(Qt::white, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
@@ -145,7 +145,7 @@ CGisItemOvlArea::CGisItemOvlArea(const CGisItemOvlArea& parentArea, CGisProject
     project->setText(1,"*");
 }
 
-CGisItemOvlArea::CGisItemOvlArea(const QDomNode &xml, CGisProject *project)
+CGisItemOvlArea::CGisItemOvlArea(const QDomNode &xml, IGisProject *project)
     : IGisItem(project, eTypeOvl, project->childCount())
     , penForeground(Qt::blue, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
     , penBackground(Qt::white, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
diff --git a/src/gis/ovl/CGisItemOvlArea.h b/src/gis/ovl/CGisItemOvlArea.h
index bfc40e7..3eeae31 100644
--- a/src/gis/ovl/CGisItemOvlArea.h
+++ b/src/gis/ovl/CGisItemOvlArea.h
@@ -25,7 +25,7 @@
 #include <QPen>
 #include <QPointer>
 
-class CGisProject;
+class IGisProject;
 class CScrOptOvlArea;
 
 #define OVL_N_COLORS 17
@@ -35,9 +35,9 @@ class CScrOptOvlArea;
 class CGisItemOvlArea : public IGisItem, public IGisLine
 {
     public:
-        CGisItemOvlArea(const QPolygonF& line, const QString &name, CGisProject * project, int idx);
-        CGisItemOvlArea(const CGisItemOvlArea &parentArea, CGisProject * project, int idx);
-        CGisItemOvlArea(const QDomNode &xml, CGisProject *project);
+        CGisItemOvlArea(const QPolygonF& line, const QString &name, IGisProject * project, int idx);
+        CGisItemOvlArea(const CGisItemOvlArea &parentArea, IGisProject * project, int idx);
+        CGisItemOvlArea(const QDomNode &xml, IGisProject *project);
         virtual ~CGisItemOvlArea();
 
         const QString& getName();
diff --git a/src/gis/ovl/IDetailsOvlArea.ui b/src/gis/ovl/IDetailsOvlArea.ui
index b22edfa..62731d1 100644
--- a/src/gis/ovl/IDetailsOvlArea.ui
+++ b/src/gis/ovl/IDetailsOvlArea.ui
@@ -48,14 +48,14 @@
        </property>
        <property name="minimumSize">
         <size>
-         <width>22</width>
-         <height>22</height>
+         <width>0</width>
+         <height>0</height>
         </size>
        </property>
        <property name="maximumSize">
         <size>
-         <width>32</width>
-         <height>32</height>
+         <width>25</width>
+         <height>25</height>
         </size>
        </property>
        <property name="text">
diff --git a/src/gis/rte/CGisItemRte.cpp b/src/gis/rte/CGisItemRte.cpp
index 1720edd..b5e9941 100644
--- a/src/gis/rte/CGisItemRte.cpp
+++ b/src/gis/rte/CGisItemRte.cpp
@@ -18,7 +18,7 @@
 
 #include "gis/rte/CGisItemRte.h"
 #include "gis/rte/CScrOptRte.h"
-#include "gis/CGisProject.h"
+#include "gis/IGisProject.h"
 #include "gis/WptIcons.h"
 #include "gis/CGisDraw.h"
 #include "canvas/CCanvas.h"
@@ -31,7 +31,7 @@ const QPen CGisItemRte::penBackground(Qt::white, 5, Qt::SolidLine, Qt::RoundCap,
 QString CGisItemRte::keyUserFocus;
 
 /// used to create a copy of route with new parent
-CGisItemRte::CGisItemRte(const CGisItemRte& parentRte, CGisProject * project, int idx)
+CGisItemRte::CGisItemRte(const CGisItemRte& parentRte, IGisProject * project, int idx)
     : IGisItem(project, eTypeRte, idx)
     , penForeground(Qt::magenta, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
 {
@@ -51,7 +51,7 @@ CGisItemRte::CGisItemRte(const CGisItemRte& parentRte, CGisProject * project, in
 }
 
 /// used to create route from GPX file
-CGisItemRte::CGisItemRte(const QDomNode& xml, CGisProject * parent)
+CGisItemRte::CGisItemRte(const QDomNode& xml, IGisProject *parent)
     : IGisItem(parent, eTypeRte, parent->childCount())
     , penForeground(Qt::magenta, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)    
 {
diff --git a/src/gis/rte/CGisItemRte.h b/src/gis/rte/CGisItemRte.h
index 9716e7c..3d8597c 100644
--- a/src/gis/rte/CGisItemRte.h
+++ b/src/gis/rte/CGisItemRte.h
@@ -25,13 +25,13 @@
 #include <QPen>
 
 class QDomNode;
-class CGisProject;
+class IGisProject;
 
 class CGisItemRte : public IGisItem, public IGisLine
 {
     public:
-        CGisItemRte(const QDomNode &xml, CGisProject *parent);
-        CGisItemRte(const CGisItemRte& parentRte, CGisProject * project, int idx);
+        CGisItemRte(const QDomNode &xml, IGisProject *parent);
+        CGisItemRte(const CGisItemRte& parentRte, IGisProject *project, int idx);
         virtual ~CGisItemRte();
 
 
diff --git a/src/gis/search/CSearchGoogle.cpp b/src/gis/search/CSearchGoogle.cpp
new file mode 100644
index 0000000..f604e49
--- /dev/null
+++ b/src/gis/search/CSearchGoogle.cpp
@@ -0,0 +1,172 @@
+/**********************************************************************************************
+    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/search/CSearchGoogle.h"
+#include "gis/CGisListWks.h"
+#include "gis/WptIcons.h"
+#include "gis/wpt/CGisItemWpt.h"
+#include "helpers/CWptIconDialog.h"
+#include "canvas/CCanvas.h"
+#include "CMainWindow.h"
+#include "helpers/CSettings.h"
+
+#include <QtWidgets>
+#include <QtNetwork>
+#include <QtXml>
+
+CSearchGoogle::CSearchGoogle(CGisListWks * parent)
+    : IGisProject("",parent)
+{
+    QPointF focus;
+
+    SETTINGS;
+    QString symName = cfg.value("Search/symbol","Default").toString();
+
+    parent->takeTopLevelItem(parent->indexOfTopLevelItem(this));
+    parent->insertTopLevelItem(0, this);
+
+    edit = new QLineEdit(parent);
+    actSymbol = edit->addAction(getWptIconByName(symName, focus), QLineEdit::TrailingPosition);
+    actSymbol->setObjectName(symName);
+    connect(actSymbol, SIGNAL(triggered()), this, SLOT(slotChangeSymbol()));
+
+    parent->setItemWidget(this, 0, edit);
+
+    connect(edit, SIGNAL(returnPressed()), this, SLOT(slotStartSearch()));
+    connect(&networkAccessManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(slotRequestFinished(QNetworkReply*)));
+
+    setIcon(1, QIcon("://icons/32x32/SearchGoogle.png"));
+}
+
+CSearchGoogle::~CSearchGoogle()
+{
+}
+
+void CSearchGoogle::slotChangeSymbol()
+{
+    CWptIconDialog dlg(actSymbol);
+    dlg.exec();
+
+    SETTINGS;
+    cfg.setValue("Search/symbol", actSymbol->objectName());
+
+}
+
+void CSearchGoogle::slotStartSearch()
+{
+    qDeleteAll(takeChildren());
+
+    QString addr = edit->text();
+
+    QUrl url("http://maps.googleapis.com");
+    url.setPath("/maps/api/geocode/xml");
+
+    QUrlQuery urlQuery;
+    urlQuery.addQueryItem("address",addr.replace(" ","+"));
+    urlQuery.addQueryItem("sensor","false");
+    url.setQuery(urlQuery);
+
+    QNetworkRequest request;
+
+    request.setUrl(url);
+    networkAccessManager.get(request);
+
+    edit->setEnabled(false);
+}
+
+void CSearchGoogle::slotRequestFinished(QNetworkReply* reply)
+{
+    edit->setEnabled(true);
+
+    if(reply->error() != QNetworkReply::NoError)
+    {
+        reply->deleteLater();
+        return;
+    }
+
+    QByteArray data = reply->readAll();
+    reply->deleteLater();
+
+    if(data.isEmpty())
+    {
+        return;
+    }
+
+    QString status;
+    QDomDocument xml;
+
+    xml.setContent(data);
+//    qDebug() << xml.toString();
+
+    QDomElement root = xml.documentElement();
+
+    if(root.tagName() != "GeocodeResponse")
+    {
+        status = tr("Unknown response");
+        QTreeWidgetItem * item = new QTreeWidgetItem(this);
+        item->setText(0, status);
+        item->setIcon(0,QIcon("://icons/32x32/Error.png"));
+        return;
+    }
+
+    status = root.namedItem("status").toElement().text();
+    if(status != "OK")
+    {
+        status  = tr("Error: ");
+        status += root.namedItem("error_message").toElement().text();
+        QTreeWidgetItem * item = new QTreeWidgetItem(this);
+        item->setText(0, status);
+        item->setIcon(0,QIcon("://icons/32x32/Error.png"));
+        return;
+    }
+
+    {
+        QDomNodeList xmlEntries = root.elementsByTagName("result");
+        const qint32 N = xmlEntries.size();
+        if(N)
+        {
+            for(int i = 0; i < N; i++)
+            {
+                QString address;
+                QDomElement xmlEntry   = xmlEntries.item(i).toElement();
+                QDomElement xmlAddress = xmlEntry.namedItem("formatted_address").toElement();
+                if(xmlAddress.isElement())
+                {
+                    address = xmlAddress.text();
+                }
+
+                QDomNode xmlGeometry = xmlEntry.namedItem("geometry");
+                QDomNode xmlLocation = xmlGeometry.namedItem("location");
+                qreal lon = xmlLocation.namedItem("lng").toElement().text().toDouble();
+                qreal lat = xmlLocation.namedItem("lat").toElement().text().toDouble();
+
+
+                new CGisItemWpt(QPointF(lon,lat), address, actSymbol->objectName(), this);
+
+            }
+        }
+    }
+
+    setExpanded(true);
+    CCanvas * canvas = CMainWindow::self().getVisibleCanvas();
+    if(canvas)
+    {
+        canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
+    }
+
+}
diff --git a/src/helpers/CWptIconDialog.h b/src/gis/search/CSearchGoogle.h
similarity index 63%
copy from src/helpers/CWptIconDialog.h
copy to src/gis/search/CSearchGoogle.h
index 7b069c9..e920e93 100644
--- a/src/helpers/CWptIconDialog.h
+++ b/src/gis/search/CSearchGoogle.h
@@ -16,29 +16,36 @@
 
 **********************************************************************************************/
 
-#ifndef CWPTICONDIALOG_H
-#define CWPTICONDIALOG_H
+#ifndef CSEARCHGOOGLE_H
+#define CSEARCHGOOGLE_H
 
-#include <QDialog>
-#include "ui_IWptIconDialog.h"
+#include <gis/IGisProject.h>
 
-class QToolButton;
-class QListWidgetItem;
+#include <QObject>
+#include <QNetworkAccessManager>
 
-class CWptIconDialog : public QDialog, private Ui::IWptIconDialog
+class CGisListWks;
+class QLineEdit;
+
+class CSearchGoogle : public QObject, public IGisProject
 {
     Q_OBJECT
     public:
-        CWptIconDialog(QToolButton * parent);
-        virtual ~CWptIconDialog();
+        CSearchGoogle(CGisListWks * parent);
+        virtual ~CSearchGoogle();
 
     private slots:
-        void slotItemClicked(QListWidgetItem * item);
+        void slotChangeSymbol();
+        void slotStartSearch();
+        void slotRequestFinished(QNetworkReply* reply);
 
     private:
-        QToolButton& button;
+        QLineEdit * edit;
+
+        QAction * actSymbol;
 
+        QNetworkAccessManager networkAccessManager;
 };
 
-#endif //CWPTICONDIALOG_H
+#endif //CSEARCHGOOGLE_H
 
diff --git a/src/gis/trk/CCombineTrk.cpp b/src/gis/trk/CCombineTrk.cpp
index 7b47244..5419718 100644
--- a/src/gis/trk/CCombineTrk.cpp
+++ b/src/gis/trk/CCombineTrk.cpp
@@ -18,12 +18,12 @@
 
 #include "gis/trk/CCombineTrk.h"
 #include "gis/trk/CGisItemTrk.h"
-#include "gis/CGisProject.h"
+#include "gis/IGisProject.h"
 #include "plot/CPlotTrack.h"
 
 #include <QtWidgets>
 
-CCombineTrk::CCombineTrk(CGisItemTrk& trk, CGisProject& project, QWidget * parent)
+CCombineTrk::CCombineTrk(CGisItemTrk& trk, IGisProject& project, QWidget * parent)
     : QDialog(parent)
     , trk(trk)
     , project(project)
diff --git a/src/gis/trk/CCombineTrk.h b/src/gis/trk/CCombineTrk.h
index bdcecac..ff434d8 100644
--- a/src/gis/trk/CCombineTrk.h
+++ b/src/gis/trk/CCombineTrk.h
@@ -23,13 +23,13 @@
 #include "ui_ICombineTrk.h"
 
 class CGisItemTrk;
-class CGisProject;
+class IGisProject;
 
 class CCombineTrk : public QDialog, private Ui::ICombineTrk
 {
     Q_OBJECT
     public:
-        CCombineTrk(CGisItemTrk& trk, CGisProject& project, QWidget * parent);
+        CCombineTrk(CGisItemTrk& trk, IGisProject &project, QWidget * parent);
         virtual ~CCombineTrk();
 
         const QStringList& getTrackKeys(){return keys;}
@@ -47,7 +47,7 @@ class CCombineTrk : public QDialog, private Ui::ICombineTrk
     private:
         void updatePreview();
         CGisItemTrk& trk;
-        CGisProject& project;
+        IGisProject& project;
 
         QStringList keys;
 };
diff --git a/src/gis/trk/CDetailsTrk.cpp b/src/gis/trk/CDetailsTrk.cpp
index e1ad9e7..ecc0a61 100644
--- a/src/gis/trk/CDetailsTrk.cpp
+++ b/src/gis/trk/CDetailsTrk.cpp
@@ -18,6 +18,7 @@
 
 #include "gis/trk/CDetailsTrk.h"
 #include "helpers/CSettings.h"
+#include "helpers/CTextEditWidget.h"
 #include "units/IUnit.h"
 #include "GeoMath.h"
 
@@ -61,7 +62,7 @@ CDetailsTrk::CDetailsTrk(CGisItemTrk& trk, QWidget *parent)
     connect(lineName, SIGNAL(textChanged(QString)), this, SLOT(slotNameChanged(QString)));
     connect(toolLock, SIGNAL(toggled(bool)), this, SLOT(slotChangeReadOnlyMode(bool)));
     connect(treeWidget, SIGNAL(itemSelectionChanged()), this, SLOT(slotItemSelectionChanged()));
-
+    connect(textCmtDesc, SIGNAL(anchorClicked(QUrl)), this, SLOT(slotLinkActivated(QUrl)));
 
     slotShowPlots();
 
@@ -77,6 +78,17 @@ 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()
 {
     QString str, val, unit;
@@ -114,7 +126,7 @@ void CDetailsTrk::setupGui()
             item->setTextAlignment(eColSpeed,Qt::AlignRight);
 
 
-            if(trkpt.flags & CGisItemTrk::trkpt_t::eDeleted)
+            if(trkpt.flags & CGisItemTrk::trkpt_t::eHidden)
             {
                 for(int i = 0; i < eColMax; i++)
                 {
@@ -196,6 +208,37 @@ void CDetailsTrk::setupGui()
     treeWidget->addTopLevelItems(items);
     treeWidget->header()->resizeSections(QHeaderView::ResizeToContents);
 
+    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->moveCursor (QTextCursor::Start) ;
+    textCmtDesc->ensureCursorVisible() ;
+
+
     if(!trk.getHistory().isEmpty())
     {
         textHistory->clear();
@@ -318,3 +361,32 @@ void CDetailsTrk::slotItemSelectionChanged()
         trk.setMouseFocusByIndex(idx, CGisItemTrk::eFocusMouseMove);
     }
 }
+
+void CDetailsTrk::slotLinkActivated(const QUrl& url)
+{
+    if(url.toString() == "comment")
+    {
+        CTextEditWidget dlg(0);
+        dlg.setHtml(trk.getComment());
+        if(dlg.exec() == QDialog::Accepted)
+        {
+            trk.setComment(dlg.getHtml());
+        }
+        setupGui();
+
+    }
+    else if(url.toString() == "description")
+    {
+        CTextEditWidget dlg(0);
+        dlg.setHtml(trk.getDescription());
+        if(dlg.exec() == QDialog::Accepted)
+        {
+            trk.setDescription(dlg.getHtml());
+        }
+        setupGui();
+    }
+    else
+    {
+        QDesktopServices::openUrl(url);
+    }
+}
diff --git a/src/gis/trk/CDetailsTrk.h b/src/gis/trk/CDetailsTrk.h
index 558b222..5f15f25 100644
--- a/src/gis/trk/CDetailsTrk.h
+++ b/src/gis/trk/CDetailsTrk.h
@@ -41,8 +41,10 @@ class CDetailsTrk : public QWidget, private Ui::IDetailsTrk
         void slotNameChanged();
         void slotNameChanged(const QString& name);
         void slotItemSelectionChanged();
+        void slotLinkActivated(const QUrl& url);
 
     private:
+        QString toLink(bool isReadOnly, const QString& href, const QString& str);
         void setupGui();
 
         enum columns_t
diff --git a/src/gis/trk/CGisItemTrk.cpp b/src/gis/trk/CGisItemTrk.cpp
index 011eaee..da62be4 100644
--- a/src/gis/trk/CGisItemTrk.cpp
+++ b/src/gis/trk/CGisItemTrk.cpp
@@ -20,7 +20,7 @@
 #include "gis/trk/CScrOptTrk.h"
 #include "gis/trk/CDetailsTrk.h"
 #include "gis/trk/CCombineTrk.h"
-#include "gis/CGisProject.h"
+#include "gis/IGisProject.h"
 #include "gis/CGisDraw.h"
 #include "gis/CGisWidget.h"
 #include "plot/IPlot.h"
@@ -102,7 +102,7 @@ const QPen CGisItemTrk::penBackground(Qt::white, 5, Qt::SolidLine, Qt::RoundCap,
 QString CGisItemTrk::keyUserFocus;
 
 /// used to create a new track from a part of an existing track
-CGisItemTrk::CGisItemTrk(const QString &name, quint32 idx1, quint32 idx2, const trk_t& srctrk, CGisProject * project)
+CGisItemTrk::CGisItemTrk(const QString &name, quint32 idx1, quint32 idx2, const trk_t& srctrk, IGisProject * project)
     : IGisItem(project, eTypeTrk, -1)
     , penForeground(Qt::blue, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
     , drawMode(eDrawNormal)
@@ -154,7 +154,7 @@ CGisItemTrk::CGisItemTrk(const QString &name, quint32 idx1, quint32 idx2, const
 }
 
 /// used to create a copy of track with new parent
-CGisItemTrk::CGisItemTrk(const CGisItemTrk& parentTrk, CGisProject * project, int idx)
+CGisItemTrk::CGisItemTrk(const CGisItemTrk& parentTrk, IGisProject *project, int idx)
     : IGisItem(project, eTypeTrk, idx)
     , penForeground(Qt::blue, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
     , drawMode(eDrawNormal)
@@ -172,7 +172,7 @@ CGisItemTrk::CGisItemTrk(const CGisItemTrk& parentTrk, CGisProject * project, in
 }
 
 /// usd to create a track from a line of coordinates
-CGisItemTrk::CGisItemTrk(const QPolygonF& l, const QString& name, CGisProject * project, int idx)
+CGisItemTrk::CGisItemTrk(const QPolygonF& l, const QString& name, IGisProject * project, int idx)
     : IGisItem(project, eTypeTrk, idx)
     , penForeground(Qt::blue, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
     , drawMode(eDrawNormal)
@@ -193,7 +193,7 @@ CGisItemTrk::CGisItemTrk(const QPolygonF& l, const QString& name, CGisProject *
 }
 
 /// used to create track from GPX file
-CGisItemTrk::CGisItemTrk(const QDomNode& xml, CGisProject * project)
+CGisItemTrk::CGisItemTrk(const QDomNode& xml, IGisProject *project)
     : IGisItem(project, eTypeTrk, project->childCount())
     , penForeground(Qt::blue, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
     , drawMode(eDrawNormal)
@@ -207,6 +207,19 @@ CGisItemTrk::CGisItemTrk(const QDomNode& xml, CGisProject * project)
     setText(0, trk.name);
     setToolTip(0, getInfo());
     genKey();
+
+//    QFile file(trk.name + ".dat");
+//    file.open(QIODevice::WriteOnly);
+//    QDataStream stream(&file);
+//    *this >> stream;
+//    file.close();
+
+//    if(file.open(QIODevice::ReadOnly))
+//    {
+//        QDataStream stream(&file);
+//        *this << stream;
+//        file.close();
+//    }
 }
 
 CGisItemTrk::~CGisItemTrk()
@@ -255,7 +268,7 @@ void CGisItemTrk::getData(QPolygonF &l)
     {
         foreach(const trkpt_t& pt, seg.pts)
         {
-            if(pt.flags & trkpt_t::eDeleted)
+            if(pt.flags & trkpt_t::eHidden)
             {
                 continue;
             }
@@ -555,6 +568,11 @@ void CGisItemTrk::readTrk(const QDomNode& xml, trk_t& trk)
             const QDomNode& xmlTrkpt = xmlTrkpts.item(m);
             readWpt(xmlTrkpt, trkpt);
 
+            trkpt.shdwLon   = trkpt.lon;
+            trkpt.shdwLat   = trkpt.lat;
+            trkpt.shdwEle   = trkpt.ele;
+            trkpt.shdwTime  = trkpt.time;
+
             const QDomNode& ext = xmlTrkpt.namedItem("extensions");
             if(ext.isElement())
             {
@@ -678,7 +696,7 @@ void CGisItemTrk::deriveSecondaryData()
             trkpt_t& trkpt = seg.pts[p];
 
             trkpt.idxTotal = cntTotalPoints++;
-            if(trkpt.flags & trkpt_t::eDeleted)
+            if(trkpt.flags & trkpt_t::eHidden)
             {
                 trkpt.reset();
                 continue;
@@ -764,7 +782,7 @@ void CGisItemTrk::deriveSecondaryData()
         for(int p = 0; p < seg.pts.size(); p++)
         {
             trkpt_t& trkpt = seg.pts[p];
-            if(trkpt.flags & trkpt_t::eDeleted)
+            if(trkpt.flags & trkpt_t::eHidden)
             {
                 continue;
             }
@@ -777,7 +795,7 @@ void CGisItemTrk::deriveSecondaryData()
             while(n>0)
             {
                 trkpt_t & trkpt2 = seg.pts[n];
-                if((trkpt2.flags & trkpt_t::eDeleted) || (trkpt2.ele == NOINT))
+                if((trkpt2.flags & trkpt_t::eHidden) || (trkpt2.ele == NOINT))
                 {
                     n--;
                     continue;
@@ -800,7 +818,7 @@ void CGisItemTrk::deriveSecondaryData()
             while(n < seg.pts.size())
             {
                 trkpt_t & trkpt2 = seg.pts[n];;
-                if((trkpt2.flags & trkpt_t::eDeleted) || (trkpt2.ele == NOINT))
+                if((trkpt2.flags & trkpt_t::eHidden) || (trkpt2.ele == NOINT))
                 {
                     n++;
                     continue;
@@ -890,7 +908,7 @@ bool CGisItemTrk::cut()
         return false;
     }
 
-    CGisProject * project = dynamic_cast<CGisProject*>(parent());
+    IGisProject * project = dynamic_cast<IGisProject*>(parent());
     if(project == 0)
     {
         return false;
@@ -917,7 +935,7 @@ bool CGisItemTrk::cut()
 
 void CGisItemTrk::reverse()
 {
-    CGisProject * project = dynamic_cast<CGisProject*>(parent());
+    IGisProject * project = dynamic_cast<IGisProject*>(parent());
     if(project == 0)
     {
         return;
@@ -955,7 +973,7 @@ void CGisItemTrk::reverse()
 
 void CGisItemTrk::combine()
 {
-    CGisProject * project = dynamic_cast<CGisProject*>(parent());
+    IGisProject * project = dynamic_cast<IGisProject*>(parent());
     if(project == 0)
     {
         return;
@@ -1024,7 +1042,7 @@ void CGisItemTrk::hideSelectedPoints()
 
             if((idx1 < trkpt.idxTotal) && (trkpt.idxTotal < idx2))
             {
-                trkpt.flags |= trkpt_t::eDeleted;
+                trkpt.flags |= trkpt_t::eHidden;
             }
         }
     }
@@ -1060,7 +1078,7 @@ void CGisItemTrk::showSelectedPoints()
 
             if((idx1 < trkpt.idxTotal) && (trkpt.idxTotal < idx2))
             {
-                trkpt.flags &= ~trkpt_t::eDeleted;
+                trkpt.flags &= ~trkpt_t::eHidden;
             }
         }
     }
@@ -1087,7 +1105,7 @@ void CGisItemTrk::copySelectedPoints()
         qSwap(idx1,idx2);
     }
 
-    CGisProject * project = CGisWidget::self().selectProject();
+    IGisProject * project = CGisWidget::self().selectProject();
     if(project == 0)
     {
         return;
@@ -1126,7 +1144,7 @@ void CGisItemTrk::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &b
         {
             foreach(const trkpt_t& pt, seg.pts)
             {
-                if(pt.flags & trkpt_t::eDeleted)
+                if(pt.flags & trkpt_t::eHidden)
                 {
                     continue;
                 }
@@ -1153,7 +1171,7 @@ void CGisItemTrk::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &b
 
                 lineFull << pt1;
 
-                if(pt.flags & trkpt_t::eDeleted)
+                if(pt.flags & trkpt_t::eHidden)
                 {
                     continue;
                 }
@@ -1360,6 +1378,18 @@ void CGisItemTrk::setName(const QString& str)
     changed(QObject::tr("Changed name"));
 }
 
+void CGisItemTrk::setComment(const QString& str)
+{
+    trk.cmt = str;
+    changed(QObject::tr("Changed comment"));
+}
+
+void CGisItemTrk::setDescription(const QString& str)
+{
+    trk.desc = str;
+    changed(QObject::tr("Changed description"));
+}
+
 void CGisItemTrk::setColor(int idx)
 {
     int N = sizeof(lineColors)/sizeof(QColor);
@@ -1426,7 +1456,7 @@ void CGisItemTrk::setMouseFocusByDistance(qreal dist, focusmode_e mode, IPlot *i
         {
             foreach(const trkpt_t& pt, seg.pts)
             {
-                if(pt.flags & trkpt_t::eDeleted)
+                if(pt.flags & trkpt_t::eHidden)
                 {
                     continue;
                 }
@@ -1463,7 +1493,7 @@ void CGisItemTrk::setMouseFocusByTime(quint32 time, focusmode_e mode, IPlot * in
         {
             foreach(const trkpt_t& pt, seg.pts)
             {
-                if(pt.flags & trkpt_t::eDeleted)
+                if(pt.flags & trkpt_t::eHidden)
                 {
                     continue;
                 }
@@ -1551,7 +1581,7 @@ const CGisItemTrk::trkpt_t * CGisItemTrk::getVisibleTrkPtByIndex(quint32 idx)
     {
         foreach(const trkpt_t& pt, seg.pts)
         {
-            if(pt.flags & trkpt_t::eDeleted)
+            if(pt.flags & trkpt_t::eHidden)
             {
                 continue;
             }
diff --git a/src/gis/trk/CGisItemTrk.h b/src/gis/trk/CGisItemTrk.h
index 3d728fa..1eb5980 100644
--- a/src/gis/trk/CGisItemTrk.h
+++ b/src/gis/trk/CGisItemTrk.h
@@ -26,7 +26,7 @@
 #include <QPointer>
 
 class QDomNode;
-class CGisProject;
+class IGisProject;
 class IPlot;
 class CDetailsTrk;
 class CScrOptTrk;
@@ -51,12 +51,31 @@ class CGisItemTrk : public IGisItem, public IGisLine
             , eDrawRange
         };
 
-        CGisItemTrk(const QString& name, quint32 idx1, quint32 idx2, const trk_t &srctrk, CGisProject * project);
-        CGisItemTrk(const CGisItemTrk& parentTrk, CGisProject * project, int idx);
-        CGisItemTrk(const QPolygonF& l, const QString &name, CGisProject * project, int idx);
-        CGisItemTrk(const QDomNode &xml, CGisProject *project);
+        CGisItemTrk(const QString& name, quint32 idx1, quint32 idx2, const trk_t &srctrk, IGisProject *project);
+        CGisItemTrk(const CGisItemTrk& parentTrk, IGisProject * project, int idx);
+        CGisItemTrk(const QPolygonF& l, const QString &name, IGisProject *project, int idx);
+        CGisItemTrk(const QDomNode &xml, IGisProject *project);
         virtual ~CGisItemTrk();
 
+        /**
+           @brief Serialize object out of a QDataStream
+
+           See CGisSerialization.cpp for implementation
+
+           @param stream the binary data stream
+           @return The stream object.
+        */
+        QDataStream& operator<<(QDataStream& stream);
+        /**
+           @brief Serialize object into a QDataStream
+
+           See CGisSerialization.cpp for implementation
+
+           @param stream the binary data stream
+           @return The stream object.
+        */
+        QDataStream& operator>>(QDataStream& stream);
+
         const QString& getName(){return trk.name;}
         int getColorIdx(){return colorIdx;}
         QString getInfo();
@@ -64,10 +83,16 @@ class CGisItemTrk : public IGisItem, public IGisLine
         QString getInfoTrkPt(const trkpt_t& pt);
         QString getInfoProgress(const trkpt_t& pt);
         quint32 getTotalElapsedSeconds(){return totalElapsedSeconds;}
+        const QString& getComment(){return trk.cmt;}
+        const QString& getDescription(){return trk.desc;}
+        const QList<link_t>& getLinks(){return trk.links;}
 
         void setName(const QString& str);
         void setColor(int idx);
         void setDrawMode(drawmode_e mode){drawMode = mode;}
+        void setComment(const QString& str);
+        void setDescription(const QString& str);
+
 
         IScrOpt * getScreenOptions(const QPoint &origin, IMouse * mouse);
         QPointF getPointCloseBy(const QPoint& screenPos);
@@ -118,10 +143,31 @@ class CGisItemTrk : public IGisItem, public IGisLine
          */
         void combine();
 
+        /**
+           @brief Set the trkpt_t::eHidden flag
+
+           The flag is set for all track points between mouseClickFocus and mouseMoveFocus,
+           regardless of their previous state.
+
+        */
         void hideSelectedPoints();
 
+        /**
+           @brief Reset the trkpt_t::eHidden flag
+
+           The flag is reset for all track points between mouseClickFocus and mouseMoveFocus,
+           regardless of their previous state.
+
+         */
         void showSelectedPoints();
 
+        /**
+           @brief Copy a section into a new track object
+
+           The section is defined by mouseClickFocus and mouseMoveFocus, All points are copied,
+           including the hidden (trkpt_t::eHidden) ones.
+
+        */
         void copySelectedPoints();
 
         /**
@@ -197,7 +243,7 @@ class CGisItemTrk : public IGisItem, public IGisLine
         void deriveSecondaryData();
         const trkpt_t *getVisibleTrkPtByIndex(quint32 idx);
         void publishMouseFocus(const trkpt_t * pt, focusmode_e mode, IPlot *initiator);
-        void readLine(const QPolygonF &l);
+        void readLine(const QPolygonF &l);        
 
     public:
         struct trkpt_t : public wpt_t
@@ -221,7 +267,7 @@ class CGisItemTrk : public IGisItem, public IGisLine
 
             enum flag_e
             {
-                eDeleted   = 0x00000004  ///< mark point as deleted
+                eHidden   = 0x00000004  ///< mark point as deleted
             };
 
             quint32 flags;
@@ -230,6 +276,16 @@ class CGisItemTrk : public IGisItem, public IGisLine
             /// offset into lineSimple
             qint32  idxVisible;
 
+            /// shadow latitude
+            qreal shdwLat;
+            /// shadow longitude
+            qreal shdwLon;
+            /// shadow elevation
+            qint32 shdwEle;
+            /// shadow timestamp
+            QDateTime shdwTime;
+
+
             /// the distance to the last point
             qreal deltaDistance;
             /// the distance from the start of the track
diff --git a/src/gis/trk/IDetailsTrk.ui b/src/gis/trk/IDetailsTrk.ui
index b90bcae..2db7506 100644
--- a/src/gis/trk/IDetailsTrk.ui
+++ b/src/gis/trk/IDetailsTrk.ui
@@ -14,8 +14,26 @@
    <string>Form</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <property name="spacing">
+      <number>3</number>
+     </property>
      <item>
       <widget class="QLabel" name="labelInfoTrkPt">
        <property name="sizePolicy">
@@ -100,75 +118,186 @@
     </widget>
    </item>
    <item>
-    <layout class="QHBoxLayout" name="horizontalLayout_4">
-     <item>
-      <layout class="QVBoxLayout" name="verticalLayout_2">
+    <layout class="QHBoxLayout" name="horizontalLayout_2"/>
+   </item>
+   <item>
+    <widget class="QTabWidget" name="tabWidget">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="currentIndex">
+      <number>0</number>
+     </property>
+     <widget class="QWidget" name="tab_3">
+      <attribute name="title">
+       <string>Info</string>
+      </attribute>
+      <layout class="QHBoxLayout" name="horizontalLayout_5">
+       <property name="spacing">
+        <number>3</number>
+       </property>
+       <property name="leftMargin">
+        <number>0</number>
+       </property>
+       <property name="topMargin">
+        <number>0</number>
+       </property>
+       <property name="rightMargin">
+        <number>0</number>
+       </property>
+       <property name="bottomMargin">
+        <number>0</number>
+       </property>
        <item>
-        <layout class="QHBoxLayout" name="horizontalLayout_2">
-         <item>
-          <widget class="QComboBox" name="comboColor"/>
-         </item>
-         <item>
-          <widget class="QLineEdit" name="lineName"/>
-         </item>
-         <item>
-          <widget class="QCheckBox" name="checkProfile">
-           <property name="text">
-            <string>Profile</string>
-           </property>
-          </widget>
-         </item>
+        <widget class="CPlotTrack" name="plotTrack" native="true"/>
+       </item>
+       <item>
+        <layout class="QVBoxLayout" name="verticalLayout_2">
          <item>
-          <widget class="QCheckBox" name="checkSpeed">
-           <property name="text">
-            <string>Speed</string>
-           </property>
-          </widget>
+          <layout class="QHBoxLayout" name="horizontalLayout">
+           <item>
+            <widget class="QComboBox" name="comboColor"/>
+           </item>
+           <item>
+            <widget class="QLineEdit" name="lineName"/>
+           </item>
+          </layout>
          </item>
          <item>
-          <widget class="QCheckBox" name="checkProgress">
-           <property name="text">
-            <string>Progress</string>
-           </property>
-          </widget>
+          <layout class="QHBoxLayout" name="horizontalLayout_4">
+           <item>
+            <widget class="QToolButton" name="toolLock">
+             <property name="text">
+              <string>...</string>
+             </property>
+             <property name="icon">
+              <iconset resource="../../resources.qrc">
+               <normaloff>:/icons/32x32/UnLock.png</normaloff>
+               <normalon>:/icons/32x32/Lock.png</normalon>:/icons/32x32/UnLock.png</iconset>
+             </property>
+             <property name="iconSize">
+              <size>
+               <width>22</width>
+               <height>22</height>
+              </size>
+             </property>
+             <property name="checkable">
+              <bool>true</bool>
+             </property>
+             <property name="autoRaise">
+              <bool>true</bool>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLabel" name="labelTainted">
+             <property name="maximumSize">
+              <size>
+               <width>25</width>
+               <height>25</height>
+              </size>
+             </property>
+             <property name="text">
+              <string/>
+             </property>
+             <property name="pixmap">
+              <pixmap resource="../../resources.qrc">:/icons/32x32/Tainted.png</pixmap>
+             </property>
+             <property name="scaledContents">
+              <bool>true</bool>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QCheckBox" name="checkProfile">
+             <property name="text">
+              <string>Profile</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QCheckBox" name="checkSpeed">
+             <property name="text">
+              <string>Speed</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QCheckBox" name="checkProgress">
+             <property name="text">
+              <string>Progress</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <spacer name="horizontalSpacer_2">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+          </layout>
          </item>
          <item>
-          <widget class="QLabel" name="labelTainted">
+          <widget class="QLabel" name="labelInfo">
            <property name="text">
-            <string/>
+            <string>-</string>
            </property>
-           <property name="pixmap">
-            <pixmap resource="../../resources.qrc">:/icons/32x32/Tainted.png</pixmap>
+           <property name="alignment">
+            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
            </property>
           </widget>
          </item>
          <item>
-          <widget class="QToolButton" name="toolLock">
-           <property name="text">
-            <string>...</string>
-           </property>
-           <property name="icon">
-            <iconset resource="../../resources.qrc">
-             <normaloff>:/icons/32x32/UnLock.png</normaloff>
-             <normalon>:/icons/32x32/Lock.png</normalon>:/icons/32x32/UnLock.png</iconset>
+          <spacer name="verticalSpacer">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
            </property>
-           <property name="iconSize">
+           <property name="sizeHint" stdset="0">
             <size>
-             <width>22</width>
-             <height>22</height>
+             <width>20</width>
+             <height>40</height>
             </size>
            </property>
-           <property name="checkable">
-            <bool>true</bool>
-           </property>
-           <property name="autoRaise">
-            <bool>true</bool>
-           </property>
-          </widget>
+          </spacer>
          </item>
         </layout>
        </item>
        <item>
+        <widget class="QTextBrowser" name="textCmtDesc"/>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="tab">
+      <attribute name="title">
+       <string>Points</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_4">
+       <property name="spacing">
+        <number>0</number>
+       </property>
+       <property name="leftMargin">
+        <number>0</number>
+       </property>
+       <property name="topMargin">
+        <number>0</number>
+       </property>
+       <property name="rightMargin">
+        <number>0</number>
+       </property>
+       <property name="bottomMargin">
+        <number>0</number>
+       </property>
+       <item>
         <widget class="QTreeWidget" name="treeWidget">
          <property name="sizePolicy">
           <sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
@@ -244,87 +373,33 @@
         </widget>
        </item>
       </layout>
-     </item>
-     <item>
-      <widget class="QTabWidget" name="tabWidget">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="Maximum" vsizetype="Expanding">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
+     </widget>
+     <widget class="QWidget" name="tab_4">
+      <attribute name="title">
+       <string>Hist.</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_3">
+       <property name="spacing">
+        <number>0</number>
        </property>
-       <property name="currentIndex">
+       <property name="leftMargin">
         <number>0</number>
        </property>
-       <widget class="QWidget" name="tab_3">
-        <attribute name="title">
-         <string>Info</string>
-        </attribute>
-        <layout class="QHBoxLayout" name="horizontalLayout">
-         <property name="spacing">
-          <number>3</number>
-         </property>
-         <property name="leftMargin">
-          <number>3</number>
-         </property>
-         <property name="topMargin">
-          <number>3</number>
-         </property>
-         <property name="rightMargin">
-          <number>3</number>
-         </property>
-         <property name="bottomMargin">
-          <number>3</number>
-         </property>
-         <item>
-          <widget class="CPlotTrack" name="plotTrack" native="true"/>
-         </item>
-         <item>
-          <widget class="QLabel" name="labelInfo">
-           <property name="sizePolicy">
-            <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
-             <horstretch>0</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
-           </property>
-           <property name="text">
-            <string>-</string>
-           </property>
-           <property name="alignment">
-            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
-           </property>
-          </widget>
-         </item>
-        </layout>
-       </widget>
-       <widget class="QWidget" name="tab_4">
-        <attribute name="title">
-         <string>Hist.</string>
-        </attribute>
-        <layout class="QVBoxLayout" name="verticalLayout_3">
-         <property name="spacing">
-          <number>0</number>
-         </property>
-         <property name="leftMargin">
-          <number>0</number>
-         </property>
-         <property name="topMargin">
-          <number>0</number>
-         </property>
-         <property name="rightMargin">
-          <number>0</number>
-         </property>
-         <property name="bottomMargin">
-          <number>0</number>
-         </property>
-         <item>
-          <widget class="QTextBrowser" name="textHistory"/>
-         </item>
-        </layout>
-       </widget>
-      </widget>
-     </item>
-    </layout>
+       <property name="topMargin">
+        <number>0</number>
+       </property>
+       <property name="rightMargin">
+        <number>0</number>
+       </property>
+       <property name="bottomMargin">
+        <number>0</number>
+       </property>
+       <item>
+        <widget class="QTextBrowser" name="textHistory"/>
+       </item>
+      </layout>
+     </widget>
+    </widget>
    </item>
   </layout>
  </widget>
diff --git a/src/gis/wpt/CDetailsWpt.cpp b/src/gis/wpt/CDetailsWpt.cpp
index cc3a022..84e8d25 100644
--- a/src/gis/wpt/CDetailsWpt.cpp
+++ b/src/gis/wpt/CDetailsWpt.cpp
@@ -209,9 +209,9 @@ void CDetailsWpt::slotLinkActivated(const QUrl& url)
         dlg.setHtml(wpt.getComment());
         if(dlg.exec() == QDialog::Accepted)
         {
-            wpt.setComment(dlg.getHtml());
-            setupGui();
+            wpt.setComment(dlg.getHtml());            
         }
+        setupGui();
 
     }
     else if(url.toString() == "description")
@@ -220,9 +220,9 @@ void CDetailsWpt::slotLinkActivated(const QUrl& url)
         dlg.setHtml(wpt.getDescription());
         if(dlg.exec() == QDialog::Accepted)
         {
-            wpt.setDescription(dlg.getHtml());
-            setupGui();
+            wpt.setDescription(dlg.getHtml());            
         }
+        setupGui();
     }
     else
     {
diff --git a/src/gis/wpt/CGisItemWpt.cpp b/src/gis/wpt/CGisItemWpt.cpp
index 673df62..18e63e9 100644
--- a/src/gis/wpt/CGisItemWpt.cpp
+++ b/src/gis/wpt/CGisItemWpt.cpp
@@ -20,7 +20,7 @@
 #include "gis/wpt/CDetailsWpt.h"
 #include "gis/wpt/CDetailsGeoCache.h"
 #include "gis/wpt/CScrOptWpt.h"
-#include "gis/CGisProject.h"
+#include "gis/IGisProject.h"
 #include "gis/CGisDraw.h"
 #include "gis/WptIcons.h"
 #include "gis/CGisListWks.h"
@@ -41,7 +41,7 @@ QString CGisItemWpt::lastName;
 QString CGisItemWpt::lastIcon;
 
 /// used to add a new waypoint
-CGisItemWpt::CGisItemWpt(const QPointF& pos, const QString& name, const QString &icon, CGisProject * project)
+CGisItemWpt::CGisItemWpt(const QPointF& pos, const QString& name, const QString &icon, IGisProject *project)
     : IGisItem(project, eTypeWpt, -1)
     , proximity(NOFLOAT)
     , posScreen(NOPOINTF)
@@ -68,7 +68,7 @@ CGisItemWpt::CGisItemWpt(const QPointF& pos, const QString& name, const QString
 }
 
 /// used to move a copy of waypoint
-CGisItemWpt::CGisItemWpt(const QPointF& pos, const CGisItemWpt& parentWpt, CGisProject * project)
+CGisItemWpt::CGisItemWpt(const QPointF& pos, const CGisItemWpt& parentWpt, IGisProject *project)
     : IGisItem(project, eTypeWpt, -1)
     , proximity(NOFLOAT)
     , posScreen(NOPOINTF)
@@ -95,7 +95,7 @@ CGisItemWpt::CGisItemWpt(const QPointF& pos, const CGisItemWpt& parentWpt, CGisP
 }
 
 /// used to create a copy of waypoint with new parent
-CGisItemWpt::CGisItemWpt(const CGisItemWpt &parentWpt, CGisProject *project, int idx)
+CGisItemWpt::CGisItemWpt(const CGisItemWpt &parentWpt, IGisProject *project, int idx)
     : IGisItem(project, eTypeWpt, idx)
     , proximity(NOFLOAT)
     , posScreen(NOPOINTF)
@@ -113,7 +113,7 @@ CGisItemWpt::CGisItemWpt(const CGisItemWpt &parentWpt, CGisProject *project, int
 }
 
 /// used to create waypoint from GPX file
-CGisItemWpt::CGisItemWpt(const QDomNode &xml, CGisProject *project)
+CGisItemWpt::CGisItemWpt(const QDomNode &xml, IGisProject *project)
     : IGisItem(project, eTypeWpt, project->childCount())
     , proximity(NOFLOAT)
     , posScreen(NOPOINTF)
diff --git a/src/gis/wpt/CGisItemWpt.h b/src/gis/wpt/CGisItemWpt.h
index 7dad51a..591e39a 100644
--- a/src/gis/wpt/CGisItemWpt.h
+++ b/src/gis/wpt/CGisItemWpt.h
@@ -23,10 +23,11 @@
 
 #include <QPointer>
 
-class CGisProject;
+class IGisProject;
 class QDomNode;
 class CScrOptWpt;
 
+
 class CGisItemWpt : public IGisItem
 {
     public:
@@ -78,27 +79,27 @@ class CGisItemWpt : public IGisItem
            @param icon      the waypoint's icon
            @param project   the project the waypoint is added to
          */
-        CGisItemWpt(const QPointF& pos, const QString& name, const QString& icon, CGisProject * project);
+        CGisItemWpt(const QPointF& pos, const QString& name, const QString& icon, IGisProject * project);
         /**
            @brief Create a copy of an existing waypoint with a new position
            @param pos       the waypoint's new position [°]
            @param parentWpt the waypoint to copy
            @param project   the project the waypoint is added to
          */
-        CGisItemWpt(const QPointF& pos, const CGisItemWpt &parentWpt, CGisProject *project);
+        CGisItemWpt(const QPointF& pos, const CGisItemWpt &parentWpt, IGisProject *project);
         /**
            @brief Create a 1:1 copy of an existing waypoint (with new key)
            @param parentWpt the waypoint to copy
            @param project   the project the waypoint is added to
            @param idx       the index to insert the item. If -1 the item will be appended to it's group
          */
-        CGisItemWpt(const CGisItemWpt &parentWpt, CGisProject *project, int idx);
+        CGisItemWpt(const CGisItemWpt &parentWpt, IGisProject *project, int idx);
         /**
            @brief Create item from GPX.
            @param xml       the GPX section containing the item
            @param project   the project to append with item
          */
-        CGisItemWpt(const QDomNode& xml, CGisProject * project);
+        CGisItemWpt(const QDomNode& xml, IGisProject * project);
         virtual ~CGisItemWpt();
 
         void setName(const QString& str);
diff --git a/src/gis/wpt/CProjWpt.cpp b/src/gis/wpt/CProjWpt.cpp
index a9bc037..f6a8190 100644
--- a/src/gis/wpt/CProjWpt.cpp
+++ b/src/gis/wpt/CProjWpt.cpp
@@ -19,7 +19,7 @@
 #include "gis/wpt/CProjWpt.h"
 #include "gis/wpt/CGisItemWpt.h"
 #include "helpers/CWptIconDialog.h"
-#include "gis/CGisProject.h"
+#include "gis/IGisProject.h"
 #include "units/IUnit.h"
 #include "GeoMath.h"
 #include "CMainWindow.h"
@@ -80,7 +80,7 @@ void CProjWpt::accept()
         return;
     }
 
-    CGisProject * project = dynamic_cast<CGisProject*>(wpt.parent());
+    IGisProject * project = dynamic_cast<IGisProject*>(wpt.parent());
     if(project == 0)
     {
         return;
diff --git a/src/gis/wpt/IDetailsWpt.ui b/src/gis/wpt/IDetailsWpt.ui
index 44db622..8f7a72f 100644
--- a/src/gis/wpt/IDetailsWpt.ui
+++ b/src/gis/wpt/IDetailsWpt.ui
@@ -198,16 +198,10 @@
            <verstretch>0</verstretch>
           </sizepolicy>
          </property>
-         <property name="minimumSize">
-          <size>
-           <width>22</width>
-           <height>22</height>
-          </size>
-         </property>
          <property name="maximumSize">
           <size>
-           <width>32</width>
-           <height>32</height>
+           <width>25</width>
+           <height>25</height>
           </size>
          </property>
          <property name="toolTip">
diff --git a/src/helpers/CSelectProjectDialog.cpp b/src/helpers/CSelectProjectDialog.cpp
index 120d235..963209a 100644
--- a/src/helpers/CSelectProjectDialog.cpp
+++ b/src/helpers/CSelectProjectDialog.cpp
@@ -17,7 +17,7 @@
 **********************************************************************************************/
 
 #include "helpers/CSelectProjectDialog.h"
-#include "gis/CGisProject.h"
+#include "gis/gpx/CGpxProject.h"
 
 #include <QtWidgets>
 
@@ -30,7 +30,7 @@ CSelectProjectDialog::CSelectProjectDialog(QString &key, QString &name, QTreeWid
 
     for(int i = 0; i < parent->topLevelItemCount(); i++)
     {
-        CGisProject * project = dynamic_cast<CGisProject*>(parent->topLevelItem(i));
+        CGpxProject * project = dynamic_cast<CGpxProject*>(parent->topLevelItem(i));
         if(project == 0)
         {
          continue;
diff --git a/src/helpers/CWptIconDialog.cpp b/src/helpers/CWptIconDialog.cpp
index 6ac826c..3c90aa2 100644
--- a/src/helpers/CWptIconDialog.cpp
+++ b/src/helpers/CWptIconDialog.cpp
@@ -59,12 +59,25 @@ static bool keyLessThanAlpha(const QString&  s1, const QString&  s2)
 }
 
 
+CWptIconDialog::CWptIconDialog(QAction *parent)
+    : button(0)
+    , action(parent)
+{
+    setupUi(this);
+    setupList(action);
+}
+
 CWptIconDialog::CWptIconDialog(QToolButton *parent)
-    : button(*parent)
+    : button(parent)
+    , action(0)
 {
     setupUi(this);
+    setupList(button);
+}
 
-    QString currentIcon = button.objectName();
+void CWptIconDialog::setupList(QObject * obj)
+{
+    QString currentIcon = obj->objectName();
     QListWidgetItem * currentItem = 0;
 
     const QMap<QString, icon_t>& wptIcons = getWptIcons();
@@ -103,8 +116,17 @@ CWptIconDialog::~CWptIconDialog()
 
 void CWptIconDialog::slotItemClicked(QListWidgetItem * item)
 {
-    button.setIcon(item->icon());
-    button.setObjectName(item->text());
-    button.setToolTip(item->text());
+    if(button)
+    {
+        button->setIcon(item->icon());
+        button->setObjectName(item->text());
+        button->setToolTip(item->text());
+    }
+    else if(action)
+    {
+        action->setIcon(item->icon());
+        action->setObjectName(item->text());
+        action->setToolTip(item->text());
+    }
     accept();
 }
diff --git a/src/helpers/CWptIconDialog.h b/src/helpers/CWptIconDialog.h
index 7b069c9..00eeb77 100644
--- a/src/helpers/CWptIconDialog.h
+++ b/src/helpers/CWptIconDialog.h
@@ -23,6 +23,7 @@
 #include "ui_IWptIconDialog.h"
 
 class QToolButton;
+class QAction;
 class QListWidgetItem;
 
 class CWptIconDialog : public QDialog, private Ui::IWptIconDialog
@@ -30,13 +31,17 @@ class CWptIconDialog : public QDialog, private Ui::IWptIconDialog
     Q_OBJECT
     public:
         CWptIconDialog(QToolButton * parent);
+        CWptIconDialog(QAction * parent);
         virtual ~CWptIconDialog();
 
     private slots:
         void slotItemClicked(QListWidgetItem * item);
 
     private:
-        QToolButton& button;
+        void setupList(QObject *obj);
+
+        QToolButton * button;
+        QAction     * action;
 
 };
 
diff --git a/src/helpers/ITextEditWidget.ui b/src/helpers/ITextEditWidget.ui
index 2c512db..9a9a703 100644
--- a/src/helpers/ITextEditWidget.ui
+++ b/src/helpers/ITextEditWidget.ui
@@ -6,12 +6,12 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>366</width>
+    <width>396</width>
     <height>341</height>
    </rect>
   </property>
   <property name="windowTitle">
-   <string>Form</string>
+   <string>Edit text...</string>
   </property>
   <layout class="QVBoxLayout">
    <item>
diff --git a/src/icons/32x32/AddProject.png b/src/icons/32x32/AddProject.png
new file mode 100644
index 0000000..c56afa7
Binary files /dev/null and b/src/icons/32x32/AddProject.png differ
diff --git a/src/icons/32x32/Error.png b/src/icons/32x32/Error.png
new file mode 100644
index 0000000..1d08fe9
Binary files /dev/null and b/src/icons/32x32/Error.png differ
diff --git a/src/icons/32x32/MimeTMS.png b/src/icons/32x32/MimeTMS.png
new file mode 100644
index 0000000..24743b1
Binary files /dev/null and b/src/icons/32x32/MimeTMS.png differ
diff --git a/src/icons/32x32/SearchGoogle.png b/src/icons/32x32/SearchGoogle.png
new file mode 100644
index 0000000..6828b0e
Binary files /dev/null and b/src/icons/32x32/SearchGoogle.png differ
diff --git a/src/icons/48x48/AddProject.png b/src/icons/48x48/AddProject.png
new file mode 100644
index 0000000..7699b33
Binary files /dev/null and b/src/icons/48x48/AddProject.png differ
diff --git a/src/icons/48x48/Error.png b/src/icons/48x48/Error.png
new file mode 100644
index 0000000..15de217
Binary files /dev/null and b/src/icons/48x48/Error.png differ
diff --git a/src/icons/48x48/MimeTMS.png b/src/icons/48x48/MimeTMS.png
new file mode 100644
index 0000000..987603f
Binary files /dev/null and b/src/icons/48x48/MimeTMS.png differ
diff --git a/src/icons/48x48/SearchGoogle.png b/src/icons/48x48/SearchGoogle.png
new file mode 100644
index 0000000..f423f75
Binary files /dev/null and b/src/icons/48x48/SearchGoogle.png differ
diff --git a/src/icons/AddProject.svg b/src/icons/AddProject.svg
new file mode 100644
index 0000000..9d47258
--- /dev/null
+++ b/src/icons/AddProject.svg
@@ -0,0 +1,106 @@
+<?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="AddProject.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="12.602959"
+     inkscape:cx="24.916712"
+     inkscape:cy="20.497272"
+     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)">
+    <g
+       id="g2995"
+       transform="matrix(0.62228539,0,0,0.62884847,17.380503,388.19153)">
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path2987"
+         d="m 7.6081967,996.43283 44.0373563,21.01087 -36.302255,10.3989 39.144317,14.0072"
+         style="fill:none;stroke:#000080;stroke-width:7.02477074;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path3762-2-1"
+         d="m 8.1970788,995.68769 0,-13.88662 12.1422072,6.27542 -12.0000003,5"
+         style="fill:#ff0000;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path3762-2-1-8"
+         d="m 50.25065,1015.8841 0,-13.8866 12.142207,6.2754 -12,5"
+         style="fill:#ccff00;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path3762-2-1-6"
+         d="m 15.464935,1026.2412 0,-13.8866 12.142207,6.2754 -12,5"
+         style="fill:#ccff00;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         sodipodi:nodetypes="cccc"
+         inkscape:connector-curvature="0"
+         id="path3762-2-1-9"
+         d="m 55.232793,1042.4734 0,-13.8866 12.142207,6.2754 -12,5"
+         style="fill:#ff00ff;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    </g>
+    <path
+       style="fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.54221296;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 30.703645,1024.2525 9.962739,0 0,9.9465 8.53232,0 0,-9.9465 9.962729,0 0,-8.5649 -9.962729,0 -8e-6,-9.9464 -8.532312,0 -9e-6,9.9464 -9.96273,0 0,8.5649 z"
+       id="rect3117-7"
+       inkscape:connector-curvature="0"
+       inkscape:export-filename="/home/oeichler/Code/cpp/MapRoom/src/icons/16x16/add.png"
+       inkscape:export-xdpi="75.913841"
+       inkscape:export-ydpi="75.913841" />
+  </g>
+</svg>
diff --git a/src/icons/Error.svg b/src/icons/Error.svg
new file mode 100644
index 0000000..d09f7a9
--- /dev/null
+++ b/src/icons/Error.svg
@@ -0,0 +1,79 @@
+<?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="svg3408"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="Error.svg">
+  <defs
+     id="defs3410" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="15.556349"
+     inkscape:cx="0.93484286"
+     inkscape:cy="36.34256"
+     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="grid3008" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3413">
+    <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">
+    <path
+       sodipodi:type="arc"
+       style="fill:#ff0000;fill-opacity:1;stroke:#000080"
+       id="path4016"
+       sodipodi:cx="262.5"
+       sodipodi:cy="39.862183"
+       sodipodi:rx="17.5"
+       sodipodi:ry="17.5"
+       d="m 280,39.862183 a 17.5,17.5 0 1 1 -1.6e-4,-0.07379"
+       sodipodi:start="0"
+       sodipodi:end="6.2789689"
+       sodipodi:open="true"
+       transform="translate(-231.95454,-12.407637)" />
+    <path
+       style="fill:#ffff00;stroke:none"
+       d="m 26.335441,13.927394 4.248234,2.256891 7.45454,-2.875154 -8.61316,11.364143 8.496467,-4.513783 -10.620585,21.440469 0.807734,-12.290829 -5.055967,2.134818 z"
+       id="path3016"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccc" />
+  </g>
+</svg>
diff --git a/src/icons/MimeTMS.svg b/src/icons/MimeTMS.svg
new file mode 100644
index 0000000..04800ce
--- /dev/null
+++ b/src/icons/MimeTMS.svg
@@ -0,0 +1,98 @@
+<?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="svg3462"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="MimeTMS.svg">
+  <defs
+     id="defs3464" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11"
+     inkscape:cx="7.1250082"
+     inkscape:cy="32.466178"
+     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="grid3017" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata3467">
+    <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="g3042">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3319"
+         d="m 20.698811,41.088148 c -0.37071,-0.152412 -0.77584,-0.328663 -0.90027,-0.391681 -0.22434,-0.113598 -0.22521,-0.115284 -0.1037,-0.198356 0.0674,-0.04608 0.17632,-0.08477 0.24202,-0.08608 0.0657,-9.37e-4 0.32235,-0.06997 0.57033,-0.15261 0.7605,-0.25358 1.15015,-0.299589 2.03222,-0.239952 0.44199,0.02988 0.83863,0.07203 0.88141,0.0938 0.0427,0.02173 0.11184,0.01264 0.15348,-0.01976 0.0648,-0.05086 0.0615,-0.07868 -0.0221,-0.192586 l -0.0978,-0.133248 0.38503,0.04693 c 0.66965, [...]
+         style="fill:#ff0000" />
+      <g
+         transform="translate(0.00854492,0)"
+         id="g3037">
+        <rect
+           style="fill:#ffffff;stroke:none"
+           id="rect3019"
+           width="31"
+           height="7"
+           x="17.582365"
+           y="37.223877" />
+        <text
+           xml:space="preserve"
+           style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ff0000;fill-opacity:1;stroke:none;font-family:Sans"
+           x="22.599211"
+           y="44"
+           id="text3207"
+           sodipodi:linespacing="125%"><tspan
+             sodipodi:role="line"
+             id="tspan3209"
+             x="22.599211"
+             y="44"
+             style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ff0000;font-family:Sans;-inkscape-font-specification:Sans Bold">TMS</tspan></text>
+      </g>
+      <rect
+         y="12.314795"
+         x="16.525911"
+         height="33.188591"
+         width="33.129997"
+         id="rect3167"
+         style="fill:none;stroke:#aa0000;stroke-width:1.87165701000000007;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    </g>
+  </g>
+</svg>
diff --git a/src/icons/SearchGoogle.svg b/src/icons/SearchGoogle.svg
new file mode 100644
index 0000000..c743cbf
--- /dev/null
+++ b/src/icons/SearchGoogle.svg
@@ -0,0 +1,73 @@
+<?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="svg3369"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="Neues Dokument 2">
+  <defs
+     id="defs3371" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.5"
+     inkscape:cx="5.6363636"
+     inkscape:cy="32"
+     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" />
+  <metadata
+     id="metadata3374">
+    <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">
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:#000080;fill-opacity:1;stroke:#000000;stroke-width:1.29969895;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 13.00053,23.56856 c 0.0019,2.024673 0.455838,4.070063 1.447537,5.982752 3.30752,6.379226 11.14254,8.832483 17.498153,5.512678 0.16494,-0.08616 0.308625,-0.206969 0.468321,-0.299138 L 46.804749,49.208924 51.700826,44.251787 37.310617,29.807716 C 39.3429,26.118184 39.563925,21.517851 37.480916,17.500341 34.173395,11.121114 26.338375,8.6678576 19.982762,11.987662 l -0.638619,0.341872 c -4.05963,2.428737 -6.347896,6.784754 -6.343613,11.239026 z m 3.235669,-0.04266 c -0.0033,-3.34 [...]
+       id="path6229" />
+    <text
+       xml:space="preserve"
+       style="font-size:12px;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="10.670987"
+       y="49.292366"
+       id="text3396"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3398"
+         x="10.670987"
+         y="49.292366"
+         style="font-size:40px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#008000;stroke:#ffffff;font-family:Serif;-inkscape-font-specification:Serif Bold">G</tspan></text>
+  </g>
+</svg>
diff --git a/src/locale/qmapshack_cs.ts b/src/locale/qmapshack_cs.ts
index 9379e3b..3e02b0c 100644
--- a/src/locale/qmapshack_cs.ts
+++ b/src/locale/qmapshack_cs.ts
@@ -81,46 +81,66 @@
     <message>
         <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="127"/>
         <source>Edit name...</source>
-        <translation type="unfinished">Upravit název...</translation>
+        <translation>Upravit název...</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="127"/>
         <source>Enter new waypoint name.</source>
-        <translation type="unfinished"></translation>
+        <translation>Zadat  nový název cestovního bodu.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="222"/>
         <source><h4>Comment:</h4></source>
-        <translation type="unfinished"><h4>Poznámka:</h4></translation>
+        <translation><h4>Poznámka:</h4></translation>
     </message>
     <message>
         <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="225"/>
         <source><p>--- no comment ---</p></source>
-        <translation type="unfinished"><p>--- žádná poznámka ---</p></translation>
+        <translation><p>--- žádná poznámka ---</p></translation>
     </message>
     <message>
         <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="232"/>
         <source><h4>Description:</h4></source>
-        <translation type="unfinished"><h4>Popis:</h4></translation>
+        <translation><h4>Popis:</h4></translation>
     </message>
     <message>
         <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="235"/>
         <source><p>--- no description ---</p></source>
-        <translation type="unfinished"><p>--- žádný popis ---</p></translation>
+        <translation><p>--- žádný popis ---</p></translation>
     </message>
 </context>
 <context>
     <name>CDetailsTrk</name>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="145"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="154"/>
         <location filename="../gis/trk/CDetailsTrk.cpp" line="157"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="163"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="182"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="184"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="166"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="169"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="175"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="194"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="196"/>
         <source>%1 %2</source>
         <translation>%1 %2</translation>
     </message>
+    <message>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="219"/>
+        <source><h4>Comment:</h4></source>
+        <translation type="unfinished"><h4>Poznámka:</h4></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="222"/>
+        <source><p>--- no comment ---</p></source>
+        <translation type="unfinished"><p>--- žádná poznámka ---</p></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="229"/>
+        <source><h4>Description:</h4></source>
+        <translation type="unfinished"><h4>Popis:</h4></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="232"/>
+        <source><p>--- no description ---</p></source>
+        <translation type="unfinished"><p>--- žádný popis ---</p></translation>
+    </message>
 </context>
 <context>
     <name>CDetailsWpt</name>
@@ -168,60 +188,70 @@
 <context>
     <name>CGisListWks</name>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="36"/>
+        <location filename="../gis/CGisListWks.cpp" line="39"/>
         <source>Save As...</source>
         <translation>Uložit jako...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="37"/>
+        <location filename="../gis/CGisListWks.cpp" line="40"/>
         <source>Save</source>
         <translation>Uložit</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="38"/>
+        <location filename="../gis/CGisListWks.cpp" line="41"/>
         <source>Close</source>
         <translation>Zavřít</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="44"/>
+        <location filename="../gis/CGisListWks.cpp" line="47"/>
         <source>Edit...</source>
         <translation>Upravit...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="45"/>
+        <location filename="../gis/CGisListWks.cpp" line="48"/>
         <source>Move Waypoint</source>
         <translation>Přesunout cestovní bod</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="46"/>
+        <location filename="../gis/CGisListWks.cpp" line="49"/>
         <source>Proj. Waypoint...</source>
-        <translation>Promítnout cestovní bod</translation>
+        <translation>Promítnout cestovní bod...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="47"/>
+        <location filename="../gis/CGisListWks.cpp" line="50"/>
         <source>Track Profile</source>
         <translation>Sledovat profil</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="48"/>
-        <source>Edit Track Points</source>
+        <location filename="../gis/CGisListWks.cpp" line="51"/>
+        <source>Select Range</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="49"/>
+        <location filename="../gis/CGisListWks.cpp" line="52"/>
+        <source>Edit Track Points</source>
+        <translation>Upravit body stopy</translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="53"/>
         <source>Reverse Track</source>
-        <translation type="unfinished"></translation>
+        <translation>Obrátit stopu</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="50"/>
+        <location filename="../gis/CGisListWks.cpp" line="54"/>
         <source>Combine Tracks</source>
-        <translation type="unfinished"></translation>
+        <translation>Spojit stopy</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="53"/>
+        <location filename="../gis/CGisListWks.cpp" line="57"/>
         <source>Delete</source>
         <translation>Smazat</translation>
     </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="555"/>
+        <source>New Project</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>CGrid</name>
@@ -898,17 +928,17 @@
     <message>
         <location filename="../map/CMapMAP.cpp" line="46"/>
         <source>Failed ...</source>
-        <translation type="unfinished">Nepodařilo se...</translation>
+        <translation>Nepodařilo se...</translation>
     </message>
     <message>
         <location filename="../map/CMapMAP.cpp" line="65"/>
         <source>Failed to open: </source>
-        <translation type="unfinished">Nepodařilo se otevřít: </translation>
+        <translation>Nepodařilo se otevřít: </translation>
     </message>
     <message>
         <location filename="../map/CMapMAP.cpp" line="75"/>
         <source>Bad file format: </source>
-        <translation type="unfinished">Špatný formát souboru: </translation>
+        <translation>Špatný formát souboru: </translation>
     </message>
 </context>
 <context>
@@ -929,7 +959,7 @@
     <message>
         <location filename="../map/CMapPropSetup.cpp" line="151"/>
         <source>Cache path...</source>
-        <translation type="unfinished"></translation>
+        <translation>Cesta k vyrovnávací paměti...</translation>
     </message>
 </context>
 <context>
@@ -976,6 +1006,39 @@
     </message>
 </context>
 <context>
+    <name>CMapTMS</name>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="69"/>
+        <location filename="../map/CMapTMS.cpp" line="79"/>
+        <source>Error...</source>
+        <translation type="unfinished">Chyba...</translation>
+    </message>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="69"/>
+        <source>Failed to open %1</source>
+        <translation type="unfinished">Nepodařilo se otevřít %1</translation>
+    </message>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="79"/>
+        <source>Failed to read: %1
+line %2, column %3:
+ %4</source>
+        <translation type="unfinished">Chyba při čtení: %1
+Řádek %2, Sloupec %3:
+%4</translation>
+    </message>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="117"/>
+        <source>Layer %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="288"/>
+        <source><b>%1</b>: %2 tiles pending<br/></source>
+        <translation type="unfinished"><b>%1</b>: %2 dlaždic čeká<br/></translation>
+    </message>
+</context>
+<context>
     <name>CMapVRT</name>
     <message>
         <location filename="../map/CMapVRT.cpp" line="46"/>
@@ -1006,53 +1069,53 @@
 <context>
     <name>CMapWMTS</name>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="44"/>
-        <location filename="../map/CMapWMTS.cpp" line="54"/>
-        <location filename="../map/CMapWMTS.cpp" line="64"/>
-        <location filename="../map/CMapWMTS.cpp" line="73"/>
-        <location filename="../map/CMapWMTS.cpp" line="188"/>
+        <location filename="../map/CMapWMTS.cpp" line="45"/>
+        <location filename="../map/CMapWMTS.cpp" line="55"/>
+        <location filename="../map/CMapWMTS.cpp" line="65"/>
+        <location filename="../map/CMapWMTS.cpp" line="74"/>
+        <location filename="../map/CMapWMTS.cpp" line="198"/>
         <source>Error...</source>
-        <translation type="unfinished">Chyba...</translation>
+        <translation>Chyba...</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="44"/>
+        <location filename="../map/CMapWMTS.cpp" line="45"/>
         <source>Failed to open %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Nepodařilo se otevřít %1</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="54"/>
+        <location filename="../map/CMapWMTS.cpp" line="55"/>
         <source>Failed to read: %1
 line %2, column %3:
  %4</source>
-        <translation type="unfinished">Chyba při čtení: %1
+        <translation>Chyba při čtení: %1
 Řádek %2, Sloupec %3:
 %4</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="64"/>
+        <location filename="../map/CMapWMTS.cpp" line="65"/>
         <source>Failed to read: %1
 Unknown structure.</source>
-        <translation type="unfinished"></translation>
+        <translation>Chyba při čtení: %1
+Neznámá stavba.</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="73"/>
+        <location filename="../map/CMapWMTS.cpp" line="74"/>
         <source>Unexpexted service. '* WMTS 1.0.0' is expected. '%1 %2' is read.</source>
-        <translation type="unfinished"></translation>
+        <translation>Neočekávaná služba. Očekáváno '* WMTS 1.0.0'. Přečteno '%1 %2'.</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="188"/>
+        <location filename="../map/CMapWMTS.cpp" line="198"/>
         <source>No georeference information found.</source>
-        <translation type="unfinished">Nenalezeny žádné údaje o vyjádření prostorových vztahů.</translation>
+        <translation>Nenalezeny žádné údaje o soustavě souřadnic.</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="243"/>
         <source>--- All ---</source>
-        <translation type="unfinished"></translation>
+        <translation type="obsolete">--- Vše ---</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="323"/>
+        <location filename="../map/CMapWMTS.cpp" line="385"/>
         <source><b>%1</b>: %2 tiles pending<br/></source>
-        <translation type="unfinished"></translation>
+        <translation><b>%1</b>: %2 dlaždic čeká<br/></translation>
     </message>
 </context>
 <context>
@@ -1060,7 +1123,7 @@ Unknown structure.</source>
     <message>
         <location filename="../mouse/CMouseEditArea.cpp" line="38"/>
         <source><b>Edit Area</b><br/>Select a corner point for more options.<br/></source>
-        <translation type="unfinished"></translation>
+        <translation><b>Upravit oblast</b><br/>Vyberte rohový bod pro více voleb.<br/></translation>
     </message>
 </context>
 <context>
@@ -1068,7 +1131,7 @@ Unknown structure.</source>
     <message>
         <location filename="../mouse/CMouseEditTrk.cpp" line="46"/>
         <source><b>Edit Track Points</b><br/>Select a track point for more options.<br/></source>
-        <translation type="unfinished"></translation>
+        <translation><b>Upravit body stopy</b><br/>Vyberte bod stopy pro více voleb.<br/></translation>
     </message>
 </context>
 <context>
@@ -1081,17 +1144,17 @@ Unknown structure.</source>
     <message>
         <location filename="../mouse/CMouseNormal.cpp" line="43"/>
         <source>Add Track</source>
-        <translation type="unfinished"></translation>
+        <translation>Přidat stopu</translation>
     </message>
     <message>
         <location filename="../mouse/CMouseNormal.cpp" line="44"/>
         <source>Add Area</source>
-        <translation type="unfinished"></translation>
+        <translation>Přidat oblast</translation>
     </message>
     <message>
         <location filename="../mouse/CMouseNormal.cpp" line="46"/>
         <source>Copy position</source>
-        <translation type="unfinished"></translation>
+        <translation>Kopírovat polohu</translation>
     </message>
 </context>
 <context>
@@ -1099,7 +1162,7 @@ Unknown structure.</source>
     <message>
         <location filename="../mouse/CMouseRangeTrk.cpp" line="48"/>
         <source><b>Select Range</b><br/>Select first track point. And then a second one.<br/></source>
-        <translation type="unfinished"></translation>
+        <translation><b>Vybrat rozsah</b><br/>Vyberte první bod stopy. A potom druhý.<br/></translation>
     </message>
 </context>
 <context>
@@ -1199,6 +1262,19 @@ není platným vymezením soustavy souřadnic
     </message>
 </context>
 <context>
+    <name>CSearchGoogle</name>
+    <message>
+        <location filename="../gis/search/CSearchGoogle.cpp" line="120"/>
+        <source>Unknown response</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/search/CSearchGoogle.cpp" line="130"/>
+        <source>Error: </source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>CTextEditWidget</name>
     <message>
         <location filename="../helpers/CTextEditWidget.cpp" line="73"/>
@@ -1275,7 +1351,7 @@ není platným vymezením soustavy souřadnic
     <message>
         <location filename="../gis/trk/ICombineTrk.ui" line="14"/>
         <source>Combine Tracks...</source>
-        <translation type="unfinished"></translation>
+        <translation>Spojit stopy...</translation>
     </message>
     <message>
         <location filename="../gis/trk/ICombineTrk.ui" line="43"/>
@@ -1283,7 +1359,7 @@ není platným vymezením soustavy souřadnic
         <location filename="../gis/trk/ICombineTrk.ui" line="117"/>
         <location filename="../gis/trk/ICombineTrk.ui" line="144"/>
         <source>...</source>
-        <translation type="unfinished">...</translation>
+        <translation>...</translation>
     </message>
 </context>
 <context>
@@ -1426,52 +1502,52 @@ není platným vymezením soustavy souřadnic
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="14"/>
         <source>Dialog</source>
-        <translation type="unfinished">Dialog</translation>
+        <translation>Dialog</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="37"/>
         <source>-</source>
-        <translation type="unfinished">-</translation>
+        <translation>-</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="75"/>
         <source>...</source>
-        <translation type="unfinished">...</translation>
+        <translation>...</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="105"/>
         <source>Color</source>
-        <translation type="unfinished"></translation>
+        <translation>Barva</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="126"/>
         <source>Border width</source>
-        <translation type="unfinished"></translation>
+        <translation>Šířka okraje</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="140"/>
         <source>Style</source>
-        <translation type="unfinished"></translation>
+        <translation>Styl</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="159"/>
         <source>Opacity</source>
-        <translation type="unfinished"></translation>
+        <translation>Neprůhlednost</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="179"/>
         <source>Points</source>
-        <translation type="unfinished">Body</translation>
+        <translation>Body</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="206"/>
         <source>Position</source>
-        <translation type="unfinished">Poloha</translation>
+        <translation>Poloha</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="215"/>
         <source>Hist.</source>
-        <translation type="unfinished">Hist.</translation>
+        <translation>Hist.</translation>
     </message>
 </context>
 <context>
@@ -1482,85 +1558,91 @@ není platným vymezením soustavy souřadnic
         <translation>Formulář</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="28"/>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="49"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="46"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="67"/>
         <source>-
 -</source>
-        <translation type="unfinished"></translation>
+        <translation>-
+-</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="117"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="217"/>
         <source>Profile</source>
         <translation>Profil</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="124"/>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="221"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="224"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="350"/>
         <source>Speed</source>
         <translation>Rychlost</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="131"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="231"/>
         <source>Progress</source>
         <translation>Postup</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="148"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="174"/>
         <source>...</source>
         <translation>...</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="201"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="282"/>
+        <source>Points</source>
+        <translation type="unfinished">Body</translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="330"/>
         <source>Time</source>
         <translation>Čas</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="206"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="335"/>
         <source>Ele.</source>
         <translation>Výška</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="211"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="340"/>
         <source>Delta</source>
         <translation>Rozdíl</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="216"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="345"/>
         <source>Dist.</source>
         <translation>Vzdál.</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="226"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="355"/>
         <source>Slope</source>
         <translation>Sklon</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="231"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="360"/>
         <source>Ascend</source>
         <translation>Stoupání</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="236"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="365"/>
         <source>Descend</source>
         <translation>Klesání</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="241"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="370"/>
         <source>Position</source>
         <translation>Poloha</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="261"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="136"/>
         <source>Info</source>
         <translation>Informace</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="291"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="253"/>
         <source>-</source>
         <translation>-</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="302"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="379"/>
         <source>Hist.</source>
         <translation>Hist.</translation>
     </message>
@@ -1573,8 +1655,8 @@ není platným vymezením soustavy souřadnic
         <translation>Dialog</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/IDetailsWpt.ui" line="233"/>
-        <location filename="../gis/wpt/IDetailsWpt.ui" line="259"/>
+        <location filename="../gis/wpt/IDetailsWpt.ui" line="227"/>
+        <location filename="../gis/wpt/IDetailsWpt.ui" line="253"/>
         <source>...</source>
         <translation>...</translation>
     </message>
@@ -1603,12 +1685,12 @@ není platným vymezením soustavy souřadnic
         <translation>Blízkost:</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/IDetailsWpt.ui" line="214"/>
+        <location filename="../gis/wpt/IDetailsWpt.ui" line="208"/>
         <source><html><head/><body><p>The waypoint was imported to QMapShack and was changed. It does not show the original data anymore. Please see history for changes. </p></body></html></source>
         <translation><html><head/><body><p>Cestovní bod byl zaveden do QMapShacku a byl změněn. Už neukazuje původní data. Prohlédněte si, prosím, historii kvůli změnám. </p></body></html></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/IDetailsWpt.ui" line="230"/>
+        <location filename="../gis/wpt/IDetailsWpt.ui" line="224"/>
         <source><html><head/><body><p>Read Only Mode</p></body></html></source>
         <translation><html><head/><body><p>Režim pouze pro čtení</p></body></html></translation>
     </message>
@@ -1718,141 +1800,161 @@ není platným vymezením soustavy souřadnic
         <translation>Otázka</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="109"/>
+        <location filename="../IMainWindow.ui" line="100"/>
+        <source>Project</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="118"/>
         <source>Maps</source>
         <translation>Mapy</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="146"/>
+        <location filename="../IMainWindow.ui" line="155"/>
         <source>Dig. Elev. Model (DEM)</source>
         <translation>Digitální výškový model (DEM)</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="179"/>
+        <location filename="../IMainWindow.ui" line="188"/>
         <source>Data</source>
         <translation>Data</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="192"/>
+        <location filename="../IMainWindow.ui" line="201"/>
         <source>Add Map Workspace</source>
         <translation>Přidat pracovní oblast mapy</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="195"/>
+        <location filename="../IMainWindow.ui" line="204"/>
         <source>Ctrl+T</source>
         <translation>Ctrl+T</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="207"/>
+        <location filename="../IMainWindow.ui" line="216"/>
         <source>Show Scale</source>
         <translation>Ukázat měřítko</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="216"/>
+        <location filename="../IMainWindow.ui" line="225"/>
         <source>Setup Map Font</source>
         <translation>Nastavit písmo mapy</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="228"/>
+        <location filename="../IMainWindow.ui" line="237"/>
         <source>Show Grid</source>
         <translation>Ukázat mřížku</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="231"/>
+        <location filename="../IMainWindow.ui" line="240"/>
         <source>Ctrl+G</source>
         <translation>Ctrl+G</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="240"/>
+        <location filename="../IMainWindow.ui" line="249"/>
         <source>Setup Grid</source>
         <translation>Nastavit mřížku</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="243"/>
+        <location filename="../IMainWindow.ui" line="252"/>
         <source>Ctrl+Alt+G</source>
         <translation>Ctrl+Alt+G</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="255"/>
+        <location filename="../IMainWindow.ui" line="264"/>
         <source>Flip Mouse Wheel</source>
         <translation>Obrátit kolečko myši</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="264"/>
-        <location filename="../IMainWindow.ui" line="267"/>
+        <location filename="../IMainWindow.ui" line="273"/>
+        <location filename="../IMainWindow.ui" line="276"/>
         <source>Setup Map Paths</source>
         <translation>Nastavit cesty k mapám</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="279"/>
+        <location filename="../IMainWindow.ui" line="288"/>
         <source>POI Text</source>
         <translation>Text POI</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="291"/>
+        <location filename="../IMainWindow.ui" line="300"/>
         <source>Night / Day</source>
         <translation>Noc/Den</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="303"/>
+        <location filename="../IMainWindow.ui" line="312"/>
         <source>Map Tool Tip</source>
         <translation>Rada k nástroji pro mapu</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="312"/>
+        <location filename="../IMainWindow.ui" line="321"/>
         <source>Setup DEM Paths</source>
         <translation>Nastavit cesty k DEM</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="321"/>
+        <location filename="../IMainWindow.ui" line="330"/>
         <source>About</source>
         <translation>O programu</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="330"/>
+        <location filename="../IMainWindow.ui" line="339"/>
         <source>Help</source>
         <translation>Nápověda</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="339"/>
+        <location filename="../IMainWindow.ui" line="348"/>
         <source>Setup Map Workspace</source>
         <translation>Nastavit pracovní oblast mapy</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="348"/>
+        <location filename="../IMainWindow.ui" line="357"/>
         <source>Load GIS Data</source>
         <translation>Nahrát data GIS</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="351"/>
+        <location filename="../IMainWindow.ui" line="360"/>
         <source>Load projects from file</source>
         <translation>Nahrát projekty ze souboru</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="354"/>
+        <location filename="../IMainWindow.ui" line="363"/>
         <source>Ctrl+L</source>
         <translation>Ctrl+L</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="363"/>
+        <location filename="../IMainWindow.ui" line="372"/>
         <source>Save All GIS Data</source>
         <translation>Uložit všechna data GIS</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="366"/>
+        <location filename="../IMainWindow.ui" line="375"/>
         <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="369"/>
+        <location filename="../IMainWindow.ui" line="378"/>
         <source>Ctrl+S</source>
         <translation>Ctrl+S</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="378"/>
+        <location filename="../IMainWindow.ui" line="387"/>
         <source>Setup Time Zone</source>
         <translation>Nastavit časové pásmo</translation>
     </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="396"/>
+        <source>Add empty project</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="408"/>
+        <source>Search Google</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="417"/>
+        <source>Close all projects</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>IMapList</name>
@@ -1868,7 +1970,7 @@ není platným vymezením soustavy souřadnic
     <message>
         <location filename="../map/IMapList.ui" line="103"/>
         <source>To add maps use File->Setup Map Paths. </source>
-        <translation type="unfinished"></translation>
+        <translation>Pro přidání map použijte Soubor → Nastavit cesty k mapám. </translation>
     </message>
     <message>
         <location filename="../map/IMapList.ui" line="116"/>
@@ -1952,40 +2054,40 @@ není platným vymezením soustavy souřadnic
     <message>
         <location filename="../map/IMapPropSetup.ui" line="184"/>
         <source>-</source>
-        <translation type="unfinished">-</translation>
+        <translation>-</translation>
     </message>
     <message>
         <location filename="../map/IMapPropSetup.ui" line="208"/>
         <source>Cache Size (MB)</source>
-        <translation type="unfinished"></translation>
+        <translation>Velikost vyrovnávací paměti (MB)</translation>
     </message>
     <message>
         <location filename="../map/IMapPropSetup.ui" line="228"/>
         <source>Expiration (Days)</source>
-        <translation type="unfinished"></translation>
+        <translation>Datum vypršení (dny)</translation>
     </message>
 </context>
 <context>
     <name>IMouseEditLine</name>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="309"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="339"/>
         <source>Add points?</source>
-        <translation type="unfinished"></translation>
+        <translation>Přidat body?</translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="309"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="339"/>
         <source>Add points to temporary line?</source>
-        <translation type="unfinished"></translation>
+        <translation>Přidat body do dočasné čáry?</translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="758"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="875"/>
         <source>Warning!</source>
-        <translation type="unfinished"></translation>
+        <translation>Varování!</translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="758"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="875"/>
         <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="unfinished"></translation>
+        <translation>Tímto budou všechny původní údaje nahrazeny jednoduchou čárou souřadnic. Všechna ostatní data budou trvale ztracena.</translation>
     </message>
 </context>
 <context>
@@ -2116,22 +2218,22 @@ nebo
     <message>
         <location filename="../mouse/IScrOptEditLine.ui" line="26"/>
         <source>Form</source>
-        <translation type="unfinished">Formulář</translation>
+        <translation>Formulář</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptEditLine.ui" line="50"/>
         <source>Save to orignal</source>
-        <translation type="unfinished"></translation>
+        <translation>Uložit do předlohy</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptEditLine.ui" line="57"/>
         <source>Save as new</source>
-        <translation type="unfinished"></translation>
+        <translation>Uložit jako nový</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptEditLine.ui" line="64"/>
         <source>Abort</source>
-        <translation type="unfinished"></translation>
+        <translation>Přerušit</translation>
     </message>
 </context>
 <context>
@@ -2139,19 +2241,19 @@ nebo
     <message>
         <location filename="../gis/ovl/IScrOptOvlArea.ui" line="14"/>
         <source>Form</source>
-        <translation type="unfinished">Formulář</translation>
+        <translation>Formulář</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IScrOptOvlArea.ui" line="40"/>
         <location filename="../gis/ovl/IScrOptOvlArea.ui" line="51"/>
         <location filename="../gis/ovl/IScrOptOvlArea.ui" line="69"/>
         <source>...</source>
-        <translation type="unfinished">...</translation>
+        <translation>...</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IScrOptOvlArea.ui" line="98"/>
         <source>TextLabel</source>
-        <translation type="unfinished">Textový štítek</translation>
+        <translation>Textový štítek</translation>
     </message>
 </context>
 <context>
@@ -2159,32 +2261,32 @@ nebo
     <message>
         <location filename="../mouse/IScrOptPoint.ui" line="14"/>
         <source>Form</source>
-        <translation type="unfinished">Formulář</translation>
+        <translation>Formulář</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptPoint.ui" line="35"/>
         <source>Delete point.</source>
-        <translation type="unfinished"></translation>
+        <translation>Smazat bod.</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptPoint.ui" line="49"/>
         <source>Select a range of points.</source>
-        <translation type="unfinished"></translation>
+        <translation>Vybrat rozsah bodů.</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptPoint.ui" line="63"/>
         <source>Move selected point.</source>
-        <translation type="unfinished"></translation>
+        <translation>Přesunout vybraný bod.</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptPoint.ui" line="77"/>
         <source>Add points before the selected point.</source>
-        <translation type="unfinished"></translation>
+        <translation>Přidat body před vybraný bod.</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptPoint.ui" line="91"/>
         <source>Add points after the selected point.</source>
-        <translation type="unfinished"></translation>
+        <translation>Přidat body po vybraném bodu.</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptPoint.ui" line="38"/>
@@ -2193,7 +2295,7 @@ nebo
         <location filename="../mouse/IScrOptPoint.ui" line="80"/>
         <location filename="../mouse/IScrOptPoint.ui" line="94"/>
         <source>...</source>
-        <translation type="unfinished">...</translation>
+        <translation>...</translation>
     </message>
 </context>
 <context>
@@ -2201,17 +2303,17 @@ nebo
     <message>
         <location filename="../mouse/IScrOptRange.ui" line="14"/>
         <source>Form</source>
-        <translation type="unfinished">Formulář</translation>
+        <translation>Formulář</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptRange.ui" line="32"/>
         <source>Delete selected range of points.</source>
-        <translation type="unfinished"></translation>
+        <translation>Smazat vybraný rozsah bodů.</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptRange.ui" line="35"/>
         <source>...</source>
-        <translation type="unfinished">...</translation>
+        <translation>...</translation>
     </message>
 </context>
 <context>
@@ -2219,34 +2321,34 @@ nebo
     <message>
         <location filename="../mouse/IScrOptRangeTrk.ui" line="14"/>
         <source>Form</source>
-        <translation type="unfinished">Formulář</translation>
+        <translation>Formulář</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptRangeTrk.ui" line="40"/>
         <source>Hide all points.</source>
-        <translation type="unfinished"></translation>
+        <translation>Skrýt všechny body.</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptRangeTrk.ui" line="43"/>
         <location filename="../mouse/IScrOptRangeTrk.ui" line="57"/>
         <location filename="../mouse/IScrOptRangeTrk.ui" line="71"/>
         <source>...</source>
-        <translation type="unfinished">...</translation>
+        <translation>...</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptRangeTrk.ui" line="54"/>
         <source>Show all points.</source>
-        <translation type="unfinished"></translation>
+        <translation>Ukázat všechny body.</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptRangeTrk.ui" line="68"/>
         <source>Copy track points as new track.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kopírovat body stopy jako novou stopu.</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptRangeTrk.ui" line="103"/>
         <source>TextLabel</source>
-        <translation type="unfinished">Textový štítek</translation>
+        <translation>Textový štítek</translation>
     </message>
 </context>
 <context>
@@ -2288,37 +2390,37 @@ nebo
     <message>
         <location filename="../gis/trk/IScrOptTrk.ui" line="40"/>
         <source>View details &amp; Edit properties of track.</source>
-        <translation type="unfinished"></translation>
+        <translation>Zobrazit podrobnosti a upravit vlastnosti stopy.</translation>
     </message>
     <message>
         <location filename="../gis/trk/IScrOptTrk.ui" line="71"/>
         <source>Delete</source>
-        <translation type="unfinished">Smazat</translation>
+        <translation>Smazat</translation>
     </message>
     <message>
         <location filename="../gis/trk/IScrOptTrk.ui" line="54"/>
         <source>Show on-screen profile and detailed information about points.</source>
-        <translation type="unfinished"></translation>
+        <translation>Ukázat promítnutý profil a podrobné údaje o bodech.</translation>
     </message>
     <message>
         <location filename="../gis/trk/IScrOptTrk.ui" line="145"/>
         <source>Cut track at selected point into two tracks.</source>
-        <translation type="unfinished"></translation>
+        <translation>Vyjmout stopu na vybraném bodu do dvou stop.</translation>
     </message>
     <message>
         <location filename="../gis/trk/IScrOptTrk.ui" line="103"/>
         <source>Edit position of track points.</source>
-        <translation type="unfinished"></translation>
+        <translation>Upravit polohu bodů stopy.</translation>
     </message>
     <message>
         <location filename="../gis/trk/IScrOptTrk.ui" line="117"/>
         <source>Reverse track.</source>
-        <translation type="unfinished"></translation>
+        <translation>Obrátit stopu.</translation>
     </message>
     <message>
         <location filename="../gis/trk/IScrOptTrk.ui" line="131"/>
         <source>Combine tracks.</source>
-        <translation type="unfinished"></translation>
+        <translation>Spojit stopy.</translation>
     </message>
     <message>
         <source><html><head/><body><p>View details &amp; Edit</p></body></html></source>
@@ -2396,7 +2498,7 @@ nebo
     <message>
         <location filename="../helpers/ISelectProjectDialog.ui" line="14"/>
         <source>Select a project...</source>
-        <translation type="unfinished"></translation>
+        <translation>Vybrat projekt...</translation>
     </message>
     <message>
         <location filename="../helpers/ISelectProjectDialog.ui" line="20"/>
@@ -2407,9 +2509,13 @@ nebo
 <context>
     <name>ITextEditWidget</name>
     <message>
-        <location filename="../helpers/ITextEditWidget.ui" line="14"/>
         <source>Form</source>
-        <translation>Formulář</translation>
+        <translation type="obsolete">Formulář</translation>
+    </message>
+    <message>
+        <location filename="../helpers/ITextEditWidget.ui" line="14"/>
+        <source>Edit text...</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../helpers/ITextEditWidget.ui" line="25"/>
@@ -2583,23 +2689,23 @@ nebo
 <context>
     <name>QObject</name>
     <message>
-        <location filename="../GeoMath.cpp" line="88"/>
+        <location filename="../GeoMath.cpp" line="89"/>
         <source>Error</source>
         <translation>Chyba</translation>
     </message>
     <message>
-        <location filename="../GeoMath.cpp" line="88"/>
+        <location filename="../GeoMath.cpp" line="89"/>
         <source>Bad position format. Must be: [N|S] ddd mm.sss [W|E] ddd mm.sss</source>
         <translation>Špatný polohový formát. Musí být: "[N|S] ddd mm.sss [W|E] ddd mm.sss"</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="77"/>
-        <location filename="../gis/CGisProject.cpp" line="86"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="72"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="81"/>
         <source>Failed to read...</source>
         <translation>Nepodařilo se přečíst...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="77"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="72"/>
         <source>Failed to read: %1
 line %2, column %3:
  %4</source>
@@ -2608,48 +2714,48 @@ line %2, column %3:
 %4</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="86"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="81"/>
         <source>Not a GPX file: </source>
         <translation>Není souborem GPX: </translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="367"/>
+        <location filename="../gis/IGisProject.cpp" line="94"/>
         <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/CGisProject.cpp" line="368"/>
+        <location filename="../gis/IGisProject.cpp" line="95"/>
         <source>Delete...</source>
         <translation>Smazat...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="485"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="331"/>
         <source>Save GIS data to...</source>
         <translation>Uložit data GIS do...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="537"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="383"/>
         <source>File exists ...</source>
         <translation>Soubor existuje...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="538"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="384"/>
         <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/CGisProject.cpp" line="604"/>
-        <location filename="../gis/CGisProject.cpp" line="614"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="450"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="460"/>
         <source>Saveing GIS data failed...</source>
         <translation>Nepodařilo se uložit data GIS...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="604"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="450"/>
         <source>Failed to create file '%1'</source>
         <translation>Nepodařilo se vytvořit soubor '%1'</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="614"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="460"/>
         <source>Failed to write file '%1'</source>
         <translation>Nepodařilo se zapsat soubor '%1'</translation>
     </message>
@@ -2664,48 +2770,48 @@ line %2, column %3:
         <translation>Režim pouze pro čtení...</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="325"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="338"/>
         <source>Length: %1 %2</source>
         <translation>Délka: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="332"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="345"/>
         <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="340"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
         <source>Time: %1</source>
         <translation>Čas: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="343"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="356"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="366"/>
         <source>, Speed: %1 %2</source>
         <translation>, Rychlost: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="350"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="363"/>
         <source>Moving: %1</source>
         <translation>Pohyb: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="359"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="372"/>
         <source>Start: %1</source>
         <translation>Začátek: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="364"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="377"/>
         <source>End: %1</source>
         <translation>Konec: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="368"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="381"/>
         <source>Points: %1 (%2)</source>
         <translation>Body: %1 (%2)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="434"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="447"/>
         <source>Ele.: %1 %2</source>
         <translation>Výška: %1 %2</translation>
     </message>
@@ -2714,118 +2820,118 @@ line %2, column %3:
         <translation type="obsolete"> sklon: %1°(%2%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="442"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="455"/>
         <source> speed: %1%2</source>
         <translation> rychlost: %1%2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="454"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="467"/>
         <source>Ascend: %1%2 (%3%)</source>
         <translation>Stoupání: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="458"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="471"/>
         <source>Ascend: - (-)</source>
         <translation>Stoupání: - (-)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="468"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="481"/>
         <source> Descend: - (-) </source>
         <translation> Klesání: - (-) </translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="489"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="502"/>
         <source> Moving: - (-) </source>
         <translation> Pohyb: - (-) </translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="464"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="477"/>
         <source> Descend: %1%2 (%3%)</source>
         <translation> Klesání: %1%2 (%3%) </translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="248"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="261"/>
         <source>Changed trackpoints, sacrificed all previous data.</source>
-        <translation type="unfinished"></translation>
+        <translation>Změněny body stop. Obětována veškerá předchozí data.</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="437"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="450"/>
         <source> slope: %1° (%2%)</source>
-        <translation type="unfinished"></translation>
+        <translation> sklon: %1° (%2%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="475"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="488"/>
         <source>Dist.: %1%2 (%3%)</source>
         <translation>Vzdálenost: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="479"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="492"/>
         <source>Dist.: - (-)</source>
         <translation>Vzdálenost: - (-)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="485"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="498"/>
         <source> Moving: %1%2 (%3%)</source>
         <translation> Pohyb: %1%2 (%3%) </translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="94"/>
         <source>thin</source>
-        <translation type="unfinished"></translation>
+        <translation>Tenký</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="95"/>
         <source>normal</source>
-        <translation type="unfinished"></translation>
+        <translation>Obvyklý</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="96"/>
         <source>wide</source>
-        <translation type="unfinished"></translation>
+        <translation>Široký</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="97"/>
         <source>strong</source>
-        <translation type="unfinished"></translation>
+        <translation>Silný</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="485"/>
         <source>Changed area shape.</source>
-        <translation type="unfinished"></translation>
+        <translation>Změněn tvar oblasti.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="492"/>
         <source>Changed name.</source>
-        <translation type="unfinished"></translation>
+        <translation>Změněn název.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="498"/>
         <source>Changed border width.</source>
-        <translation type="unfinished"></translation>
+        <translation>Změněna šířka okraje.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="504"/>
         <source>Changed fill pattern.</source>
-        <translation type="unfinished"></translation>
+        <translation>Změněn vzor výplně.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="510"/>
         <source>Changed opacity.</source>
-        <translation type="unfinished"></translation>
+        <translation>Změněna neprůhlednost.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="516"/>
         <source>Changed comment.</source>
-        <translation type="unfinished"></translation>
+        <translation>Změněna poznámka.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="522"/>
         <source>Changed description.</source>
-        <translation type="unfinished"></translation>
+        <translation>Změněn popis.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="534"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1371"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1401"/>
         <source>Changed color</source>
         <translation>Změněná barva</translation>
     </message>
@@ -2840,20 +2946,21 @@ line %2, column %3:
         <translation>Blízkost: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1360"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1378"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="313"/>
         <source>Changed name</source>
         <translation>Změněný název</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="900"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="908"/>
+        <location filename="../gis/CGisListWks.cpp" line="555"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="918"/>
         <location filename="../gis/trk/CGisItemTrk.cpp" line="926"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="973"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1097"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="944"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="991"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1115"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="194"/>
-        <location filename="../mouse/CMouseEditArea.cpp" line="86"/>
-        <location filename="../mouse/CMouseEditTrk.cpp" line="91"/>
+        <location filename="../mouse/CMouseEditArea.cpp" line="100"/>
+        <location filename="../mouse/CMouseEditTrk.cpp" line="106"/>
         <source>Edit name...</source>
         <translation>Upravit název...</translation>
     </message>
@@ -2883,11 +2990,13 @@ line %2, column %3:
         <translation>Změněná ikona</translation>
     </message>
     <message>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1384"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="346"/>
         <source>Changed comment</source>
         <translation>Změněná poznámka</translation>
     </message>
     <message>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1390"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="352"/>
         <source>Changed description</source>
         <translation>Změněný popis</translation>
@@ -2924,15 +3033,16 @@ 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/trk/CGisItemTrk.cpp" line="900"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="908"/>
+        <location filename="../gis/CGisListWks.cpp" line="555"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="918"/>
         <location filename="../gis/trk/CGisItemTrk.cpp" line="926"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="973"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1097"/>
-        <location filename="../mouse/CMouseEditArea.cpp" line="86"/>
-        <location filename="../mouse/CMouseEditTrk.cpp" line="91"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="944"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="991"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1115"/>
+        <location filename="../mouse/CMouseEditArea.cpp" line="100"/>
+        <location filename="../mouse/CMouseEditTrk.cpp" line="106"/>
         <source>Enter new track name.</source>
-        <translation type="unfinished"></translation>
+        <translation>Zadat název nové stopy.</translation>
     </message>
 </context>
 </TS>
diff --git a/src/locale/qmapshack_de.ts b/src/locale/qmapshack_de.ts
index 1b06954..0f620c9 100644
--- a/src/locale/qmapshack_de.ts
+++ b/src/locale/qmapshack_de.ts
@@ -116,15 +116,35 @@
 <context>
     <name>CDetailsTrk</name>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="145"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="154"/>
         <location filename="../gis/trk/CDetailsTrk.cpp" line="157"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="163"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="182"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="184"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="166"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="169"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="175"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="194"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="196"/>
         <source>%1 %2</source>
         <translation></translation>
     </message>
+    <message>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="219"/>
+        <source><h4>Comment:</h4></source>
+        <translation><h4>Kommentar:</h4></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="222"/>
+        <source><p>--- no comment ---</p></source>
+        <translation><p>--- kein Kommentar ---</p></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="229"/>
+        <source><h4>Description:</h4></source>
+        <translation><h4>Beschreibung:</h4></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="232"/>
+        <source><p>--- no description ---</p></source>
+        <translation><p>--- keine Beschreibung ---</p></translation>
+    </message>
 </context>
 <context>
     <name>CDetailsWpt</name>
@@ -180,27 +200,27 @@
 <context>
     <name>CGisListWks</name>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="37"/>
+        <location filename="../gis/CGisListWks.cpp" line="40"/>
         <source>Save</source>
         <translation>Speichern</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="36"/>
+        <location filename="../gis/CGisListWks.cpp" line="39"/>
         <source>Save As...</source>
         <translation>Speichern als...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="38"/>
+        <location filename="../gis/CGisListWks.cpp" line="41"/>
         <source>Close</source>
         <translation>Schließen</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="44"/>
+        <location filename="../gis/CGisListWks.cpp" line="47"/>
         <source>Edit...</source>
         <translation>Ändern...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="45"/>
+        <location filename="../gis/CGisListWks.cpp" line="48"/>
         <source>Move Waypoint</source>
         <translation>Wegpunkt verschieben</translation>
     </message>
@@ -209,35 +229,45 @@
         <translation type="obsolete">Wegpunkt verschieben...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="46"/>
+        <location filename="../gis/CGisListWks.cpp" line="49"/>
         <source>Proj. Waypoint...</source>
         <translation>Wegpunkt Projektion...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="47"/>
+        <location filename="../gis/CGisListWks.cpp" line="50"/>
         <source>Track Profile</source>
         <translation>Trackprofil</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="48"/>
+        <location filename="../gis/CGisListWks.cpp" line="51"/>
+        <source>Select Range</source>
+        <translation>Teilstrecke auswählen</translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="52"/>
         <source>Edit Track Points</source>
         <translation>Wegpunkte bearbeiten</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="49"/>
+        <location filename="../gis/CGisListWks.cpp" line="53"/>
         <source>Reverse Track</source>
         <translation>Track umkehren</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="50"/>
+        <location filename="../gis/CGisListWks.cpp" line="54"/>
         <source>Combine Tracks</source>
         <translation>Tracks verbinden</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="53"/>
+        <location filename="../gis/CGisListWks.cpp" line="57"/>
         <source>Delete</source>
         <translation>Löschen</translation>
     </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="555"/>
+        <source>New Project</source>
+        <translation>Neues Projekt</translation>
+    </message>
 </context>
 <context>
     <name>CGrid</name>
@@ -993,6 +1023,43 @@
     </message>
 </context>
 <context>
+    <name>CMapTMS</name>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="69"/>
+        <location filename="../map/CMapTMS.cpp" line="79"/>
+        <source>Error...</source>
+        <translation>Fehler...</translation>
+    </message>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="69"/>
+        <source>Failed to open %1</source>
+        <translation>Öffnen fehlgeschlagen: %1</translation>
+    </message>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="79"/>
+        <source>Failed to read: %1
+line %2, column %3:
+ %4</source>
+        <translation>Lesen fehlgeschlagen: %1
+Zeile %2, Spalte %3:
+%4</translation>
+    </message>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="117"/>
+        <source>Layer %1</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>--- All ---</source>
+        <translation type="obsolete">--- Alle ---</translation>
+    </message>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="288"/>
+        <source><b>%1</b>: %2 tiles pending<br/></source>
+        <translation><b>%1</b>: %2 unerledigte Kacheln<br/></translation>
+    </message>
+</context>
+<context>
     <name>CMapVRT</name>
     <message>
         <location filename="../map/CMapVRT.cpp" line="46"/>
@@ -1022,21 +1089,21 @@
 <context>
     <name>CMapWMTS</name>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="44"/>
-        <location filename="../map/CMapWMTS.cpp" line="54"/>
-        <location filename="../map/CMapWMTS.cpp" line="64"/>
-        <location filename="../map/CMapWMTS.cpp" line="73"/>
-        <location filename="../map/CMapWMTS.cpp" line="188"/>
+        <location filename="../map/CMapWMTS.cpp" line="45"/>
+        <location filename="../map/CMapWMTS.cpp" line="55"/>
+        <location filename="../map/CMapWMTS.cpp" line="65"/>
+        <location filename="../map/CMapWMTS.cpp" line="74"/>
+        <location filename="../map/CMapWMTS.cpp" line="198"/>
         <source>Error...</source>
         <translation>Fehler...</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="44"/>
+        <location filename="../map/CMapWMTS.cpp" line="45"/>
         <source>Failed to open %1</source>
         <translation>Öffnen fehlgeschlagen: %1</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="54"/>
+        <location filename="../map/CMapWMTS.cpp" line="55"/>
         <source>Failed to read: %1
 line %2, column %3:
  %4</source>
@@ -1045,26 +1112,25 @@ Zeile %2, Spalte %3:
 %4</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="64"/>
+        <location filename="../map/CMapWMTS.cpp" line="65"/>
         <source>Failed to read: %1
 Unknown structure.</source>
         <translation>Lesen fehlgeschlagen: %1
 Unbekannte Struktur.</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="73"/>
+        <location filename="../map/CMapWMTS.cpp" line="74"/>
         <source>Unexpexted service. '* WMTS 1.0.0' is expected. '%1 %2' is read.</source>
         <translation>Unerwarteter Dienst. '* WMTS 1.0.0' wird erwartet. '%1 %2' wurde gelesen.</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="243"/>
         <source>--- All ---</source>
-        <translation>--- Alle ---</translation>
+        <translation type="obsolete">--- Alle ---</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="323"/>
+        <location filename="../map/CMapWMTS.cpp" line="385"/>
         <source><b>%1</b>: %2 tiles pending<br/></source>
-        <translation><b>%1</b>: %2 unerledigte Kacheln<br/></translation>
+        <translation><b>%1</b>: %2 unerledigte Kacheln</translation>
     </message>
     <message>
         <source>%1: %2 tiles pending</source>
@@ -1075,7 +1141,7 @@ Unbekannte Struktur.</translation>
         <translation type="obsolete">Unerwarterter Dienst. 'OGC WMTS 1.0.0' Wird erwartet. '%1 %2' wird gelesen.</translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="188"/>
+        <location filename="../map/CMapWMTS.cpp" line="198"/>
         <source>No georeference information found.</source>
         <translation>Keine Georeferenzierung gefunden.</translation>
     </message>
@@ -1085,7 +1151,7 @@ Unbekannte Struktur.</translation>
     <message>
         <location filename="../mouse/CMouseEditArea.cpp" line="38"/>
         <source><b>Edit Area</b><br/>Select a corner point for more options.<br/></source>
-        <translation><b>Gebiet bearbeiten</b><br/>Wählen Sie einen der Eckpunkt für eine Auswahl an Funktionen.<br/></translation>
+        <translation><b>Fläche bearbeiten</b><br/>Wähle einen Eckpunkt für mehr Optionen.<br/></translation>
     </message>
 </context>
 <context>
@@ -1112,7 +1178,7 @@ Unbekannte Struktur.</translation>
     <message>
         <location filename="../mouse/CMouseEditTrk.cpp" line="46"/>
         <source><b>Edit Track Points</b><br/>Select a track point for more options.<br/></source>
-        <translation><b>Trackpunkte bearbeiten</b><br/>Wählen Sie einen Trackpunkt für eine Auswahl an Funktionen.<br/></translation>
+        <translation><b>Trackpunkte bearbeiten</b><br/>Wähle einen Trackpunkt für mehr Optionen.<br/></translation>
     </message>
 </context>
 <context>
@@ -1143,7 +1209,7 @@ Unbekannte Struktur.</translation>
     <message>
         <location filename="../mouse/CMouseRangeTrk.cpp" line="48"/>
         <source><b>Select Range</b><br/>Select first track point. And then a second one.<br/></source>
-        <translation><b>Ausschnitt wählen</b><br/>Wählen Sie den ersten Punkt aus. Und dann den zweiten.<br/></translation>
+        <translation><b>Bereich wählen</b><br/>Wähle einen ersten Punkt. Dann einen zweiten.<br/></translation>
     </message>
 </context>
 <context>
@@ -1243,6 +1309,19 @@ ist keine gültige Koordinatensystemdefinition:
     </message>
 </context>
 <context>
+    <name>CSearchGoogle</name>
+    <message>
+        <location filename="../gis/search/CSearchGoogle.cpp" line="120"/>
+        <source>Unknown response</source>
+        <translation>Unbekannte Antwort</translation>
+    </message>
+    <message>
+        <location filename="../gis/search/CSearchGoogle.cpp" line="130"/>
+        <source>Error: </source>
+        <translation>Fehler:</translation>
+    </message>
+</context>
+<context>
     <name>CTextEditWidget</name>
     <message>
         <location filename="../helpers/CTextEditWidget.cpp" line="73"/>
@@ -1526,87 +1605,92 @@ ist keine gültige Koordinatensystemdefinition:
         <translation></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="28"/>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="49"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="46"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="67"/>
         <source>-
 -</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="117"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="217"/>
         <source>Profile</source>
         <translation>Profil</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="124"/>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="221"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="224"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="350"/>
         <source>Speed</source>
         <translation>Geschw.</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="131"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="231"/>
         <source>Progress</source>
         <translatorcomment>?</translatorcomment>
         <translation>Verlauf</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="148"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="174"/>
         <source>...</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="201"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="282"/>
+        <source>Points</source>
+        <translation>Punkte</translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="330"/>
         <source>Time</source>
         <translation>Zeit</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="206"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="335"/>
         <source>Ele.</source>
         <translation>Höhe</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="211"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="340"/>
         <source>Delta</source>
         <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="216"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="345"/>
         <source>Dist.</source>
         <translation>Entf.</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="226"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="355"/>
         <source>Slope</source>
         <translation>Neigung</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="231"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="360"/>
         <source>Ascend</source>
         <translation>Anstieg</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="236"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="365"/>
         <source>Descend</source>
         <translation>Abstieg</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="241"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="370"/>
         <source>Position</source>
         <translation>Position</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="261"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="136"/>
         <source>Info</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="291"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="253"/>
         <source>-</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="302"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="379"/>
         <source>Hist.</source>
         <translation>Hist.</translation>
     </message>
@@ -1627,13 +1711,13 @@ ist keine gültige Koordinatensystemdefinition:
         <translation type="obsolete"><html><head/><body><p>Kommentar bearbeiten.</p></body></html></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/IDetailsWpt.ui" line="233"/>
-        <location filename="../gis/wpt/IDetailsWpt.ui" line="259"/>
+        <location filename="../gis/wpt/IDetailsWpt.ui" line="227"/>
+        <location filename="../gis/wpt/IDetailsWpt.ui" line="253"/>
         <source>...</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/IDetailsWpt.ui" line="214"/>
+        <location filename="../gis/wpt/IDetailsWpt.ui" line="208"/>
         <source><html><head/><body><p>The waypoint was imported to QMapShack and was changed. It does not show the original data anymore. Please see history for changes. </p></body></html></source>
         <translation><html><head/><body><p>Der Wegpunkt wurde in QMapShack importiert und geändert. Die ursprünglichen Daten weren nicht mehr angezeigt. Näheres siehe Änderungshistorie.</p></body></html></translation>
     </message>
@@ -1666,7 +1750,7 @@ ist keine gültige Koordinatensystemdefinition:
         <translation>Abstand:</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/IDetailsWpt.ui" line="230"/>
+        <location filename="../gis/wpt/IDetailsWpt.ui" line="224"/>
         <source><html><head/><body><p>Read Only Mode</p></body></html></source>
         <translation><html><head/><body><p>Schreibschutz</p></body></html></translation>
     </message>
@@ -1776,141 +1860,161 @@ ist keine gültige Koordinatensystemdefinition:
         <translation>?</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="109"/>
+        <location filename="../IMainWindow.ui" line="100"/>
+        <source>Project</source>
+        <translation>Projekt</translation>
+    </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="118"/>
         <source>Maps</source>
         <translation>Karten</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="146"/>
+        <location filename="../IMainWindow.ui" line="155"/>
         <source>Dig. Elev. Model (DEM)</source>
         <translation>Höhenmodell (DEM)</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="179"/>
+        <location filename="../IMainWindow.ui" line="188"/>
         <source>Data</source>
         <translation>Daten</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="192"/>
+        <location filename="../IMainWindow.ui" line="201"/>
         <source>Add Map Workspace</source>
         <translation>Ansicht hinzufügen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="195"/>
+        <location filename="../IMainWindow.ui" line="204"/>
         <source>Ctrl+T</source>
         <translation>Crtl+T</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="207"/>
+        <location filename="../IMainWindow.ui" line="216"/>
         <source>Show Scale</source>
         <translation>Maßstab</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="216"/>
+        <location filename="../IMainWindow.ui" line="225"/>
         <source>Setup Map Font</source>
         <translation>Kartenfont einstellen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="228"/>
+        <location filename="../IMainWindow.ui" line="237"/>
         <source>Show Grid</source>
         <translation>Gitter</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="231"/>
+        <location filename="../IMainWindow.ui" line="240"/>
         <source>Ctrl+G</source>
         <translation>Crtl+G</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="240"/>
+        <location filename="../IMainWindow.ui" line="249"/>
         <source>Setup Grid</source>
         <translation>Gitter einstellen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="243"/>
+        <location filename="../IMainWindow.ui" line="252"/>
         <source>Ctrl+Alt+G</source>
         <translation>Ctrl+Alt+G</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="255"/>
+        <location filename="../IMainWindow.ui" line="264"/>
         <source>Flip Mouse Wheel</source>
         <translation>Mausrad umdrehen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="264"/>
-        <location filename="../IMainWindow.ui" line="267"/>
+        <location filename="../IMainWindow.ui" line="273"/>
+        <location filename="../IMainWindow.ui" line="276"/>
         <source>Setup Map Paths</source>
         <translation>Kartenverzeichnisse angeben</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="279"/>
+        <location filename="../IMainWindow.ui" line="288"/>
         <source>POI Text</source>
         <translation>POI Text</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="291"/>
+        <location filename="../IMainWindow.ui" line="300"/>
         <source>Night / Day</source>
         <translation>Nacht / Tag</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="303"/>
+        <location filename="../IMainWindow.ui" line="312"/>
         <source>Map Tool Tip</source>
         <translation>Kartentooltip</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="312"/>
+        <location filename="../IMainWindow.ui" line="321"/>
         <source>Setup DEM Paths</source>
         <translation>DEM Verzeichnisse angeben</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="321"/>
+        <location filename="../IMainWindow.ui" line="330"/>
         <source>About</source>
         <translation>Über</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="330"/>
+        <location filename="../IMainWindow.ui" line="339"/>
         <source>Help</source>
         <translation>Hilfe</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="339"/>
+        <location filename="../IMainWindow.ui" line="348"/>
         <source>Setup Map Workspace</source>
         <translation>Kartenansicht einstellen</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="348"/>
+        <location filename="../IMainWindow.ui" line="357"/>
         <source>Load GIS Data</source>
         <translation>GIS Daten laden</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="351"/>
+        <location filename="../IMainWindow.ui" line="360"/>
         <source>Load projects from file</source>
         <translation>Lade Datei als Projekt</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="354"/>
+        <location filename="../IMainWindow.ui" line="363"/>
         <source>Ctrl+L</source>
         <translation>Ctrl+L</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="363"/>
+        <location filename="../IMainWindow.ui" line="372"/>
         <source>Save All GIS Data</source>
         <translation>Alle GIS Daten speichern</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="366"/>
+        <location filename="../IMainWindow.ui" line="375"/>
         <source>Save all projects in the workspace</source>
         <translation>Alle Projekte im Arbeitsplatz speichern</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="369"/>
+        <location filename="../IMainWindow.ui" line="378"/>
         <source>Ctrl+S</source>
         <translation>Ctrl+S</translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="378"/>
+        <location filename="../IMainWindow.ui" line="387"/>
         <source>Setup Time Zone</source>
         <translation>Zeitzone einstellen</translation>
     </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="396"/>
+        <source>Add empty project</source>
+        <translation>Ein leeres Projekt hinzufügen</translation>
+    </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="408"/>
+        <source>Search Google</source>
+        <translation>Mit Google suchen</translation>
+    </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="417"/>
+        <source>Close all projects</source>
+        <translation>Alle Projekte schließen</translation>
+    </message>
 </context>
 <context>
     <name>IMapList</name>
@@ -2026,22 +2130,22 @@ ist keine gültige Koordinatensystemdefinition:
 <context>
     <name>IMouseEditLine</name>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="309"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="339"/>
         <source>Add points?</source>
         <translation>Punkte hinzufügen?</translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="309"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="339"/>
         <source>Add points to temporary line?</source>
         <translation>Punkte zur temporären Linie hinzufügen?</translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="758"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="875"/>
         <source>Warning!</source>
         <translation>Warnung!</translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="758"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="875"/>
         <source>This will replace all data of the orignal by a simple line of coordinates. All other data will be lost permanently.</source>
         <translation>Alle ursprünglichen Daten werden durch eine einfache Koordinatenlinie ersetzt. Alle anderen Daten sind dauerhaft verloren.</translation>
     </message>
@@ -2283,7 +2387,21 @@ sein</translation>
     <message>
         <location filename="../mouse/IScrOptRangeTrk.ui" line="40"/>
         <source>Hide all points.</source>
-        <translation>Alle Punkte verstecken.</translation>
+        <translation>Alle Punkte ausblenden.</translation>
+    </message>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="54"/>
+        <source>Show all points.</source>
+        <translation>Alle Punkte anzeigen.</translation>
+    </message>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="68"/>
+        <source>Copy track points as new track.</source>
+        <translation>Trackpunkte in neuen Track kopieren.</translation>
+    </message>
+    <message>
+        <source>Hide points.</source>
+        <translation type="obsolete">Pukte ausblenden.</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptRangeTrk.ui" line="43"/>
@@ -2293,14 +2411,12 @@ sein</translation>
         <translation></translation>
     </message>
     <message>
-        <location filename="../mouse/IScrOptRangeTrk.ui" line="54"/>
-        <source>Show all points.</source>
-        <translation>Alle Punkte zeigen.</translation>
+        <source>Show points.</source>
+        <translation type="obsolete">Punkte anzeigen.</translation>
     </message>
     <message>
-        <location filename="../mouse/IScrOptRangeTrk.ui" line="68"/>
-        <source>Copy track points as new track.</source>
-        <translation>Die Trackpunkte als neuen Track kopieren.</translation>
+        <source>Copy track points to clipboard</source>
+        <translation type="obsolete">Trackpunkte in die Zwischenablage kopieren</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptRangeTrk.ui" line="103"/>
@@ -2483,8 +2599,8 @@ sein</translation>
     <name>ITextEditWidget</name>
     <message>
         <location filename="../helpers/ITextEditWidget.ui" line="14"/>
-        <source>Form</source>
-        <translation></translation>
+        <source>Edit text...</source>
+        <translation>Text eingeben...</translation>
     </message>
     <message>
         <location filename="../helpers/ITextEditWidget.ui" line="25"/>
@@ -2658,23 +2774,23 @@ sein</translation>
 <context>
     <name>QObject</name>
     <message>
-        <location filename="../GeoMath.cpp" line="88"/>
+        <location filename="../GeoMath.cpp" line="89"/>
         <source>Error</source>
         <translation>Fehler</translation>
     </message>
     <message>
-        <location filename="../GeoMath.cpp" line="88"/>
+        <location filename="../GeoMath.cpp" line="89"/>
         <source>Bad position format. Must be: [N|S] ddd mm.sss [W|E] ddd mm.sss</source>
         <translation>Falsches Positionsformat. Richtig: [N|S] ddd mm.sss [W|E] ddd mm.sss </translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="77"/>
-        <location filename="../gis/CGisProject.cpp" line="86"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="72"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="81"/>
         <source>Failed to read...</source>
         <translation>Lesen fehlgeschlagen...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="77"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="72"/>
         <source>Failed to read: %1
 line %2, column %3:
  %4</source>
@@ -2683,104 +2799,104 @@ Zeile %2, Spalte %3:
 %4</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="86"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="81"/>
         <source>Not a GPX file: </source>
         <translation>Keien GPX Datei:</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="367"/>
+        <location filename="../gis/IGisProject.cpp" line="94"/>
         <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/CGisProject.cpp" line="368"/>
+        <location filename="../gis/IGisProject.cpp" line="95"/>
         <source>Delete...</source>
         <translation>Löschen...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="485"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="331"/>
         <source>Save GIS data to...</source>
         <translation>GIS Daten speichern in...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="537"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="383"/>
         <source>File exists ...</source>
         <translation>Datei existiert...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="538"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="384"/>
         <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/CGisProject.cpp" line="604"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="450"/>
         <source>Failed to create file '%1'</source>
         <translation>Datei %1' konnte nicht erstellt werden</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="604"/>
-        <location filename="../gis/CGisProject.cpp" line="614"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="450"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="460"/>
         <source>Saveing GIS data failed...</source>
         <translation>Speichern der GIS DAten fehlgeschlagen...</translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="614"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="460"/>
         <source>Failed to write file '%1'</source>
         <translation>Datei %1' konnte nicht gespeichert werden</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="248"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="261"/>
         <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="325"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="338"/>
         <source>Length: %1 %2</source>
         <translation>Länge: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="332"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="345"/>
         <source>, %1%2 %3, %4%5 %6</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="340"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
         <source>Time: %1</source>
         <translation>Zeit: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="343"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="356"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="366"/>
         <source>, Speed: %1 %2</source>
         <translation>, Geschw.: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="350"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="363"/>
         <source>Moving: %1</source>
         <translation>Bewegung: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="359"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="372"/>
         <source>Start: %1</source>
         <translation>Beginn: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="364"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="377"/>
         <source>End: %1</source>
         <translation>Ende: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="368"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="381"/>
         <source>Points: %1 (%2)</source>
         <translation>Punkte: %1 (%2)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="434"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="447"/>
         <source>Ele.: %1 %2</source>
         <translation>Höhe: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="437"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="450"/>
         <source> slope: %1° (%2%)</source>
         <translation> Neigung: %1° (%2%)</translation>
     </message>
@@ -2789,47 +2905,47 @@ Zeile %2, Spalte %3:
         <translation type="obsolete">Neigung: %1°(%2%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="442"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="455"/>
         <source> speed: %1%2</source>
         <translation>Geschwindigkeit: %1%2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="454"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="467"/>
         <source>Ascend: %1%2 (%3%)</source>
         <translation>Anstieg: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="458"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="471"/>
         <source>Ascend: - (-)</source>
         <translation>Anstieg: - (-)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="464"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="477"/>
         <source> Descend: %1%2 (%3%)</source>
         <translation> Abstieg: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="468"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="481"/>
         <source> Descend: - (-) </source>
         <translation> Abstieg: - (-) </translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="475"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="488"/>
         <source>Dist.: %1%2 (%3%)</source>
         <translation>Entf.: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="479"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="492"/>
         <source>Dist.: - (-)</source>
         <translation>Entf.: - (-)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="485"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="498"/>
         <source> Moving: %1%2 (%3%)</source>
         <translation>Bewegung: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="489"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="502"/>
         <source> Moving: - (-) </source>
         <translation> Bewegung: - (-) </translation>
     </message>
@@ -2890,19 +3006,20 @@ Zeile %2, Spalte %3:
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="534"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1371"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1401"/>
         <source>Changed color</source>
         <translation>Farbe geändert</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="900"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="908"/>
+        <location filename="../gis/CGisListWks.cpp" line="555"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="918"/>
         <location filename="../gis/trk/CGisItemTrk.cpp" line="926"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="973"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1097"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="944"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="991"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1115"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="194"/>
-        <location filename="../mouse/CMouseEditArea.cpp" line="86"/>
-        <location filename="../mouse/CMouseEditTrk.cpp" line="91"/>
+        <location filename="../mouse/CMouseEditArea.cpp" line="100"/>
+        <location filename="../mouse/CMouseEditTrk.cpp" line="106"/>
         <source>Edit name...</source>
         <translation>Name ändern...</translation>
     </message>
@@ -2922,7 +3039,7 @@ Zeile %2, Spalte %3:
         <translation>Abstand: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1360"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1378"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="313"/>
         <source>Changed name</source>
         <translation>Name geändert</translation>
@@ -2948,11 +3065,13 @@ Zeile %2, Spalte %3:
         <translation>Symbol geändert</translation>
     </message>
     <message>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1384"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="346"/>
         <source>Changed comment</source>
         <translation>Kommentar geändert</translation>
     </message>
     <message>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1390"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="352"/>
         <source>Changed description</source>
         <translation>Beschreibung geändert</translation>
@@ -2999,13 +3118,14 @@ Zeile %2, Spalte %3:
         <translation>Schreibgeschützt...</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="900"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="908"/>
+        <location filename="../gis/CGisListWks.cpp" line="555"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="918"/>
         <location filename="../gis/trk/CGisItemTrk.cpp" line="926"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="973"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1097"/>
-        <location filename="../mouse/CMouseEditArea.cpp" line="86"/>
-        <location filename="../mouse/CMouseEditTrk.cpp" line="91"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="944"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="991"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1115"/>
+        <location filename="../mouse/CMouseEditArea.cpp" line="100"/>
+        <location filename="../mouse/CMouseEditTrk.cpp" line="106"/>
         <source>Enter new track name.</source>
         <translation>Name eingeben.</translation>
     </message>
diff --git a/src/locale/qmapshack_es.ts b/src/locale/qmapshack_es.ts
index 9465088..9439855 100644
--- a/src/locale/qmapshack_es.ts
+++ b/src/locale/qmapshack_es.ts
@@ -112,15 +112,35 @@
 <context>
     <name>CDetailsTrk</name>
     <message>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="145"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="154"/>
         <location filename="../gis/trk/CDetailsTrk.cpp" line="157"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="163"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="182"/>
-        <location filename="../gis/trk/CDetailsTrk.cpp" line="184"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="166"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="169"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="175"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="194"/>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="196"/>
         <source>%1 %2</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="219"/>
+        <source><h4>Comment:</h4></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="222"/>
+        <source><p>--- no comment ---</p></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="229"/>
+        <source><h4>Description:</h4></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/CDetailsTrk.cpp" line="232"/>
+        <source><p>--- no description ---</p></source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>CDetailsWpt</name>
@@ -168,60 +188,70 @@
 <context>
     <name>CGisListWks</name>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="37"/>
+        <location filename="../gis/CGisListWks.cpp" line="40"/>
         <source>Save</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="36"/>
+        <location filename="../gis/CGisListWks.cpp" line="39"/>
         <source>Save As...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="38"/>
+        <location filename="../gis/CGisListWks.cpp" line="41"/>
         <source>Close</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="44"/>
+        <location filename="../gis/CGisListWks.cpp" line="47"/>
         <source>Edit...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="45"/>
+        <location filename="../gis/CGisListWks.cpp" line="48"/>
         <source>Move Waypoint</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="46"/>
+        <location filename="../gis/CGisListWks.cpp" line="49"/>
         <source>Proj. Waypoint...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="47"/>
+        <location filename="../gis/CGisListWks.cpp" line="50"/>
         <source>Track Profile</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="48"/>
+        <location filename="../gis/CGisListWks.cpp" line="51"/>
+        <source>Select Range</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="52"/>
         <source>Edit Track Points</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="49"/>
+        <location filename="../gis/CGisListWks.cpp" line="53"/>
         <source>Reverse Track</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="50"/>
+        <location filename="../gis/CGisListWks.cpp" line="54"/>
         <source>Combine Tracks</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="53"/>
+        <location filename="../gis/CGisListWks.cpp" line="57"/>
         <source>Delete</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="555"/>
+        <source>New Project</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>CGrid</name>
@@ -976,6 +1006,37 @@
     </message>
 </context>
 <context>
+    <name>CMapTMS</name>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="69"/>
+        <location filename="../map/CMapTMS.cpp" line="79"/>
+        <source>Error...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="69"/>
+        <source>Failed to open %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="79"/>
+        <source>Failed to read: %1
+line %2, column %3:
+ %4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="117"/>
+        <source>Layer %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../map/CMapTMS.cpp" line="288"/>
+        <source><b>%1</b>: %2 tiles pending<br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>CMapVRT</name>
     <message>
         <location filename="../map/CMapVRT.cpp" line="46"/>
@@ -1005,49 +1066,44 @@
 <context>
     <name>CMapWMTS</name>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="44"/>
-        <location filename="../map/CMapWMTS.cpp" line="54"/>
-        <location filename="../map/CMapWMTS.cpp" line="64"/>
-        <location filename="../map/CMapWMTS.cpp" line="73"/>
-        <location filename="../map/CMapWMTS.cpp" line="188"/>
+        <location filename="../map/CMapWMTS.cpp" line="45"/>
+        <location filename="../map/CMapWMTS.cpp" line="55"/>
+        <location filename="../map/CMapWMTS.cpp" line="65"/>
+        <location filename="../map/CMapWMTS.cpp" line="74"/>
+        <location filename="../map/CMapWMTS.cpp" line="198"/>
         <source>Error...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="44"/>
+        <location filename="../map/CMapWMTS.cpp" line="45"/>
         <source>Failed to open %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="54"/>
+        <location filename="../map/CMapWMTS.cpp" line="55"/>
         <source>Failed to read: %1
 line %2, column %3:
  %4</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="64"/>
+        <location filename="../map/CMapWMTS.cpp" line="65"/>
         <source>Failed to read: %1
 Unknown structure.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="73"/>
+        <location filename="../map/CMapWMTS.cpp" line="74"/>
         <source>Unexpexted service. '* WMTS 1.0.0' is expected. '%1 %2' is read.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="188"/>
+        <location filename="../map/CMapWMTS.cpp" line="198"/>
         <source>No georeference information found.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../map/CMapWMTS.cpp" line="243"/>
-        <source>--- All ---</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../map/CMapWMTS.cpp" line="323"/>
+        <location filename="../map/CMapWMTS.cpp" line="385"/>
         <source><b>%1</b>: %2 tiles pending<br/></source>
         <translation type="unfinished"></translation>
     </message>
@@ -1193,6 +1249,19 @@ is not a valid coordinate system definition:
     </message>
 </context>
 <context>
+    <name>CSearchGoogle</name>
+    <message>
+        <location filename="../gis/search/CSearchGoogle.cpp" line="120"/>
+        <source>Unknown response</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/search/CSearchGoogle.cpp" line="130"/>
+        <source>Error: </source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>CTextEditWidget</name>
     <message>
         <location filename="../helpers/CTextEditWidget.cpp" line="73"/>
@@ -1476,85 +1545,90 @@ is not a valid coordinate system definition:
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="28"/>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="49"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="46"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="67"/>
         <source>-
 -</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="117"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="217"/>
         <source>Profile</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="124"/>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="221"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="224"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="350"/>
         <source>Speed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="131"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="231"/>
         <source>Progress</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="148"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="174"/>
         <source>...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="201"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="282"/>
+        <source>Points</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="330"/>
         <source>Time</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="206"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="335"/>
         <source>Ele.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="211"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="340"/>
         <source>Delta</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="216"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="345"/>
         <source>Dist.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="226"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="355"/>
         <source>Slope</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="231"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="360"/>
         <source>Ascend</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="236"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="365"/>
         <source>Descend</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="241"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="370"/>
         <source>Position</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="261"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="136"/>
         <source>Info</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="291"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="253"/>
         <source>-</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IDetailsTrk.ui" line="302"/>
+        <location filename="../gis/trk/IDetailsTrk.ui" line="379"/>
         <source>Hist.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1567,8 +1641,8 @@ is not a valid coordinate system definition:
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/IDetailsWpt.ui" line="233"/>
-        <location filename="../gis/wpt/IDetailsWpt.ui" line="259"/>
+        <location filename="../gis/wpt/IDetailsWpt.ui" line="227"/>
+        <location filename="../gis/wpt/IDetailsWpt.ui" line="253"/>
         <source>...</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1597,12 +1671,12 @@ is not a valid coordinate system definition:
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/IDetailsWpt.ui" line="214"/>
+        <location filename="../gis/wpt/IDetailsWpt.ui" line="208"/>
         <source><html><head/><body><p>The waypoint was imported to QMapShack and was changed. It does not show the original data anymore. Please see history for changes. </p></body></html></source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/IDetailsWpt.ui" line="230"/>
+        <location filename="../gis/wpt/IDetailsWpt.ui" line="224"/>
         <source><html><head/><body><p>Read Only Mode</p></body></html></source>
         <translation type="unfinished"></translation>
     </message>
@@ -1712,141 +1786,161 @@ is not a valid coordinate system definition:
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="109"/>
+        <location filename="../IMainWindow.ui" line="100"/>
+        <source>Project</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="118"/>
         <source>Maps</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="146"/>
+        <location filename="../IMainWindow.ui" line="155"/>
         <source>Dig. Elev. Model (DEM)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="179"/>
+        <location filename="../IMainWindow.ui" line="188"/>
         <source>Data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="192"/>
+        <location filename="../IMainWindow.ui" line="201"/>
         <source>Add Map Workspace</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="195"/>
+        <location filename="../IMainWindow.ui" line="204"/>
         <source>Ctrl+T</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="207"/>
+        <location filename="../IMainWindow.ui" line="216"/>
         <source>Show Scale</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="216"/>
+        <location filename="../IMainWindow.ui" line="225"/>
         <source>Setup Map Font</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="228"/>
+        <location filename="../IMainWindow.ui" line="237"/>
         <source>Show Grid</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="231"/>
+        <location filename="../IMainWindow.ui" line="240"/>
         <source>Ctrl+G</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="240"/>
+        <location filename="../IMainWindow.ui" line="249"/>
         <source>Setup Grid</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="243"/>
+        <location filename="../IMainWindow.ui" line="252"/>
         <source>Ctrl+Alt+G</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="255"/>
+        <location filename="../IMainWindow.ui" line="264"/>
         <source>Flip Mouse Wheel</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="264"/>
-        <location filename="../IMainWindow.ui" line="267"/>
+        <location filename="../IMainWindow.ui" line="273"/>
+        <location filename="../IMainWindow.ui" line="276"/>
         <source>Setup Map Paths</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="279"/>
+        <location filename="../IMainWindow.ui" line="288"/>
         <source>POI Text</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="291"/>
+        <location filename="../IMainWindow.ui" line="300"/>
         <source>Night / Day</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="303"/>
+        <location filename="../IMainWindow.ui" line="312"/>
         <source>Map Tool Tip</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="312"/>
+        <location filename="../IMainWindow.ui" line="321"/>
         <source>Setup DEM Paths</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="321"/>
+        <location filename="../IMainWindow.ui" line="330"/>
         <source>About</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="330"/>
+        <location filename="../IMainWindow.ui" line="339"/>
         <source>Help</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="339"/>
+        <location filename="../IMainWindow.ui" line="348"/>
         <source>Setup Map Workspace</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="348"/>
+        <location filename="../IMainWindow.ui" line="357"/>
         <source>Load GIS Data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="351"/>
+        <location filename="../IMainWindow.ui" line="360"/>
         <source>Load projects from file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="354"/>
+        <location filename="../IMainWindow.ui" line="363"/>
         <source>Ctrl+L</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="363"/>
+        <location filename="../IMainWindow.ui" line="372"/>
         <source>Save All GIS Data</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="366"/>
+        <location filename="../IMainWindow.ui" line="375"/>
         <source>Save all projects in the workspace</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="369"/>
+        <location filename="../IMainWindow.ui" line="378"/>
         <source>Ctrl+S</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../IMainWindow.ui" line="378"/>
+        <location filename="../IMainWindow.ui" line="387"/>
         <source>Setup Time Zone</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="396"/>
+        <source>Add empty project</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="408"/>
+        <source>Search Google</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../IMainWindow.ui" line="417"/>
+        <source>Close all projects</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>IMapList</name>
@@ -1958,22 +2052,22 @@ is not a valid coordinate system definition:
 <context>
     <name>IMouseEditLine</name>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="309"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="339"/>
         <source>Add points?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="309"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="339"/>
         <source>Add points to temporary line?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="758"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="875"/>
         <source>Warning!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="758"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="875"/>
         <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="unfinished"></translation>
     </message>
@@ -2383,7 +2477,7 @@ or
     <name>ITextEditWidget</name>
     <message>
         <location filename="../helpers/ITextEditWidget.ui" line="14"/>
-        <source>Form</source>
+        <source>Edit text...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -2558,172 +2652,172 @@ or
 <context>
     <name>QObject</name>
     <message>
-        <location filename="../GeoMath.cpp" line="88"/>
+        <location filename="../GeoMath.cpp" line="89"/>
         <source>Error</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../GeoMath.cpp" line="88"/>
+        <location filename="../GeoMath.cpp" line="89"/>
         <source>Bad position format. Must be: [N|S] ddd mm.sss [W|E] ddd mm.sss</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="77"/>
-        <location filename="../gis/CGisProject.cpp" line="86"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="72"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="81"/>
         <source>Failed to read...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="77"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="72"/>
         <source>Failed to read: %1
 line %2, column %3:
  %4</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="86"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="81"/>
         <source>Not a GPX file: </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="367"/>
+        <location filename="../gis/IGisProject.cpp" line="94"/>
         <source>Are you sure you want to delete '%1' from project '%2'?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="368"/>
+        <location filename="../gis/IGisProject.cpp" line="95"/>
         <source>Delete...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="485"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="331"/>
         <source>Save GIS data to...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="537"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="383"/>
         <source>File exists ...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="538"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="384"/>
         <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/CGisProject.cpp" line="604"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="450"/>
         <source>Failed to create file '%1'</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="604"/>
-        <location filename="../gis/CGisProject.cpp" line="614"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="450"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="460"/>
         <source>Saveing GIS data failed...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisProject.cpp" line="614"/>
+        <location filename="../gis/gpx/CGpxProject.cpp" line="460"/>
         <source>Failed to write file '%1'</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="325"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="338"/>
         <source>Length: %1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="332"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="345"/>
         <source>, %1%2 %3, %4%5 %6</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="340"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
         <source>Time: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="343"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="356"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="366"/>
         <source>, Speed: %1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="350"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="363"/>
         <source>Moving: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="359"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="372"/>
         <source>Start: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="364"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="377"/>
         <source>End: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="368"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="381"/>
         <source>Points: %1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="434"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="447"/>
         <source>Ele.: %1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="442"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="455"/>
         <source> speed: %1%2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="454"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="467"/>
         <source>Ascend: %1%2 (%3%)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="458"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="471"/>
         <source>Ascend: - (-)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="468"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="481"/>
         <source> Descend: - (-) </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="489"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="502"/>
         <source> Moving: - (-) </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="464"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="477"/>
         <source> Descend: %1%2 (%3%)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="248"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="261"/>
         <source>Changed trackpoints, sacrificed all previous data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="437"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="450"/>
         <source> slope: %1° (%2%)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="475"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="488"/>
         <source>Dist.: %1%2 (%3%)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="479"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="492"/>
         <source>Dist.: - (-)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="485"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="498"/>
         <source> Moving: %1%2 (%3%)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2784,7 +2878,7 @@ line %2, column %3:
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="534"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1371"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1401"/>
         <source>Changed color</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2799,20 +2893,21 @@ line %2, column %3:
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1360"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1378"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="313"/>
         <source>Changed name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="900"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="908"/>
+        <location filename="../gis/CGisListWks.cpp" line="555"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="918"/>
         <location filename="../gis/trk/CGisItemTrk.cpp" line="926"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="973"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1097"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="944"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="991"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1115"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="194"/>
-        <location filename="../mouse/CMouseEditArea.cpp" line="86"/>
-        <location filename="../mouse/CMouseEditTrk.cpp" line="91"/>
+        <location filename="../mouse/CMouseEditArea.cpp" line="100"/>
+        <location filename="../mouse/CMouseEditTrk.cpp" line="106"/>
         <source>Edit name...</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2842,11 +2937,13 @@ line %2, column %3:
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1384"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="346"/>
         <source>Changed comment</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1390"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="352"/>
         <source>Changed description</source>
         <translation type="unfinished"></translation>
@@ -2893,13 +2990,14 @@ line %2, column %3:
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="900"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="908"/>
+        <location filename="../gis/CGisListWks.cpp" line="555"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="918"/>
         <location filename="../gis/trk/CGisItemTrk.cpp" line="926"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="973"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1097"/>
-        <location filename="../mouse/CMouseEditArea.cpp" line="86"/>
-        <location filename="../mouse/CMouseEditTrk.cpp" line="91"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="944"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="991"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1115"/>
+        <location filename="../mouse/CMouseEditArea.cpp" line="100"/>
+        <location filename="../mouse/CMouseEditTrk.cpp" line="106"/>
         <source>Enter new track name.</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/src/map/CMapDraw.cpp b/src/map/CMapDraw.cpp
index f7013fc..fba3ab9 100644
--- a/src/map/CMapDraw.cpp
+++ b/src/map/CMapDraw.cpp
@@ -31,7 +31,7 @@
 
 QList<CMapDraw*> CMapDraw::maps;
 QStringList CMapDraw::mapPaths;
-QStringList CMapDraw::supportedFormats = QString("*.vrt|*.jnx|*.img|*.rmap|*.wmts|*.map").split('|');
+QStringList CMapDraw::supportedFormats = QString("*.vrt|*.jnx|*.img|*.rmap|*.wmts|*.tms").split('|');
 
 
 CMapDraw::CMapDraw(CCanvas *parent)
@@ -149,7 +149,39 @@ void CMapDraw::getToolTip(const QPoint& px, QString& str)
         }
     }
     CMapItem::mutexActiveMaps.unlock();
+}
+
+bool CMapDraw::findPolylineCloseBy(QPointF& pt1, QPointF& pt2, qint32 threshold, QPolygonF& polyline)
+{
+    if(isRunning())
+    {
+        return false;
+    }
+    bool res = false;
+    CMapItem::mutexActiveMaps.lock();
+    if(mapList)
+    {
+        for(int i = 0; i < mapList->count(); i++)
+        {
+            CMapItem * item = mapList->item(i);
+
+            if(!item || item->mapfile.isNull())
+            {
+                // as all active maps have to be at the top of the list
+                // it is ok to break ass soon as the first map with no
+                // active files is hit.
+                break;
+            }
 
+            res = item->mapfile->findPolylineCloseBy(pt1, pt2, threshold, polyline);
+            if(res)
+            {
+                break;
+            }
+        }
+    }
+    CMapItem::mutexActiveMaps.unlock();
+    return res;
 }
 
 void CMapDraw::saveConfig(QSettings& cfg)
@@ -277,24 +309,6 @@ void CMapDraw::restoreActiveMapsList(const QStringList& keys)
 void CMapDraw::reportStatusToCanvas(const QString& key, const QString& msg)
 {
     canvas->reportStatus(key, msg);
-//    if(msg.isEmpty())
-//    {
-//        statusMessages.remove(key);
-//    }
-//    else
-//    {
-//        statusMessages[key] = msg;
-//    }
-
-//    QString report;
-//    QStringList keys = statusMessages.keys();
-//    keys.sort();
-//    foreach(const QString& key, keys)
-//    {
-//        report += statusMessages[key] + "\n";
-//    }
-
-//    canvas->setStatusMessage(report);
 }
 
 void CMapDraw::drawt(IDrawContext::buffer_t& currentBuffer)
diff --git a/src/map/CMapDraw.h b/src/map/CMapDraw.h
index d5e4729..1eff3f8 100644
--- a/src/map/CMapDraw.h
+++ b/src/map/CMapDraw.h
@@ -92,6 +92,20 @@ class CMapDraw : public IDrawContext
          */
         void reportStatusToCanvas(const QString& key, const QString& msg);
 
+        /**
+           @brief Find a matching street polyline
+
+           The polyline must be close enough in terms of pixel to point 1 and 2. "Close enough" is defined by
+           the threshold. The returned poylline uses lon/lat as coordinates.
+
+           @param pt1           first point in [rad]
+           @param pt2           second point in [rad]
+           @param threshold     the "close enough" threshold in [pixel]
+           @param polyline      the resulting polyline, if any, in [rad]
+           @return              Return true if a line has been found.
+        */
+        bool findPolylineCloseBy(QPointF& pt1, QPointF& pt2, qint32 threshold, QPolygonF& polyline);
+
     protected:
         void drawt(buffer_t& currentBuffer);
 
diff --git a/src/map/CMapIMG.cpp b/src/map/CMapIMG.cpp
index 4b28e2f..c4b30aa 100644
--- a/src/map/CMapIMG.cpp
+++ b/src/map/CMapIMG.cpp
@@ -1457,7 +1457,7 @@ void CMapIMG::loadSubDiv(CFileExt &file, const subdiv_desc_t& subdiv, IGarminStr
             pData += p.decode(subdiv.iCenterLng, subdiv.iCenterLat, subdiv.shift, true, pData, pEnd);
 
             // skip points outside our current viewport
-            if(isCompletlyOutside(p.poly, viewport))
+            if(isCompletlyOutside(p.pixel, viewport))
             {
                 continue;
             }
@@ -1487,7 +1487,7 @@ void CMapIMG::loadSubDiv(CFileExt &file, const subdiv_desc_t& subdiv, IGarminStr
             pData += p.decode(subdiv.iCenterLng, subdiv.iCenterLat, subdiv.shift, false, pData, pEnd);
 
             // skip points outside our current viewport
-            if(isCompletlyOutside(p.poly, viewport))
+            if(isCompletlyOutside(p.pixel, viewport))
             {
                 continue;
             }
@@ -1526,7 +1526,7 @@ void CMapIMG::loadSubDiv(CFileExt &file, const subdiv_desc_t& subdiv, IGarminStr
             pData += p.decode2(subdiv.iCenterLng, subdiv.iCenterLat, subdiv.shift, false, pData, pEnd);
 
             // skip points outside our current viewport
-            if(isCompletlyOutside(p.poly, viewport))
+            if(isCompletlyOutside(p.pixel, viewport))
             {
                 continue;
             }
@@ -1551,7 +1551,7 @@ void CMapIMG::loadSubDiv(CFileExt &file, const subdiv_desc_t& subdiv, IGarminStr
             pData += p.decode2(subdiv.iCenterLng, subdiv.iCenterLat, subdiv.shift, true, pData, pEnd);
 
             // skip points outside our current viewport
-            if(isCompletlyOutside(p.poly, viewport))
+            if(isCompletlyOutside(p.pixel, viewport))
             {
                 continue;
             }
@@ -1614,7 +1614,7 @@ void CMapIMG::drawPolygons(QPainter& p, polytype_t& lines)
                 continue;
             }
 
-            QPolygonF& poly = item->poly;
+            QPolygonF& poly = item->pixel;
 
             map->convertRad2Px(poly);
 
@@ -1678,7 +1678,7 @@ void CMapIMG::drawPolylines(QPainter& p, polytype_t& lines, const QPointF& scale
 
                     pixmapCount++;
 
-                    QPolygonF& poly = item.poly;
+                    QPolygonF& poly = item.pixel;
                     int size        = poly.size();
 
                     if(size < 2)
@@ -1820,7 +1820,7 @@ void CMapIMG::drawPolylines(QPainter& p, polytype_t& lines, const QPointF& scale
 
 void CMapIMG::drawLine(QPainter& p, CGarminPolygon& l, const CGarminTyp::polyline_property& property, const QFontMetricsF& metrics, const QFont& font, const QPointF& scale)
 {
-    QPolygonF& poly     = l.poly;
+    QPolygonF& poly     = l.pixel;
     const int size      = poly.size();
     const int lineWidth = p.pen().width();
 
@@ -1843,8 +1843,8 @@ void CMapIMG::drawLine(QPainter& p, CGarminPolygon& l, const CGarminTyp::polylin
 
 void CMapIMG::drawLine(QPainter& p, const CGarminPolygon& l)
 {
-    const QPolygonF& poly     = l.poly;
-    const int size      = poly.size();
+    const QPolygonF& poly   = l.pixel;
+    const int size          = poly.size();
 
     if(size < 2)
     {
@@ -2472,7 +2472,7 @@ void CMapIMG::getInfoPolylines(const QPoint &pt, QMultiMap<QString, QString>& di
     polytype_t::const_iterator line = polylines.begin();
     while(line != polylines.end())
     {
-        len = line->poly.size();
+        len = line->pixel.size();
         // need at least 2 points
         if(len < 2)
         {
@@ -2483,10 +2483,10 @@ void CMapIMG::getInfoPolylines(const QPoint &pt, QMultiMap<QString, QString>& di
         // see http://local.wasp.uwa.edu.au/~pbourke/geometry/pointline/
         for(i=1; i<len; ++i)
         {
-            p1.u = line->poly[i-1].x();
-            p1.v = line->poly[i-1].y();
-            p2.u = line->poly[i].x();
-            p2.v = line->poly[i].y();
+            p1.u = line->pixel[i-1].x();
+            p1.v = line->pixel[i-1].y();
+            p2.u = line->pixel[i].x();
+            p2.v = line->pixel[i].y();
 
             dx = p2.u - p1.u;
             dy = p2.v - p1.v;
@@ -2590,17 +2590,17 @@ void CMapIMG::getInfoPolygons(const QPoint& pt, QMultiMap<QString, QString>& dic
     while(line != polygons.end())
     {
 
-        npol = line->poly.size();
+        npol = line->pixel.size();
         if(npol > 2)
         {
             c = 0;
             // see http://local.wasp.uwa.edu.au/~pbourke/geometry/insidepoly/
             for (i = 0, j = npol-1; i < npol; j = i++)
             {
-                p1.u = line->poly[j].x();
-                p1.v = line->poly[j].y();
-                p2.u = line->poly[i].x();
-                p2.v = line->poly[i].y();
+                p1.u = line->pixel[j].x();
+                p1.v = line->pixel[j].y();
+                p2.u = line->pixel[i].x();
+                p2.v = line->pixel[i].y();
 
                 if ((((p2.v <= y) && (y < p1.v))  || ((p1.v <= y) && (y < p2.v))) &&
                     (x < (p1.u - p2.u) * (y - p2.v) / (p1.v - p2.v) + p2.u))
@@ -2640,3 +2640,77 @@ void CMapIMG::getInfoPolygons(const QPoint& pt, QMultiMap<QString, QString>& dic
     }
 }
 
+
+static qreal getDistance(const QPolygonF& line, const QPointF& pt, qreal threshold)
+{
+    int i = 0;                   // index into poly line
+    int len;                     // number of points in line
+    QPointF p1, p2;               // the two points of the polyline close to pt
+    qreal dx,dy;                // delta x and y defined by p1 and p2
+    qreal d_p1_p2;              // distance between p1 and p2
+    qreal u;                    // ratio u the tangent point will divide d_p1_p2
+    qreal x,y;                  // coord. (x,y) of the point on line defined by [p1,p2] close to pt
+    qreal distance;             // the distance to the polyline
+
+    qreal d = threshold + 1;
+
+    len = line.size();
+    // see http://local.wasp.uwa.edu.au/~pbourke/geometry/pointline/
+    for(i=1; i<len; ++i)
+    {
+        p1 = line[i-1];
+        p2 = line[i];
+
+        dx = p2.x() - p1.x();
+        dy = p2.y() - p1.y();
+
+        d_p1_p2 = sqrt(dx * dx + dy * dy);
+
+        u = ((pt.x() - p1.x()) * dx + (pt.y() - p1.y()) * dy) / (d_p1_p2 * d_p1_p2);
+
+        if(u < 0.0 || u > 1.0)
+        {
+            continue;
+        }
+
+        x = p1.x() + u * dx;
+        y = p1.y() + u * dy;
+
+        distance = sqrt((x - pt.x())*(x - pt.x()) + (y - pt.y())*(y - pt.y()));
+
+        if(distance < threshold)
+        {
+            d = threshold = distance;
+        }
+    }
+
+    return d;
+}
+
+
+
+bool CMapIMG::findPolylineCloseBy(QPointF& pt1, QPointF& pt2, qint32 threshold, QPolygonF& polyline)
+{
+    foreach(const CGarminPolygon& line, polylines)
+    {
+        if(line.pixel.size() < 2)
+        {
+            continue;
+        }
+        if(0x20 <= line.type && line.type <= 0x25)
+        {
+            continue;
+        }
+
+        qreal dist1 = ::getDistance(line.pixel, pt1, threshold);
+        qreal dist2 = ::getDistance(line.pixel, pt2, threshold);
+
+        if(dist1 < threshold && dist2 < threshold)
+        {
+            polyline  = line.coords;
+            threshold = qMin(dist1, dist2);
+        }
+    }
+
+    return !polyline.isEmpty();
+}
diff --git a/src/map/CMapIMG.h b/src/map/CMapIMG.h
index 3695992..6bf41ce 100644
--- a/src/map/CMapIMG.h
+++ b/src/map/CMapIMG.h
@@ -148,6 +148,21 @@ class CMapIMG : public IMap
         void getInfo(const QPoint& px, QString& str);
         void getToolTip(const QPoint& px, QString& infotext);
 
+        /**
+           @brief Find a matching street polyline
+
+           The polyline must be close enough in terms of pixel to point 1 and 2. "Close enough" is defined by
+           the threshold. The returned poylline uses lon/lat as coordinates.
+
+           @param pt1           first point in [rad]
+           @param pt2           second point in [rad]
+           @param threshold     the "close enough" threshold in [pixel]
+           @param polyline      the resulting polyline, if any, in [rad]
+           @return              Return true if a line has been found.
+        */
+        bool findPolylineCloseBy(QPointF& pt1, QPointF& pt2, qint32 threshold, QPolygonF& polyline);
+
+
     private:
         enum exce_e {eErrOpen, eErrAccess, errFormat, errLock, errAbort};
         struct exce_t
diff --git a/src/map/CMapItem.cpp b/src/map/CMapItem.cpp
index dc6dba7..d691421 100644
--- a/src/map/CMapItem.cpp
+++ b/src/map/CMapItem.cpp
@@ -24,6 +24,7 @@
 #include "map/CMapVRT.h"
 #include "map/CMapMAP.h"
 #include "map/CMapWMTS.h"
+#include "map/CMapTMS.h"
 #include "map/IMapProp.h"
 #include <QtGui>
 
@@ -120,6 +121,10 @@ void CMapItem::updateIcon()
     {
         img = QPixmap("://icons/32x32/MimeWMTS.png");
     }
+    else if(fi.suffix().toLower() == "tms")
+    {
+        img = QPixmap("://icons/32x32/MimeTMS.png");
+    }
 
     setIcon(0,QIcon(img));
 }
@@ -195,6 +200,10 @@ bool CMapItem::activate()
     {
         mapfile = new CMapWMTS(filename, map);
     }
+    else if(fi.suffix().toLower() == "tms")
+    {
+        mapfile = new CMapTMS(filename, map);
+    }
 
     updateIcon();
     // no mapfiles loaded? Bad.
@@ -210,6 +219,9 @@ bool CMapItem::activate()
         delete mapfile;
         return false;
     }
+
+    setToolTip(0, mapfile->getCopyright());
+
     // append list of active map files
     moveToBottom();
 
diff --git a/src/map/CMapJNX.cpp b/src/map/CMapJNX.cpp
index 218cec8..53007db 100644
--- a/src/map/CMapJNX.cpp
+++ b/src/map/CMapJNX.cpp
@@ -180,7 +180,7 @@ void CMapJNX::readFile(const QString& fn, qint32& productId)
             stream >> dummy;
             readCString(stream, ba);
             level.copyright1 = codec->toUnicode(ba);
-
+            copyright += level.copyright1 + "\n";
         }
         qDebug() << i << hex << level.nTiles << level.offset << level.scale;
     }
@@ -217,6 +217,7 @@ void CMapJNX::readFile(const QString& fn, qint32& productId)
             level.name2 = codec->toUnicode(ba);
             readCString(stream, ba);
             level.copyright2 = codec->toUnicode(ba);
+            copyright += level.copyright2 + "\n";
         }
     }
 
diff --git a/src/map/CMapTMS.cpp b/src/map/CMapTMS.cpp
new file mode 100644
index 0000000..d1b59a2
--- /dev/null
+++ b/src/map/CMapTMS.cpp
@@ -0,0 +1,501 @@
+/**********************************************************************************************
+    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 "map/CMapTMS.h"
+#include "map/CMapDraw.h"
+#include "map/cache/CDiskCache.h"
+#include "units/IUnit.h"
+
+#include <QtWidgets>
+#include <QtNetwork>
+#include <QtXml>
+#include <QtScript>
+#include <ogr_spatialref.h>
+#include <proj_api.h>
+
+inline int lon2tile(double lon, int z)
+{
+    return (int)(qRound(256*(lon + 180.0) / 360.0 * pow(2.0, z)));
+}
+
+inline int lat2tile(double lat, int z)
+{
+    return (int)(qRound(256*(1.0 - log( tan(lat * M_PI/180.0) + 1.0 / cos(lat * M_PI/180.0)) / M_PI) / 2.0 * pow(2.0, z)));
+}
+
+inline double tile2lon(int x, int z)
+{
+    return x / pow(2.0, z) * 360.0 - 180;
+}
+
+inline double tile2lat(int y, int z)
+{
+    double n = M_PI - 2.0 * M_PI * y / pow(2.0, z);
+    return 180.0 / M_PI * atan(0.5 * (exp(n) - exp(-n)));
+}
+
+CMapTMS::CMapTMS(const QString &filename, CMapDraw *parent)
+    : IMap(eFeatVisibility|eFeatTileCache, parent)
+    , minZoomLevel(1)
+    , maxZoomLevel(18)
+    , diskCache(0)
+    , lastRequest(false)
+{
+    qDebug() << "------------------------------";
+    qDebug() << "TMS: try to open" << filename;
+
+    pjsrc = pj_init_plus("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs");
+    qDebug() << "tms:" << "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs";
+
+
+    QFile file(filename);
+    if(!file.open(QIODevice::ReadOnly))
+    {
+        QMessageBox::critical(0, tr("Error..."), tr("Failed to open %1").arg(filename), QMessageBox::Abort, QMessageBox::Abort);
+        return;
+    }
+
+    QString msg;
+    int line, column;
+    QDomDocument dom;
+    if(!dom.setContent(&file, true, &msg, &line, &column))
+    {
+        file.close();
+        QMessageBox::critical(0, tr("Error..."), tr("Failed to read: %1\nline %2, column %3:\n %4").arg(filename).arg(line).arg(column).arg(msg), QMessageBox::Abort, QMessageBox::Abort);
+        return;
+    }
+    file.close();
+
+    const QDomElement& xmlTms =  dom.firstChildElement("TMS");
+    name        = xmlTms.firstChildElement("Title").text();
+    copyright   = xmlTms.firstChildElement("Copyright").text();
+
+    if(xmlTms.firstChildElement("MaxZoomLevel").isElement())
+    {
+        maxZoomLevel = xmlTms.firstChildElement("MaxZoomLevel").text().toInt();
+    }
+
+    if(xmlTms.firstChildElement("MinZoomLevel").isElement())
+    {
+        minZoomLevel = xmlTms.firstChildElement("MinZoomLevel").text().toInt();
+    }
+
+    const QDomNodeList& xmlLayers = xmlTms.elementsByTagName("Layer");
+    qint32 N = xmlLayers.count();
+    layers.resize(N);
+
+    for(qint32 n = 0; n < N; ++n)
+    {
+        const QDomNode& xmlLayer = xmlLayers.item(n);
+        int idx = xmlLayer.attributes().namedItem("idx").nodeValue().toInt();
+        layers[idx].strUrl          = xmlLayer.namedItem("ServerUrl").toElement().text();
+        layers[idx].script          = xmlLayer.namedItem("Script").toElement().text();
+        layers[idx].minZoomLevel    = minZoomLevel;
+        layers[idx].maxZoomLevel    = maxZoomLevel;
+
+        if(xmlLayer.namedItem("Title").isElement())
+        {
+            layers[idx].title       = xmlLayer.namedItem("Title").toElement().text();
+        }
+        else
+        {
+            layers[idx].title       = tr("Layer %1").arg(idx + 1);
+        }
+
+        if(xmlLayer.firstChildElement("MinZoomLevel").isElement())
+        {
+            layers[idx].minZoomLevel = xmlLayer.firstChildElement("MinZoomLevel").text().toInt();
+        }
+
+        if(xmlLayer.firstChildElement("MaxZoomLevel").isElement())
+        {
+            layers[idx].maxZoomLevel = xmlLayer.firstChildElement("MaxZoomLevel").text().toInt();
+        }
+    }
+
+    const QDomElement& xmlRawHeader = xmlTms.firstChildElement("RawHeader");
+    const QDomNodeList& xmlValues   = xmlRawHeader.elementsByTagName("Value");
+    N = xmlValues.count();
+    for(qint32 n = 0; n < N; ++n)
+    {
+        rawHeaderItem_t item;
+        const QDomNode& xmlValue = xmlValues.item(n);
+        item.name  = xmlValue.attributes().namedItem("name").nodeValue();
+        item.value = xmlValue.toElement().text();
+        rawHeaderItems << item;
+    }
+
+    // if there is more than one layer the layer list in the properties widget has to be enabled.
+    if(layers.size() > 1)
+    {
+        flagsFeature |= eFeatLayers;
+    }
+
+
+    // create default cache path from filename
+    QFileInfo fi(filename);
+    slotSetCachePath(QDir::home().absoluteFilePath(".QMapShack/" + fi.baseName()));
+
+    accessManager   = new QNetworkAccessManager(parent->thread());
+    connect(this, SIGNAL(sigQueueChanged()), this, SLOT(slotQueueChanged()));
+    connect(accessManager,SIGNAL(finished(QNetworkReply*)),this,SLOT(slotRequestFinished(QNetworkReply*)));
+
+    name = fi.baseName().replace("_", " ");
+
+    isActivated = true;
+}
+
+CMapTMS::~CMapTMS()
+{
+//    map->reportStatusToCanvas(name, "");
+}
+
+void CMapTMS::getLayers(QListWidget& list)
+{
+    list.clear();
+    if(layers.size() < 2)
+    {
+        return;
+    }
+
+    int i = 0;
+    foreach(const layer_t& layer, layers)
+    {
+        QListWidgetItem * item = new QListWidgetItem(layer.title, &list);
+        item->setCheckState(layer.enabled ? Qt::Checked : Qt::Unchecked);
+        item->setData(Qt::UserRole, i++);
+    }
+
+    connect(&list, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(slotLayersChanged(QListWidgetItem*)));
+}
+
+
+void CMapTMS::saveConfig(QSettings& cfg)
+{
+    IMap::saveConfig(cfg);
+    if(layers.size() < 2)
+    {
+        return;
+    }
+
+    // save indices of enbaled layers
+    QStringList enabled;
+    for(int i = 0; i< layers.size(); i++)
+    {
+        if(layers[i].enabled)
+        {
+            enabled << QString::number(i);
+        }
+    }
+    cfg.setValue("enabledLayers", enabled);
+}
+
+void CMapTMS::loadConfig(QSettings& cfg)
+{
+    IMap::loadConfig(cfg);
+    if(layers.size() < 2)
+    {
+        return;
+    }
+
+    QStringList enabled;
+    // set all layers to disabled first
+    for(int i = 0; i< layers.size(); i++)
+    {
+        layers[i].enabled = false;
+        enabled << QString::number(i);
+    }
+
+    // enable layers stored in configuration
+    enabled = cfg.value("enabledLayers", enabled).toStringList();
+    foreach(const QString& str, enabled)
+    {
+        int idx = str.toInt();
+        if(idx < layers.size())
+        {
+            layers[idx].enabled = true;
+        }
+    }
+}
+
+
+
+void CMapTMS::configureCache()
+{
+    delete diskCache;
+    diskCache = new CDiskCache(getCachePath(), getCacheSize(), getCacheExpiration(), this);
+}
+
+void CMapTMS::slotQueueChanged()
+{
+    QMutexLocker lock(&mutex);
+
+    if(!urlQueue.isEmpty() && urlPending.size() < 6)
+    {
+        // request up to 6 pending request
+        for(int i = 0; i < (6 - urlPending.size()); i++)
+        {
+            QString url = urlQueue.dequeue();
+            lastRequest = urlQueue.isEmpty();
+
+            QNetworkRequest request;
+            request.setUrl(url);
+            foreach(const rawHeaderItem_t& item, rawHeaderItems)
+            {
+                request.setRawHeader(item.name.toLatin1(), item.value.toLatin1());
+            }
+            accessManager->get(request);
+            urlPending << url;
+
+            if(lastRequest)
+            {
+                break;
+            }
+        }
+    }
+    else if(lastRequest && urlPending.isEmpty())
+    {
+        lastRequest = false;
+        // if all tiles are received the map layer can be redrawn with all tiles from cache
+        map->emitSigCanvasUpdate();
+    }
+
+    if(timeLastUpdate.elapsed() > 2000)
+    {
+        timeLastUpdate.start();
+        map->emitSigCanvasUpdate();
+    }
+
+    // report status of pending tiles
+    int pending = urlQueue.size() + urlPending.size();
+    if(pending)
+    {
+        map->reportStatusToCanvas(name, tr("<b>%1</b>: %2 tiles pending<br/>").arg(name).arg(pending));
+    }
+    else
+    {
+        map->reportStatusToCanvas(name, "");
+    }
+}
+
+void CMapTMS::slotRequestFinished(QNetworkReply* reply)
+{
+    QString url = reply->url().toString();
+    if(urlPending.contains(url))
+    {
+        QImage img;
+        // only take good responses
+        if(!reply->error())
+        {
+            // read image data
+            img.loadFromData(reply->readAll());
+
+        }
+        // always store image to cache, the cache will take care of NULL images
+        diskCache->store(url, img);
+
+        urlPending.removeAll(url);
+    }
+
+    // debug output any error
+    if(reply->error())
+    {
+        qDebug() << reply->errorString();
+    }
+
+    // delete reply object
+    reply->deleteLater();
+
+    // check for more items to be queued
+    slotQueueChanged();
+}
+
+void CMapTMS::slotLayersChanged(QListWidgetItem * item)
+{
+    bool isChecked = (item->checkState() == Qt::Checked);
+    int idx = item->data(Qt::UserRole).toInt();
+    if(idx < 0)
+    {
+        QListWidget * list = item->listWidget();
+        list->blockSignals(true);
+
+        for(int i = 0; i < layers.size(); i++)
+        {
+            list->item(i + 1)->setCheckState(isChecked ? Qt::Checked : Qt::Unchecked);
+            layers[i].enabled = isChecked;
+        }
+
+        list->blockSignals(false);
+    }
+    else
+    {
+        layers[idx].enabled = isChecked;
+    }
+
+    map->emitSigCanvasUpdate();
+}
+
+
+QString CMapTMS::createUrl(const layer_t& layer, int x, int y, int z)
+{
+    if(layer.strUrl.startsWith("script"))
+    {
+
+        QString filename = layer.strUrl.mid(9);
+        QFile scriptFile(filename);
+        if (!scriptFile.open(QIODevice::ReadOnly))
+        {
+            return "";
+        }
+        QTextStream stream(&scriptFile);
+        QString contents = stream.readAll();
+        scriptFile.close();
+
+        QScriptEngine engine;
+        QScriptValue fun = engine.evaluate(contents, filename);
+
+        if(engine.hasUncaughtException())
+        {
+            int line = engine.uncaughtExceptionLineNumber();
+            qDebug() << "uncaught exception at line" << line << ":" << fun.toString();
+        }
+
+        QScriptValueList args;
+        args << z << x << y;
+        QScriptValue res = fun.call(QScriptValue(), args);
+        return res.toString();
+    }
+    else if(!layer.script.isEmpty())
+    {
+        QScriptEngine engine;
+        QScriptValue fun = engine.evaluate(layer.script);
+        QScriptValueList args;
+        args << z << x << y;
+        QScriptValue res = fun.call(QScriptValue(), args);
+        return res.toString();
+    }
+
+    return layer.strUrl.arg(z).arg(x).arg(y);
+}
+
+
+void CMapTMS::draw(IDrawContext::buffer_t& buf)
+{
+    QMutexLocker lock(&mutex);
+
+    timeLastUpdate.start();
+    urlQueue.clear();
+
+    if(map->needsRedraw())
+    {
+        return;
+    }
+
+    // get pixel offset of top left buffer corner
+    QPointF pp = buf.ref1;
+    map->convertRad2Px(pp);
+
+    // start to draw the map
+    QPainter p(&buf.image);
+    USE_ANTI_ALIASING(p,true);
+    p.setOpacity(getOpacity()/100.0);
+    p.translate(-pp);
+
+    // calculate maximum viewport
+    qreal x1 = buf.ref1.x() < buf.ref4.x() ? buf.ref1.x() : buf.ref4.x();
+    qreal y1 = buf.ref1.y() > buf.ref2.y() ? buf.ref1.y() : buf.ref2.y();
+
+    qreal x2 = buf.ref2.x() > buf.ref3.x() ? buf.ref2.x() : buf.ref3.x();
+    qreal y2 = buf.ref3.y() < buf.ref4.y() ? buf.ref3.y() : buf.ref4.y();
+
+    if(x1 < -180.0*DEG_TO_RAD) x1 = -180*DEG_TO_RAD;
+    if(x2 >  180.0*DEG_TO_RAD) x2 =  180*DEG_TO_RAD;
+
+    // draw layers
+    foreach(const layer_t& layer, layers)
+    {
+        if(!layer.enabled)
+        {
+            continue;
+        }
+
+        qint32 z    = 17;
+        QPointF s1  = buf.scale * buf.zoomFactor;
+        qreal d     = NOFLOAT;
+
+        for(qint32 i = layer.minZoomLevel; i < 18; i++)
+        {
+            qreal s2 = 0.6 * (1<<i);
+            if(qAbs(s2 - s1.x()) < d)
+            {
+                z = i;
+                d = qAbs(s2 - s1.x());
+            }
+        }
+
+        if(z > layer.maxZoomLevel)
+        {
+            continue;
+        }
+
+        z = 18 - z;
+
+
+        qint32 row1, row2, col1, col2;
+
+        col1 = lon2tile(x1 * RAD_TO_DEG, z) / 256;
+        col2 = lon2tile(x2 * RAD_TO_DEG, z) / 256;
+        row1 = lat2tile(y1 * RAD_TO_DEG, z) / 256;
+        row2 = lat2tile(y2 * RAD_TO_DEG, z) / 256;
+
+//        qDebug() << col1 << col2 << row1 << row2 << (col2 - col1) << (row2 - row1) << ((col2 - col1) * (row2 - row1));
+
+        // start to request tiles. draw tiles in cache, queue urls of tile yet to be requested
+        for(qint32 row = row1; row <= row2; row++)
+        {
+            for(qint32 col = col1; col <= col2; col++)
+            {
+                QString url = createUrl(layer, col, row, z);
+//                qDebug() << url;
+
+                if(diskCache->contains(url))
+                {
+                    QImage img;
+                    diskCache->restore(url, img);
+
+                    QPolygonF l;
+
+                    qreal xx1 = tile2lon(col, z) * DEG_TO_RAD;
+                    qreal yy1 = tile2lat(row, z) * DEG_TO_RAD;
+                    qreal xx2 = tile2lon(col + 1, z) * DEG_TO_RAD;
+                    qreal yy2 = tile2lat(row + 1, z) * DEG_TO_RAD;
+
+                    l << QPointF(xx1, yy1) << QPointF(xx2, yy1) << QPointF(xx2, yy2) << QPointF(xx1, yy2);
+                    drawTile(img, l, p);
+                }
+                else
+                {
+                    urlQueue << url;
+                }
+
+            }                        
+        }
+        emit sigQueueChanged();
+    }
+
+}
diff --git a/src/map/CMapWMTS.h b/src/map/CMapTMS.h
similarity index 62%
copy from src/map/CMapWMTS.h
copy to src/map/CMapTMS.h
index 5fc2ea4..0225d4f 100644
--- a/src/map/CMapWMTS.h
+++ b/src/map/CMapTMS.h
@@ -16,31 +16,33 @@
 
 **********************************************************************************************/
 
-#ifndef CMAPWMTS_H
-#define CMAPWMTS_H
+#ifndef CMAPTMS_H
+#define CMAPTMS_H
+
 #include "map/IMap.h"
-#include <QMap>
 #include <QQueue>
-#include <QMutex>
-
+#include <QTime>
 
-class CMapDraw;
 class IDiskCache;
+class QListWidgetItem;
 class QNetworkAccessManager;
 class QNetworkReply;
-class QListWidgetItem;
 
-class CMapWMTS  : public IMap
+class CMapTMS : public IMap
 {
     Q_OBJECT
     public:
-        CMapWMTS(const QString& filename, CMapDraw *parent);
-        virtual ~CMapWMTS();
+        CMapTMS(const QString& filename, CMapDraw *parent);
+        virtual ~CMapTMS();
 
         void draw(IDrawContext::buffer_t& buf);
 
         void getLayers(QListWidget& list);
 
+        void saveConfig(QSettings& cfg);
+
+        void loadConfig(QSettings& cfg);
+
     signals:
         void sigQueueChanged();
 
@@ -52,50 +54,39 @@ class CMapWMTS  : public IMap
         void slotRequestFinished(QNetworkReply* reply);
         void slotLayersChanged(QListWidgetItem * item);
 
+
     private:
-        struct limit_t
-        {
-            qint32 minTileRow;
-            qint32 maxTileRow;
-            qint32 minTileCol;
-            qint32 maxTileCol;
-        };
+        struct layer_t;
+        QString createUrl(const layer_t& layer, int x, int y, int z);
 
         struct layer_t
         {
-            bool        enabled;
-            QString     title;
-            QStringList styles;
-            QString     tileMatrixSet;
-            QRectF      boundingBox;
-            QString     resourceURL;
-            QMap<QString,limit_t> limits;
-        };
-
-        QList<layer_t> layers;
+            layer_t() : enabled(true), minZoomLevel(0), maxZoomLevel(0){}
+            bool enabled;
+            qint32 minZoomLevel;
+            qint32 maxZoomLevel;
+            QString title;
+            QString strUrl;
+            QString script;
 
-        struct  tilematrix_t
-        {
-            QPointF topLeft;
-            qreal scale;
-            qint32  tileWidth;
-            qint32  tileHeight;
-            qint32  matrixWidth;
-            qint32  matrixHeight;
         };
 
-        struct tileset_t
+        struct rawHeaderItem_t
         {
-            tileset_t() : pjsrc(0) {}
-            ~tileset_t() { if(pjsrc) pj_free(pjsrc); }
-
-            projPJ  pjsrc;
-            QMap<QString,tilematrix_t> tilematrix;
+            QString name;
+            QString value;
         };
 
-        QMap<QString,tileset_t> tilesets;
+        QVector<layer_t> layers;
 
         QString name;
+
+        qint32 minZoomLevel;
+
+        qint32 maxZoomLevel;
+
+        QList<rawHeaderItem_t> rawHeaderItems;
+
         /// Mutex to control access to url queue
         QMutex mutex;
         /// a queue with all tile urls to request
@@ -109,7 +100,9 @@ class CMapWMTS  : public IMap
 
         bool lastRequest;
 
+        QTime timeLastUpdate;
+
 };
 
-#endif //CMAPWMTS_H
+#endif //CMAPTMS_H
 
diff --git a/src/map/CMapWMTS.cpp b/src/map/CMapWMTS.cpp
index 1cf9ae3..c632a42 100644
--- a/src/map/CMapWMTS.cpp
+++ b/src/map/CMapWMTS.cpp
@@ -18,7 +18,7 @@
 
 #include "map/CMapWMTS.h"
 #include "map/CMapDraw.h"
-#include "map/wmts/CDiskCache.h"
+#include "map/cache/CDiskCache.h"
 #include "units/IUnit.h"
 
 
@@ -38,6 +38,7 @@ CMapWMTS::CMapWMTS(const QString &filename, CMapDraw *parent)
     qDebug() << "------------------------------";
     qDebug() << "WTMS: try to open" << filename;
 
+
     QFile file(filename);
     if(!file.open(QIODevice::ReadOnly))
     {
@@ -178,7 +179,16 @@ CMapWMTS::CMapWMTS(const QString &filename, CMapDraw *parent)
         QString str = xmlTileMatrixSet.namedItem("SupportedCRS").toElement().text();
         char * ptr = str.toLatin1().data();
         OGRSpatialReference oSRS;
-        oSRS.importFromURN(ptr);
+
+        if(str.startsWith("EPSG"))
+        {
+            QStringList tokens = str.split(":");
+            oSRS.importFromEPSG(tokens.last().toInt());
+        }
+        else
+        {
+            oSRS.importFromURN(ptr);
+        }
         oSRS.exportToProj4(&ptr);
 
         qDebug() << ptr;
@@ -229,7 +239,7 @@ CMapWMTS::CMapWMTS(const QString &filename, CMapDraw *parent)
 
 CMapWMTS::~CMapWMTS()
 {
-
+//    map->reportStatusToCanvas(name, "");
 }
 
 void CMapWMTS::getLayers(QListWidget& list)
@@ -240,10 +250,6 @@ void CMapWMTS::getLayers(QListWidget& list)
         return;
     }
 
-    QListWidgetItem * item = new QListWidgetItem(tr("--- All ---"), &list);
-    item->setCheckState(Qt::Checked);
-    item->setData(Qt::UserRole, -1);
-
     int i = 0;
     foreach(const layer_t& layer, layers)
     {
@@ -255,6 +261,55 @@ void CMapWMTS::getLayers(QListWidget& list)
     connect(&list, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(slotLayersChanged(QListWidgetItem*)));
 }
 
+void CMapWMTS::saveConfig(QSettings& cfg)
+{
+    IMap::saveConfig(cfg);
+    if(layers.size() < 2)
+    {
+        return;
+    }
+
+    // save indices of enbaled layers
+    QStringList enabled;
+    for(int i = 0; i< layers.size(); i++)
+    {
+        if(layers[i].enabled)
+        {
+            enabled << QString::number(i);
+        }
+    }
+    cfg.setValue("enabledLayers", enabled);
+}
+
+void CMapWMTS::loadConfig(QSettings& cfg)
+{
+    IMap::loadConfig(cfg);
+    if(layers.size() < 2)
+    {
+        return;
+    }
+
+    QStringList enabled;
+    // set all layers to disabled first
+    for(int i = 0; i< layers.size(); i++)
+    {
+        layers[i].enabled = false;
+        enabled << QString::number(i);
+    }
+
+    // enable layers stored in configuration
+    enabled = cfg.value("enabledLayers", enabled).toStringList();
+    foreach(const QString& str, enabled)
+    {
+        int idx = str.toInt();
+        if(idx < layers.size())
+        {
+            layers[idx].enabled = true;
+        }
+    }
+}
+
+
 void CMapWMTS::configureCache()
 {
     delete diskCache;
@@ -316,6 +371,13 @@ void CMapWMTS::slotQueueChanged()
         map->emitSigCanvasUpdate();
     }
 
+    if(timeLastUpdate.elapsed() > 2000)
+    {
+        timeLastUpdate.start();
+        map->emitSigCanvasUpdate();
+    }
+
+
     // report status of pending tiles
     int pending = urlQueue.size() + urlPending.size();
     if(pending)
@@ -364,6 +426,7 @@ void CMapWMTS::draw(IDrawContext::buffer_t& buf)
 {
     QMutexLocker lock(&mutex);
 
+    timeLastUpdate.start();
     urlQueue.clear();
 
     if(map->needsRedraw())
diff --git a/src/map/CMapWMTS.h b/src/map/CMapWMTS.h
index 5fc2ea4..d0de639 100644
--- a/src/map/CMapWMTS.h
+++ b/src/map/CMapWMTS.h
@@ -22,6 +22,7 @@
 #include <QMap>
 #include <QQueue>
 #include <QMutex>
+#include <QTime>
 
 
 class CMapDraw;
@@ -30,6 +31,7 @@ class QNetworkAccessManager;
 class QNetworkReply;
 class QListWidgetItem;
 
+
 class CMapWMTS  : public IMap
 {
     Q_OBJECT
@@ -41,6 +43,11 @@ class CMapWMTS  : public IMap
 
         void getLayers(QListWidget& list);
 
+        void saveConfig(QSettings& cfg);
+
+        void loadConfig(QSettings& cfg);
+
+
     signals:
         void sigQueueChanged();
 
@@ -109,6 +116,8 @@ class CMapWMTS  : public IMap
 
         bool lastRequest;
 
+        QTime timeLastUpdate;
+
 };
 
 #endif //CMAPWMTS_H
diff --git a/src/map/IMap.cpp b/src/map/IMap.cpp
index 9a3575c..1e41f28 100644
--- a/src/map/IMap.cpp
+++ b/src/map/IMap.cpp
@@ -94,3 +94,12 @@ void IMap::drawTile(QImage& img, QPolygonF& l, QPainter& p)
     p.restore();
 
 }
+
+bool IMap::findPolylineCloseBy(QPointF& pt1, QPointF& pt2, qint32 threshold, QPolygonF& polyline)
+{
+    Q_UNUSED(pt1);
+    Q_UNUSED(pt2);
+    Q_UNUSED(threshold);
+    Q_UNUSED(polyline);
+    return false;
+}
diff --git a/src/map/IMap.h b/src/map/IMap.h
index 0f89c02..698e3ce 100644
--- a/src/map/IMap.h
+++ b/src/map/IMap.h
@@ -74,11 +74,31 @@ class IMap : public IDrawObject
          */
         virtual void getToolTip(const QPoint& px, QString& str){Q_UNUSED(px); Q_UNUSED(str);}
 
+        /**
+           @brief Return copyright notice if any
+           @return If no copyright notice has been decoded the string will be empty
+        */
+        const QString& getCopyright(){return copyright;}
+
         bool hasFeatureVisibility(){return flagsFeature & eFeatVisibility;}
         bool hasFeatureVectorItems(){return flagsFeature & eFeatVectorItems;}
         bool hasFeatureTileCache(){return flagsFeature & eFeatTileCache;}
         bool hasFeatureLayers(){return flagsFeature & eFeatLayers;}
 
+        /**
+           @brief Find a matching street polyline
+
+           The polyline must be close enough in terms of pixel to point 1 and 2. "Close enough" is defined by
+           the threshold. The returned poylline uses lon/lat as coordinates.
+
+           @param pt1           first point in [rad]
+           @param pt2           second point in [rad]
+           @param threshold     the "close enough" threshold in [pixel]
+           @param polyline      the resulting polyline, if any, in [rad]
+           @return              Return true if a line has been found.
+        */
+        virtual bool findPolylineCloseBy(QPointF& pt1, QPointF& pt2, qint32 threshold, QPolygonF& polyline);
+
     protected:
         void convertRad2M(QPointF &p);
         void convertM2Rad(QPointF &p);
@@ -119,6 +139,7 @@ class IMap : public IDrawObject
         quint32 flagsFeature;
 
 
+        QString copyright;
 };
 
 
diff --git a/src/map/wmts/CDiskCache.cpp b/src/map/cache/CDiskCache.cpp
similarity index 91%
rename from src/map/wmts/CDiskCache.cpp
rename to src/map/cache/CDiskCache.cpp
index d87951e..29bf7ee 100644
--- a/src/map/wmts/CDiskCache.cpp
+++ b/src/map/cache/CDiskCache.cpp
@@ -24,7 +24,7 @@ CDiskCache::CDiskCache(const QString &path, qint32 size, qint32 days, QObject *
     : IDiskCache(parent)   
     , dir(path)
     , size(size)
-    , expiration(size)
+    , expiration(days)
     , dummy(256,256, QImage::Format_ARGB32)
 {
     dummy.fill(Qt::transparent);
@@ -39,7 +39,7 @@ CDiskCache::CDiskCache(const QString &path, qint32 size, qint32 days, QObject *
 
     timer = new QTimer(this);
     timer->setSingleShot(false);
-    timer->start(60000);
+    timer->start(20000);
     connect(timer, SIGNAL(timeout()), this, SLOT(slotCleanup()));
 }
 
@@ -113,12 +113,11 @@ void CDiskCache::slotCleanup()
 {
     QMutexLocker lock(&mutex);
 
-    qint64 size = 0;
     QFileInfoList files = dir.entryInfoList(QStringList("*.png"), QDir::Files);
-    QDateTime now = QDateTime::currentDateTime();
-    int days        = expiration;
-    quint32 maxSize = size * 1024 * 1024;
-
+    QDateTime now       = QDateTime::currentDateTime();
+    int days            = expiration;
+    qint32 maxSize      = size * 1024 * 1024;
+    qint32 tmpSize      = 0;
     // expire old files and calculate cache size
     foreach(const QFileInfo& fileinfo, files)
     {
@@ -131,11 +130,11 @@ void CDiskCache::slotCleanup()
         }
         else
         {
-            size += fileinfo.size();
+            tmpSize += fileinfo.size();
         }
     }
 
-    if(size > maxSize)
+    if(tmpSize > maxSize)
     {
         // if cache is still too large remove oldest files
         foreach(const QFileInfo& fileinfo, files)
@@ -145,6 +144,8 @@ void CDiskCache::slotCleanup()
             cache.remove(hash);
             QFile::remove(fileinfo.absoluteFilePath());
 
+            qDebug() << "remove" << fileinfo.absoluteFilePath();
+
             size -= fileinfo.size();
 
             if(size < maxSize)
diff --git a/src/map/wmts/CDiskCache.h b/src/map/cache/CDiskCache.h
similarity index 98%
rename from src/map/wmts/CDiskCache.h
rename to src/map/cache/CDiskCache.h
index 4ba0eb7..1abbe95 100644
--- a/src/map/wmts/CDiskCache.h
+++ b/src/map/cache/CDiskCache.h
@@ -19,7 +19,7 @@
 #ifndef CDISKCACHE_H
 #define CDISKCACHE_H
 
-#include "map/wmts/IDiskCache.h"
+#include "map/cache/IDiskCache.h"
 
 #include <QDir>
 #include <QHash>
diff --git a/src/map/wmts/IDiskCache.cpp b/src/map/cache/IDiskCache.cpp
similarity index 100%
rename from src/map/wmts/IDiskCache.cpp
rename to src/map/cache/IDiskCache.cpp
diff --git a/src/map/wmts/IDiskCache.h b/src/map/cache/IDiskCache.h
similarity index 100%
rename from src/map/wmts/IDiskCache.h
rename to src/map/cache/IDiskCache.h
diff --git a/src/map/garmin/CGarminPolygon.cpp b/src/map/garmin/CGarminPolygon.cpp
index fb83c3c..eba2252 100644
--- a/src/map/garmin/CGarminPolygon.cpp
+++ b/src/map/garmin/CGarminPolygon.cpp
@@ -96,8 +96,8 @@ quint32 CGarminPolygon::decode(qint32 iCenterLon, qint32 iCenterLat, quint32 shi
     const quint8 * const pStart = pData;
 
     labels.clear();
-    poly.resize(0);
-    poly.reserve(maxVecSize);
+    coords.resize(0);
+    coords.reserve(maxVecSize);
 
     /* poly_type
 
@@ -194,7 +194,7 @@ quint32 CGarminPolygon::decode(qint32 iCenterLon, qint32 iCenterLat, quint32 shi
 
     if(x1 >= 0x800000 && !isNegative) x1 = 0x7fffff;
 
-    poly << QPointF(GARMIN_RAD(x1), GARMIN_RAD(y1));
+    coords << QPointF(GARMIN_RAD(x1), GARMIN_RAD(y1));
 
     // next points
     while(sr.get(x,y))
@@ -204,20 +204,23 @@ quint32 CGarminPolygon::decode(qint32 iCenterLon, qint32 iCenterLat, quint32 shi
 
         if(x1 >= 0x800000 && !isNegative) x1 = 0x7fffff;
 
-        poly << QPointF(GARMIN_RAD(x1), GARMIN_RAD(y1));
+        coords << QPointF(GARMIN_RAD(x1), GARMIN_RAD(y1));
     }
 
     id = cnt++;
     //     qDebug() << "<<<" << id;
 
-    if(maxVecSize < poly.size())
+    if(maxVecSize < coords.size())
     {
-        maxVecSize = poly.size();
+        maxVecSize = coords.size();
     }
-    if(poly.size() * 1.2 < maxVecSize)
+    if(coords.size() * 1.2 < maxVecSize)
     {
-        poly.squeeze();
+        coords.squeeze();
     }
+
+    pixel = coords;
+
     return bytes_total;
 }
 
@@ -239,8 +242,8 @@ quint32 CGarminPolygon::decode2(qint32 iCenterLon, qint32 iCenterLat, quint32 sh
     const quint8 * const pStart = pData;
 
     labels.clear();
-    poly.resize(0);
-    poly.reserve(maxVecSize);
+    coords.resize(0);
+    coords.reserve(maxVecSize);
 
     type        = *pData++;
     subtype     = *pData++;;
@@ -299,7 +302,7 @@ quint32 CGarminPolygon::decode2(qint32 iCenterLon, qint32 iCenterLat, quint32 sh
 
     if(x1 >= 0x800000 && !isNegative) x1 = 0x7fffff;
 
-    poly << QPointF(GARMIN_RAD(x1), GARMIN_RAD(y1));
+    coords << QPointF(GARMIN_RAD(x1), GARMIN_RAD(y1));
 
     // next points
     while(sr.get(x,y))
@@ -321,7 +324,7 @@ quint32 CGarminPolygon::decode2(qint32 iCenterLon, qint32 iCenterLat, quint32 sh
 //#ifdef DEBUG_SHOW_POLY_PTS
 //        qDebug() << xy.u << xy.v << (RAD_TO_DEG * xy.u) << (RAD_TO_DEG * xy.v);
 //#endif
-        poly << QPointF(GARMIN_RAD(x1), GARMIN_RAD(y1));
+        coords << QPointF(GARMIN_RAD(x1), GARMIN_RAD(y1));
     }
 
     if(hasV2Label)
@@ -338,16 +341,17 @@ quint32 CGarminPolygon::decode2(qint32 iCenterLon, qint32 iCenterLat, quint32 sh
     id = cnt++;
     //     qDebug() << "<<<" << id;
 
-    if(maxVecSize < poly.size())
+    if(maxVecSize < coords.size())
     {
-        maxVecSize = poly.size();
+        maxVecSize = coords.size();
     }
-    if(poly.size() * 1.2 < maxVecSize)
+    if(coords.size() * 1.2 < maxVecSize)
     {
-        poly.squeeze();
-        poly.squeeze();
+        coords.squeeze();
     }
 
+    pixel = coords;
+
     return bytes_total;
 }
 
diff --git a/src/map/garmin/CGarminPolygon.h b/src/map/garmin/CGarminPolygon.h
index 487aa43..7f8b4c1 100644
--- a/src/map/garmin/CGarminPolygon.h
+++ b/src/map/garmin/CGarminPolygon.h
@@ -57,8 +57,13 @@ class CGarminPolygon
         qint16 dLng;
         /// delta latitude from subdivision center
         qint16 dLat;
+        /** @brief the actual polyline points as [pixel]
+          @note After decode() or decode2() the content will be the same as coords.
+                It is up to the render object to convert it into pixel coordinates
+        */
+        QPolygonF pixel;
         /// the actual polyline points as longitude / latitude [rad]
-        QPolygonF poly;
+        QPolygonF coords;
 
         quint32 id;
 
diff --git a/src/mouse/CMouseEditArea.cpp b/src/mouse/CMouseEditArea.cpp
index f528ef2..c34b604 100644
--- a/src/mouse/CMouseEditArea.cpp
+++ b/src/mouse/CMouseEditArea.cpp
@@ -63,14 +63,28 @@ IGisLine * CMouseEditArea::getGisLine()
     return dynamic_cast<CGisItemOvlArea*>(CGisWidget::self().getItemByKey(key));
 }
 
+void CMouseEditArea::slotAbort()
+{
+    canvas->reportStatus(key,"");
+    IMouseEditLine::slotAbort();
+}
+
+void CMouseEditArea::slotCopyToOrig()
+{
+    canvas->reportStatus(key,"");
+    IMouseEditLine::slotCopyToOrig();
+}
+
 void CMouseEditArea::slotCopyToNew()
 {
+    canvas->reportStatus(key,"");
+
     if(coords1.size() < 3)
     {
         return;
     }
 
-    CGisProject * project = CGisWidget::self().selectProject();
+    IGisProject * project = CGisWidget::self().selectProject();
     if(project == 0)
     {
         return;
diff --git a/src/mouse/CMouseEditArea.h b/src/mouse/CMouseEditArea.h
index 80e8cf4..5f5a07b 100644
--- a/src/mouse/CMouseEditArea.h
+++ b/src/mouse/CMouseEditArea.h
@@ -34,7 +34,9 @@ class CMouseEditArea : public IMouseEditLine
         void mousePressEvent(QMouseEvent * e);
 
     protected slots:
+        void slotAbort();
         void slotCopyToNew();
+        void slotCopyToOrig();
 
     protected:
         virtual void drawLine(const QPolygonF& l, QPainter& p);
diff --git a/src/mouse/CMouseEditTrk.cpp b/src/mouse/CMouseEditTrk.cpp
index da35996..6887578 100644
--- a/src/mouse/CMouseEditTrk.cpp
+++ b/src/mouse/CMouseEditTrk.cpp
@@ -53,7 +53,7 @@ CMouseEditTrk::CMouseEditTrk(CGisItemTrk &trk, CGisDraw * gis, CCanvas * parent)
 
 CMouseEditTrk::~CMouseEditTrk()
 {
-    canvas->reportStatus(key, "");
+//    canvas->reportStatus(key,"");
 }
 
 void CMouseEditTrk::mousePressEvent(QMouseEvent * e)
@@ -67,14 +67,29 @@ IGisLine * CMouseEditTrk::getGisLine()
     return dynamic_cast<CGisItemTrk*>(CGisWidget::self().getItemByKey(key));
 }
 
+void CMouseEditTrk::slotAbort()
+{
+    canvas->reportStatus(key,"");
+    IMouseEditLine::slotAbort();
+}
+
+void CMouseEditTrk::slotCopyToOrig()
+{
+    canvas->reportStatus(key,"");
+    IMouseEditLine::slotCopyToOrig();
+}
+
+
 void CMouseEditTrk::slotCopyToNew()
 {
+    canvas->reportStatus(key,"");
+
     if(coords1.size() < 2)
     {
         return;
     }
 
-    CGisProject * project = CGisWidget::self().selectProject();
+    IGisProject * project = CGisWidget::self().selectProject();
     if(project == 0)
     {
         return;
@@ -98,5 +113,5 @@ void CMouseEditTrk::slotCopyToNew()
     new CGisItemTrk(coords1,name, project, -1);
 
     canvas->resetMouse();
-    canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
+    canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);            
 }
diff --git a/src/mouse/CMouseEditTrk.h b/src/mouse/CMouseEditTrk.h
index 79096e4..48f6eee 100644
--- a/src/mouse/CMouseEditTrk.h
+++ b/src/mouse/CMouseEditTrk.h
@@ -33,8 +33,11 @@ class CMouseEditTrk : public IMouseEditLine
 
         void mousePressEvent(QMouseEvent * e);
 
-    protected slots:
+    protected slots:        
+        void slotAbort();
         void slotCopyToNew();
+        void slotCopyToOrig();
+
 
     protected:
         IGisLine * getGisLine();
diff --git a/src/mouse/CMouseNormal.cpp b/src/mouse/CMouseNormal.cpp
index c2eae25..c701435 100644
--- a/src/mouse/CMouseNormal.cpp
+++ b/src/mouse/CMouseNormal.cpp
@@ -25,7 +25,7 @@
 #include "gis/rte/CGisItemRte.h"
 #include "gis/CGisWidget.h"
 #include "gis/CGisDraw.h"
-#include "gis/CGisProject.h"
+#include "gis/IGisProject.h"
 #include "GeoMath.h"
 
 #include <QtWidgets>
@@ -300,7 +300,7 @@ void CMouseNormal::slotAddWpt()
         return;
     }
 
-    CGisProject * project = CGisWidget::self().selectProject();
+    IGisProject * project = CGisWidget::self().selectProject();
     if(project == 0)
     {
         return;
diff --git a/src/mouse/CScrOptUnclutter.cpp b/src/mouse/CScrOptUnclutter.cpp
index 77231b0..7028f65 100644
--- a/src/mouse/CScrOptUnclutter.cpp
+++ b/src/mouse/CScrOptUnclutter.cpp
@@ -23,16 +23,71 @@
 
 #include <QtWidgets>
 
-const QPoint CScrOptUnclutter::positions[] =
+const QPoint CScrOptUnclutter::positions[9][8] =
 {
-      QPoint(-50,-23)
-    , QPoint( 50,-23)
-    , QPoint(-50, 23)
-    , QPoint( 50, 23)
-    , QPoint(-22,-55)
-    , QPoint( 22,-55)
-    , QPoint(-22, 55)
-    , QPoint( 22, 55)
+    {
+
+    },
+
+    {
+          QPoint(-50,-23)
+    },
+
+    {
+          QPoint(-30,0)
+        , QPoint( 30,0)
+    },
+
+    {
+          QPoint(  0,-30)
+        , QPoint( 30, 30)
+        , QPoint(-30, 30)
+    },
+
+    {
+          QPoint(-30,-30)
+        , QPoint( 30,-30)
+        , QPoint(-30, 30)
+        , QPoint( 30, 30)
+    },
+
+    {
+          QPoint(-25, 40)
+        , QPoint( 25, 40)
+        , QPoint(-40, -5)
+        , QPoint( 40, -5)
+        , QPoint(  0,-40)
+    },
+
+    {
+          QPoint(-40,-22)
+        , QPoint( 40,-22)
+        , QPoint(-40, 22)
+        , QPoint( 40, 22)
+        , QPoint(  0,-55)
+        , QPoint(  0, 55)
+    },
+
+    {
+          QPoint(-50,-23)
+        , QPoint( 50,-23)
+        , QPoint(-45, 21)
+        , QPoint( 45, 21)
+        , QPoint(-22,-55)
+        , QPoint( 22,-55)
+        , QPoint(  0, 50)
+    },
+
+    {
+          QPoint(-50,-23)
+        , QPoint( 50,-23)
+        , QPoint(-50, 23)
+        , QPoint( 50, 23)
+        , QPoint(-22,-55)
+        , QPoint( 22,-55)
+        , QPoint(-22, 55)
+        , QPoint( 22, 55)
+    }
 
 };
 
@@ -118,15 +173,16 @@ const CScrOptUnclutter::item_t * CScrOptUnclutter::selectItem(const QPoint& poin
 
 void CScrOptUnclutter::draw(QPainter& p)
 {
+    const int N = items.size();
     QFontMetrics fm(CMainWindow::self().getMapFont());
-    for(int cnt = 0; cnt < items.size(); cnt++)
+    for(int cnt = 0; cnt < N; cnt++)
     {
         item_t& item = items[cnt];
 
         if(item.text.isNull())
         {
 
-            item.area.moveCenter(origin + positions[cnt]);
+            item.area.moveCenter(origin + positions[N][cnt]);
             item.active.moveCenter(item.area.center());
             item.text = fm.boundingRect(item.name);
             if(cnt & 0x01)
diff --git a/src/mouse/CScrOptUnclutter.h b/src/mouse/CScrOptUnclutter.h
index f5d8fd9..a95d671 100644
--- a/src/mouse/CScrOptUnclutter.h
+++ b/src/mouse/CScrOptUnclutter.h
@@ -51,7 +51,7 @@ class CScrOptUnclutter : public IScrOpt
         void mouseMoveEvent(QMouseEvent * e);
 
     private:
-        static const QPoint positions[];
+        static const QPoint positions[9][8];
         QList<item_t> items;
         bool doSpecialCursor;
 
diff --git a/src/mouse/IMouse.cpp b/src/mouse/IMouse.cpp
index 913da4e..c1bb0c6 100644
--- a/src/mouse/IMouse.cpp
+++ b/src/mouse/IMouse.cpp
@@ -18,6 +18,7 @@
 
 #include "mouse/IMouse.h"
 #include "canvas/CCanvas.h"
+#include <gis/CGisDraw.h>
 
 #include <QtWidgets>
 
diff --git a/src/mouse/IMouse.h b/src/mouse/IMouse.h
index 78504f1..6124322 100644
--- a/src/mouse/IMouse.h
+++ b/src/mouse/IMouse.h
@@ -21,6 +21,7 @@
 
 #include <QObject>
 #include <QCursor>
+#include <QPointer>
 
 class QMouseEvent;
 class QWheelEvent;
@@ -28,6 +29,7 @@ class CCanvas;
 class QTimer;
 class CGisDraw;
 
+
 class IMouse : public QObject
 {
     Q_OBJECT
@@ -63,9 +65,9 @@ class IMouse : public QObject
         /// the functions mouse icon
         QCursor cursor;
 
-        CGisDraw * gis;
+        QPointer<CGisDraw> gis;
 
-        CCanvas * canvas;
+        QPointer<CCanvas>  canvas;
         // the current point reported by the mouse events
         QPoint point;
 
diff --git a/src/mouse/IMouseEditLine.cpp b/src/mouse/IMouseEditLine.cpp
index 9a5a76a..6549be1 100644
--- a/src/mouse/IMouseEditLine.cpp
+++ b/src/mouse/IMouseEditLine.cpp
@@ -205,6 +205,12 @@ void IMouseEditLine::drawArrows(const QPolygonF &l, QPainter& p)
 
 }
 
+void IMouseEditLine::drawLeadLine(const QPolygonF &l, QPainter& p)
+{
+    p.setPen(QPen(QColor(255,255,0,100), 9, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
+    p.drawPolyline(l);
+}
+
 void IMouseEditLine::draw(QPainter& p, bool needsRedraw, const QRect &rect)
 {
     if(needsRedraw)
@@ -215,10 +221,9 @@ void IMouseEditLine::draw(QPainter& p, bool needsRedraw, const QRect &rect)
         gis->convertRad2Px(newLine);
     }
 
-
-
     switch(state)
     {
+        case eStateMoveMap:
         case eStateIdle:
         case eStatePointSelected:
             drawArrows(line, p);
@@ -251,14 +256,39 @@ void IMouseEditLine::draw(QPainter& p, bool needsRedraw, const QRect &rect)
             break;
 
         case eStateAddPointFwd:
-        case eStateAddPointBwd:
         {
-            QPolygonF l = line.mid(0, idxStart + 1) + newLine + line.mid(idxStop, -1);
+            QPolygonF l;
+            if(subLinePixel.isEmpty())
+            {
+                l = line.mid(0, idxStart) + newLine + line.mid(idxStop, -1);
+            }
+            else
+            {
+                l = line.mid(0, idxStart) + newLine.mid(0, newLine.size() - 2) + subLinePixel + line.mid(idxStop, -1);
+            }
+            drawLeadLine(leadLinePixel, p);
             drawArrows(l, p);
             drawLine(l, p);            
             drawBullets(l, p);
             break;
         }
+        case eStateAddPointBwd:
+        {
+            QPolygonF l;
+            if(subLinePixel.isEmpty())
+            {
+                l = line.mid(0, idxStart + 1) + newLine + line.mid(idxStop + 1, -1);
+            }
+            else
+            {
+                l = line.mid(0, idxStart + 1) + subLinePixel + newLine.mid(2, -1) + line.mid(idxStop + 1, -1);
+            }
+            drawLeadLine(leadLinePixel, p);
+            drawArrows(l, p);
+            drawLine(l, p);
+            drawBullets(l, p);
+            break;
+        }
         default:;
     }
 
@@ -310,17 +340,21 @@ void IMouseEditLine::mousePressEvent(QMouseEvent * e)
                 {
                     if(state == eStateAddPointBwd)
                     {
+                        // remove first point, which is the current moving point
                         newCoords.pop_front();
+                        save = coords1.mid(0, idxStart + 1) + newCoords + coords1.mid(idxStop + 1, -1);
                     }
 
                     if(state == eStateAddPointFwd)
                     {
+                        // remove last point, which is the current moving point
                         newCoords.pop_back();
+                        save = coords1.mid(0, idxStart) + newCoords + coords1.mid(idxStop, -1);
                     }
 
-                    save        = coords1.mid(0, idxStart + 1) + newCoords + coords1.mid(idxStop, -1);
-                    coords1     = save;
-                    line        = coords1;
+
+                    coords1 = save;
+                    line    = coords1;
                     gis->convertRad2Px(line);
                 }
 
@@ -470,13 +504,38 @@ void IMouseEditLine::mousePressEvent(QMouseEvent * e)
             }
             case eStateAddPointFwd:
             {
+                if(!subLineCoord.isEmpty())
+                {
+                    newLine.pop_back();
+                    newLine.pop_back();
+                    newLine     = newLine + subLinePixel;
+                    newCoords.pop_back();
+                    newCoords.pop_back();
+                    newCoords   = newCoords + subLineCoord;
+
+                    subLineCoord.clear();
+                    subLinePixel.clear();
+                }
                 newLine.append(newLine.last());
                 newCoords.append(newCoords.last());
-                idxFocus++;
+                idxFocus = newLine.size() - 1;
                 break;
             }
             case eStateAddPointBwd:
             {
+                if(!subLineCoord.isEmpty())
+                {
+                    newLine.pop_front();
+                    newLine.pop_front();
+                    newLine = subLinePixel + newLine;
+                    newCoords.pop_front();
+                    newCoords.pop_front();
+                    newCoords = subLineCoord + newCoords;
+
+                    subLineCoord.clear();
+                    subLinePixel.clear();
+                }
+
                 newLine.prepend(newLine.first());
                 newCoords.prepend(newCoords.first());
                 idxFocus = 0;
@@ -556,6 +615,47 @@ void IMouseEditLine::mouseMoveEvent(QMouseEvent * e)
             gis->convertPx2Rad(pt);
             newCoords[idxFocus] = pt;
 
+
+            leadLineCoord.clear();
+            leadLinePixel.clear();
+            subLinePixel.clear();
+            subLineCoord.clear();
+
+
+            // find polyline to snap
+            QPointF px1;
+            QPointF px2;
+            if(newLine.size() > 1)
+            {                
+                px1 = state == eStateAddPointFwd ? newLine[idxFocus - 1] : newLine[1];
+                px2 = newLine[idxFocus];
+            }
+
+            if(canvas->findPolylineCloseBy(px2, px2, 10, leadLineCoord))
+            {
+
+                leadLinePixel = leadLineCoord;
+                gis->convertRad2Px(leadLinePixel);
+
+                segment_t result;
+                GPS_Math_SubPolyline(px1, px2, 10, leadLinePixel, result);
+                result.apply(leadLineCoord, leadLinePixel, subLineCoord, subLinePixel, gis);
+
+                if(state == eStateAddPointBwd)
+                {
+                    QPolygonF tmp1;
+                    QPolygonF tmp2;
+                    for(int i = 0; i < subLineCoord.size(); i++)
+                    {
+                        tmp1.push_front(subLineCoord[i]);
+                        tmp2.push_front(subLinePixel[i]);
+                    }
+                    subLineCoord = tmp1;
+                    subLinePixel = tmp2;
+                }
+            }
+
+
             canvas->update();
             break;
 
@@ -691,11 +791,17 @@ void IMouseEditLine::slotAddPoint1()
     }
     scrOptPoint->deleteLater();
 
-    // set point with focus as temporary initial point
-    newCoords.clear();    
-    newCoords << coords1[idxFocus];
+    newCoords.clear();
     newLine.clear();
-    newLine   << line[idxFocus];
+    /*
+        Adding points will work completely on newLine and newCoords until the
+        line segment is taken over or dumped. The current point of focus is
+        added twice. The first time as fixed starting point of the tmeporary
+        newLine. And the second time as initial point to be moved by the mouse.
+
+    */
+    newCoords << coords1[idxFocus]  << coords1[idxFocus];
+    newLine   << line[idxFocus]     << line[idxFocus];
 
     // mark gap to insert points
     idxStart = idxFocus - 1;
@@ -718,20 +824,31 @@ void IMouseEditLine::slotAddPoint2()
     {
         return;
     }
-    scrOptPoint->deleteLater();
 
-    // set point with focus as temporary initial point
+    if(!scrOptPoint.isNull())
+    {
+        scrOptPoint->deleteLater();
+    }
+
+
     newCoords.clear();
-    newCoords << coords1[idxFocus];    
     newLine.clear();
-    newLine   << line[idxFocus];
+    /*
+        Adding points will work completely on newLine and newCoords until the
+        line segment is taken over or dumped. The current point of focus is
+        added twice. The first time as fixed starting point of the tmeporary
+        newLine. And the second time as initial point to be moved by the mouse.
+
+    */
+    newCoords << coords1[idxFocus]  << coords1[idxFocus];
+    newLine   << line[idxFocus]     << line[idxFocus];
 
     // mark gap to insert points
     idxStart = idxFocus;
     idxStop  = idxFocus + 1;
 
     // set focus to first point in newLine
-    idxFocus = 0;
+    idxFocus = 1;
 
     state   = eStateAddPointFwd;
     cursor  = QCursor(QPixmap(":/cursors/cursorAdd.png"),0,0);
@@ -771,3 +888,4 @@ void IMouseEditLine::slotCopyToOrig()
     canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
 }
 
+
diff --git a/src/mouse/IMouseEditLine.h b/src/mouse/IMouseEditLine.h
index 85121e8..03c698a 100644
--- a/src/mouse/IMouseEditLine.h
+++ b/src/mouse/IMouseEditLine.h
@@ -83,8 +83,8 @@ class IMouseEditLine  : public IMouse
         void slotAddPoint2();
 
 
-        void slotAbort();
-        void slotCopyToOrig();
+        virtual void slotAbort();
+        virtual void slotCopyToOrig();
         virtual void slotCopyToNew() = 0;
 
     protected:
@@ -105,6 +105,7 @@ class IMouseEditLine  : public IMouse
         void drawHighlight1(QPainter& p);
         void drawHighlight2(QPainter& p);
         void drawArrows(const QPolygonF &l, QPainter& p);
+        void drawLeadLine(const QPolygonF &l, QPainter& p);
         int getPointCloseBy(const QPoint& screenPos);
 
         /// backup for coord1
@@ -140,6 +141,11 @@ class IMouseEditLine  : public IMouse
         CScrOptEditLine * scrOptEditLine;
 
         QPoint lastPoint;
+
+        QPolygonF leadLineCoord;
+        QPolygonF leadLinePixel;
+        QPolygonF subLineCoord;
+        QPolygonF subLinePixel;
 };
 
 #endif //IMOUSEEDITLINE_H
diff --git a/src/plot/CPlotDistance.cpp b/src/plot/CPlotDistance.cpp
index 4f7eac4..b722b5c 100644
--- a/src/plot/CPlotDistance.cpp
+++ b/src/plot/CPlotDistance.cpp
@@ -76,7 +76,7 @@ void CPlotDistance::updateData()
     {
         foreach(const CGisItemTrk::trkpt_t& trkpt, seg.pts)
         {
-            if(trkpt.flags & CGisItemTrk::trkpt_t::eDeleted)
+            if(trkpt.flags & CGisItemTrk::trkpt_t::eHidden)
             {
                 continue;
             }
diff --git a/src/plot/CPlotProfile.cpp b/src/plot/CPlotProfile.cpp
index 4872332..1854c39 100644
--- a/src/plot/CPlotProfile.cpp
+++ b/src/plot/CPlotProfile.cpp
@@ -83,7 +83,7 @@ void CPlotProfile::updateData()
     {
         foreach(const CGisItemTrk::trkpt_t& trkpt, seg.pts)
         {
-            if(trkpt.flags & CGisItemTrk::trkpt_t::eDeleted)
+            if(trkpt.flags & CGisItemTrk::trkpt_t::eHidden)
             {
                 continue;
             }
diff --git a/src/plot/CPlotSpeed.cpp b/src/plot/CPlotSpeed.cpp
index bb979b9..69ff9bf 100644
--- a/src/plot/CPlotSpeed.cpp
+++ b/src/plot/CPlotSpeed.cpp
@@ -74,7 +74,7 @@ void CPlotSpeed::updateData()
     {
         foreach(const CGisItemTrk::trkpt_t& trkpt, seg.pts)
         {
-            if(trkpt.flags & CGisItemTrk::trkpt_t::eDeleted)
+            if(trkpt.flags & CGisItemTrk::trkpt_t::eHidden)
             {
                 continue;
             }
diff --git a/src/plot/CPlotTrack.cpp b/src/plot/CPlotTrack.cpp
index af1b522..84b78b8 100644
--- a/src/plot/CPlotTrack.cpp
+++ b/src/plot/CPlotTrack.cpp
@@ -75,7 +75,7 @@ void CPlotTrack::updateData()
         {
             foreach(const CGisItemTrk::trkpt_t& trkpt, seg.pts)
             {
-                if(trkpt.flags & CGisItemTrk::trkpt_t::eDeleted)
+                if(trkpt.flags & CGisItemTrk::trkpt_t::eHidden)
                 {
                     continue;
                 }
diff --git a/src/resources.qrc b/src/resources.qrc
index beab307..0cf0abb 100644
--- a/src/resources.qrc
+++ b/src/resources.qrc
@@ -37,6 +37,7 @@
         <file>icons/32x32/GridWizzard.png</file>
         <file>icons/32x32/Help.png</file>
         <file>icons/32x32/Info.png</file>
+        <file>icons/32x32/Error.png</file>
         <file>icons/32x32/Map.png</file>
         <file>icons/32x32/QMapShack.png</file>
         <file>icons/32x32/MimeIMG.png</file>
@@ -45,6 +46,7 @@
         <file>icons/32x32/MimeRMAP.png</file>
         <file>icons/32x32/MimeVRT.png</file>
         <file>icons/32x32/MimeWMTS.png</file>
+        <file>icons/32x32/MimeTMS.png</file>
         <file>icons/32x32/MimeDemVRT.png</file>
         <file>icons/32x32/MouseWheel.png</file>
         <file>icons/32x32/NightDay.png</file>
@@ -93,6 +95,7 @@
         <file>icons/32x32/AddWpt.png</file>
         <file>icons/32x32/AddTrk.png</file>
         <file>icons/32x32/AddArea.png</file>
+        <file>icons/32x32/AddProject.png</file>
         <file>icons/32x32/LineMove.png</file>
         <file>icons/32x32/PointMove.png</file>
         <file>icons/32x32/PointHide.png</file>
@@ -102,6 +105,7 @@
         <file>icons/32x32/Area.png</file>
         <file>icons/32x32/Reverse.png</file>
         <file>icons/32x32/Combine.png</file>
+        <file>icons/32x32/SearchGoogle.png</file>
 
         <file>icons/48x48/2DFix.png</file>
         <file>icons/48x48/3DFix.png</file>
@@ -121,6 +125,7 @@
         <file>icons/48x48/GridWizzard.png</file>
         <file>icons/48x48/Help.png</file>
         <file>icons/48x48/Info.png</file>
+        <file>icons/48x48/Error.png</file>
         <file>icons/48x48/Map.png</file>
         <file>icons/48x48/QMapShack.png</file>
         <file>icons/48x48/MimeIMG.png</file>
@@ -129,6 +134,7 @@
         <file>icons/48x48/MimeRMAP.png</file>
         <file>icons/48x48/MimeVRT.png</file>
         <file>icons/48x48/MimeWMTS.png</file>
+        <file>icons/48x48/MimeTMS.png</file>
         <file>icons/48x48/MimeDemVRT.png</file>
         <file>icons/48x48/MouseWheel.png</file>
         <file>icons/48x48/NightDay.png</file>
@@ -177,6 +183,7 @@
         <file>icons/48x48/AddWpt.png</file>
         <file>icons/48x48/AddTrk.png</file>
         <file>icons/48x48/AddArea.png</file>
+        <file>icons/48x48/AddProject.png</file>
         <file>icons/48x48/LineMove.png</file>
         <file>icons/48x48/PointMove.png</file>
         <file>icons/48x48/PointHide.png</file>
@@ -186,6 +193,7 @@
         <file>icons/48x48/Area.png</file>
         <file>icons/48x48/Reverse.png</file>
         <file>icons/48x48/Combine.png</file>
+        <file>icons/48x48/SearchGoogle.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