[qmapshack] 01/02: Imported Upstream version 0.6.0

Jaromír Mikeš mira-guest at moszumanska.debian.org
Thu Oct 16 19:45:16 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 809ebf32262ef2860cfa4ea61d9e3828971009ee
Author: Jaromír Mikeš <mira.mikes at seznam.cz>
Date:   Thu Oct 16 21:44:58 2014 +0200

    Imported Upstream version 0.6.0
---
 CMakeLists.txt                                     |   2 +-
 CMakeLists.txt.user                                |  65 +--
 changelog.txt                                      |   7 +
 src/CMainWindow.cpp                                |  11 +
 src/CMakeLists.txt                                 |  10 +-
 src/canvas/CCanvas.cpp                             |  20 +-
 src/canvas/CCanvas.h                               |   2 +
 src/cursors/cursorSelectRange.png                  | Bin 1357 -> 1419 bytes
 src/gis/CGisListWks.cpp                            |  32 +-
 src/gis/CGisListWks.h                              |   5 +
 src/gis/CGisWidget.cpp                             |  45 +++
 src/gis/CGisWidget.h                               |   8 +
 src/gis/trk/CCombineTrk.cpp                        | 205 ++++++++++
 src/gis/trk/{CScrOptTrk.h => CCombineTrk.h}        |  41 +-
 src/gis/trk/CDetailsTrk.cpp                        |   4 +-
 src/gis/trk/CGisItemTrk.cpp                        | 437 ++++++++++++++++++---
 src/gis/trk/CGisItemTrk.h                          |  60 ++-
 src/gis/trk/CScrOptTrk.cpp                         |  22 ++
 src/gis/trk/CScrOptTrk.h                           |   3 +
 src/gis/trk/ICombineTrk.ui                         | 266 +++++++++++++
 src/gis/trk/IScrOptTrk.ui                          |  61 ++-
 src/icons/32x32/Combine.png                        | Bin 0 -> 711 bytes
 src/icons/32x32/Left.png                           | Bin 0 -> 669 bytes
 src/icons/32x32/PointHide.png                      | Bin 0 -> 813 bytes
 src/icons/32x32/PointShow.png                      | Bin 0 -> 642 bytes
 src/icons/32x32/Reverse.png                        | Bin 0 -> 661 bytes
 src/icons/32x32/SelectRange.png                    | Bin 628 -> 831 bytes
 src/icons/48x48/Combine.png                        | Bin 0 -> 979 bytes
 src/icons/48x48/Left.png                           | Bin 0 -> 976 bytes
 src/icons/48x48/PointHide.png                      | Bin 0 -> 1175 bytes
 src/icons/48x48/PointShow.png                      | Bin 0 -> 869 bytes
 src/icons/48x48/Reverse.png                        | Bin 0 -> 1088 bytes
 src/icons/48x48/SelectRange.png                    | Bin 849 -> 1129 bytes
 src/icons/Combine.svg                              | 120 ++++++
 src/icons/Left.svg                                 |  94 +++++
 src/icons/{SelectRange.svg => PointHide.svg}       | 102 +++--
 src/icons/{SelectRange.svg => PointShow.svg}       |  79 ++--
 src/icons/Reverse.svg                              |  76 ++++
 src/icons/SelectRange.svg                          |  73 +++-
 src/locale/qmapshack_cs.ts                         | 231 ++++++++---
 src/locale/qmapshack_de.ts                         | 405 ++++++++++++-------
 src/locale/qmapshack_es.ts                         | 231 ++++++++---
 src/map/CMapWMTS.cpp                               |   2 +-
 src/mouse/CMouseEditArea.cpp                       |  10 +-
 src/mouse/CMouseEditArea.h                         |   2 +
 src/mouse/CMouseEditTrk.cpp                        |   9 +-
 src/mouse/CMouseEditTrk.h                          |   2 +
 src/mouse/CMouseRangeTrk.cpp                       | 275 +++++++++++++
 .../trk/CScrOptTrk.h => mouse/CMouseRangeTrk.h}    |  56 ++-
 src/mouse/{CMouseEditTrk.h => CScrOptRangeTrk.cpp} |  41 +-
 .../trk/CScrOptTrk.h => mouse/CScrOptRangeTrk.h}   |  28 +-
 src/mouse/IMouseEditLine.cpp                       | 106 ++++-
 src/mouse/IMouseEditLine.h                         |   4 +
 src/mouse/IScrOptRangeTrk.ui                       | 116 ++++++
 src/plot/CPlotTrack.cpp                            |  68 +++-
 src/plot/CPlotTrack.h                              |   3 +
 src/resources.qrc                                  |  10 +
 57 files changed, 2874 insertions(+), 575 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index d7a90d4..ae04ec5 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 "5")
+set(APPLICATION_VERSION_MINOR "6")
 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 d8476d7..0d188d1 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.1, 2014-10-05T17:39:27. -->
+<!-- Written by QtCreator 3.1.2, 2014-10-15T08:28:32. -->
 <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.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.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.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">1</value>
+   <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</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,59 +152,8 @@
      <value type="int">13</value>
      <value type="int">14</value>
     </valuelist>
-    <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="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">2</value>
@@ -219,7 +168,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">2</value>
+   <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
   </valuemap>
  </data>
  <data>
@@ -228,7 +177,7 @@
  </data>
  <data>
   <variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
-  <value type="QByteArray">{044d553a-749a-4a4b-b707-1344605bd255}</value>
+  <value type="QByteArray">{aef9f59c-83a3-4ac3-bddf-77d643de0ead}</value>
  </data>
  <data>
   <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
diff --git a/changelog.txt b/changelog.txt
index 4634eb5..f225f6a 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,3 +1,10 @@
+V 0.6.0
+* Reverse tracks
+* Add dialog to combine tracks
+* Add range select to tracks
+* Add function to hide/show track points
+* Add function to copy selected track points as new track
+
 V 0.5.0
 * Add support for WMTS maps
 * Edit/create tracks
diff --git a/src/CMainWindow.cpp b/src/CMainWindow.cpp
index 205cc04..3f0b300 100644
--- a/src/CMainWindow.cpp
+++ b/src/CMainWindow.cpp
@@ -155,6 +155,7 @@ CMainWindow::~CMainWindow()
     cfg.setValue("MainWindow/geometry", saveGeometry());
 
     cfg.beginGroup("Canvas");
+    QList<CCanvas*> allCanvas;
     for(int i = 0; i < tabWidget->count(); i++)
     {
         CCanvas * canvas = dynamic_cast<CCanvas*>(tabWidget->widget(i));
@@ -166,6 +167,8 @@ CMainWindow::~CMainWindow()
         cfg.beginGroup(QString("Canvas%1").arg(i));
         canvas->saveConfig(cfg);
         cfg.endGroup();
+
+        allCanvas << canvas;
     }
 
     cfg.setValue("visibleCanvas", tabWidget->currentIndex());
@@ -181,6 +184,14 @@ CMainWindow::~CMainWindow()
     CDemDraw::saveDemPath(cfg);
     cfg.endGroup(); // Canvas
 
+    /*
+        Delete all canvas objects now to make sure they are destroyed before all
+        other objects. This allows children of the canvas to access central objects
+        like CGisWidget safely uppon their destruction. (e.g. CMouseRangeTrk to reset
+        it's track's draw mode by key)
+    */
+    qDeleteAll(allCanvas);
+
     QByteArray tz;
     IUnit::tz_mode_e tzmode;
     IUnit::getTimeZoneSetup(tzmode, tz);
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 3c3035a..aaaa497 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -74,10 +74,12 @@ set( SRCS
     mouse/CMouseMoveWpt.cpp
     mouse/CMouseEditTrk.cpp
     mouse/CMouseEditArea.cpp
+    mouse/CMouseRangeTrk.cpp
     mouse/CScrOptUnclutter.cpp    
     mouse/CScrOptPoint.cpp
     mouse/CScrOptEditLine.cpp
     mouse/CScrOptRange.cpp
+    mouse/CScrOptRangeTrk.cpp
     gis/WptIcons.cpp
     gis/CGisDraw.cpp
     gis/IGisItem.cpp
@@ -90,6 +92,7 @@ set( SRCS
     gis/trk/CGisItemTrk.cpp
     gis/trk/CScrOptTrk.cpp
     gis/trk/CDetailsTrk.cpp
+    gis/trk/CCombineTrk.cpp
     gis/rte/CGisItemRte.cpp
     gis/rte/CScrOptRte.cpp
     gis/ovl/CGisItemOvlArea.cpp
@@ -176,10 +179,12 @@ set( HDRS
     mouse/CMouseMoveWpt.h
     mouse/CMouseEditTrk.h
     mouse/CMouseEditArea.h
+    mouse/CMouseRangeTrk.h
     mouse/CScrOptUnclutter.h
     mouse/CScrOptPoint.h
     mouse/CScrOptEditLine.h
     mouse/CScrOptRange.h
+    mouse/CScrOptRangeTrk.h
     gis/WptIcons.h
     gis/CGisDraw.h
     gis/IGisItem.h
@@ -191,7 +196,8 @@ set( HDRS
     gis/wpt/CProjWpt.h
     gis/trk/CGisItemTrk.h
     gis/trk/CScrOptTrk.h
-    gis/trk/CDetailsTrk.cpp
+    gis/trk/CDetailsTrk.h
+    gis/trk/CCombineTrk.h
     gis/rte/CGisItemRte.h
     gis/rte/CScrOptRte.h
     gis/ovl/CGisItemOvlArea.h
@@ -231,6 +237,7 @@ set( UIS
     mouse/IScrOptPoint.ui
     mouse/IScrOptEditLine.ui
     mouse/IScrOptRange.ui
+    mouse/IScrOptRangeTrk.ui
     gis/IGisWidget.ui
     gis/wpt/IScrOptWpt.ui
     gis/wpt/IDetailsWpt.ui
@@ -238,6 +245,7 @@ set( UIS
     gis/wpt/IProjWpt.ui
     gis/trk/IScrOptTrk.ui
     gis/trk/IDetailsTrk.ui
+    gis/trk/ICombineTrk.ui
     gis/rte/IScrOptRte.ui
     gis/ovl/IScrOptOvlArea.ui
     gis/ovl/IDetailsOvlArea.ui
diff --git a/src/canvas/CCanvas.cpp b/src/canvas/CCanvas.cpp
index d14a1ed..6db7200 100644
--- a/src/canvas/CCanvas.cpp
+++ b/src/canvas/CCanvas.cpp
@@ -29,6 +29,7 @@
 #include "mouse/CMouseMoveWpt.h"
 #include "mouse/CMouseEditTrk.h"
 #include "mouse/CMouseEditArea.h"
+#include "mouse/CMouseRangeTrk.h"
 #include "gis/CGisWidget.h"
 #include "gis/CGisDraw.h"
 #include "gis/trk/CGisItemTrk.h"
@@ -181,6 +182,17 @@ void CCanvas::setMouseEditTrk(CGisItemTrk& trk)
     }
 }
 
+void CCanvas::setMouseRangeTrk(CGisItemTrk& trk)
+{
+    mouse->deleteLater();
+    mouse = new CMouseRangeTrk(trk, gis, this);
+    if(underMouse())
+    {
+        QApplication::restoreOverrideCursor();
+        QApplication::setOverrideCursor(*mouse);
+    }
+}
+
 void CCanvas::setMouseEditArea(const QPointF& pt)
 {
     mouse->deleteLater();
@@ -232,9 +244,9 @@ void CCanvas::reportStatus(const QString& key, const QString& msg)
     {
         labelStatusMessages->show();
         labelStatusMessages->setText(report);
-        labelStatusMessages->adjustSize();
-        update();
+        labelStatusMessages->adjustSize();        
     }
+    update();
 }
 
 void CCanvas::resizeEvent(QResizeEvent * e)
@@ -255,7 +267,7 @@ void CCanvas::resizeEvent(QResizeEvent * e)
     QPoint p2(demLoadIndicator->width()>>1, demLoadIndicator->height()>>1);
     demLoadIndicator->move(rect().center() - p2);
 
-    labelStatusMessages->move(20,20);
+    labelStatusMessages->move(20,50);
 
     if(plotTrackProfile)
     {
@@ -486,7 +498,7 @@ void CCanvas::drawStatusMessages(QPainter& p)
     {
         QRect r = labelStatusMessages->rect();
         r.adjust(-5, -5, 5, 5);
-        r.moveTopLeft(QPoint(15,15));
+        r.moveTopLeft(QPoint(15,45));
         p.setPen(CCanvas::penBorderGray);
         p.setBrush(CCanvas::brushBackWhite);
         p.drawRoundedRect(r, 5, 5);
diff --git a/src/canvas/CCanvas.h b/src/canvas/CCanvas.h
index dccb87d..e3d1851 100644
--- a/src/canvas/CCanvas.h
+++ b/src/canvas/CCanvas.h
@@ -100,10 +100,12 @@ class CCanvas : public QWidget
         void resetMouse();
         void setMouseMoveWpt(CGisItemWpt& wpt);
         void setMouseEditTrk(CGisItemTrk& trk);
+        void setMouseRangeTrk(CGisItemTrk& trk);
         void setMouseEditTrk(const QPointF& pt);        
         void setMouseEditArea(CGisItemOvlArea& area);
         void setMouseEditArea(const QPointF& pt);
 
+
         /**
            @brief Add a message by key to be reported on the canvas
 
diff --git a/src/cursors/cursorSelectRange.png b/src/cursors/cursorSelectRange.png
index 0741d16..f5617f9 100644
Binary files a/src/cursors/cursorSelectRange.png and b/src/cursors/cursorSelectRange.png differ
diff --git a/src/gis/CGisListWks.cpp b/src/gis/CGisListWks.cpp
index 174c10e..23e8545 100644
--- a/src/gis/CGisListWks.cpp
+++ b/src/gis/CGisListWks.cpp
@@ -46,6 +46,8 @@ CGisListWks::CGisListWks(QWidget *parent)
     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"));
     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()));
@@ -333,13 +335,17 @@ void CGisListWks::slotContextMenu(const QPoint& point)
         {
             actionFocusTrk->setVisible(false);
             actionEditTrk->setVisible(false);
+            actionReverseTrk->setVisible(false);
+            actionCombineTrk->setVisible(false);
         }
         else
         {
             actionFocusTrk->setVisible(true);
             actionEditTrk->setVisible(true);
+            actionReverseTrk->setVisible(true);
+            actionCombineTrk->setVisible(true);
             actionFocusTrk->setChecked(trk->hasUserFocus());
-            actionEditTrk->setEnabled(!trk->isReadOnly());
+            actionEditTrk->setEnabled(!trk->isReadOnly());            
         }
         // display menu
         QPoint p = mapToGlobal(point);
@@ -485,3 +491,27 @@ void CGisListWks::slotEditTrk()
     }
     IGisItem::mutexItems.unlock();
 }
+
+void CGisListWks::slotReverseTrk()
+{
+    IGisItem::mutexItems.lock();
+    CGisItemTrk * gisItem = dynamic_cast<CGisItemTrk*>(currentItem());
+    if(gisItem != 0)
+    {
+        QString key = gisItem->getKey();
+        CGisWidget::self().reverseTrkByKey(key);
+    }
+    IGisItem::mutexItems.unlock();
+}
+
+void CGisListWks::slotCombineTrk()
+{
+    IGisItem::mutexItems.lock();
+    CGisItemTrk * gisItem = dynamic_cast<CGisItemTrk*>(currentItem());
+    if(gisItem != 0)
+    {
+        QString key = gisItem->getKey();
+        CGisWidget::self().combineTrkByKey(key);
+    }
+    IGisItem::mutexItems.unlock();
+}
diff --git a/src/gis/CGisListWks.h b/src/gis/CGisListWks.h
index 4d7d139..185da30 100644
--- a/src/gis/CGisListWks.h
+++ b/src/gis/CGisListWks.h
@@ -51,6 +51,8 @@ class CGisListWks : public QTreeWidget
         void slotMoveWpt();        
         void slotFocusTrk(bool on);
         void slotEditTrk();
+        void slotReverseTrk();
+        void slotCombineTrk();
 
     private:
         QMenu * menuProject;
@@ -65,6 +67,9 @@ class CGisListWks : public QTreeWidget
         QAction * actionMoveWpt;
         QAction * actionFocusTrk;
         QAction * actionEditTrk;
+        QAction * actionReverseTrk;
+        QAction * actionCombineTrk;
+
 
 };
 
diff --git a/src/gis/CGisWidget.cpp b/src/gis/CGisWidget.cpp
index e15c5c6..cea7831 100644
--- a/src/gis/CGisWidget.cpp
+++ b/src/gis/CGisWidget.cpp
@@ -267,6 +267,34 @@ void CGisWidget::cutTrkByKey(const QString& key)
     emit sigChanged();
 }
 
+void CGisWidget::reverseTrkByKey(const QString& key)
+{
+    IGisItem::mutexItems.lock();
+
+    CGisItemTrk * trk = dynamic_cast<CGisItemTrk*>(getItemByKey(key));
+    if(trk)
+    {
+        trk->reverse();
+    }
+    IGisItem::mutexItems.unlock();
+    emit sigChanged();
+
+}
+
+void CGisWidget::combineTrkByKey(const QString& key)
+{
+    IGisItem::mutexItems.lock();
+
+    CGisItemTrk * trk = dynamic_cast<CGisItemTrk*>(getItemByKey(key));
+    if(trk)
+    {
+        trk->combine();
+    }
+    IGisItem::mutexItems.unlock();
+    emit sigChanged();
+
+}
+
 void CGisWidget::editTrkByKey(const QString& key)
 {
     IGisItem::mutexItems.lock();
@@ -284,6 +312,23 @@ void CGisWidget::editTrkByKey(const QString& key)
     IGisItem::mutexItems.unlock();
 }
 
+void CGisWidget::rangeTrkByKey(const QString& key)
+{
+    IGisItem::mutexItems.lock();
+
+    CGisItemTrk * trk = dynamic_cast<CGisItemTrk*>(getItemByKey(key));
+    if(trk != 0)
+    {
+        CCanvas * canvas = CMainWindow::self().getVisibleCanvas();
+        if(canvas != 0)
+        {
+            canvas->setMouseRangeTrk(*trk);
+        }
+    }
+
+    IGisItem::mutexItems.unlock();
+}
+
 void CGisWidget::editAreaByKey(const QString& key)
 {
     IGisItem::mutexItems.lock();
diff --git a/src/gis/CGisWidget.h b/src/gis/CGisWidget.h
index f893165..47787b2 100644
--- a/src/gis/CGisWidget.h
+++ b/src/gis/CGisWidget.h
@@ -116,8 +116,16 @@ class CGisWidget : public QWidget, private Ui::IGisWidget
 
         void editTrkByKey(const QString& key);
 
+        void reverseTrkByKey(const QString& key);
+
+        void combineTrkByKey(const QString& key);
+
+        void rangeTrkByKey(const QString& key);
+
         void editAreaByKey(const QString& key);
 
+
+
         /**
            @brief Select a project via dialog
 
diff --git a/src/gis/trk/CCombineTrk.cpp b/src/gis/trk/CCombineTrk.cpp
new file mode 100644
index 0000000..7b47244
--- /dev/null
+++ b/src/gis/trk/CCombineTrk.cpp
@@ -0,0 +1,205 @@
+/**********************************************************************************************
+    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/trk/CCombineTrk.h"
+#include "gis/trk/CGisItemTrk.h"
+#include "gis/CGisProject.h"
+#include "plot/CPlotTrack.h"
+
+#include <QtWidgets>
+
+CCombineTrk::CCombineTrk(CGisItemTrk& trk, CGisProject& project, QWidget * parent)
+    : QDialog(parent)
+    , trk(trk)
+    , project(project)
+{
+    setupUi(this);
+
+    const int N = project.childCount();
+    for(int i = 0; i < N; i++)
+    {
+        CGisItemTrk * trk1 = dynamic_cast<CGisItemTrk*>(project.child(i));
+        if(trk1 == 0)
+        {
+            continue;
+        }
+
+        if(trk.getKey() == trk1->getKey())
+        {
+            continue;
+        }
+
+        QListWidgetItem * item = new QListWidgetItem(listAvailable);
+        item->setText(trk1->getName());
+        item->setIcon(trk1->getIcon());
+        item->setData(Qt::UserRole, trk1->getKey());
+    }
+
+    QListWidgetItem * item = new QListWidgetItem(listSelected);
+    item->setText(trk.getName());
+    item->setIcon(trk.getIcon());
+    item->setData(Qt::UserRole, trk.getKey());
+
+    connect(listAvailable, SIGNAL(itemSelectionChanged()), this, SLOT(slotSelectionChanged()));
+    connect(listSelected, SIGNAL(itemSelectionChanged()), this, SLOT(slotSelectionChanged()));
+    connect(toolSelect, SIGNAL(clicked()), this, SLOT(slotSelect()));
+    connect(toolRemove, SIGNAL(clicked()), this, SLOT(slotRemove()));
+    connect(toolUp, SIGNAL(clicked()), this, SLOT(slotUp()));
+    connect(toolDown, SIGNAL(clicked()), this, SLOT(slotDown()));
+
+    listAvailable->setCurrentItem(0);
+    listSelected->setCurrentItem(0);
+
+    slotSelectionChanged();
+    updatePreview();
+
+}
+
+CCombineTrk::~CCombineTrk()
+{
+
+}
+
+void CCombineTrk::accept()
+{
+    for(int i = 0; i < listSelected->count(); i++)
+    {
+        QString key = listSelected->item(i)->data(Qt::UserRole).toString();
+        CGisItemTrk * trk1 = dynamic_cast<CGisItemTrk*>(project.getItemByKey(key));
+        if(trk1 == 0)
+        {
+            continue;
+        }
+        keys << key;
+    }
+
+    QDialog::accept();
+}
+
+void CCombineTrk::slotSelectionChanged()
+{
+    QListWidgetItem * item;
+    item = listAvailable->currentItem();
+    toolSelect->setEnabled(item != 0);
+
+    item = listSelected->currentItem();
+    toolRemove->setEnabled(item != 0);
+    toolUp->setEnabled(item != 0);
+    toolDown->setEnabled(item != 0);
+
+    if(item)
+    {
+        if(listSelected->row(item) == 0)
+        {
+            toolUp->setEnabled(false);
+        }
+        if(listSelected->row(item) == (listSelected->count() - 1))
+        {
+            toolDown->setEnabled(false);
+        }
+    }
+
+    buttonBox->button(QDialogButtonBox::Ok)->setEnabled(listSelected->count() > 1);
+}
+
+void CCombineTrk::slotSelect()
+{
+    QListWidgetItem * item;
+    item = listAvailable->currentItem();
+
+    if(item == 0)
+    {
+        return;
+    }
+
+    listAvailable->takeItem(listAvailable->row(item));
+    listSelected->addItem(item);
+
+    slotSelectionChanged();
+    updatePreview();
+}
+
+void CCombineTrk::slotRemove()
+{
+    QListWidgetItem * item;
+    item = listSelected->currentItem();
+
+    if((item == 0) || (item->data(Qt::UserRole).toString() == trk.getKey()))
+    {
+        return;
+    }
+
+    listSelected->takeItem(listSelected->row(item));
+    listAvailable->addItem(item);
+
+    slotSelectionChanged();
+    updatePreview();
+}
+
+void CCombineTrk::slotUp()
+{
+    QListWidgetItem * item = listSelected->currentItem();
+    if(item)
+    {
+        int row = listSelected->row(item);
+        if(row == 0) return;
+        listSelected->takeItem(row);
+        row = row - 1;
+        listSelected->insertItem(row,item);
+        listSelected->setCurrentItem(item);
+    }
+    updatePreview();
+
+}
+
+void CCombineTrk::slotDown()
+{
+    QListWidgetItem * item = listSelected->currentItem();
+    if(item)
+    {
+        int row = listSelected->row(item);
+        if(row == (listSelected->count() - 1)) return;
+        listSelected->takeItem(row);
+        row = row + 1;
+        listSelected->insertItem(row,item);
+        listSelected->setCurrentItem(item);
+    }
+
+    updatePreview();
+}
+
+void CCombineTrk::updatePreview()
+{
+    QPolygonF line;
+    for(int i = 0; i < listSelected->count(); i++)
+    {
+        QString key = listSelected->item(i)->data(Qt::UserRole).toString();
+        CGisItemTrk * trk1 = dynamic_cast<CGisItemTrk*>(project.getItemByKey(key));
+        if(trk1 == 0)
+        {
+            continue;
+        }
+        QPolygonF line1;
+        trk1->getData(line1);
+
+        line += line1;
+    }
+
+    plotTrack->setTrack(line);
+    plotTrack->update();
+}
diff --git a/src/gis/trk/CScrOptTrk.h b/src/gis/trk/CCombineTrk.h
similarity index 59%
copy from src/gis/trk/CScrOptTrk.h
copy to src/gis/trk/CCombineTrk.h
index 1ea7586..bdcecac 100644
--- a/src/gis/trk/CScrOptTrk.h
+++ b/src/gis/trk/CCombineTrk.h
@@ -16,36 +16,41 @@
 
 **********************************************************************************************/
 
-#ifndef CSCROPTTRK_H
-#define CSCROPTTRK_H
+#ifndef CCOMBINETRK_H
+#define CCOMBINETRK_H
 
-#include "mouse/IScrOpt.h"
-#include "ui_IScrOptTrk.h"
+#include <QDialog>
+#include "ui_ICombineTrk.h"
 
 class CGisItemTrk;
-class IMouse;
+class CGisProject;
 
-class CScrOptTrk : public IScrOpt, private Ui::IScrOptTrk
+class CCombineTrk : public QDialog, private Ui::ICombineTrk
 {
     Q_OBJECT
     public:
-        CScrOptTrk(CGisItemTrk * trk, const QPoint &point, IMouse *parent);
-        virtual ~CScrOptTrk();
+        CCombineTrk(CGisItemTrk& trk, CGisProject& project, QWidget * parent);
+        virtual ~CCombineTrk();
 
-        void draw(QPainter& p);
+        const QStringList& getTrackKeys(){return keys;}
 
-    private slots:        
-        void slotDelete();
-        void slotEditDetails();
-        void slotProfile(bool on);
-        void slotCut();
-        void slotEdit();
+    public slots:
+        void accept();
 
+    private slots:
+        void slotSelectionChanged();
+        void slotSelect();
+        void slotRemove();
+        void slotUp();
+        void slotDown();
 
     private:
-        QString key;
-        QPointF anchor;
+        void updatePreview();
+        CGisItemTrk& trk;
+        CGisProject& project;
+
+        QStringList keys;
 };
 
-#endif //CSCROPTTRK_H
+#endif //CCOMBINETRK_H
 
diff --git a/src/gis/trk/CDetailsTrk.cpp b/src/gis/trk/CDetailsTrk.cpp
index d61151f..e1ad9e7 100644
--- a/src/gis/trk/CDetailsTrk.cpp
+++ b/src/gis/trk/CDetailsTrk.cpp
@@ -129,7 +129,7 @@ void CDetailsTrk::setupGui()
                 }
             }
 
-            item->setText(eColNum,QString::number(trkpt.idx));
+            item->setText(eColNum,QString::number(trkpt.idxTotal));
             if(trkpt.time.isValid())
             {
                 item->setText(eColTime, IUnit::self().datetime2string(trkpt.time, true, QPointF(trkpt.lon, trkpt.lat)*DEG_TO_RAD));
@@ -226,7 +226,7 @@ void CDetailsTrk::setMouseClickFocus(const CGisItemTrk::trkpt_t * pt)
     if(pt != 0)
     {
         treeWidget->blockSignals(true);
-        treeWidget->setCurrentItem(treeWidget->topLevelItem(pt->idx));
+        treeWidget->setCurrentItem(treeWidget->topLevelItem(pt->idxTotal));
         treeWidget->blockSignals(false);
     }
 }
diff --git a/src/gis/trk/CGisItemTrk.cpp b/src/gis/trk/CGisItemTrk.cpp
index b22b741..011eaee 100644
--- a/src/gis/trk/CGisItemTrk.cpp
+++ b/src/gis/trk/CGisItemTrk.cpp
@@ -19,8 +19,10 @@
 #include "gis/trk/CGisItemTrk.h"
 #include "gis/trk/CScrOptTrk.h"
 #include "gis/trk/CDetailsTrk.h"
+#include "gis/trk/CCombineTrk.h"
 #include "gis/CGisProject.h"
 #include "gis/CGisDraw.h"
+#include "gis/CGisWidget.h"
 #include "plot/IPlot.h"
 #include "CMainWindow.h"
 #include "GeoMath.h"
@@ -100,24 +102,25 @@ 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(quint32 idx1, quint32 idx2, const trk_t& srctrk, CGisProject * project)
+CGisItemTrk::CGisItemTrk(const QString &name, quint32 idx1, quint32 idx2, const trk_t& srctrk, CGisProject * project)
     : IGisItem(project, eTypeTrk, -1)
     , penForeground(Qt::blue, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
+    , drawMode(eDrawNormal)
     , mouseMoveFocus(0)
     , mouseClickFocus(0)
 {
-    flags = eFlagCreatedInQms|eFlagWriteAllowed;
+    flags = eFlagCreatedInQms;
 
     foreach(const trkseg_t& srcseg, srctrk.segs)
     {
         trkseg_t seg;
         foreach(const trkpt_t& srcpt, srcseg.pts)
         {
-            if(srcpt.idx < idx1)
+            if(srcpt.idxTotal < idx1)
             {
                 continue;
             }
-            if(srcpt.idx > idx2)
+            if(srcpt.idxTotal > idx2)
             {
                 break;
             }
@@ -131,7 +134,7 @@ CGisItemTrk::CGisItemTrk(quint32 idx1, quint32 idx2, const trk_t& srctrk, CGisPr
         }
     }
 
-    trk.name    = srctrk.name + QString(" (%1 - %2)").arg(idx1).arg(idx2);
+    trk.name    = name;
     trk.cmt     = srctrk.cmt;
     trk.desc    = srctrk.desc;
     trk.src     = srctrk.src;
@@ -154,6 +157,7 @@ CGisItemTrk::CGisItemTrk(quint32 idx1, quint32 idx2, const trk_t& srctrk, CGisPr
 CGisItemTrk::CGisItemTrk(const CGisItemTrk& parentTrk, CGisProject * project, int idx)
     : IGisItem(project, eTypeTrk, idx)
     , penForeground(Qt::blue, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
+    , drawMode(eDrawNormal)
     , mouseMoveFocus(0)
     , mouseClickFocus(0)
 {
@@ -168,14 +172,15 @@ CGisItemTrk::CGisItemTrk(const CGisItemTrk& parentTrk, CGisProject * project, in
 }
 
 /// usd to create a track from a line of coordinates
-CGisItemTrk::CGisItemTrk(const QPolygonF& line, const QString& name, CGisProject * project, int idx)
+CGisItemTrk::CGisItemTrk(const QPolygonF& l, const QString& name, CGisProject * project, int idx)
     : IGisItem(project, eTypeTrk, idx)
     , penForeground(Qt::blue, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
+    , drawMode(eDrawNormal)
     , mouseMoveFocus(0)
     , mouseClickFocus(0)
 {
     trk.name = name;
-    readLine(line);
+    readLine(l);
 
     flags |=  eFlagCreatedInQms|eFlagWriteAllowed;
 
@@ -191,6 +196,7 @@ CGisItemTrk::CGisItemTrk(const QPolygonF& line, const QString& name, CGisProject
 CGisItemTrk::CGisItemTrk(const QDomNode& xml, CGisProject * project)
     : IGisItem(project, eTypeTrk, project->childCount())
     , penForeground(Qt::blue, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
+    , drawMode(eDrawNormal)
     , mouseMoveFocus(0)
     , mouseClickFocus(0)
 {        
@@ -223,7 +229,7 @@ CGisItemTrk::~CGisItemTrk()
 }
 
 
-void CGisItemTrk::setData(const QPolygonF &line)
+void CGisItemTrk::setData(const QPolygonF &l)
 {
     /*
         as this will change the line significantly we better stop
@@ -233,7 +239,7 @@ void CGisItemTrk::setData(const QPolygonF &line)
     mouseMoveFocus  = 0;
     delete dlgDetails;
 
-    readLine(line);
+    readLine(l);
 
     flags |= eFlagTainted;
     setText(1,"*");
@@ -242,9 +248,9 @@ void CGisItemTrk::setData(const QPolygonF &line)
     changed(QObject::tr("Changed trackpoints, sacrificed all previous data."));
 }
 
-void CGisItemTrk::getData(QPolygonF &line)
+void CGisItemTrk::getData(QPolygonF &l)
 {
-    line.clear();
+    l.clear();
     foreach (const trkseg_t& seg, trk.segs)
     {
         foreach(const trkpt_t& pt, seg.pts)
@@ -253,27 +259,27 @@ void CGisItemTrk::getData(QPolygonF &line)
             {
                 continue;
             }
-            line << QPointF(pt.lon * DEG_TO_RAD, pt.lat * DEG_TO_RAD);
+            l << QPointF(pt.lon * DEG_TO_RAD, pt.lat * DEG_TO_RAD);
         }
     }
 
 }
 
-void CGisItemTrk::readLine(const QPolygonF &line)
+void CGisItemTrk::readLine(const QPolygonF &l)
 {
     trk.segs.clear();
     trk.segs.resize(1);
     trkseg_t& seg = trk.segs.first();
 
-    seg.pts.resize(line.size());
+    seg.pts.resize(l.size());
 
-    QPolygonF ele(line.size());
-    CMainWindow::self().getEelevationAt(line, ele);
+    QPolygonF ele(l.size());
+    CMainWindow::self().getEelevationAt(l, ele);
 
-    for(int i = 0; i < line.size(); i++)
+    for(int i = 0; i < l.size(); i++)
     {
         trkpt_t& trkpt      = seg.pts[i];
-        const QPointF& pt   = line[i];
+        const QPointF& pt   = l[i];
 
         trkpt.lon = pt.x() * RAD_TO_DEG;
         trkpt.lat = pt.y() * RAD_TO_DEG;
@@ -365,6 +371,60 @@ QString CGisItemTrk::getInfo()
     return str;
 }
 
+QString CGisItemTrk::getInfoRange()
+{
+    qreal tmp, d, slope1, slope2;
+    QString str, val, unit;
+    if(mouseClickFocus == 0 || mouseMoveFocus == 0)
+    {
+        return str;
+    }
+
+    int idx1 = mouseClickFocus->idxTotal;
+    int idx2 = mouseMoveFocus->idxTotal;
+    const trkpt_t * pt1, * pt2;
+    if(idx1 < idx2)
+    {
+        pt1 = mouseClickFocus;
+        pt2 = mouseMoveFocus;
+    }
+    else
+    {
+        pt1 = mouseMoveFocus;
+        pt2 = mouseClickFocus;
+    }
+
+    d = tmp = pt2->distance - pt1->distance;
+    IUnit::self().meter2distance(tmp, val, unit);
+    str += QString("%3 %1%2\n").arg(val).arg(unit).arg(QChar(0x21A6));
+    if(pt1->time.isValid() && pt2->time.isValid())
+    {
+        quint32 t  = pt2->time.toTime_t() - pt1->time.toTime_t();
+        quint32 hh = t / 3600;
+        quint32 mm = (t - hh * 3600) / 60;
+        quint32 ss = (t - hh * 3600 - mm * 60);
+
+        str += QString("%4 %1:%2:%3\n").arg(hh,2,10,QChar('0')).arg(mm,2,10,QChar('0')).arg(ss,2,10,QChar('0')).arg(QChar(0x231a));
+    }
+
+    tmp       = atan((pt2->ascend - pt1->ascend)/d);
+    slope1    = qAbs(tmp * 360.0/(2 * M_PI));
+    slope2    = qTan(slope1 * DEG_TO_RAD) * 100;
+
+    IUnit::self().meter2elevation(pt2->ascend - pt1->ascend, val, unit);
+    str += QString("%3 %1%2 (%4%5, %6%)\n").arg(val).arg(unit).arg(QChar(0x2197)).arg(qRound(slope1)).arg(QChar(0260)).arg(qRound(slope2));
+
+    tmp       = atan((pt2->descend - pt1->descend)/d);
+    slope1    = qAbs(tmp * 360.0/(2 * M_PI));
+    slope2    = qTan(slope1 * DEG_TO_RAD) * 100;
+
+    IUnit::self().meter2elevation(pt2->descend - pt1->descend, val, unit);
+    str += QString("%3 %1%2 (%4%5, %6%)").arg(val).arg(unit).arg(QChar(0x2198)).arg(qRound(slope1)).arg(QChar(0260)).arg(qRound(slope2));
+
+
+    return str;
+}
+
 QString CGisItemTrk::getInfoTrkPt(const trkpt_t& pt)
 {
 
@@ -446,7 +506,7 @@ QPointF CGisItemTrk::getPointCloseBy(const QPoint& screenPos)
     qint32 i    = 0;
     qint32 idx  = -1;
     qint32  d   = NOINT;
-    foreach(const QPointF& point, line)
+    foreach(const QPointF& point, lineSimple)
     {
         int tmp = (screenPos - point).manhattanLength();
         if(tmp < d)
@@ -465,7 +525,7 @@ QPointF CGisItemTrk::getPointCloseBy(const QPoint& screenPos)
     const trkpt_t * newPointOfFocus = getVisibleTrkPtByIndex(idx);
     publishMouseFocus(newPointOfFocus, eFocusMouseClick, 0);
 
-    return line[idx];
+    return lineSimple[idx];
 }
 
 void CGisItemTrk::readTrk(const QDomNode& xml, trk_t& trk)
@@ -617,13 +677,13 @@ void CGisItemTrk::deriveSecondaryData()
         {
             trkpt_t& trkpt = seg.pts[p];
 
-            trkpt.idx = cntTotalPoints++;
+            trkpt.idxTotal = cntTotalPoints++;
             if(trkpt.flags & trkpt_t::eDeleted)
             {
                 trkpt.reset();
                 continue;
             }
-            cntVisiblePoints++;
+            trkpt.idxVisible = cntVisiblePoints++;
 
             if(trkpt.lon < west)  west    = trkpt.lon;
             if(trkpt.lon > east)  east    = trkpt.lon;
@@ -796,7 +856,7 @@ void CGisItemTrk::deriveSecondaryData()
 
 bool CGisItemTrk::isCloseTo(const QPointF& pos)
 {
-    foreach(const QPointF& pt, line)
+    foreach(const QPointF& pt, lineSimple)
     {
         if((pt - pos).manhattanLength() < MIN_DIST_CLOSE_TO)
         {
@@ -836,49 +896,303 @@ bool CGisItemTrk::cut()
         return false;
     }
 
+    QString name1 = getName() + QString(" (%1 - %2)").arg(0).arg(mouseClickFocus->idxTotal);
+    name1 = QInputDialog::getText(0, QObject::tr("Edit name..."), QObject::tr("Enter new track name."), QLineEdit::Normal, name1);
+    if(name1.isEmpty())
+    {
+        return false;
+    }
+    new CGisItemTrk(name1, 0, mouseClickFocus->idxTotal, trk, project);
 
-    new CGisItemTrk(0, mouseClickFocus->idx, trk, project);
-    new CGisItemTrk(mouseClickFocus->idx, cntTotalPoints-1, trk, project);
+    name1 = getName() + QString(" (%1 - %2)").arg(mouseClickFocus->idxTotal).arg(cntTotalPoints-1);
+    name1 = QInputDialog::getText(0, QObject::tr("Edit name..."), QObject::tr("Enter new track name."), QLineEdit::Normal, name1);
+    if(name1.isEmpty())
+    {
+        return false;
+    }
+    new CGisItemTrk(name1, mouseClickFocus->idxTotal, cntTotalPoints-1, trk, project);
 
     return true;
 }
 
+void CGisItemTrk::reverse()
+{
+    CGisProject * project = dynamic_cast<CGisProject*>(parent());
+    if(project == 0)
+    {
+        return;
+    }
+
+    QString name1 = QInputDialog::getText(0, QObject::tr("Edit name..."), QObject::tr("Enter new track name."), QLineEdit::Normal, getName() + "_rev");
+    if(name1.isEmpty())
+    {
+        return;
+    }
+
+    CGisItemTrk * trk1 = new CGisItemTrk(*this, project, -1);
+
+    trk1->trk.name = name1;
+    trk1->trk.segs.clear();
+    foreach(const trkseg_t& seg, trk.segs)
+    {
+        trkseg_t seg1;
+        foreach(const trkpt_t& pt, seg.pts)
+        {
+            trkpt_t pt1     = pt;
+            pt1.time        = QDateTime();
+
+            seg1.pts.push_front(pt1);
+        }
+        trk1->trk.segs.push_front(seg1);
+    }
+    trk1->deriveSecondaryData();
+    trk1->setText(0, trk1->getName());
+    trk1->setToolTip(0, trk1->getInfo());
+    trk1->setText(1,"*");
+    project->setText(1,"*");
+
+}
+
+void CGisItemTrk::combine()
+{
+    CGisProject * project = dynamic_cast<CGisProject*>(parent());
+    if(project == 0)
+    {
+        return;
+    }
+
+    CCombineTrk dlg(*this, *project, 0);
+    dlg.exec();
+
+    QStringList keys = dlg.getTrackKeys();
+    if(keys.isEmpty())
+    {
+        return;
+    }
+
+    QString name1 = QInputDialog::getText(0, QObject::tr("Edit name..."), QObject::tr("Enter new track name."), QLineEdit::Normal, getName() + " & other");
+    if(name1.isEmpty())
+    {
+        return;
+    }
+
+    CGisItemTrk * trk1 = new CGisItemTrk(*this, project, -1);
+
+    trk1->trk.name = name1;
+    trk1->trk.segs.clear();
+    foreach(const QString& key, keys)
+    {
+        CGisItemTrk * trk2 = dynamic_cast<CGisItemTrk*>(project->getItemByKey(key));
+        if(trk2 == 0)
+        {
+            continue;
+        }
+
+        trk1->trk.segs += trk2->trk.segs;
+    }
+
+    trk1->deriveSecondaryData();
+    trk1->setText(0, trk1->getName());
+    trk1->setToolTip(0, trk1->getInfo());
+    trk1->setText(1,"*");
+    project->setText(1,"*");
+
+}
+
+void CGisItemTrk::hideSelectedPoints()
+{
+
+    if((mouseClickFocus == 0) && (mouseMoveFocus == 0))
+    {
+        return;
+    }
+
+    quint32 idx1 = mouseClickFocus->idxTotal;
+    quint32 idx2 = mouseMoveFocus->idxTotal;
+
+    if(idx1 > idx2)
+    {
+        qSwap(idx1,idx2);
+    }
+
+    for(int s = 0; s < trk.segs.size(); s++)
+    {
+        trkseg_t& seg = trk.segs[s];
+        for(int i = 0; i < seg.pts.size(); i++)
+        {
+            trkpt_t& trkpt = seg.pts[i];
+
+            if((idx1 < trkpt.idxTotal) && (trkpt.idxTotal < idx2))
+            {
+                trkpt.flags |= trkpt_t::eDeleted;
+            }
+        }
+    }
+    mouseClickFocus = 0;
+    mouseMoveFocus  = 0;
+    deriveSecondaryData();
+    setToolTip(0, getInfo());
+    setText(1,"*");
+    parent()->setText(1,"*");
+}
+
+void CGisItemTrk::showSelectedPoints()
+{
+    if((mouseClickFocus == 0) && (mouseMoveFocus == 0))
+    {
+        return;
+    }
+
+    quint32 idx1 = mouseClickFocus->idxTotal;
+    quint32 idx2 = mouseMoveFocus->idxTotal;
+
+    if(idx1 > idx2)
+    {
+        qSwap(idx1,idx2);
+    }
+
+    for(int s = 0; s < trk.segs.size(); s++)
+    {
+        trkseg_t& seg = trk.segs[s];
+        for(int i = 0; i < seg.pts.size(); i++)
+        {
+            trkpt_t& trkpt = seg.pts[i];
+
+            if((idx1 < trkpt.idxTotal) && (trkpt.idxTotal < idx2))
+            {
+                trkpt.flags &= ~trkpt_t::eDeleted;
+            }
+        }
+    }
+    mouseClickFocus = 0;
+    mouseMoveFocus  = 0;
+    deriveSecondaryData();
+    setToolTip(0, getInfo());
+    setText(1,"*");
+    parent()->setText(1,"*");
+}
+
+void CGisItemTrk::copySelectedPoints()
+{
+    if((mouseClickFocus == 0) && (mouseMoveFocus == 0))
+    {
+        return;
+    }
+
+    quint32 idx1 = mouseClickFocus->idxTotal;
+    quint32 idx2 = mouseMoveFocus->idxTotal;
+
+    if(idx1 > idx2)
+    {
+        qSwap(idx1,idx2);
+    }
+
+    CGisProject * project = CGisWidget::self().selectProject();
+    if(project == 0)
+    {
+        return;
+    }
+
+    QString name1 = getName() + QString(" (%1 - %2)").arg(idx1).arg(idx2);
+    name1 = QInputDialog::getText(0, QObject::tr("Edit name..."), QObject::tr("Enter new track name."), QLineEdit::Normal, name1);
+    if(name1.isEmpty())
+    {
+        return;
+    }
+    new CGisItemTrk(name1, idx1, idx2, trk, project);
+}
+
 void CGisItemTrk::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &blockedAreas, CGisDraw *gis)
 {
-    line.clear();
+    lineSimple.clear();
+    lineFull.clear();
+
     if(!viewport.intersects(boundingRect))
     {
         return;
     }
 
-    QPointF     pt1;
-
+    QPointF pt1;
     QPointF p1 = viewport.topLeft();
     QPointF p2 = viewport.bottomRight();
     gis->convertRad2Px(p1);
     gis->convertRad2Px(p2);
     QRectF extViewport(p1,p2);
 
-    foreach (const trkseg_t& seg, trk.segs)
+    if(drawMode == eDrawNormal)
     {
-        foreach(const trkpt_t& pt, seg.pts)
+        // in normal mode the trackline without points marked as deleted is drawn
+        foreach (const trkseg_t& seg, trk.segs)
         {
-            if(pt.flags & trkpt_t::eDeleted)
+            foreach(const trkpt_t& pt, seg.pts)
             {
-                continue;
+                if(pt.flags & trkpt_t::eDeleted)
+                {
+                    continue;
+                }
+
+                pt1.setX(pt.lon);
+                pt1.setY(pt.lat);
+                pt1 *= DEG_TO_RAD;
+                lineSimple << pt1;
             }
+        }
+    }
+    else
+    {
+        // in full mode the complete track including points marked as deleted
+        // is drawn as gray line first. Then the track without points marked as
+        // deleted is drawn with it's configured color
+        foreach (const trkseg_t& seg, trk.segs)
+        {
+            foreach(const trkpt_t& pt, seg.pts)
+            {
+                pt1.setX(pt.lon);
+                pt1.setY(pt.lat);
+                pt1 *= DEG_TO_RAD;
 
-            pt1.setX(pt.lon);
-            pt1.setY(pt.lat);
-            pt1 *= DEG_TO_RAD;                       
-            line << pt1;
+                lineFull << pt1;
+
+                if(pt.flags & trkpt_t::eDeleted)
+                {
+                    continue;
+                }
+
+                lineSimple << pt1;
+            }
         }
     }
+    gis->convertRad2Px(lineSimple);
+    gis->convertRad2Px(lineFull);
+
+    // draw the full line first
+    if(drawMode == eDrawRange)
+    {
+        QList<QPolygonF> lines;
+        splitLineToViewport(lineFull, extViewport, lines);
+
+        p.setPen(QPen(Qt::lightGray,5,Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
+
+        foreach(const QPolygonF& l, lines)
+        {
+            p.drawPolyline(l);
+        }
 
-    gis->convertRad2Px(line);
+        QPixmap bullet("://icons/8x8/bullet_dark_gray.png");
+        foreach(const QPolygonF& l, lines)
+        {
+            foreach(const QPointF& pt, l)
+            {
+                p.drawPixmap(pt.x() - 3, pt.y() - 3, bullet);
+            }
+        }
+
+    }
+    // -------------------------
 
+    // draw the reduced track line
     QList<QPolygonF> lines;
-    splitLineToViewport(line, extViewport, lines);
+    splitLineToViewport(lineSimple, extViewport, lines);
 
     if(key == keyUserFocus)
     {
@@ -901,7 +1215,8 @@ void CGisItemTrk::drawItem(QPainter& p, const QRectF& viewport, QList<QRectF> &b
     foreach(const QPolygonF& l, lines)
     {
         p.drawPolyline(l);
-    }    
+    }
+    // -------------------------
 }
 
 void CGisItemTrk::drawItem(QPainter& p, const QRectF& viewport, CGisDraw * gis)
@@ -997,7 +1312,6 @@ void CGisItemTrk::drawItem(QPainter& p, const QRectF& viewport, CGisDraw * gis)
 
         p.drawPixmap(anchor - QPointF(4,4), QPixmap(bulletColors[colorIdx]));
     }
-
 }
 
 void CGisItemTrk::drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF> &blockedAreas, const QFontMetricsF &fm, CGisDraw *gis)
@@ -1008,12 +1322,35 @@ void CGisItemTrk::drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF> &
 
 void CGisItemTrk::drawHighlight(QPainter& p)
 {
-    if(line.isEmpty() || key == keyUserFocus)
+    if(lineSimple.isEmpty() || key == keyUserFocus)
     {
         return;
     }
     p.setPen(QPen(QColor(255,0,0,100),11,Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
-    p.drawPolyline(line);
+    p.drawPolyline(lineSimple);
+}
+
+void CGisItemTrk::drawRange(QPainter& p)
+{
+    if((mouseClickFocus != 0) && (mouseMoveFocus != 0))
+    {
+        int idx1 = mouseClickFocus->idxVisible;
+        int idx2 = mouseMoveFocus->idxVisible;
+
+        if(idx1 > idx2)
+        {
+            qSwap(idx1,idx2);
+        }
+
+        QPolygonF line = lineSimple.mid(idx1, idx2 - idx1 + 1);
+
+        p.setPen(QPen(Qt::red, 12, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
+        p.drawPolyline(line);
+        foreach(const QPointF& pt, line)
+        {
+            p.drawPixmap(pt.x() - 3, pt.y() - 3, bullet);
+        }
+    }
 }
 
 void CGisItemTrk::setName(const QString& str)
@@ -1149,11 +1486,12 @@ void CGisItemTrk::setMouseFocusByTime(quint32 time, focusmode_e mode, IPlot * in
 
 }
 
-void CGisItemTrk::setMouseFocusByPoint(const QPoint& pt, focusmode_e mode)
+QPointF CGisItemTrk::setMouseFocusByPoint(const QPoint& pt, focusmode_e mode)
 {
     const trkpt_t * newPointOfFocus = 0;
+    quint32 idx = 0;
 
-    if(hasUserFocus() && (pt != NOPOINT))
+    if((hasUserFocus() || (drawMode == eDrawRange)) && (pt != NOPOINT))
     {
         /*
             Iterate over the polyline used to draw the track as it contains screen
@@ -1164,10 +1502,9 @@ void CGisItemTrk::setMouseFocusByPoint(const QPoint& pt, focusmode_e mode)
             until the visible index is reached. This is done by getVisibleTrkPtByIndex().
         */
 
-        quint32 i   = 0;
-        quint32 idx = 0;
-        qint32 d    = NOINT;
-        foreach(const QPointF& point, line)
+        quint32 i = 0;
+        qint32 d  = NOINT;
+        foreach(const QPointF& point, lineSimple)
         {
             int tmp = (pt - point).manhattanLength();
             if(tmp < d)
@@ -1184,6 +1521,8 @@ void CGisItemTrk::setMouseFocusByPoint(const QPoint& pt, focusmode_e mode)
         }
     }
     publishMouseFocus(newPointOfFocus, mode, 0);
+
+    return newPointOfFocus ? lineSimple[idx] : NOPOINTF;
 }
 
 
@@ -1195,7 +1534,7 @@ void CGisItemTrk::setMouseFocusByIndex(quint32 idx, focusmode_e mode)
     {
         foreach(const trkpt_t& pt, seg.pts)
         {
-            if(pt.idx == idx)
+            if(pt.idxTotal == idx)
             {
                 newPointOfFocus = &pt;
                 publishMouseFocus(newPointOfFocus, mode, 0);
diff --git a/src/gis/trk/CGisItemTrk.h b/src/gis/trk/CGisItemTrk.h
index eada1ce..3d728fa 100644
--- a/src/gis/trk/CGisItemTrk.h
+++ b/src/gis/trk/CGisItemTrk.h
@@ -45,21 +45,29 @@ class CGisItemTrk : public IGisItem, public IGisLine
             ,eFocusMouseClick
         };
 
-        CGisItemTrk(quint32 idx1, quint32 idx2, const trk_t &srctrk, CGisProject * project);
+        enum drawmode_e
+        {
+              eDrawNormal
+            , 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& line, const QString &name, CGisProject * project, int idx);
+        CGisItemTrk(const QPolygonF& l, const QString &name, CGisProject * project, int idx);
         CGisItemTrk(const QDomNode &xml, CGisProject *project);
         virtual ~CGisItemTrk();
 
         const QString& getName(){return trk.name;}
         int getColorIdx(){return colorIdx;}
         QString getInfo();
+        QString getInfoRange();
         QString getInfoTrkPt(const trkpt_t& pt);
         QString getInfoProgress(const trkpt_t& pt);
         quint32 getTotalElapsedSeconds(){return totalElapsedSeconds;}
 
         void setName(const QString& str);
         void setColor(int idx);
+        void setDrawMode(drawmode_e mode){drawMode = mode;}
 
         IScrOpt * getScreenOptions(const QPoint &origin, IMouse * mouse);
         QPointF getPointCloseBy(const QPoint& screenPos);
@@ -69,10 +77,11 @@ class CGisItemTrk : public IGisItem, public IGisLine
         void drawItem(QPainter& p, const QRectF& viewport, CGisDraw * gis);
         void drawLabel(QPainter& p, const QRectF& viewport, QList<QRectF>& blockedAreas, const QFontMetricsF& fm, CGisDraw * gis);
         void drawHighlight(QPainter& p);
+        void drawRange(QPainter& p);
         void save(QDomNode& gpx);
 
-        void setData(const QPolygonF& line);
-        void getData(QPolygonF& line);
+        void setData(const QPolygonF& l);
+        void getData(QPolygonF& l);
 
         /**
            @brief Switch user focus on and off.
@@ -93,6 +102,28 @@ class CGisItemTrk : public IGisItem, public IGisLine
            @return Return true on success.
          */
         bool cut();
+
+        /**
+           @brief Reverse the complete track
+
+           @note All timestamps will be removed
+         */
+        void reverse();
+
+        /**
+           @brief Combine this track with several others.
+
+           Handle the complete process of selecting tracks, choosing the order and
+           the final name with dialogs.
+         */
+        void combine();
+
+        void hideSelectedPoints();
+
+        void showSelectedPoints();
+
+        void copySelectedPoints();
+
         /**
            @brief Check for user focus
 
@@ -146,7 +177,7 @@ class CGisItemTrk : public IGisItem, public IGisLine
 
            @param pt        a point on the screen in pixel.
          */
-        void setMouseFocusByPoint(const QPoint& pt, focusmode_e mode);
+        QPointF setMouseFocusByPoint(const QPoint& pt, focusmode_e mode);
 
         /**
            @brief Use point with given index counter
@@ -166,7 +197,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 &line);
+        void readLine(const QPolygonF &l);
 
     public:
         struct trkpt_t : public wpt_t
@@ -190,15 +221,14 @@ class CGisItemTrk : public IGisItem, public IGisLine
 
             enum flag_e
             {
-                 eSelected  = 0x00000001  ///< selected by track info view
-//                ,eCursor    = 0x00000002  ///< selected by cursor
-                ,eDeleted   = 0x00000004  ///< mark point as deleted
-//                ,eFocus     = 0x00000008  ///< mark current point of user focus
-                ,eAllowEdit = 0x80000000
+                eDeleted   = 0x00000004  ///< mark point as deleted
             };
 
             quint32 flags;
-            quint32 idx;
+            /// index within the complete track
+            quint32 idxTotal;
+            /// offset into lineSimple
+            qint32  idxVisible;
 
             /// the distance to the last point
             qreal deltaDistance;
@@ -254,6 +284,8 @@ class CGisItemTrk : public IGisItem, public IGisLine
 
         QPen penForeground;
 
+        drawmode_e drawMode;
+
         quint32     cntTotalPoints;
         quint32     cntVisiblePoints;
         QDateTime   timeStart;
@@ -271,7 +303,9 @@ class CGisItemTrk : public IGisItem, public IGisLine
         /// the track line color by index
         unsigned colorIdx;
         /// the current track line as screen pixel coordinates
-        QPolygonF line;
+        QPolygonF lineSimple;
+        /// visible and invisible points
+        QPolygonF lineFull;
 
         /**
             A list of plot objects that need to get informed on any change in data.
diff --git a/src/gis/trk/CScrOptTrk.cpp b/src/gis/trk/CScrOptTrk.cpp
index 231a1db..b504ba7 100644
--- a/src/gis/trk/CScrOptTrk.cpp
+++ b/src/gis/trk/CScrOptTrk.cpp
@@ -45,6 +45,9 @@ CScrOptTrk::CScrOptTrk(CGisItemTrk * trk, const QPoint& point, IMouse *parent)
     connect(toolProfile, SIGNAL(toggled(bool)), this, SLOT(slotProfile(bool)));
     connect(toolCut, SIGNAL(clicked()), this, SLOT(slotCut()));
     connect(toolEdit, SIGNAL(clicked()), this, SLOT(slotEdit()));
+    connect(toolReverse, SIGNAL(clicked()), this, SLOT(slotReverse()));
+    connect(toolCombine, SIGNAL(clicked()), this, SLOT(slotCombine()));
+    connect(toolRange, SIGNAL(clicked()), this, SLOT(slotRange()));
 }
 
 CScrOptTrk::~CScrOptTrk()
@@ -82,6 +85,25 @@ void CScrOptTrk::slotEdit()
     deleteLater();
 }
 
+void CScrOptTrk::slotReverse()
+{
+    CGisWidget::self().reverseTrkByKey(key);
+    deleteLater();
+}
+
+void CScrOptTrk::slotCombine()
+{
+    CGisWidget::self().combineTrkByKey(key);
+    deleteLater();
+
+}
+
+void CScrOptTrk::slotRange()
+{
+    CGisWidget::self().rangeTrkByKey(key);
+    deleteLater();
+}
+
 void CScrOptTrk::draw(QPainter& p)
 {
     IGisItem * item = CGisWidget::self().getItemByKey(key);
diff --git a/src/gis/trk/CScrOptTrk.h b/src/gis/trk/CScrOptTrk.h
index 1ea7586..5ac73d2 100644
--- a/src/gis/trk/CScrOptTrk.h
+++ b/src/gis/trk/CScrOptTrk.h
@@ -40,6 +40,9 @@ class CScrOptTrk : public IScrOpt, private Ui::IScrOptTrk
         void slotProfile(bool on);
         void slotCut();
         void slotEdit();
+        void slotReverse();
+        void slotCombine();
+        void slotRange();
 
 
     private:
diff --git a/src/gis/trk/ICombineTrk.ui b/src/gis/trk/ICombineTrk.ui
new file mode 100644
index 0000000..447f9a9
--- /dev/null
+++ b/src/gis/trk/ICombineTrk.ui
@@ -0,0 +1,266 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ICombineTrk</class>
+ <widget class="QDialog" name="ICombineTrk">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>473</width>
+    <height>369</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Combine Tracks...</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_3">
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QListWidget" name="listAvailable"/>
+     </item>
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout">
+       <item>
+        <spacer name="verticalSpacer_3">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QToolButton" name="toolSelect">
+         <property name="enabled">
+          <bool>false</bool>
+         </property>
+         <property name="text">
+          <string>...</string>
+         </property>
+         <property name="icon">
+          <iconset resource="../../resources.qrc">
+           <normaloff>:/icons/32x32/Right.png</normaloff>:/icons/32x32/Right.png</iconset>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QToolButton" name="toolRemove">
+         <property name="enabled">
+          <bool>false</bool>
+         </property>
+         <property name="text">
+          <string>...</string>
+         </property>
+         <property name="icon">
+          <iconset resource="../../resources.qrc">
+           <normaloff>:/icons/32x32/Left.png</normaloff>:/icons/32x32/Left.png</iconset>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QListWidget" name="listSelected"/>
+     </item>
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <spacer name="verticalSpacer_4">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QToolButton" name="toolUp">
+         <property name="enabled">
+          <bool>false</bool>
+         </property>
+         <property name="text">
+          <string>...</string>
+         </property>
+         <property name="icon">
+          <iconset resource="../../resources.qrc">
+           <normaloff>:/icons/32x32/Up.png</normaloff>:/icons/32x32/Up.png</iconset>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="verticalSpacer_5">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QToolButton" name="toolDown">
+         <property name="enabled">
+          <bool>false</bool>
+         </property>
+         <property name="text">
+          <string>...</string>
+         </property>
+         <property name="icon">
+          <iconset resource="../../resources.qrc">
+           <normaloff>:/icons/32x32/Down.png</normaloff>:/icons/32x32/Down.png</iconset>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="verticalSpacer_6">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <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>
+     <item>
+      <widget class="CPlotTrack" name="plotTrack" native="true">
+       <property name="minimumSize">
+        <size>
+         <width>150</width>
+         <height>150</height>
+        </size>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <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="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>CPlotTrack</class>
+   <extends>QWidget</extends>
+   <header>plot/CPlotTrack.h</header>
+   <container>1</container>
+  </customwidget>
+ </customwidgets>
+ <resources>
+  <include location="../../resources.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>ICombineTrk</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>ICombineTrk</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/src/gis/trk/IScrOptTrk.ui b/src/gis/trk/IScrOptTrk.ui
index c7722b7..8bb6506 100644
--- a/src/gis/trk/IScrOptTrk.ui
+++ b/src/gis/trk/IScrOptTrk.ui
@@ -49,6 +49,23 @@
       </widget>
      </item>
      <item>
+      <widget class="QToolButton" name="toolProfile">
+       <property name="toolTip">
+        <string>Show on-screen profile and detailed information about points.</string>
+       </property>
+       <property name="text">
+        <string>...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../../resources.qrc">
+         <normaloff>:/icons/32x32/TrkProfile.png</normaloff>:/icons/32x32/TrkProfile.png</iconset>
+       </property>
+       <property name="checkable">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
       <widget class="QToolButton" name="toolDelete">
        <property name="toolTip">
         <string>Delete</string>
@@ -70,47 +87,69 @@
       </widget>
      </item>
      <item>
-      <widget class="QToolButton" name="toolProfile">
+      <widget class="QToolButton" name="toolRange">
+       <property name="text">
+        <string>...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../../resources.qrc">
+         <normaloff>:/icons/32x32/SelectRange.png</normaloff>:/icons/32x32/SelectRange.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="toolEdit">
        <property name="toolTip">
-        <string>Show on-screen profile and detailed information about points.</string>
+        <string>Edit position of track points.</string>
        </property>
        <property name="text">
         <string>...</string>
        </property>
        <property name="icon">
         <iconset resource="../../resources.qrc">
-         <normaloff>:/icons/32x32/TrkProfile.png</normaloff>:/icons/32x32/TrkProfile.png</iconset>
+         <normaloff>:/icons/32x32/LineMove.png</normaloff>:/icons/32x32/LineMove.png</iconset>
        </property>
-       <property name="checkable">
-        <bool>true</bool>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="toolReverse">
+       <property name="toolTip">
+        <string>Reverse track.</string>
+       </property>
+       <property name="text">
+        <string>...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../../resources.qrc">
+         <normaloff>:/icons/32x32/Reverse.png</normaloff>:/icons/32x32/Reverse.png</iconset>
        </property>
       </widget>
      </item>
      <item>
-      <widget class="QToolButton" name="toolCut">
+      <widget class="QToolButton" name="toolCombine">
        <property name="toolTip">
-        <string>Cut track at selected point into two tracks.</string>
+        <string>Combine tracks.</string>
        </property>
        <property name="text">
         <string>...</string>
        </property>
        <property name="icon">
         <iconset resource="../../resources.qrc">
-         <normaloff>:/icons/32x32/TrkCut.png</normaloff>:/icons/32x32/TrkCut.png</iconset>
+         <normaloff>:/icons/32x32/Combine.png</normaloff>:/icons/32x32/Combine.png</iconset>
        </property>
       </widget>
      </item>
      <item>
-      <widget class="QToolButton" name="toolEdit">
+      <widget class="QToolButton" name="toolCut">
        <property name="toolTip">
-        <string>Edit position of track points.</string>
+        <string>Cut track at selected point into two tracks.</string>
        </property>
        <property name="text">
         <string>...</string>
        </property>
        <property name="icon">
         <iconset resource="../../resources.qrc">
-         <normaloff>:/icons/32x32/LineMove.png</normaloff>:/icons/32x32/LineMove.png</iconset>
+         <normaloff>:/icons/32x32/TrkCut.png</normaloff>:/icons/32x32/TrkCut.png</iconset>
        </property>
       </widget>
      </item>
diff --git a/src/icons/32x32/Combine.png b/src/icons/32x32/Combine.png
new file mode 100644
index 0000000..c753af3
Binary files /dev/null and b/src/icons/32x32/Combine.png differ
diff --git a/src/icons/32x32/Left.png b/src/icons/32x32/Left.png
new file mode 100644
index 0000000..c6047a5
Binary files /dev/null and b/src/icons/32x32/Left.png differ
diff --git a/src/icons/32x32/PointHide.png b/src/icons/32x32/PointHide.png
new file mode 100644
index 0000000..a749118
Binary files /dev/null and b/src/icons/32x32/PointHide.png differ
diff --git a/src/icons/32x32/PointShow.png b/src/icons/32x32/PointShow.png
new file mode 100644
index 0000000..870bdf0
Binary files /dev/null and b/src/icons/32x32/PointShow.png differ
diff --git a/src/icons/32x32/Reverse.png b/src/icons/32x32/Reverse.png
new file mode 100644
index 0000000..1bd284b
Binary files /dev/null and b/src/icons/32x32/Reverse.png differ
diff --git a/src/icons/32x32/SelectRange.png b/src/icons/32x32/SelectRange.png
index 1b41b92..b785f2d 100644
Binary files a/src/icons/32x32/SelectRange.png and b/src/icons/32x32/SelectRange.png differ
diff --git a/src/icons/48x48/Combine.png b/src/icons/48x48/Combine.png
new file mode 100644
index 0000000..b8f0991
Binary files /dev/null and b/src/icons/48x48/Combine.png differ
diff --git a/src/icons/48x48/Left.png b/src/icons/48x48/Left.png
new file mode 100644
index 0000000..414e372
Binary files /dev/null and b/src/icons/48x48/Left.png differ
diff --git a/src/icons/48x48/PointHide.png b/src/icons/48x48/PointHide.png
new file mode 100644
index 0000000..b97ad53
Binary files /dev/null and b/src/icons/48x48/PointHide.png differ
diff --git a/src/icons/48x48/PointShow.png b/src/icons/48x48/PointShow.png
new file mode 100644
index 0000000..197892a
Binary files /dev/null and b/src/icons/48x48/PointShow.png differ
diff --git a/src/icons/48x48/Reverse.png b/src/icons/48x48/Reverse.png
new file mode 100644
index 0000000..58b0228
Binary files /dev/null and b/src/icons/48x48/Reverse.png differ
diff --git a/src/icons/48x48/SelectRange.png b/src/icons/48x48/SelectRange.png
index 233ce9f..e4ede1e 100644
Binary files a/src/icons/48x48/SelectRange.png and b/src/icons/48x48/SelectRange.png differ
diff --git a/src/icons/Combine.svg b/src/icons/Combine.svg
new file mode 100644
index 0000000..8e01e59
--- /dev/null
+++ b/src/icons/Combine.svg
@@ -0,0 +1,120 @@
+<?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="Combine.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="7.919596"
+     inkscape:cx="21.972795"
+     inkscape:cy="31.160294"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="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="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="translate(0,-4)">
+      <rect
+         y="1027.494"
+         x="9.7728424"
+         height="5"
+         width="20"
+         id="rect2987"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none" />
+      <path
+         sodipodi:open="true"
+         sodipodi:end="9.4203312"
+         sodipodi:start="3.1402285"
+         transform="translate(-5.137872,993.99396)"
+         d="m 33.000005,36.006821 c -0.0038,-2.761421 2.231753,-5.003049 4.993174,-5.006816 2.761421,-0.0038 5.003049,2.231753 5.006816,4.993174 0.0038,2.761421 -2.231753,5.003049 -4.993174,5.006816 -2.755404,0.0038 -4.994519,-2.222382 -5.006772,-4.977761"
+         sodipodi:ry="5"
+         sodipodi:rx="5"
+         sodipodi:cy="36"
+         sodipodi:cx="38"
+         id="path2989"
+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:open="true"
+         sodipodi:end="7.8518428"
+         sodipodi:start="4.7086266"
+         transform="matrix(1.1421102,0,0,1.2655127,-8.991318,981.27173)"
+         d="m 39.475545,32.000046 c 3.589825,-0.01351 6.510903,2.885673 6.524409,6.475499 0.01351,3.589825 -2.885673,6.510903 -6.475499,6.524409 -0.0035,1.3e-5 -0.007,2.4e-5 -0.01055,3.1e-5"
+         sodipodi:ry="6.5"
+         sodipodi:rx="6.5"
+         sodipodi:cy="38.5"
+         sodipodi:cx="39.5"
+         id="path3759"
+         style="fill:none;stroke:#008000;stroke-width:4.61505318;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none"
+         sodipodi:type="arc" />
+      <rect
+         y="1027.4646"
+         x="42.100681"
+         height="5.0586071"
+         width="12.826465"
+         id="rect2987-9"
+         style="fill:#008000;fill-opacity:1;fill-rule:evenodd;stroke:#008000;stroke-width:0.94139314" />
+    </g>
+    <path
+       style="fill:#000080;stroke:#000000;stroke-width:1.56250179px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="m 6.0937514,1003.5878 7.8124996,0 0,-7.81257 7.812499,0 0,7.81257 7.8125,0 0,7.8124 -7.8125,0 0,7.8125 -7.812499,0 0,-7.8125 -7.8124996,0 z"
+       id="path3779"
+       inkscape:connector-curvature="0" />
+    <rect
+       style="fill:none;stroke:none"
+       id="rect3781"
+       width="50"
+       height="50"
+       x="5.3125005"
+       y="990.99396" />
+  </g>
+</svg>
diff --git a/src/icons/Left.svg b/src/icons/Left.svg
new file mode 100644
index 0000000..38ea694
--- /dev/null
+++ b/src/icons/Left.svg
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="64px"
+   height="64px"
+   id="svg3513"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="Right.svg">
+  <defs
+     id="defs3515">
+    <marker
+       inkscape:stockid="Arrow1Mstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mstart"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4038"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(0.4,0,0,0.4,4,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Mend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Mend"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path4041"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
+         transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.5"
+     inkscape:cx="32"
+     inkscape:cy="32.090909"
+     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" />
+  <metadata
+     id="metadata3518">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <path
+       style="fill:#000080;stroke:#000000;stroke-width:1.01764786;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 37.718453,40.918299 -19.82335,0 0,9.70925 -14.1590101,-16.90607 14.1590101,-17.0763 0,9.70925 19.82335,0 0,14.56387"
+       id="path3052-5"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccccc"
+       inkscape:export-filename="/home/oeichler/Code/android/QLandkarteM/QLandkarteM/icons/32x32/next.png"
+       inkscape:export-xdpi="83"
+       inkscape:export-ydpi="83" />
+  </g>
+</svg>
diff --git a/src/icons/SelectRange.svg b/src/icons/PointHide.svg
similarity index 51%
copy from src/icons/SelectRange.svg
copy to src/icons/PointHide.svg
index f1e86fa..94f7f62 100644
--- a/src/icons/SelectRange.svg
+++ b/src/icons/PointHide.svg
@@ -14,7 +14,7 @@
    id="svg3513"
    version="1.1"
    inkscape:version="0.48.4 r9939"
-   sodipodi:docname="SelectRange.svg">
+   sodipodi:docname="PointHide.svg">
   <defs
      id="defs3515">
     <marker
@@ -92,14 +92,14 @@
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="11"
-     inkscape:cx="46.804178"
-     inkscape:cy="23.220932"
+     inkscape:cx="0.74985782"
+     inkscape:cy="21.718796"
      inkscape:current-layer="layer1"
      showgrid="true"
      inkscape:document-units="px"
      inkscape:grid-bbox="true"
      inkscape:window-width="1920"
-     inkscape:window-height="1012"
+     inkscape:window-height="996"
      inkscape:window-x="-2"
      inkscape:window-y="-3"
      inkscape:window-maximized="1">
@@ -115,7 +115,7 @@
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
+        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
@@ -123,26 +123,76 @@
      id="layer1"
      inkscape:label="Layer 1"
      inkscape:groupmode="layer">
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 5,49 52,0"
-       id="path4223"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#000080;stroke:#000080;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 11,9 0,50"
-       id="path3002"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#000080;stroke:#000080;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="M 51,9.0909092 51,59.09091"
-       id="path3002-0"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#000080;stroke:#000080;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend)"
-       d="m 11,34 34,0"
-       id="path3024"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
+    <g
+       id="g3001"
+       transform="translate(-5.1263428e-7,-1.9999988)">
+      <path
+         sodipodi:nodetypes="cccccc"
+         inkscape:connector-curvature="0"
+         id="path3021"
+         d="m 51.954546,24.068177 -10,0 -9.999999,19 -10,-19 -10,0 10,0"
+         style="fill:none;stroke:#999999;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         transform="matrix(4.9999916,0,0,3.3333275,-56.999863,-27.643853)"
+         sodipodi:open="true"
+         sodipodi:end="7.8084814"
+         sodipodi:start="1.5578398"
+         d="m 16.012956,16.999874 c -0.552238,0.01073 -1.005717,-0.652082 -1.012872,-1.48044 -0.0072,-0.828357 0.434721,-1.508575 0.98696,-1.519308 0.552238,-0.01073 1.005717,0.652082 1.012872,1.48044 0.007,0.809359 -0.415372,1.481065 -0.954431,1.517882"
+         sodipodi:ry="1.5"
+         sodipodi:rx="1"
+         sodipodi:cy="15.5"
+         sodipodi:cx="16"
+         id="path3026"
+         style="fill:#ff0000;stroke:none"
+         sodipodi:type="arc" />
+      <path
+         transform="matrix(4.9999916,0,0,3.3333275,-38.090772,-27.780214)"
+         sodipodi:open="true"
+         sodipodi:end="7.8084814"
+         sodipodi:start="1.5578398"
+         d="m 16.012956,16.999874 c -0.552238,0.01073 -1.005717,-0.652082 -1.012872,-1.48044 -0.0072,-0.828357 0.434721,-1.508575 0.98696,-1.519308 0.552238,-0.01073 1.005717,0.652082 1.012872,1.48044 0.007,0.809359 -0.415372,1.481065 -0.954431,1.517882"
+         sodipodi:ry="1.5"
+         sodipodi:rx="1"
+         sodipodi:cy="15.5"
+         sodipodi:cx="16"
+         id="path3026-6"
+         style="fill:#ff0000;stroke:none"
+         sodipodi:type="arc" />
+      <path
+         transform="matrix(4.9999916,0,0,3.3333275,-48.090772,-8.280213)"
+         sodipodi:open="true"
+         sodipodi:end="7.8084814"
+         sodipodi:start="1.5578398"
+         d="m 16.012956,16.999874 c -0.552238,0.01073 -1.005717,-0.652082 -1.012872,-1.48044 -0.0072,-0.828357 0.434721,-1.508575 0.98696,-1.519308 0.552238,-0.01073 1.005717,0.652082 1.012872,1.48044 0.007,0.809359 -0.415372,1.481065 -0.954431,1.517882"
+         sodipodi:ry="1.5"
+         sodipodi:rx="1"
+         sodipodi:cy="15.5"
+         sodipodi:cx="16"
+         id="path3026-2"
+         style="fill:#999999;stroke:none"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3853"
+         d="m 11.954547,24.068167 10,0"
+         style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3855"
+         d="m 41.954546,24.022752 10,0"
+         style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3857"
+         d="m 21.954547,23.977268 19.999999,0"
+         style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+    </g>
+    <rect
+       style="fill:none;stroke:none"
+       id="rect3859"
+       width="44"
+       height="44"
+       x="9.954546"
+       y="9.636364" />
   </g>
 </svg>
diff --git a/src/icons/SelectRange.svg b/src/icons/PointShow.svg
similarity index 59%
copy from src/icons/SelectRange.svg
copy to src/icons/PointShow.svg
index f1e86fa..5947d1b 100644
--- a/src/icons/SelectRange.svg
+++ b/src/icons/PointShow.svg
@@ -14,7 +14,7 @@
    id="svg3513"
    version="1.1"
    inkscape:version="0.48.4 r9939"
-   sodipodi:docname="SelectRange.svg">
+   sodipodi:docname="PointShow.svg">
   <defs
      id="defs3515">
     <marker
@@ -92,14 +92,14 @@
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="11"
-     inkscape:cx="46.804178"
-     inkscape:cy="23.220932"
+     inkscape:cx="0.74985782"
+     inkscape:cy="34.683233"
      inkscape:current-layer="layer1"
      showgrid="true"
      inkscape:document-units="px"
      inkscape:grid-bbox="true"
      inkscape:window-width="1920"
-     inkscape:window-height="1012"
+     inkscape:window-height="996"
      inkscape:window-x="-2"
      inkscape:window-y="-3"
      inkscape:window-maximized="1">
@@ -115,7 +115,7 @@
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
+        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
@@ -123,26 +123,53 @@
      id="layer1"
      inkscape:label="Layer 1"
      inkscape:groupmode="layer">
-    <path
-       style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 5,49 52,0"
-       id="path4223"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#000080;stroke:#000080;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 11,9 0,50"
-       id="path3002"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#000080;stroke:#000080;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="M 51,9.0909092 51,59.09091"
-       id="path3002-0"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#000080;stroke:#000080;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend)"
-       d="m 11,34 34,0"
-       id="path3024"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cc" />
+    <g
+       id="g2998"
+       transform="translate(-5.1263428e-7,-1.8636831)">
+      <path
+         sodipodi:nodetypes="cccccc"
+         inkscape:connector-curvature="0"
+         id="path3021"
+         d="m 51.954546,24.068177 -10,0 -9.999999,19 -10,-19 -10,0 10,0"
+         style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+      <path
+         transform="matrix(4.9999916,0,0,3.3333275,-57.999866,-27.643851)"
+         sodipodi:open="true"
+         sodipodi:end="7.8084814"
+         sodipodi:start="1.5578398"
+         d="m 16.012956,16.999874 c -0.552238,0.01073 -1.005717,-0.652082 -1.012872,-1.48044 -0.0072,-0.828357 0.434721,-1.508575 0.98696,-1.519308 0.552238,-0.01073 1.005717,0.652082 1.012872,1.48044 0.007,0.809359 -0.415372,1.481065 -0.954431,1.517882"
+         sodipodi:ry="1.5"
+         sodipodi:rx="1"
+         sodipodi:cy="15.5"
+         sodipodi:cx="16"
+         id="path3026"
+         style="fill:#ff0000;stroke:none"
+         sodipodi:type="arc" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3026-6"
+         d="m 43.155442,28.976782 c -1.674983,0.0257 -3.060232,-0.800843 -3.841513,-1.723781 -1.335977,-1.585952 -1.536426,-3.537884 -0.806772,-5.274056 0.511251,-1.159446 1.537885,-2.332921 3.271612,-2.827458 1.387235,-0.405204 3.038707,-0.06746 4.052859,0.644023 1.613676,1.093903 2.246943,2.679675 2.257881,4.180199 -0.01,1.503052 -0.644825,3.092097 -2.262864,4.186897 -0.670763,0.443916 -1.552507,0.769248 -2.508598,0.809423"
+         style="fill:#ff0000;stroke:none" />
+      <path
+         transform="matrix(4.9999916,0,0,3.3333275,-48.09077,-8.643849)"
+         sodipodi:open="true"
+         sodipodi:end="7.8084814"
+         sodipodi:start="1.5578398"
+         d="m 16.012956,16.999874 c -0.552238,0.01073 -1.005717,-0.652082 -1.012872,-1.48044 -0.0072,-0.828357 0.434721,-1.508575 0.98696,-1.519308 0.552238,-0.01073 1.005717,0.652082 1.012872,1.48044 0.007,0.809359 -0.415372,1.481065 -0.954431,1.517882"
+         sodipodi:ry="1.5"
+         sodipodi:rx="1"
+         sodipodi:cy="15.5"
+         sodipodi:cx="16"
+         id="path3026-2"
+         style="fill:#ff0000;stroke:none"
+         sodipodi:type="arc" />
+    </g>
+    <rect
+       style="fill:none;stroke:none"
+       id="rect3859"
+       width="44"
+       height="44"
+       x="9.954546"
+       y="9.636364" />
   </g>
 </svg>
diff --git a/src/icons/Reverse.svg b/src/icons/Reverse.svg
new file mode 100644
index 0000000..2638195
--- /dev/null
+++ b/src/icons/Reverse.svg
@@ -0,0 +1,76 @@
+<?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="Reverse.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="11.2"
+     inkscape:cx="30.17267"
+     inkscape:cy="30.261621"
+     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)">
+    <path
+       style="fill:#000080;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 10.575768,1019.8759 39.205608,0 -17.820732,-17.7058 3.032802,11.3528 -24.52916,0.071 z"
+       id="path2987"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+    <path
+       style="fill:#000080;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 49.781375,1023.67 -39.205607,0 17.82073,17.7057 -3.300658,-11.3529 24.685536,0 z"
+       id="path2987-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="cccccc" />
+  </g>
+</svg>
diff --git a/src/icons/SelectRange.svg b/src/icons/SelectRange.svg
index f1e86fa..db406fd 100644
--- a/src/icons/SelectRange.svg
+++ b/src/icons/SelectRange.svg
@@ -92,14 +92,14 @@
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="11"
-     inkscape:cx="46.804178"
-     inkscape:cy="23.220932"
+     inkscape:cx="4.2132686"
+     inkscape:cy="35.664608"
      inkscape:current-layer="layer1"
      showgrid="true"
      inkscape:document-units="px"
      inkscape:grid-bbox="true"
      inkscape:window-width="1920"
-     inkscape:window-height="1012"
+     inkscape:window-height="996"
      inkscape:window-x="-2"
      inkscape:window-y="-3"
      inkscape:window-maximized="1">
@@ -115,7 +115,7 @@
         <dc:format>image/svg+xml</dc:format>
         <dc:type
            rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
+        <dc:title />
       </cc:Work>
     </rdf:RDF>
   </metadata>
@@ -124,25 +124,76 @@
      inkscape:label="Layer 1"
      inkscape:groupmode="layer">
     <path
-       style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 5,49 52,0"
+       style="fill:none;stroke:#ff0000;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 12.590982,42.90909 37.636219,0"
+       id="path2999"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:none;stroke:#0000ff;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 6,42.90909 52,0"
        id="path4223"
        inkscape:connector-curvature="0" />
     <path
-       style="fill:#000080;stroke:#000080;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="m 11,9 0,50"
+       style="fill:#000080;stroke:#000080;stroke-width:2.80589914;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="M 12,9.3576325 12,53.096912"
        id="path3002"
        inkscape:connector-curvature="0" />
     <path
-       style="fill:#000080;stroke:#000080;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
-       d="M 51,9.0909092 51,59.09091"
+       style="fill:#000080;stroke:#000080;stroke-width:2.82508969;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="M 52,8.8301885 52,53.169812"
        id="path3002-0"
        inkscape:connector-curvature="0" />
     <path
        style="fill:#000080;stroke:#000080;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Mend)"
-       d="m 11,34 34,0"
+       d="m 12,21.90909 34,0"
        id="path3024"
        inkscape:connector-curvature="0"
        sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#0000ff;fill-opacity:1;stroke:none"
+       id="path3802"
+       sodipodi:cx="-24.5"
+       sodipodi:cy="39.5"
+       sodipodi:rx="0.5"
+       sodipodi:ry="0.5"
+       d="m -25,39.500682 a 0.5,0.5 0 1 1 5e-6,0.0015"
+       sodipodi:start="3.1402285"
+       sodipodi:end="9.4203312"
+       sodipodi:open="true"
+       transform="matrix(14,0,0,14,355.00002,-509.9091)" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#0000ff;fill-opacity:1;stroke:none"
+       id="path3802-8"
+       sodipodi:cx="-24.5"
+       sodipodi:cy="39.5"
+       sodipodi:rx="0.5"
+       sodipodi:ry="0.5"
+       d="m -25,39.500682 a 0.5,0.5 0 1 1 5e-6,0.0015"
+       sodipodi:start="3.1402285"
+       sodipodi:end="9.4203312"
+       sodipodi:open="true"
+       transform="matrix(14,0,0,14,395.00001,-509.99999)" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#0000ff;fill-opacity:1;stroke:none"
+       id="path3802-0"
+       sodipodi:cx="-24.5"
+       sodipodi:cy="39.5"
+       sodipodi:rx="0.5"
+       sodipodi:ry="0.5"
+       d="m -25,39.500682 a 0.5,0.5 0 1 1 5e-6,0.0015"
+       sodipodi:start="3.1402285"
+       sodipodi:end="9.4203312"
+       sodipodi:open="true"
+       transform="matrix(14,0,0,14,375.09092,-510.00001)" />
+    <rect
+       style="fill:none;stroke:none"
+       id="rect3829"
+       width="60"
+       height="60"
+       x="2"
+       y="1" />
   </g>
 </svg>
diff --git a/src/locale/qmapshack_cs.ts b/src/locale/qmapshack_cs.ts
index 88fbf94..9379e3b 100644
--- a/src/locale/qmapshack_cs.ts
+++ b/src/locale/qmapshack_cs.ts
@@ -4,7 +4,7 @@
 <context>
     <name>CCanvas</name>
     <message>
-        <location filename="../canvas/CCanvas.cpp" line="58"/>
+        <location filename="../canvas/CCanvas.cpp" line="59"/>
         <source>Workspace %1</source>
         <translation>Pracovní oblast %1</translation>
     </message>
@@ -208,7 +208,17 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="51"/>
+        <location filename="../gis/CGisListWks.cpp" line="49"/>
+        <source>Reverse Track</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="50"/>
+        <source>Combine Tracks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="53"/>
         <source>Delete</source>
         <translation>Smazat</translation>
     </message>
@@ -229,12 +239,12 @@
 <context>
     <name>CMainWindow</name>
     <message>
-        <location filename="../CMainWindow.cpp" line="420"/>
+        <location filename="../CMainWindow.cpp" line="431"/>
         <source>Ele: %1%2</source>
         <translation>Výška: %1%2</translation>
     </message>
     <message>
-        <location filename="../CMainWindow.cpp" line="521"/>
+        <location filename="../CMainWindow.cpp" line="532"/>
         <source>Load GIS Data...</source>
         <translation>Nahrát data GIS...</translation>
     </message>
@@ -1041,27 +1051,56 @@ Unknown structure.</source>
     </message>
     <message>
         <location filename="../map/CMapWMTS.cpp" line="323"/>
-        <source>%1: %2 tiles pending</source>
+        <source><b>%1</b>: %2 tiles pending<br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>CMouseEditArea</name>
+    <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>
+    </message>
+</context>
+<context>
+    <name>CMouseEditTrk</name>
+    <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>
     </message>
 </context>
 <context>
     <name>CMouseNormal</name>
     <message>
-        <location filename="../mouse/CMouseNormal.cpp" line="41"/>
+        <location filename="../mouse/CMouseNormal.cpp" line="42"/>
         <source>Add Waypoint</source>
         <translation>Přidat cestovní bod</translation>
     </message>
     <message>
-        <location filename="../mouse/CMouseNormal.cpp" line="42"/>
+        <location filename="../mouse/CMouseNormal.cpp" line="43"/>
         <source>Add Track</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../mouse/CMouseNormal.cpp" line="43"/>
+        <location filename="../mouse/CMouseNormal.cpp" line="44"/>
         <source>Add Area</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../mouse/CMouseNormal.cpp" line="46"/>
+        <source>Copy position</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>CMouseRangeTrk</name>
+    <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>
+    </message>
 </context>
 <context>
     <name>CPlotDistance</name>
@@ -1232,6 +1271,22 @@ není platným vymezením soustavy souřadnic
     </message>
 </context>
 <context>
+    <name>ICombineTrk</name>
+    <message>
+        <location filename="../gis/trk/ICombineTrk.ui" line="14"/>
+        <source>Combine Tracks...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/ICombineTrk.ui" line="43"/>
+        <location filename="../gis/trk/ICombineTrk.ui" line="70"/>
+        <location filename="../gis/trk/ICombineTrk.ui" line="117"/>
+        <location filename="../gis/trk/ICombineTrk.ui" line="144"/>
+        <source>...</source>
+        <translation type="unfinished">...</translation>
+    </message>
+</context>
+<context>
     <name>IDemPathSetup</name>
     <message>
         <location filename="../dem/IDemPathSetup.ui" line="14"/>
@@ -1913,22 +1968,22 @@ není platným vymezením soustavy souřadnic
 <context>
     <name>IMouseEditLine</name>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="240"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="309"/>
         <source>Add points?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="240"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="309"/>
         <source>Add points to temporary line?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="652"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="758"/>
         <source>Warning!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="652"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="758"/>
         <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>
@@ -2160,6 +2215,41 @@ nebo
     </message>
 </context>
 <context>
+    <name>IScrOptRangeTrk</name>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished">Formulář</translation>
+    </message>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="40"/>
+        <source>Hide all points.</source>
+        <translation type="unfinished"></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>
+    </message>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="54"/>
+        <source>Show all points.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="68"/>
+        <source>Copy track points as new track.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="103"/>
+        <source>TextLabel</source>
+        <translation type="unfinished">Textový štítek</translation>
+    </message>
+</context>
+<context>
     <name>IScrOptRte</name>
     <message>
         <location filename="../gis/rte/IScrOptRte.ui" line="14"/>
@@ -2201,35 +2291,48 @@ nebo
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="54"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="71"/>
         <source>Delete</source>
         <translation type="unfinished">Smazat</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="75"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="54"/>
         <source>Show on-screen profile and detailed information about points.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="92"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="145"/>
         <source>Cut track at selected point into two tracks.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="106"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="103"/>
         <source>Edit position of track points.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="117"/>
+        <source>Reverse track.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="131"/>
+        <source>Combine tracks.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
         <source><html><head/><body><p>View details &amp; Edit</p></body></html></source>
         <translation type="obsolete"><html><head/><body><p>Zobrazit podrobnosti a upravit</p></body></html></translation>
     </message>
     <message>
         <location filename="../gis/trk/IScrOptTrk.ui" line="43"/>
         <location filename="../gis/trk/IScrOptTrk.ui" line="57"/>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="78"/>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="95"/>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="109"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="74"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="92"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="106"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="120"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="134"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="148"/>
         <source>...</source>
         <translation>...</translation>
     </message>
@@ -2238,7 +2341,7 @@ nebo
         <translation type="obsolete"><html><head/><body><p>Smazat</p></body></html></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="135"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="174"/>
         <source>TextLabel</source>
         <translation>Textový štítek</translation>
     </message>
@@ -2561,48 +2664,48 @@ line %2, column %3:
         <translation>Režim pouze pro čtení...</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="319"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="325"/>
         <source>Length: %1 %2</source>
         <translation>Délka: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="326"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="332"/>
         <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="334"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="340"/>
         <source>Time: %1</source>
         <translation>Čas: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="337"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="347"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="343"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
         <source>, Speed: %1 %2</source>
         <translation>, Rychlost: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="344"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="350"/>
         <source>Moving: %1</source>
         <translation>Pohyb: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="359"/>
         <source>Start: %1</source>
         <translation>Začátek: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="358"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="364"/>
         <source>End: %1</source>
         <translation>Konec: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="362"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="368"/>
         <source>Points: %1 (%2)</source>
         <translation>Body: %1 (%2)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="374"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="434"/>
         <source>Ele.: %1 %2</source>
         <translation>Výška: %1 %2</translation>
     </message>
@@ -2611,57 +2714,57 @@ line %2, column %3:
         <translation type="obsolete"> sklon: %1°(%2%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="382"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="442"/>
         <source> speed: %1%2</source>
         <translation> rychlost: %1%2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="394"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="454"/>
         <source>Ascend: %1%2 (%3%)</source>
         <translation>Stoupání: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="398"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="458"/>
         <source>Ascend: - (-)</source>
         <translation>Stoupání: - (-)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="408"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="468"/>
         <source> Descend: - (-) </source>
         <translation> Klesání: - (-) </translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="429"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="489"/>
         <source> Moving: - (-) </source>
         <translation> Pohyb: - (-) </translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="404"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="464"/>
         <source> Descend: %1%2 (%3%)</source>
         <translation> Klesání: %1%2 (%3%) </translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="242"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="248"/>
         <source>Changed trackpoints, sacrificed all previous data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="377"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="437"/>
         <source> slope: %1° (%2%)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="415"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="475"/>
         <source>Dist.: %1%2 (%3%)</source>
         <translation>Vzdálenost: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="419"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="479"/>
         <source>Dist.: - (-)</source>
         <translation>Vzdálenost: - (-)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="425"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="485"/>
         <source> Moving: %1%2 (%3%)</source>
         <translation> Pohyb: %1%2 (%3%) </translation>
     </message>
@@ -2722,30 +2825,35 @@ line %2, column %3:
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="534"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1034"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1371"/>
         <source>Changed color</source>
         <translation>Změněná barva</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="237"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="240"/>
         <source>Elevation: %1 %2</source>
         <translation>Výška: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="245"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="248"/>
         <source>Proximity: %1 %2</source>
         <translation>Blízkost: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1023"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="310"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1360"/>
+        <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/trk/CGisItemTrk.cpp" line="926"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="973"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1097"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="194"/>
-        <location filename="../mouse/CMouseEditArea.cpp" line="78"/>
-        <location filename="../mouse/CMouseEditTrk.cpp" line="84"/>
+        <location filename="../mouse/CMouseEditArea.cpp" line="86"/>
+        <location filename="../mouse/CMouseEditTrk.cpp" line="91"/>
         <source>Edit name...</source>
         <translation>Upravit název...</translation>
     </message>
@@ -2755,47 +2863,47 @@ line %2, column %3:
         <translation>Zadat nový název pro cestovní bod.</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="317"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="320"/>
         <source>Changed position</source>
         <translation>Změněná poloha</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="323"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="326"/>
         <source>Changed elevation</source>
         <translation>Změněná výška</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="329"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="332"/>
         <source>Changed proximity</source>
         <translation>Změněná blízkost</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="337"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="340"/>
         <source>Changed icon</source>
         <translation>Změněná ikona</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="343"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="346"/>
         <source>Changed comment</source>
         <translation>Změněná poznámka</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="349"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="352"/>
         <source>Changed description</source>
         <translation>Změněný popis</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="392"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="395"/>
         <source>Archived</source>
         <translation>Archivováno</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="396"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="399"/>
         <source>Available</source>
         <translation>Dostupné</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="400"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="403"/>
         <source>Not Available</source>
         <translation>Nedostupné</translation>
     </message>
@@ -2816,8 +2924,13 @@ 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="../mouse/CMouseEditArea.cpp" line="78"/>
-        <location filename="../mouse/CMouseEditTrk.cpp" line="84"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="900"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="908"/>
+        <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"/>
         <source>Enter new track name.</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/src/locale/qmapshack_de.ts b/src/locale/qmapshack_de.ts
index d48f6bb..1b06954 100644
--- a/src/locale/qmapshack_de.ts
+++ b/src/locale/qmapshack_de.ts
@@ -4,7 +4,7 @@
 <context>
     <name>CCanvas</name>
     <message>
-        <location filename="../canvas/CCanvas.cpp" line="58"/>
+        <location filename="../canvas/CCanvas.cpp" line="59"/>
         <source>Workspace %1</source>
         <translation>Ansicht %1</translation>
     </message>
@@ -27,7 +27,7 @@
     <message>
         <location filename="../dem/CDemPathSetup.cpp" line="39"/>
         <source>Add or remove paths containing DEM data. There can be multiple files in a path but no sub-path is parsed. Supported formats are: %1</source>
-        <translation>Hinzufügen oder entfernen von Verzeichnissen mit DEM Daten. Im Verzeichnis können mehrere Dateien vorliegen. Allerdings wird kein Unterverzeichnis durchsucht. Unterstützte Formate sind: %1</translation>
+        <translation>Hinzufügen oder Entfernen von Verzeichnissen mit DEM Daten. Im Verzeichnis können mehrere Dateien vorliegen. Allerdings wird kein Unterverzeichnis durchsucht. Unterstützte Formate sind: %1</translation>
     </message>
     <message>
         <location filename="../dem/CDemPathSetup.cpp" line="55"/>
@@ -54,7 +54,11 @@
         <location filename="../dem/CDemVRT.cpp" line="51"/>
         <location filename="../dem/CDemVRT.cpp" line="60"/>
         <source>DEM must have one band with 16bit or 32bit data.</source>
-        <translation>Das DEM muss aus einem Satz mit 16 oder 32Bit Daten bestehen.</translation>
+        <translation>DEM muss aus einem Satz mit 16 bit oder 32 bit Daten bestehen.</translation>
+    </message>
+    <message>
+        <source>DEM must have one band with 16 bit or 32 bit data.</source>
+        <translation type="obsolete">Das DEM muss aus einem Satz mit 16 bit oder 32 bit Daten bestehen.</translation>
     </message>
     <message>
         <location filename="../dem/CDemVRT.cpp" line="84"/>
@@ -81,32 +85,32 @@
     <message>
         <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="127"/>
         <source>Edit name...</source>
-        <translation type="unfinished">Name ändern...</translation>
+        <translation>Name ändern...</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="127"/>
         <source>Enter new waypoint name.</source>
-        <translation type="unfinished">Geben Sie einen neuen Namen ein.</translation>
+        <translation>Geben Sie einen neuen Namen ein.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="222"/>
         <source><h4>Comment:</h4></source>
-        <translation type="unfinished"><h4>Kommentar:</h4></translation>
+        <translation><h4>Kommentar:</h4></translation>
     </message>
     <message>
         <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="225"/>
         <source><p>--- no comment ---</p></source>
-        <translation type="unfinished"><p>--- kein Kommentar ---</p></translation>
+        <translation><p>--- kein Kommentar ---</p></translation>
     </message>
     <message>
         <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="232"/>
         <source><h4>Description:</h4></source>
-        <translation type="unfinished"><h4>Beschreibung:</h4></translation>
+        <translation><h4>Beschreibung:</h4></translation>
     </message>
     <message>
         <location filename="../gis/ovl/CDetailsOvlArea.cpp" line="235"/>
         <source><p>--- no description ---</p></source>
-        <translation type="unfinished"><p>--- keine Beschreibung ---</p></translation>
+        <translation><p>--- keine Beschreibung ---</p></translation>
     </message>
 </context>
 <context>
@@ -220,7 +224,17 @@
         <translation>Wegpunkte bearbeiten</translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="51"/>
+        <location filename="../gis/CGisListWks.cpp" line="49"/>
+        <source>Reverse Track</source>
+        <translation>Track umkehren</translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="50"/>
+        <source>Combine Tracks</source>
+        <translation>Tracks verbinden</translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="53"/>
         <source>Delete</source>
         <translation>Löschen</translation>
     </message>
@@ -241,12 +255,12 @@
 <context>
     <name>CMainWindow</name>
     <message>
-        <location filename="../CMainWindow.cpp" line="420"/>
+        <location filename="../CMainWindow.cpp" line="431"/>
         <source>Ele: %1%2</source>
         <translation>Höhe: %1%2</translation>
     </message>
     <message>
-        <location filename="../CMainWindow.cpp" line="521"/>
+        <location filename="../CMainWindow.cpp" line="532"/>
         <source>Load GIS Data...</source>
         <translation>Lade GIS Daten...</translation>
     </message>
@@ -321,8 +335,7 @@
     <message>
         <location filename="../map/CMapIMG.cpp" line="168"/>
         <source>Welsh</source>
-        <translatorcomment>?</translatorcomment>
-        <translation></translation>
+        <translation>Walisisch</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="169"/>
@@ -392,47 +405,48 @@
     <message>
         <location filename="../map/CMapIMG.cpp" line="182"/>
         <source>Estonian</source>
-        <translation></translation>
+        <translation>Estnisch</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="183"/>
         <source>Latvian</source>
-        <translation></translation>
+        <translation>Lettisch</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="184"/>
         <source>Romanian</source>
-        <translation></translation>
+        <translation>Rumänisch</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="185"/>
         <source>Albanian</source>
-        <translation></translation>
+        <translatorcomment>Albanisch</translatorcomment>
+        <translation>Albanisch</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="186"/>
         <source>Bosnian</source>
-        <translation></translation>
+        <translation>Bosnisch</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="187"/>
         <source>Lithuanian</source>
-        <translation></translation>
+        <translation>Litauisch</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="188"/>
         <source>Serbian</source>
-        <translation></translation>
+        <translation>Serbisch</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="189"/>
         <source>Macedonian</source>
-        <translation></translation>
+        <translation>Makedonisch</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="190"/>
         <source>Bulgarian</source>
-        <translation></translation>
+        <translation>Bulgarisch</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="247"/>
@@ -497,7 +511,7 @@
     <message>
         <location filename="../map/CMapIMG.cpp" line="259"/>
         <source>Railroad</source>
-        <translation>Einsenbahn</translation>
+        <translation>Eisenbahn</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="260"/>
@@ -517,7 +531,7 @@
     <message>
         <location filename="../map/CMapIMG.cpp" line="263"/>
         <source>Time zone</source>
-        <translation></translation>
+        <translation>Zeitzone</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="264"/>
@@ -548,32 +562,32 @@
     <message>
         <location filename="../map/CMapIMG.cpp" line="270"/>
         <source>Minor land contour</source>
-        <translation></translation>
+        <translation>Höhenlinie klein</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="271"/>
         <source>Intermediate land contour</source>
-        <translation></translation>
+        <translation>Höhenlinie mittel</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="272"/>
         <source>Major land contour</source>
-        <translation></translation>
+        <translation>Höhenlinie groß</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="273"/>
         <source>Minor depth contour</source>
-        <translation></translation>
+        <translation>Tiefenlinie klein</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="274"/>
         <source>Intermediate depth contour</source>
-        <translation></translation>
+        <translation>Tiefenlinie mittel</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="275"/>
         <source>Major depth contour</source>
-        <translation></translation>
+        <translation>Tiefenlinie groß</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="276"/>
@@ -584,7 +598,7 @@
         <location filename="../map/CMapIMG.cpp" line="277"/>
         <location filename="../map/CMapIMG.cpp" line="359"/>
         <source>Airport runway</source>
-        <translation></translation>
+        <translation>Landebahn</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="278"/>
@@ -624,17 +638,17 @@
     <message>
         <location filename="../map/CMapIMG.cpp" line="349"/>
         <source>Military base</source>
-        <translation></translation>
+        <translation>Militärbasis</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="350"/>
         <source>Parking lot</source>
-        <translation></translation>
+        <translation>Parkplatz</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="351"/>
         <source>Parking garage</source>
-        <translation></translation>
+        <translation>Parkhaus</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="352"/>
@@ -644,7 +658,7 @@
     <message>
         <location filename="../map/CMapIMG.cpp" line="353"/>
         <source>Shopping center</source>
-        <translation></translation>
+        <translation>Einkaufszentrum</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="354"/>
@@ -654,7 +668,7 @@
     <message>
         <location filename="../map/CMapIMG.cpp" line="355"/>
         <source>University/College</source>
-        <translation></translation>
+        <translation>Universität/Hochschule</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="356"/>
@@ -664,12 +678,12 @@
     <message>
         <location filename="../map/CMapIMG.cpp" line="357"/>
         <source>Industrial complex</source>
-        <translation></translation>
+        <translation>Industrie</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="358"/>
         <source>Reservation</source>
-        <translation></translation>
+        <translation>Schutzgebiet</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="360"/>
@@ -679,12 +693,12 @@
     <message>
         <location filename="../map/CMapIMG.cpp" line="361"/>
         <source>Sports complex</source>
-        <translation></translation>
+        <translation>Sportanlage</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="362"/>
         <source>Golf course</source>
-        <translation></translation>
+        <translation>Golfplatz</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="363"/>
@@ -696,12 +710,12 @@
         <location filename="../map/CMapIMG.cpp" line="365"/>
         <location filename="../map/CMapIMG.cpp" line="366"/>
         <source>National park</source>
-        <translation></translation>
+        <translation>Nationalpark</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="367"/>
         <source>City park</source>
-        <translation></translation>
+        <translation>Stadtpark</translation>
     </message>
     <message>
         <location filename="../map/CMapIMG.cpp" line="368"/>
@@ -997,7 +1011,7 @@
     <message>
         <location filename="../map/CMapVRT.cpp" line="88"/>
         <source>File must be 8 bit palette or gray indexed.</source>
-        <translation>Die Datei muss eine 8Bit Palette haben, oder Graustufen.</translation>
+        <translation>Die Datei muss eine 8 bit Palette haben, oder Graustufen.</translation>
     </message>
     <message>
         <location filename="../map/CMapVRT.cpp" line="123"/>
@@ -1049,8 +1063,12 @@ Unbekannte Struktur.</translation>
     </message>
     <message>
         <location filename="../map/CMapWMTS.cpp" line="323"/>
+        <source><b>%1</b>: %2 tiles pending<br/></source>
+        <translation><b>%1</b>: %2 unerledigte Kacheln<br/></translation>
+    </message>
+    <message>
         <source>%1: %2 tiles pending</source>
-        <translation>%1: %2 unerledigte Kacheln</translation>
+        <translation type="obsolete">%1: %2 unerledigte Kacheln</translation>
     </message>
     <message>
         <source>Unexpexted service. 'OGC WMTS 1.0.0' is expected. '%1 %2' is read.</source>
@@ -1063,8 +1081,24 @@ Unbekannte Struktur.</translation>
     </message>
 </context>
 <context>
+    <name>CMouseEditArea</name>
+    <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>
+    </message>
+</context>
+<context>
     <name>CMouseEditLine</name>
     <message>
+        <source>Add points?</source>
+        <translation type="obsolete">Punkte hinzufügen?</translation>
+    </message>
+    <message>
+        <source>Add points to temporary line?</source>
+        <translation type="obsolete">Punkte zur temporären Linie hinzufügen?</translation>
+    </message>
+    <message>
         <source>Warning!</source>
         <translation type="obsolete">Warnung!</translation>
     </message>
@@ -1074,21 +1108,42 @@ Unbekannte Struktur.</translation>
     </message>
 </context>
 <context>
+    <name>CMouseEditTrk</name>
+    <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>
+    </message>
+</context>
+<context>
     <name>CMouseNormal</name>
     <message>
-        <location filename="../mouse/CMouseNormal.cpp" line="41"/>
+        <location filename="../mouse/CMouseNormal.cpp" line="42"/>
         <source>Add Waypoint</source>
         <translation>Wegpunkt hinzufügen</translation>
     </message>
     <message>
-        <location filename="../mouse/CMouseNormal.cpp" line="42"/>
+        <location filename="../mouse/CMouseNormal.cpp" line="43"/>
         <source>Add Track</source>
-        <translation type="unfinished"></translation>
+        <translation>Track hinzufügen</translation>
     </message>
     <message>
-        <location filename="../mouse/CMouseNormal.cpp" line="43"/>
+        <location filename="../mouse/CMouseNormal.cpp" line="44"/>
         <source>Add Area</source>
-        <translation type="unfinished"></translation>
+        <translation>Fläche hinzufügen</translation>
+    </message>
+    <message>
+        <location filename="../mouse/CMouseNormal.cpp" line="46"/>
+        <source>Copy position</source>
+        <translation>Position kopieren</translation>
+    </message>
+</context>
+<context>
+    <name>CMouseRangeTrk</name>
+    <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>
     </message>
 </context>
 <context>
@@ -1260,6 +1315,22 @@ ist keine gültige Koordinatensystemdefinition:
     </message>
 </context>
 <context>
+    <name>ICombineTrk</name>
+    <message>
+        <location filename="../gis/trk/ICombineTrk.ui" line="14"/>
+        <source>Combine Tracks...</source>
+        <translation>Tracks verbinden...</translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/ICombineTrk.ui" line="43"/>
+        <location filename="../gis/trk/ICombineTrk.ui" line="70"/>
+        <location filename="../gis/trk/ICombineTrk.ui" line="117"/>
+        <location filename="../gis/trk/ICombineTrk.ui" line="144"/>
+        <source>...</source>
+        <translation></translation>
+    </message>
+</context>
+<context>
     <name>IDemPathSetup</name>
     <message>
         <location filename="../dem/IDemPathSetup.ui" line="14"/>
@@ -1283,7 +1354,6 @@ ist keine gültige Koordinatensystemdefinition:
     <message>
         <location filename="../dem/IDemPropSetup.ui" line="14"/>
         <source>Form</source>
-        <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
@@ -1323,7 +1393,6 @@ ist keine gültige Koordinatensystemdefinition:
     <message>
         <location filename="../dem/IDemList.ui" line="14"/>
         <source>Form</source>
-        <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
@@ -1393,7 +1462,7 @@ ist keine gültige Koordinatensystemdefinition:
     <message>
         <location filename="../gis/wpt/IDetailsGeoCache.ui" line="249"/>
         <source>Hint:</source>
-        <translation>Hilfe:</translation>
+        <translation>Hinweis:</translation>
     </message>
 </context>
 <context>
@@ -1401,52 +1470,52 @@ ist keine gültige Koordinatensystemdefinition:
     <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>Farbe</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="126"/>
         <source>Border width</source>
-        <translation type="unfinished"></translation>
+        <translation>Rahmenbreite</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="140"/>
         <source>Style</source>
-        <translation type="unfinished"></translation>
+        <translation>Stil</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="159"/>
         <source>Opacity</source>
-        <translation type="unfinished"></translation>
+        <translation>Deckkraft</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="179"/>
         <source>Points</source>
-        <translation type="unfinished">Punkte</translation>
+        <translation>Punkte</translation>
     </message>
     <message>
         <location filename="../gis/ovl/IDetailsOvlArea.ui" line="206"/>
         <source>Position</source>
-        <translation type="unfinished">Position</translation>
+        <translation>Position</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>
@@ -1454,7 +1523,6 @@ ist keine gültige Koordinatensystemdefinition:
     <message>
         <location filename="../gis/trk/IDetailsTrk.ui" line="14"/>
         <source>Form</source>
-        <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
@@ -1613,7 +1681,6 @@ ist keine gültige Koordinatensystemdefinition:
     <message>
         <location filename="../gis/IGisWidget.ui" line="14"/>
         <source>Form</source>
-        <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
@@ -1850,7 +1917,6 @@ ist keine gültige Koordinatensystemdefinition:
     <message>
         <location filename="../map/IMapList.ui" line="14"/>
         <source>Form</source>
-        <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
@@ -1897,7 +1963,6 @@ ist keine gültige Koordinatensystemdefinition:
     <message>
         <location filename="../map/IMapPropSetup.ui" line="14"/>
         <source>Form</source>
-        <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
@@ -1961,22 +2026,22 @@ ist keine gültige Koordinatensystemdefinition:
 <context>
     <name>IMouseEditLine</name>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="240"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="309"/>
         <source>Add points?</source>
-        <translation type="unfinished"></translation>
+        <translation>Punkte hinzufügen?</translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="240"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="309"/>
         <source>Add points to temporary line?</source>
-        <translation type="unfinished"></translation>
+        <translation>Punkte zur temporären Linie hinzufügen?</translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="652"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="758"/>
         <source>Warning!</source>
         <translation>Warnung!</translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="652"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="758"/>
         <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>
@@ -2110,7 +2175,6 @@ sein</translation>
     <message>
         <location filename="../mouse/IScrOptEditLine.ui" line="26"/>
         <source>Form</source>
-        <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
@@ -2154,7 +2218,6 @@ sein</translation>
     <message>
         <location filename="../mouse/IScrOptPoint.ui" line="14"/>
         <source>Form</source>
-        <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
@@ -2179,17 +2242,17 @@ sein</translation>
     <message>
         <location filename="../mouse/IScrOptPoint.ui" line="63"/>
         <source>Move selected point.</source>
-        <translation type="unfinished"></translation>
+        <translation>Ausgewählten Punkt verschieben.</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptPoint.ui" line="77"/>
         <source>Add points before the selected point.</source>
-        <translation type="unfinished"></translation>
+        <translation>Punkte vor dem ausgewählten Punkt einfügen.</translation>
     </message>
     <message>
         <location filename="../mouse/IScrOptPoint.ui" line="91"/>
         <source>Add points after the selected point.</source>
-        <translation type="unfinished"></translation>
+        <translation>Punkte nach dem ausgewählten Punkt einfügen.</translation>
     </message>
 </context>
 <context>
@@ -2197,7 +2260,6 @@ sein</translation>
     <message>
         <location filename="../mouse/IScrOptRange.ui" line="14"/>
         <source>Form</source>
-        <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
@@ -2212,11 +2274,45 @@ sein</translation>
     </message>
 </context>
 <context>
+    <name>IScrOptRangeTrk</name>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="14"/>
+        <source>Form</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="40"/>
+        <source>Hide all points.</source>
+        <translation>Alle Punkte verstecken.</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></translation>
+    </message>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="54"/>
+        <source>Show all points.</source>
+        <translation>Alle Punkte zeigen.</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>
+    </message>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="103"/>
+        <source>TextLabel</source>
+        <translation>Bezeichnung</translation>
+    </message>
+</context>
+<context>
     <name>IScrOptRte</name>
     <message>
         <location filename="../gis/rte/IScrOptRte.ui" line="14"/>
         <source>Form</source>
-        <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
@@ -2246,7 +2342,6 @@ sein</translation>
     <message>
         <location filename="../gis/trk/IScrOptTrk.ui" line="14"/>
         <source>Form</source>
-        <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
@@ -2255,26 +2350,36 @@ sein</translation>
         <translation>Detailansicht &amp; Trackeigenschaften bearbeiten.</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="54"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="71"/>
         <source>Delete</source>
         <translation>Löschen</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="75"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="54"/>
         <source>Show on-screen profile and detailed information about points.</source>
         <translation>Zeigt das Profil und detaillierte Informationen der Punkte.</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="92"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="145"/>
         <source>Cut track at selected point into two tracks.</source>
         <translation>Teilt den Track am selektierten Punkt in zwei Teile.</translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="106"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="103"/>
         <source>Edit position of track points.</source>
         <translation>Position von Trackpunkten bearbeiten.</translation>
     </message>
     <message>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="117"/>
+        <source>Reverse track.</source>
+        <translation>Track umkehren.</translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="131"/>
+        <source>Combine tracks.</source>
+        <translation>Tracks verbinden.</translation>
+    </message>
+    <message>
         <source><html><head/><body><p>View details &amp; Edit</p></body></html></source>
         <translation type="obsolete"><html><head/><body><p>Details anzeigen &amp; Bearbeiten</p></body></html></translation>
     </message>
@@ -2285,9 +2390,12 @@ sein</translation>
     <message>
         <location filename="../gis/trk/IScrOptTrk.ui" line="43"/>
         <location filename="../gis/trk/IScrOptTrk.ui" line="57"/>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="78"/>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="95"/>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="109"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="74"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="92"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="106"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="120"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="134"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="148"/>
         <source>...</source>
         <translation></translation>
     </message>
@@ -2308,7 +2416,7 @@ sein</translation>
         <translation type="obsolete"><html><head/><body><p>Bearbeiten der Position von Trackpunkten.</p></body></html></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="135"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="174"/>
         <source>TextLabel</source>
         <translation>Bezeichnung</translation>
     </message>
@@ -2318,7 +2426,6 @@ sein</translation>
     <message>
         <location filename="../gis/wpt/IScrOptWpt.ui" line="20"/>
         <source>Form</source>
-        <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
@@ -2364,7 +2471,7 @@ sein</translation>
     <message>
         <location filename="../helpers/ISelectProjectDialog.ui" line="14"/>
         <source>Select a project...</source>
-        <translation type="unfinished"></translation>
+        <translation>Wähle ein Projekt...</translation>
     </message>
     <message>
         <location filename="../helpers/ISelectProjectDialog.ui" line="20"/>
@@ -2377,7 +2484,6 @@ sein</translation>
     <message>
         <location filename="../helpers/ITextEditWidget.ui" line="14"/>
         <source>Form</source>
-        <translatorcomment>?</translatorcomment>
         <translation></translation>
     </message>
     <message>
@@ -2623,59 +2729,58 @@ Zeile %2, Spalte %3:
         <translation>Datei %1' konnte nicht gespeichert werden</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="242"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="248"/>
         <source>Changed trackpoints, sacrificed all previous data.</source>
-        <translatorcomment>?</translatorcomment>
-        <translation>Geänderte Wegpunkte, alle vorherigen Daten sind verloren.</translation>
+        <translation>Wegpunkte geändert, alle vorherigen Daten sind verloren.</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="319"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="325"/>
         <source>Length: %1 %2</source>
         <translation>Länge: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="326"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="332"/>
         <source>, %1%2 %3, %4%5 %6</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="334"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="340"/>
         <source>Time: %1</source>
         <translation>Zeit: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="337"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="347"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="343"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
         <source>, Speed: %1 %2</source>
         <translation>, Geschw.: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="344"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="350"/>
         <source>Moving: %1</source>
         <translation>Bewegung: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="359"/>
         <source>Start: %1</source>
         <translation>Beginn: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="358"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="364"/>
         <source>End: %1</source>
         <translation>Ende: %1</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="362"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="368"/>
         <source>Points: %1 (%2)</source>
         <translation>Punkte: %1 (%2)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="374"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="434"/>
         <source>Ele.: %1 %2</source>
         <translation>Höhe: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="377"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="437"/>
         <source> slope: %1° (%2%)</source>
         <translation> Neigung: %1° (%2%)</translation>
     </message>
@@ -2684,115 +2789,120 @@ Zeile %2, Spalte %3:
         <translation type="obsolete">Neigung: %1°(%2%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="382"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="442"/>
         <source> speed: %1%2</source>
         <translation>Geschwindigkeit: %1%2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="394"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="454"/>
         <source>Ascend: %1%2 (%3%)</source>
         <translation>Anstieg: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="398"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="458"/>
         <source>Ascend: - (-)</source>
         <translation>Anstieg: - (-)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="404"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="464"/>
         <source> Descend: %1%2 (%3%)</source>
         <translation> Abstieg: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="408"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="468"/>
         <source> Descend: - (-) </source>
         <translation> Abstieg: - (-) </translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="415"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="475"/>
         <source>Dist.: %1%2 (%3%)</source>
         <translation>Entf.: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="419"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="479"/>
         <source>Dist.: - (-)</source>
         <translation>Entf.: - (-)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="425"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="485"/>
         <source> Moving: %1%2 (%3%)</source>
         <translation>Bewegung: %1%2 (%3%)</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="429"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="489"/>
         <source> Moving: - (-) </source>
         <translation> Bewegung: - (-) </translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="94"/>
         <source>thin</source>
-        <translation type="unfinished"></translation>
+        <translation>dünn</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="95"/>
         <source>normal</source>
-        <translation type="unfinished"></translation>
+        <translation>normal</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="96"/>
         <source>wide</source>
-        <translation type="unfinished"></translation>
+        <translation>weit</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="97"/>
         <source>strong</source>
-        <translation type="unfinished"></translation>
+        <translation>stark</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="485"/>
         <source>Changed area shape.</source>
-        <translation type="unfinished"></translation>
+        <translation>Flächenform geändert.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="492"/>
         <source>Changed name.</source>
-        <translation type="unfinished"></translation>
+        <translation>Name geändert.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="498"/>
         <source>Changed border width.</source>
-        <translation type="unfinished"></translation>
+        <translation>Umrnadungsbreite geändert.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="504"/>
         <source>Changed fill pattern.</source>
-        <translation type="unfinished"></translation>
+        <translation>Füllung geändert.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="510"/>
         <source>Changed opacity.</source>
-        <translation type="unfinished"></translation>
+        <translation>Durchsichtigkeit geändert.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="516"/>
         <source>Changed comment.</source>
-        <translation type="unfinished"></translation>
+        <translation>Kommentar geändert.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="522"/>
         <source>Changed description.</source>
-        <translation type="unfinished"></translation>
+        <translation>Beschreibung geändert.</translation>
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="534"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1034"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1371"/>
         <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/trk/CGisItemTrk.cpp" line="926"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="973"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1097"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="194"/>
-        <location filename="../mouse/CMouseEditArea.cpp" line="78"/>
-        <location filename="../mouse/CMouseEditTrk.cpp" line="84"/>
+        <location filename="../mouse/CMouseEditArea.cpp" line="86"/>
+        <location filename="../mouse/CMouseEditTrk.cpp" line="91"/>
         <source>Edit name...</source>
         <translation>Name ändern...</translation>
     </message>
@@ -2802,63 +2912,63 @@ Zeile %2, Spalte %3:
         <translation>Geben Sie einen neuen Namen ein.</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="237"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="240"/>
         <source>Elevation: %1 %2</source>
         <translation>Höhe: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="245"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="248"/>
         <source>Proximity: %1 %2</source>
         <translation>Abstand: %1 %2</translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1023"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="310"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1360"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="313"/>
         <source>Changed name</source>
         <translation>Name geändert</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="317"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="320"/>
         <source>Changed position</source>
         <translation>Position geändert</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="323"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="326"/>
         <source>Changed elevation</source>
         <translation>Höhe geändert</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="329"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="332"/>
         <source>Changed proximity</source>
         <translation>Abstandsalarm geändert</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="337"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="340"/>
         <source>Changed icon</source>
         <translation>Symbol geändert</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="343"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="346"/>
         <source>Changed comment</source>
         <translation>Kommentar geändert</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="349"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="352"/>
         <source>Changed description</source>
         <translation>Beschreibung geändert</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="392"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="395"/>
         <source>Archived</source>
         <translation>Archiviert</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="396"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="399"/>
         <source>Available</source>
         <translation>Verfügbar</translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="400"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="403"/>
         <source>Not Available</source>
         <translation>Nicht verfügbar</translation>
     </message>
@@ -2889,10 +2999,15 @@ Zeile %2, Spalte %3:
         <translation>Schreibgeschützt...</translation>
     </message>
     <message>
-        <location filename="../mouse/CMouseEditArea.cpp" line="78"/>
-        <location filename="../mouse/CMouseEditTrk.cpp" line="84"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="900"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="908"/>
+        <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"/>
         <source>Enter new track name.</source>
-        <translation type="unfinished"></translation>
+        <translation>Name eingeben.</translation>
     </message>
 </context>
 </TS>
diff --git a/src/locale/qmapshack_es.ts b/src/locale/qmapshack_es.ts
index 9d25baa..9465088 100644
--- a/src/locale/qmapshack_es.ts
+++ b/src/locale/qmapshack_es.ts
@@ -4,7 +4,7 @@
 <context>
     <name>CCanvas</name>
     <message>
-        <location filename="../canvas/CCanvas.cpp" line="58"/>
+        <location filename="../canvas/CCanvas.cpp" line="59"/>
         <source>Workspace %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -208,7 +208,17 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/CGisListWks.cpp" line="51"/>
+        <location filename="../gis/CGisListWks.cpp" line="49"/>
+        <source>Reverse Track</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="50"/>
+        <source>Combine Tracks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/CGisListWks.cpp" line="53"/>
         <source>Delete</source>
         <translation type="unfinished"></translation>
     </message>
@@ -229,12 +239,12 @@
 <context>
     <name>CMainWindow</name>
     <message>
-        <location filename="../CMainWindow.cpp" line="420"/>
+        <location filename="../CMainWindow.cpp" line="431"/>
         <source>Ele: %1%2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../CMainWindow.cpp" line="521"/>
+        <location filename="../CMainWindow.cpp" line="532"/>
         <source>Load GIS Data...</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1038,27 +1048,56 @@ Unknown structure.</source>
     </message>
     <message>
         <location filename="../map/CMapWMTS.cpp" line="323"/>
-        <source>%1: %2 tiles pending</source>
+        <source><b>%1</b>: %2 tiles pending<br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>CMouseEditArea</name>
+    <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>
+    </message>
+</context>
+<context>
+    <name>CMouseEditTrk</name>
+    <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>
     </message>
 </context>
 <context>
     <name>CMouseNormal</name>
     <message>
-        <location filename="../mouse/CMouseNormal.cpp" line="41"/>
+        <location filename="../mouse/CMouseNormal.cpp" line="42"/>
         <source>Add Waypoint</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../mouse/CMouseNormal.cpp" line="42"/>
+        <location filename="../mouse/CMouseNormal.cpp" line="43"/>
         <source>Add Track</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../mouse/CMouseNormal.cpp" line="43"/>
+        <location filename="../mouse/CMouseNormal.cpp" line="44"/>
         <source>Add Area</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../mouse/CMouseNormal.cpp" line="46"/>
+        <source>Copy position</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>CMouseRangeTrk</name>
+    <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>
+    </message>
 </context>
 <context>
     <name>CPlotDistance</name>
@@ -1226,6 +1265,22 @@ is not a valid coordinate system definition:
     </message>
 </context>
 <context>
+    <name>ICombineTrk</name>
+    <message>
+        <location filename="../gis/trk/ICombineTrk.ui" line="14"/>
+        <source>Combine Tracks...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/ICombineTrk.ui" line="43"/>
+        <location filename="../gis/trk/ICombineTrk.ui" line="70"/>
+        <location filename="../gis/trk/ICombineTrk.ui" line="117"/>
+        <location filename="../gis/trk/ICombineTrk.ui" line="144"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>IDemPathSetup</name>
     <message>
         <location filename="../dem/IDemPathSetup.ui" line="14"/>
@@ -1903,22 +1958,22 @@ is not a valid coordinate system definition:
 <context>
     <name>IMouseEditLine</name>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="240"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="309"/>
         <source>Add points?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="240"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="309"/>
         <source>Add points to temporary line?</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="652"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="758"/>
         <source>Warning!</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../mouse/IMouseEditLine.cpp" line="652"/>
+        <location filename="../mouse/IMouseEditLine.cpp" line="758"/>
         <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>
@@ -2147,6 +2202,41 @@ or
     </message>
 </context>
 <context>
+    <name>IScrOptRangeTrk</name>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="40"/>
+        <source>Hide all points.</source>
+        <translation type="unfinished"></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>
+    </message>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="54"/>
+        <source>Show all points.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="68"/>
+        <source>Copy track points as new track.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../mouse/IScrOptRangeTrk.ui" line="103"/>
+        <source>TextLabel</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>IScrOptRte</name>
     <message>
         <location filename="../gis/rte/IScrOptRte.ui" line="14"/>
@@ -2188,36 +2278,49 @@ or
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="54"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="71"/>
         <source>Delete</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="75"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="54"/>
         <source>Show on-screen profile and detailed information about points.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="92"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="145"/>
         <source>Cut track at selected point into two tracks.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="106"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="103"/>
         <source>Edit position of track points.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location filename="../gis/trk/IScrOptTrk.ui" line="43"/>
         <location filename="../gis/trk/IScrOptTrk.ui" line="57"/>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="78"/>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="95"/>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="109"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="74"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="92"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="106"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="120"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="134"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="148"/>
         <source>...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/IScrOptTrk.ui" line="135"/>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="117"/>
+        <source>Reverse track.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="131"/>
+        <source>Combine tracks.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/trk/IScrOptTrk.ui" line="174"/>
         <source>TextLabel</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2524,103 +2627,103 @@ line %2, column %3:
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="319"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="325"/>
         <source>Length: %1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="326"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="332"/>
         <source>, %1%2 %3, %4%5 %6</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="334"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="340"/>
         <source>Time: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="337"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="347"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="343"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
         <source>, Speed: %1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="344"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="350"/>
         <source>Moving: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="353"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="359"/>
         <source>Start: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="358"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="364"/>
         <source>End: %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="362"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="368"/>
         <source>Points: %1 (%2)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="374"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="434"/>
         <source>Ele.: %1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="382"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="442"/>
         <source> speed: %1%2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="394"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="454"/>
         <source>Ascend: %1%2 (%3%)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="398"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="458"/>
         <source>Ascend: - (-)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="408"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="468"/>
         <source> Descend: - (-) </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="429"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="489"/>
         <source> Moving: - (-) </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="404"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="464"/>
         <source> Descend: %1%2 (%3%)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="242"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="248"/>
         <source>Changed trackpoints, sacrificed all previous data.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="377"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="437"/>
         <source> slope: %1° (%2%)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="415"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="475"/>
         <source>Dist.: %1%2 (%3%)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="419"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="479"/>
         <source>Dist.: - (-)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="425"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="485"/>
         <source> Moving: %1%2 (%3%)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2681,30 +2784,35 @@ line %2, column %3:
     </message>
     <message>
         <location filename="../gis/ovl/CGisItemOvlArea.cpp" line="534"/>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1034"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1371"/>
         <source>Changed color</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="237"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="240"/>
         <source>Elevation: %1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="245"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="248"/>
         <source>Proximity: %1 %2</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/trk/CGisItemTrk.cpp" line="1023"/>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="310"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1360"/>
+        <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/trk/CGisItemTrk.cpp" line="926"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="973"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="1097"/>
         <location filename="../gis/wpt/CGisItemWpt.cpp" line="194"/>
-        <location filename="../mouse/CMouseEditArea.cpp" line="78"/>
-        <location filename="../mouse/CMouseEditTrk.cpp" line="84"/>
+        <location filename="../mouse/CMouseEditArea.cpp" line="86"/>
+        <location filename="../mouse/CMouseEditTrk.cpp" line="91"/>
         <source>Edit name...</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2714,47 +2822,47 @@ line %2, column %3:
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="317"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="320"/>
         <source>Changed position</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="323"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="326"/>
         <source>Changed elevation</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="329"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="332"/>
         <source>Changed proximity</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="337"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="340"/>
         <source>Changed icon</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="343"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="346"/>
         <source>Changed comment</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="349"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="352"/>
         <source>Changed description</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="392"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="395"/>
         <source>Archived</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="396"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="399"/>
         <source>Available</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/wpt/CGisItemWpt.cpp" line="400"/>
+        <location filename="../gis/wpt/CGisItemWpt.cpp" line="403"/>
         <source>Not Available</source>
         <translation type="unfinished"></translation>
     </message>
@@ -2785,8 +2893,13 @@ line %2, column %3:
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../mouse/CMouseEditArea.cpp" line="78"/>
-        <location filename="../mouse/CMouseEditTrk.cpp" line="84"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="900"/>
+        <location filename="../gis/trk/CGisItemTrk.cpp" line="908"/>
+        <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"/>
         <source>Enter new track name.</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/src/map/CMapWMTS.cpp b/src/map/CMapWMTS.cpp
index ce77bff..1cf9ae3 100644
--- a/src/map/CMapWMTS.cpp
+++ b/src/map/CMapWMTS.cpp
@@ -320,7 +320,7 @@ void CMapWMTS::slotQueueChanged()
     int pending = urlQueue.size() + urlPending.size();
     if(pending)
     {
-        map->reportStatusToCanvas(name, tr("%1: %2 tiles pending").arg(name).arg(pending));
+        map->reportStatusToCanvas(name, tr("<b>%1</b>: %2 tiles pending<br/>").arg(name).arg(pending));
     }
     else
     {
diff --git a/src/mouse/CMouseEditArea.cpp b/src/mouse/CMouseEditArea.cpp
index deaa563..f528ef2 100644
--- a/src/mouse/CMouseEditArea.cpp
+++ b/src/mouse/CMouseEditArea.cpp
@@ -27,7 +27,7 @@
 CMouseEditArea::CMouseEditArea(const QPointF& point, CGisDraw * gis, CCanvas * parent)
     : IMouseEditLine(point, gis, parent)
 {
-    cursor = cursor1 = QCursor(QPixmap(":/cursors/cursorMoveArea.png"),0,0);
+    cursor = cursor1 = QCursor(QPixmap(":/cursors/cursorMoveArea.png"),0,0);    
 }
 
 CMouseEditArea::CMouseEditArea(CGisItemOvlArea &area, CGisDraw * gis, CCanvas * parent)
@@ -35,13 +35,21 @@ CMouseEditArea::CMouseEditArea(CGisItemOvlArea &area, CGisDraw * gis, CCanvas *
 {
     cursor = cursor1 = QCursor(QPixmap(":/cursors/cursorMoveArea.png"),0,0);
     key    = area.getKey();
+    canvas->reportStatus(key, tr("<b>Edit Area</b><br/>Select a corner point for more options.<br/>"));
 }
 
 CMouseEditArea::~CMouseEditArea()
 {
+    canvas->reportStatus(key, "");
+}
 
+void CMouseEditArea::mousePressEvent(QMouseEvent * e)
+{
+    canvas->reportStatus(key, "");
+    IMouseEditLine::mousePressEvent(e);
 }
 
+
 void CMouseEditArea::drawLine(const QPolygonF &l, QPainter& p)
 {
     p.setPen(QPen(Qt::magenta, 5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
diff --git a/src/mouse/CMouseEditArea.h b/src/mouse/CMouseEditArea.h
index 9ec2ead..80e8cf4 100644
--- a/src/mouse/CMouseEditArea.h
+++ b/src/mouse/CMouseEditArea.h
@@ -31,6 +31,8 @@ class CMouseEditArea : public IMouseEditLine
         CMouseEditArea(CGisItemOvlArea &area, CGisDraw * gis, CCanvas * parent);
         virtual ~CMouseEditArea();
 
+        void mousePressEvent(QMouseEvent * e);
+
     protected slots:
         void slotCopyToNew();
 
diff --git a/src/mouse/CMouseEditTrk.cpp b/src/mouse/CMouseEditTrk.cpp
index 5bf68e3..da35996 100644
--- a/src/mouse/CMouseEditTrk.cpp
+++ b/src/mouse/CMouseEditTrk.cpp
@@ -43,16 +43,23 @@ CMouseEditTrk::CMouseEditTrk(CGisItemTrk &trk, CGisDraw * gis, CCanvas * parent)
         trk.gainUserFocus(false);
     }
 
+    canvas->reportStatus(key, tr("<b>Edit Track Points</b><br/>Select a track point for more options.<br/>"));
     /*
         trigger complete update of GIS components to make sure all changes to
-        the originating object are reflected on the canvas->
+        the originating object are reflected on the canvas
     */
     canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
 }
 
 CMouseEditTrk::~CMouseEditTrk()
 {
+    canvas->reportStatus(key, "");
+}
 
+void CMouseEditTrk::mousePressEvent(QMouseEvent * e)
+{
+    canvas->reportStatus(key, "");
+    IMouseEditLine::mousePressEvent(e);
 }
 
 IGisLine * CMouseEditTrk::getGisLine()
diff --git a/src/mouse/CMouseEditTrk.h b/src/mouse/CMouseEditTrk.h
index 33c77fc..79096e4 100644
--- a/src/mouse/CMouseEditTrk.h
+++ b/src/mouse/CMouseEditTrk.h
@@ -31,6 +31,8 @@ class CMouseEditTrk : public IMouseEditLine
         CMouseEditTrk(CGisItemTrk &trk, CGisDraw * gis, CCanvas * parent);
         virtual ~CMouseEditTrk();
 
+        void mousePressEvent(QMouseEvent * e);
+
     protected slots:
         void slotCopyToNew();
 
diff --git a/src/mouse/CMouseRangeTrk.cpp b/src/mouse/CMouseRangeTrk.cpp
new file mode 100644
index 0000000..9e9c5d6
--- /dev/null
+++ b/src/mouse/CMouseRangeTrk.cpp
@@ -0,0 +1,275 @@
+/**********************************************************************************************
+    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 "mouse/CMouseRangeTrk.h"
+#include "mouse/CScrOptRangeTrk.h"
+#include "gis/trk/CGisItemTrk.h"
+#include "gis/CGisDraw.h"
+#include "gis/CGisWidget.h"
+#include "canvas/CCanvas.h"
+
+#include <QtWidgets>
+
+
+CMouseRangeTrk::CMouseRangeTrk(CGisItemTrk &trk, CGisDraw *gis, CCanvas *parent)
+    : IMouse(gis, parent)
+    , state(eStateIdle)
+    , anchor(NOPOINTF)
+{
+    cursor  = QCursor(QPixmap("://cursors/cursorSelectRange.png"),0,0);
+    key = trk.getKey();
+
+    // reset user focus if the track has it
+    trk.setMouseFocusByPoint(NOPOINT, CGisItemTrk::eFocusMouseMove);
+    trk.setMouseFocusByPoint(NOPOINT, CGisItemTrk::eFocusMouseClick);
+    if(trk.hasUserFocus())
+    {
+        trk.gainUserFocus(false);
+    }
+
+    // switch to full mode to show deleted (hidden) track points, too
+    trk.setDrawMode(CGisItemTrk::eDrawRange);
+
+    canvas->reportStatus(key, tr("<b>Select Range</b><br/>Select first track point. And then a second one.<br/>"));
+    /*
+        trigger complete update of GIS components to make sure all changes to
+        the originating object are reflected on the canvas
+    */
+    canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
+}
+
+CMouseRangeTrk::~CMouseRangeTrk()
+{
+    canvas->reportStatus(key, "");
+
+    CGisItemTrk * trk = dynamic_cast<CGisItemTrk*>(CGisWidget::self().getItemByKey(key));
+    if(trk)
+    {
+        trk->setDrawMode(CGisItemTrk::eDrawNormal);
+        canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
+    }
+
+    delete scrOptRange;
+}
+
+void CMouseRangeTrk::draw(QPainter& p,  bool needsRedraw, const QRect &rect)
+{
+    CGisItemTrk * trk = dynamic_cast<CGisItemTrk*>(CGisWidget::self().getItemByKey(key));
+    if(trk)
+    {
+        switch(state)
+        {
+            case eStateIdle:
+            case eStateMoveMap:
+                if(anchor != NOPOINTF)
+                {
+                    p.setPen(Qt::darkBlue);
+                    p.setBrush(QColor(255,255,255,200));
+                    p.drawEllipse(anchor, 6, 6);
+
+                    QPixmap bullet("://icons/8x8/bullet_magenta.png");
+                    p.drawPixmap(anchor.x() - 3, anchor.y() - 3, bullet);
+                }
+                break;
+
+            case eStateSelectRange:
+            case eStateRangeSelected:
+                trk->drawRange(p);
+                if(anchor != NOPOINTF)
+                {
+                    p.setPen(Qt::darkBlue);
+                    p.setBrush(QColor(255,255,255,200));
+                    p.drawEllipse(anchor, 6, 6);
+
+                    QPixmap bullet("://icons/8x8/bullet_magenta.png");
+                    p.drawPixmap(anchor.x() - 3, anchor.y() - 3, bullet);
+                }
+
+                break;
+        }
+    }
+
+    if(!scrOptRange.isNull())
+    {
+        scrOptRange->draw(p);
+    }
+}
+
+void CMouseRangeTrk::mousePressEvent(QMouseEvent * e)
+{
+    canvas->reportStatus(key, "");
+    point  = e->pos();
+    if(e->button() == Qt::RightButton)
+    {
+        canvas->resetMouse();
+        canvas->update();
+    }
+    else if(e->button() == Qt::LeftButton)
+    {
+        switch(state)
+        {
+            case eStateIdle:
+            {
+                CGisItemTrk * trk = dynamic_cast<CGisItemTrk*>(CGisWidget::self().getItemByKey(key));
+                if(trk != 0 && anchor != NOPOINTF)
+                {
+                    anchor = trk->setMouseFocusByPoint(point, CGisItemTrk::eFocusMouseClick);
+                    state = eStateSelectRange;
+                    canvas->update();
+                }
+                else
+                {
+                    state = eStateMoveMap;
+                }
+                break;
+            }
+
+            case eStateSelectRange:
+            {
+                CGisItemTrk * trk = dynamic_cast<CGisItemTrk*>(CGisWidget::self().getItemByKey(key));
+                if(trk != 0 && anchor != NOPOINTF)
+                {
+                    QPointF pt = trk->setMouseFocusByPoint(point, CGisItemTrk::eFocusMouseMove);
+                    scrOptRange = new CScrOptRangeTrk(pt, trk, canvas);
+                    connect(scrOptRange->toolHidePoints, SIGNAL(clicked()), this, SLOT(slotHidePoints()));
+                    connect(scrOptRange->toolShowPoints, SIGNAL(clicked()), this, SLOT(slotShowPoints()));
+                    connect(scrOptRange->toolCopy, SIGNAL(clicked()), this, SLOT(slotCopy()));
+
+                    state = eStateRangeSelected;
+                    canvas->update();
+                }
+
+                break;
+            }
+            case eStateRangeSelected:
+            {
+                scrOptRange->deleteLater();
+                CGisItemTrk * trk = dynamic_cast<CGisItemTrk*>(CGisWidget::self().getItemByKey(key));
+                if(trk != 0)
+                {
+                    trk->setMouseFocusByPoint(NOPOINT, CGisItemTrk::eFocusMouseMove);
+                    trk->setMouseFocusByPoint(NOPOINT, CGisItemTrk::eFocusMouseClick);
+                }
+                state = eStateIdle;
+                canvas->update();
+                break;
+            }
+            default:;
+        }
+
+    }
+}
+
+void CMouseRangeTrk::mouseMoveEvent(QMouseEvent * e)
+{
+    point  = e->pos();
+
+    switch(state)
+    {
+        case eStateIdle:
+        {
+            CGisItemTrk * trk = dynamic_cast<CGisItemTrk*>(CGisWidget::self().getItemByKey(key));
+            if(trk != 0)
+            {
+                anchor = trk->setMouseFocusByPoint(point, CGisItemTrk::eFocusMouseClick);
+                canvas->update();
+            }
+            break;
+        }
+
+        case eStateMoveMap:
+        {
+            if(point != lastPoint)
+            {
+                QPoint delta = point - lastPoint;
+                canvas->moveMap(delta);
+            }
+            break;
+        }
+
+        case eStateSelectRange:
+        {
+
+            CGisItemTrk * trk = dynamic_cast<CGisItemTrk*>(CGisWidget::self().getItemByKey(key));
+            if(trk != 0)
+            {
+                anchor = trk->setMouseFocusByPoint(point, CGisItemTrk::eFocusMouseMove);
+                canvas->update();
+            }
+            panCanvas(point);
+            break;
+        }
+        default:;
+    }
+
+    lastPoint = point;
+}
+
+void CMouseRangeTrk::mouseReleaseEvent(QMouseEvent *e)
+{
+    if(e->button() == Qt::LeftButton)
+    {
+        if(state == eStateMoveMap)
+        {
+            state = eStateIdle;
+        }
+    }
+}
+
+void CMouseRangeTrk::wheelEvent(QWheelEvent * e)
+{
+
+}
+
+void CMouseRangeTrk::slotHidePoints()
+{
+    CGisItemTrk * trk = dynamic_cast<CGisItemTrk*>(CGisWidget::self().getItemByKey(key));
+    if(trk != 0)
+    {
+        trk->hideSelectedPoints();
+        canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
+    }
+
+    scrOptRange->deleteLater();
+    canvas->resetMouse();
+}
+
+void CMouseRangeTrk::slotShowPoints()
+{
+    CGisItemTrk * trk = dynamic_cast<CGisItemTrk*>(CGisWidget::self().getItemByKey(key));
+    if(trk != 0)
+    {
+        trk->showSelectedPoints();
+        canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
+    }
+
+    scrOptRange->deleteLater();
+    canvas->resetMouse();
+}
+
+void CMouseRangeTrk::slotCopy()
+{
+    CGisItemTrk * trk = dynamic_cast<CGisItemTrk*>(CGisWidget::self().getItemByKey(key));
+    if(trk != 0)
+    {
+        trk->copySelectedPoints();
+        canvas->slotTriggerCompleteUpdate(CCanvas::eRedrawGis);
+    }
+    scrOptRange->deleteLater();
+    canvas->resetMouse();
+}
diff --git a/src/gis/trk/CScrOptTrk.h b/src/mouse/CMouseRangeTrk.h
similarity index 51%
copy from src/gis/trk/CScrOptTrk.h
copy to src/mouse/CMouseRangeTrk.h
index 1ea7586..dcd0a16 100644
--- a/src/gis/trk/CScrOptTrk.h
+++ b/src/mouse/CMouseRangeTrk.h
@@ -16,36 +16,56 @@
 
 **********************************************************************************************/
 
-#ifndef CSCROPTTRK_H
-#define CSCROPTTRK_H
+#ifndef CMOUSERANGETRK_H
+#define CMOUSERANGETRK_H
 
-#include "mouse/IScrOpt.h"
-#include "ui_IScrOptTrk.h"
+#include "mouse/IMouse.h"
+#include <QPointer>
 
 class CGisItemTrk;
-class IMouse;
+class CGisDraw;
+class CCanvas;
+class CScrOptRangeTrk;
 
-class CScrOptTrk : public IScrOpt, private Ui::IScrOptTrk
+class CMouseRangeTrk : public IMouse
 {
-    Q_OBJECT
+    Q_OBJECT;
     public:
-        CScrOptTrk(CGisItemTrk * trk, const QPoint &point, IMouse *parent);
-        virtual ~CScrOptTrk();
+        CMouseRangeTrk(CGisItemTrk& trk, CGisDraw * gis, CCanvas * parent);
+        virtual ~CMouseRangeTrk();
 
-        void draw(QPainter& p);
-
-    private slots:        
-        void slotDelete();
-        void slotEditDetails();
-        void slotProfile(bool on);
-        void slotCut();
-        void slotEdit();
+        void draw(QPainter& p,  bool needsRedraw, const QRect &rect);
+        void mousePressEvent(QMouseEvent * e);
+        void mouseMoveEvent(QMouseEvent * e);
+        void mouseReleaseEvent(QMouseEvent *e);
+        void wheelEvent(QWheelEvent * e);
 
+    private slots:
+        void slotHidePoints();
+        void slotShowPoints();
+        void slotCopy();
 
     private:
         QString key;
+
+        enum state_e
+        {
+             eStateIdle
+            ,eStateMoveMap
+            ,eStateSelectRange
+            ,eStateRangeSelected
+        };
+
+        state_e state;
+
         QPointF anchor;
+
+        QPoint lastPoint;
+
+        QPointer<CScrOptRangeTrk> scrOptRange;
+
+
 };
 
-#endif //CSCROPTTRK_H
+#endif //CMOUSERANGETRK_H
 
diff --git a/src/mouse/CMouseEditTrk.h b/src/mouse/CScrOptRangeTrk.cpp
similarity index 61%
copy from src/mouse/CMouseEditTrk.h
copy to src/mouse/CScrOptRangeTrk.cpp
index 33c77fc..cf17ce7 100644
--- a/src/mouse/CMouseEditTrk.h
+++ b/src/mouse/CScrOptRangeTrk.cpp
@@ -16,30 +16,33 @@
 
 **********************************************************************************************/
 
-#ifndef CMOUSEEDITTRK_H
-#define CMOUSEEDITTRK_H
+#include "mouse/CScrOptRangeTrk.h"
+#include "gis/trk/CGisItemTrk.h"
+#include "CMainWindow.h"
 
-#include "mouse/IMouseEditLine.h"
+#include <QtWidgets>
 
-class CGisItemTrk;
-
-class CMouseEditTrk : public IMouseEditLine
+CScrOptRangeTrk::CScrOptRangeTrk(const QPointF &point, CGisItemTrk * trk, QWidget *parent)
+    : IScrOpt(parent)
 {
-    Q_OBJECT
-    public:
-        CMouseEditTrk(const QPointF& point, CGisDraw * gis, CCanvas * parent);
-        CMouseEditTrk(CGisItemTrk &trk, CGisDraw * gis, CCanvas * parent);
-        virtual ~CMouseEditTrk();
+    setupUi(this);    
+    label->setFont(CMainWindow::self().getMapFont());
+    label->setText(trk->getInfoRange());
+    adjustSize();
+
+    setOrigin(point.toPoint());
 
-    protected slots:
-        void slotCopyToNew();
+    move(point.toPoint() + QPoint(-width()/2,SCR_OPT_OFFSET));
+    show();
+}
 
-    protected:
-        IGisLine * getGisLine();
+CScrOptRangeTrk::~CScrOptRangeTrk()
+{
 
-    private:
-        QString     key;
-};
+}
 
-#endif //CMOUSEEDITTRK_H
+void CScrOptRangeTrk::draw(QPainter& p)
+{
+    drawBubble2(origin, p);
+}
 
diff --git a/src/gis/trk/CScrOptTrk.h b/src/mouse/CScrOptRangeTrk.h
similarity index 66%
copy from src/gis/trk/CScrOptTrk.h
copy to src/mouse/CScrOptRangeTrk.h
index 1ea7586..ecb0914 100644
--- a/src/gis/trk/CScrOptTrk.h
+++ b/src/mouse/CScrOptRangeTrk.h
@@ -16,36 +16,22 @@
 
 **********************************************************************************************/
 
-#ifndef CSCROPTTRK_H
-#define CSCROPTTRK_H
+#ifndef CSCROPTRANGETRK_H
+#define CSCROPTRANGETRK_H
 
 #include "mouse/IScrOpt.h"
-#include "ui_IScrOptTrk.h"
+#include "ui_IScrOptRangeTrk.h"
 
 class CGisItemTrk;
-class IMouse;
 
-class CScrOptTrk : public IScrOpt, private Ui::IScrOptTrk
+class CScrOptRangeTrk : public IScrOpt, public Ui::IScrOptRangeTrk
 {
-    Q_OBJECT
     public:
-        CScrOptTrk(CGisItemTrk * trk, const QPoint &point, IMouse *parent);
-        virtual ~CScrOptTrk();
+        CScrOptRangeTrk(const QPointF& point, CGisItemTrk *trk, QWidget * parent);
+        virtual ~CScrOptRangeTrk();
 
         void draw(QPainter& p);
-
-    private slots:        
-        void slotDelete();
-        void slotEditDetails();
-        void slotProfile(bool on);
-        void slotCut();
-        void slotEdit();
-
-
-    private:
-        QString key;
-        QPointF anchor;
 };
 
-#endif //CSCROPTTRK_H
+#endif //CSCROPTRANGETRK_H
 
diff --git a/src/mouse/IMouseEditLine.cpp b/src/mouse/IMouseEditLine.cpp
index 663f32f..9a5a76a 100644
--- a/src/mouse/IMouseEditLine.cpp
+++ b/src/mouse/IMouseEditLine.cpp
@@ -143,6 +143,68 @@ void IMouseEditLine::drawHighlight2(QPainter& p)
     p.drawPolyline(highlight);
 }
 
+void IMouseEditLine::drawArrows(const QPolygonF &l, QPainter& p)
+{
+    QPointF arrow[4] =
+    {
+        QPointF( 24.0, 9.0),     //front
+        QPointF( 0.0, 0.0),      //upper tail
+        QPointF( 5.0, 9.0),      //mid tail
+        QPointF( 0.0, 19.0)      //lower tail
+    };
+
+    QPointF  pt, pt1, ptt;
+
+    // draw direction arrows
+    bool    start = true;
+    qreal  heading;
+
+    //generate arrow pic on-the-fly
+    QImage arrow_pic(25,20, QImage::Format_ARGB32);
+    arrow_pic.fill( qRgba(0,0,0,0));
+    QPainter t_paint(&arrow_pic);
+    USE_ANTI_ALIASING(t_paint, true);
+    t_paint.setPen(QPen(Qt::white, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
+    t_paint.setBrush(Qt::magenta);
+    t_paint.drawPolygon(arrow, 4);
+    t_paint.end();
+
+    foreach(pt,l)
+    {
+        if(start)                // no arrow on  the first loop
+        {
+            start = false;
+        }
+        else
+        {
+            if((qAbs(pt.x() - pt1.x()) + qAbs(pt.y() - pt1.y())) < 7)
+            {
+                pt1 = pt;
+                continue;
+            }
+            // keep distance
+            if((qAbs(pt.x() - ptt.x()) + qAbs(pt.y() - ptt.y())) > 100)
+            {
+                if(0 != pt.x() - pt1.x() && (pt.y() - pt1.y()))
+                {
+                    heading = ( atan2((qreal)(pt.y() - pt1.y()), (qreal)(pt.x() - pt1.x())) * 180.) / M_PI;
+
+                    p.save();
+                    // draw arrow between bullets
+                    p.translate((pt.x() + pt1.x())/2,(pt.y() + pt1.y())/2);
+                    p.rotate(heading);
+                    p.drawImage(-13, -9, arrow_pic);
+                    p.restore();
+                    //remember last point
+                    ptt = pt;
+                }
+            }
+        }
+        pt1 = pt;
+    }
+
+}
+
 void IMouseEditLine::draw(QPainter& p, bool needsRedraw, const QRect &rect)
 {
     if(needsRedraw)
@@ -153,30 +215,36 @@ void IMouseEditLine::draw(QPainter& p, bool needsRedraw, const QRect &rect)
         gis->convertRad2Px(newLine);
     }
 
+
+
     switch(state)
     {
         case eStateIdle:
         case eStatePointSelected:
-            drawLine(line, p);
+            drawArrows(line, p);
+            drawLine(line, p);            
             drawBullets(line, p);
             drawPointOfFocus(p);
             break;
 
         case eStateSelectRange:
-            drawLine(line, p);
+            drawArrows(line, p);
+            drawLine(line, p);            
             drawHighlight1(p);
             drawBullets(line, p);
             drawPointOfFocus(p);
             break;
 
         case eStateRangeSelected:
-            drawLine(line, p);
+            drawArrows(line, p);
+            drawLine(line, p);            
             drawHighlight2(p);
             drawBullets(line, p);
             drawPointOfFocus(p);
             break;
 
         case eStateMovePoint:
+            drawArrows(line, p);
             drawLine(line, p);
             drawBullets(line, p);
             drawPointOfFocus(p);
@@ -186,7 +254,8 @@ void IMouseEditLine::draw(QPainter& p, bool needsRedraw, const QRect &rect)
         case eStateAddPointBwd:
         {
             QPolygonF l = line.mid(0, idxStart + 1) + newLine + line.mid(idxStop, -1);
-            drawLine(l, p);
+            drawArrows(l, p);
+            drawLine(l, p);            
             drawBullets(l, p);
             break;
         }
@@ -380,6 +449,10 @@ void IMouseEditLine::mousePressEvent(QMouseEvent * e)
 
                     state = eStatePointSelected;
                 }
+                else
+                {
+                    state = eStateMoveMap;
+                }
                 break;
             }
             case eStateSelectRange:
@@ -432,11 +505,6 @@ void IMouseEditLine::mouseMoveEvent(QMouseEvent * e)
     {
         case eStateIdle:
         {
-            if(!scrOptEditLine->rect().contains(point))
-            {
-                panCanvas(point);
-            }
-
             int old = idxFocus;
             idxFocus = getPointCloseBy(point);
             if(old != idxFocus)
@@ -489,15 +557,33 @@ void IMouseEditLine::mouseMoveEvent(QMouseEvent * e)
             newCoords[idxFocus] = pt;
 
             canvas->update();
+            break;
 
         }
+        case eStateMoveMap:
+        {
+            if(point != lastPoint)
+            {
+                QPoint delta = point - lastPoint;
+                canvas->moveMap(delta);
+            }
+            break;
+        }
         default:;
     }
+
+    lastPoint = point;
 }
 
 void IMouseEditLine::mouseReleaseEvent(QMouseEvent *e)
 {
-
+    if(e->button() == Qt::LeftButton)
+    {
+        if(state == eStateMoveMap)
+        {
+            state = eStateIdle;
+        }
+    }
 }
 
 void IMouseEditLine::wheelEvent(QWheelEvent * e)
diff --git a/src/mouse/IMouseEditLine.h b/src/mouse/IMouseEditLine.h
index 651477d..85121e8 100644
--- a/src/mouse/IMouseEditLine.h
+++ b/src/mouse/IMouseEditLine.h
@@ -104,6 +104,7 @@ class IMouseEditLine  : public IMouse
         void drawBullets(const QPolygonF& l, QPainter& p);
         void drawHighlight1(QPainter& p);
         void drawHighlight2(QPainter& p);
+        void drawArrows(const QPolygonF &l, QPainter& p);
         int getPointCloseBy(const QPoint& screenPos);
 
         /// backup for coord1
@@ -125,6 +126,7 @@ class IMouseEditLine  : public IMouse
             ,eStateMovePoint
             ,eStateAddPointBwd
             ,eStateAddPointFwd
+            ,eStateMoveMap
 
         };
 
@@ -136,6 +138,8 @@ class IMouseEditLine  : public IMouse
         QPointer<CScrOptPoint> scrOptPoint;
         QPointer<CScrOptRange> scrOptRange;
         CScrOptEditLine * scrOptEditLine;
+
+        QPoint lastPoint;
 };
 
 #endif //IMOUSEEDITLINE_H
diff --git a/src/mouse/IScrOptRangeTrk.ui b/src/mouse/IScrOptRangeTrk.ui
new file mode 100644
index 0000000..01ab623
--- /dev/null
+++ b/src/mouse/IScrOptRangeTrk.ui
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IScrOptRangeTrk</class>
+ <widget class="QWidget" name="IScrOptRangeTrk">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>100</width>
+    <height>100</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <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>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <property name="spacing">
+      <number>3</number>
+     </property>
+     <item>
+      <widget class="QToolButton" name="toolHidePoints">
+       <property name="toolTip">
+        <string>Hide all points.</string>
+       </property>
+       <property name="text">
+        <string>...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../resources.qrc">
+         <normaloff>:/icons/32x32/PointHide.png</normaloff>:/icons/32x32/PointHide.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="toolShowPoints">
+       <property name="toolTip">
+        <string>Show all points.</string>
+       </property>
+       <property name="text">
+        <string>...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../resources.qrc">
+         <normaloff>:/icons/32x32/PointShow.png</normaloff>:/icons/32x32/PointShow.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QToolButton" name="toolCopy">
+       <property name="toolTip">
+        <string>Copy track points as new track.</string>
+       </property>
+       <property name="text">
+        <string>...</string>
+       </property>
+       <property name="icon">
+        <iconset resource="../resources.qrc">
+         <normaloff>:/icons/32x32/Copy.png</normaloff>:/icons/32x32/Copy.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <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="label">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>TextLabel</string>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="../resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/src/plot/CPlotTrack.cpp b/src/plot/CPlotTrack.cpp
index be68fe1..af1b522 100644
--- a/src/plot/CPlotTrack.cpp
+++ b/src/plot/CPlotTrack.cpp
@@ -51,19 +51,59 @@ void CPlotTrack::setTrack(CGisItemTrk * track, const QString& proj)
     updateData();
 }
 
+void CPlotTrack::setTrack(const QPolygonF& track, const QString &proj)
+{
+    coords = track;
+    pjsrc = pj_init_plus(proj.toLatin1());
+
+    updateData();
+}
+
 void CPlotTrack::updateData()
 {
-    if(trk == 0)
+    if(trk == 0 && coords.isEmpty())
     {
         return;
     }
 
-    const QRectF& boundingRect = trk->getBoundingRect();
+    QRectF boundingRect;
+    if(trk)
+    {
+        coords.clear();
+        const CGisItemTrk::trk_t& t = trk->getTrackData();
+        foreach (const CGisItemTrk::trkseg_t& seg, t.segs)
+        {
+            foreach(const CGisItemTrk::trkpt_t& trkpt, seg.pts)
+            {
+                if(trkpt.flags & CGisItemTrk::trkpt_t::eDeleted)
+                {
+                    continue;
+                }
+
+                coords << QPointF(trkpt.lon * DEG_TO_RAD, trkpt.lat * DEG_TO_RAD);
+            }
+        }
+    }
+
+    qreal north = -90 * DEG_TO_RAD;
+    qreal east  = -180 * DEG_TO_RAD;
+    qreal south =  90 * DEG_TO_RAD;
+    qreal west  =  180 * DEG_TO_RAD;
+
+    foreach(const QPointF& trkpt, coords)
+    {
+        if(trkpt.x() < west)  west    = trkpt.x();
+        if(trkpt.x() > east)  east    = trkpt.x();
+        if(trkpt.y() < south) south   = trkpt.y();
+        if(trkpt.y() > north) north   = trkpt.y();
+    }
+
+
     QRectF r = buffer.rect();
     r.adjust(5,5,-5,-5);
 
-    pt1 = boundingRect.topLeft();
-    pt2 = boundingRect.bottomRight();
+    pt1 = QPointF(west, north);
+    pt2 = QPointF(east, south);
 
     pj_transform(pjtar, pjsrc, 1, 0, &pt1.rx(), &pt1.ry(), 0);
     pj_transform(pjtar, pjsrc, 1, 0, &pt2.rx(), &pt2.ry(), 0);
@@ -83,28 +123,16 @@ void CPlotTrack::updateData()
     }
 
     line.clear();
-    const CGisItemTrk::trk_t& t = trk->getTrackData();
-    foreach (const CGisItemTrk::trkseg_t& seg, t.segs)
+    foreach(const QPointF& trkpt, coords)
     {
-        foreach(const CGisItemTrk::trkpt_t& trkpt, seg.pts)
-        {
-            if(trkpt.flags & CGisItemTrk::trkpt_t::eDeleted)
-            {
-                continue;
-            }
-
-            QPointF pt(trkpt.lon * DEG_TO_RAD, trkpt.lat * DEG_TO_RAD);
-            pj_transform(pjtar, pjsrc, 1, 0, &pt.rx(), &pt.ry(), 0);
-
-            line << (pt - pt1) * scale;
-        }
+        QPointF pt(trkpt.x(), trkpt.y());
+        pj_transform(pjtar, pjsrc, 1, 0, &pt.rx(), &pt.ry(), 0);
+        line << (pt - pt1) * scale;
     }
 
     xoff = qRound((buffer.width()  - w * scale.x()) / 2);
     yoff = qRound((buffer.height() - h * scale.y()) / 2);
 
-
-
     needsRedraw = true;
 }
 
diff --git a/src/plot/CPlotTrack.h b/src/plot/CPlotTrack.h
index 0dc4076..42bb596 100644
--- a/src/plot/CPlotTrack.h
+++ b/src/plot/CPlotTrack.h
@@ -31,6 +31,7 @@ class CPlotTrack : public QWidget
         virtual ~CPlotTrack();
 
         void setTrack(CGisItemTrk * track, const QString &proj = "+init=epsg:3857");
+        void setTrack(const QPolygonF &track, const QString &proj = "+init=epsg:3857");
         void updateData();
         void setMouseMoveFocus(qreal lon, qreal lat);
 
@@ -47,6 +48,8 @@ class CPlotTrack : public QWidget
 
         bool needsRedraw;
         CGisItemTrk * trk;
+        QPolygonF coords;
+
         QImage buffer;
 
         QPointF pt1;
diff --git a/src/resources.qrc b/src/resources.qrc
index 80d9ec0..beab307 100644
--- a/src/resources.qrc
+++ b/src/resources.qrc
@@ -53,6 +53,7 @@
         <file>icons/32x32/POIText.png</file>
         <file>icons/32x32/Reset.png</file>
         <file>icons/32x32/Right.png</file>
+        <file>icons/32x32/Left.png</file>
         <file>icons/32x32/Scale.png</file>
         <file>icons/32x32/SelectColor.png</file>
         <file>icons/32x32/ToBottom.png</file>
@@ -94,9 +95,13 @@
         <file>icons/32x32/AddArea.png</file>
         <file>icons/32x32/LineMove.png</file>
         <file>icons/32x32/PointMove.png</file>
+        <file>icons/32x32/PointHide.png</file>
+        <file>icons/32x32/PointShow.png</file>
         <file>icons/32x32/AreaMove.png</file>
         <file>icons/32x32/SelectRange.png</file>
         <file>icons/32x32/Area.png</file>
+        <file>icons/32x32/Reverse.png</file>
+        <file>icons/32x32/Combine.png</file>
 
         <file>icons/48x48/2DFix.png</file>
         <file>icons/48x48/3DFix.png</file>
@@ -132,6 +137,7 @@
         <file>icons/48x48/POIText.png</file>
         <file>icons/48x48/Reset.png</file>
         <file>icons/48x48/Right.png</file>
+        <file>icons/48x48/Left.png</file>
         <file>icons/48x48/Scale.png</file>
         <file>icons/48x48/SelectColor.png</file>
         <file>icons/48x48/ToBottom.png</file>
@@ -173,9 +179,13 @@
         <file>icons/48x48/AddArea.png</file>
         <file>icons/48x48/LineMove.png</file>
         <file>icons/48x48/PointMove.png</file>
+        <file>icons/48x48/PointHide.png</file>
+        <file>icons/48x48/PointShow.png</file>
         <file>icons/48x48/AreaMove.png</file>
         <file>icons/48x48/SelectRange.png</file>
         <file>icons/48x48/Area.png</file>
+        <file>icons/48x48/Reverse.png</file>
+        <file>icons/48x48/Combine.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