[qmapshack] 01/05: Imported Upstream version 1.8.1

Bas Couwenberg sebastic at debian.org
Sun May 14 11:46:17 UTC 2017


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

sebastic pushed a commit to branch master
in repository qmapshack.

commit 7067510722c98e3c27391c97ca9a86e0538338f1
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Sun May 14 13:20:27 2017 +0200

    Imported Upstream version 1.8.1
---
 CMakeLists.txt                                     |    7 +-
 CMakeLists.txt.user                                |    4 +-
 README.md                                          |   13 +-
 changelog.txt                                      |    9 +
 cmake/Modules/FindQuaZip.cmake                     |    3 +
 src/CMakeLists.txt                                 |   29 +-
 src/canvas/CCanvas.cpp                             |   34 +
 src/canvas/CCanvas.h                               |    3 +
 src/canvas/IDrawContext.h                          |    6 +
 src/canvas/IDrawObject.cpp                         |   14 +-
 src/dem/IDem.cpp                                   |    2 +-
 src/dem/IDem.h                                     |    2 +-
 src/gis/IGisItem.cpp                               |   10 +-
 src/gis/IGisItem.h                                 |    7 +-
 src/gis/fit/CFitProject.cpp                        |   10 +-
 src/gis/fit/decoder/CFitByteDataTransformer.cpp    |   29 +-
 src/gis/fit/decoder/CFitByteDataTransformer.h      |    6 +-
 src/gis/fit/decoder/CFitDecoder.cpp                |   26 +-
 src/gis/fit/decoder/CFitDefinitionMessage.cpp      |   44 +-
 src/gis/fit/decoder/CFitDefinitionMessage.h        |   13 +-
 src/gis/fit/decoder/CFitDevFieldDefinition.cpp     |   54 +
 ...itFieldDataState.h => CFitDevFieldDefinition.h} |   32 +-
 ...onState.cpp => CFitDevFieldDefinitionState.cpp} |   29 +-
 ...ldDataState.h => CFitDevFieldDefinitionState.h} |   24 +-
 src/gis/fit/decoder/CFitField.cpp                  |    3 +-
 src/gis/fit/decoder/CFitFieldBuilder.cpp           |   13 +-
 src/gis/fit/decoder/CFitFieldBuilder.h             |    2 +
 src/gis/fit/decoder/CFitFieldDataState.cpp         |  209 +++-
 src/gis/fit/decoder/CFitFieldDataState.h           |    6 +
 src/gis/fit/decoder/CFitFieldDefinition.cpp        |   12 +-
 src/gis/fit/decoder/CFitFieldDefinition.h          |    2 +
 src/gis/fit/decoder/CFitFieldDefinitionState.cpp   |    7 +-
 src/gis/fit/decoder/CFitHeaderState.cpp            |    2 +-
 src/gis/fit/decoder/CFitMessage.cpp                |   35 +-
 src/gis/fit/decoder/CFitMessage.h                  |    1 +
 src/gis/fit/decoder/CFitRecordContentState.cpp     |   24 +-
 src/gis/fit/decoder/CFitRecordHeaderState.cpp      |   10 +-
 src/gis/fit/decoder/IFitDecoderState.cpp           |   46 +-
 src/gis/fit/decoder/IFitDecoderState.h             |   19 +-
 src/gis/fit/defs/CFitBaseType.cpp                  |   20 +-
 src/gis/fit/defs/CFitBaseType.h                    |    9 +
 src/gis/fit/defs/CFitFieldProfile.cpp              |   34 +-
 src/gis/fit/defs/CFitFieldProfile.h                |   22 +-
 src/gis/fit/defs/CFitProfile.cpp                   |    6 +-
 src/gis/fit/defs/CFitProfile.h                     |    6 +-
 src/gis/fit/defs/CFitProfileLookup.cpp             |  362 ++++++-
 src/gis/fit/defs/HowToFitGenerator.txt             |    4 +-
 src/gis/fit/defs/fit_enums.h                       | 1049 ++++++++++++++++----
 src/gis/fit/defs/fit_fields.h                      |  418 +++++---
 src/gis/fit/defs/profiles.py                       |  267 +++++
 src/gis/fit/defs/profiles.sh                       |  316 ------
 src/gis/fit/serialization.cpp                      |    2 +-
 .../rte/router/brouter/CRouterBRouterSetupPage.cpp |   10 -
 .../router/brouter/CRouterBRouterSetupWizard.cpp   |   22 +-
 .../rte/router/brouter/CRouterBRouterSetupWizard.h |    4 +-
 .../router/brouter/CRouterBRouterTilesSelect.cpp   |   41 +-
 .../rte/router/brouter/CRouterBRouterToolShell.cpp |   12 +-
 .../rte/router/brouter/CRouterBRouterToolShell.h   |    6 +
 .../router/brouter/IRouterBRouterSetupWizard.ui    |   16 +-
 src/icons/32x32/CutHistory.png                     |  Bin 1014 -> 0 bytes
 src/icons/32x32/CutHistoryAfter.png                |  Bin 0 -> 1451 bytes
 src/icons/32x32/CutHistoryBefore.png               |  Bin 0 -> 1316 bytes
 src/icons/48x48/CutHistory.png                     |  Bin 1558 -> 0 bytes
 src/icons/48x48/CutHistoryAfter.png                |  Bin 0 -> 2318 bytes
 src/icons/48x48/CutHistoryBefore.png               |  Bin 0 -> 2211 bytes
 src/icons/{CutHistory.svg => CutHistoryAfter.svg}  |   40 +-
 src/icons/{CutHistory.svg => CutHistoryBefore.svg} |   36 +-
 src/locale/qmapshack.ts                            |   81 +-
 src/locale/qmapshack_cs.ts                         |   85 +-
 src/locale/qmapshack_de.ts                         |   85 +-
 src/locale/qmapshack_es.ts                         |   83 +-
 src/locale/qmapshack_fr.ts                         |   85 +-
 src/locale/qmapshack_nl.ts                         |   85 +-
 src/locale/qmapshack_ru.desktop                    |    4 +-
 src/locale/qmapshack_ru.ts                         |   85 +-
 src/resources.qrc                                  |    6 +-
 src/widgets/CHistoryListWidget.cpp                 |   52 +-
 src/widgets/CHistoryListWidget.h                   |    6 +-
 78 files changed, 3034 insertions(+), 1126 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index e6e74a9..106d0c4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -31,7 +31,7 @@ set(APPLICATION_NAME qmapshack)
 
 set(APPLICATION_VERSION_MAJOR "1")
 set(APPLICATION_VERSION_MINOR "8")
-set(APPLICATION_VERSION_PATCH "0")
+set(APPLICATION_VERSION_PATCH "1")
 
 add_definitions(-DVER_MAJOR=${APPLICATION_VERSION_MAJOR} -DVER_MINOR=${APPLICATION_VERSION_MINOR} -DVER_STEP=${APPLICATION_VERSION_PATCH} -DAPPLICATION_NAME=${PROJECT_NAME})
 
@@ -84,11 +84,6 @@ endif(NOT ALGLIB_FOUND)
 
 add_subdirectory(src)
 
-if(UNIX AND NOT APPLE)
-    add_subdirectory(test/unittest)
-endif(UNIX AND NOT APPLE)
-
-
 if (UNIX AND NOT WIN32 AND NOT APPLE)
   install(
     FILES
diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user
index 1fb8c7b..6b8367d 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 4.2.1, 2017-03-26T12:51:41. -->
+<!-- Written by QtCreator 4.2.1, 2017-05-13T20:12:37. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
@@ -68,7 +68,7 @@
    <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
     <valuelist type="QVariantList" key="CMake.Configuration">
      <value type="QString">BUILD_FOR_LOCAL_SYSTEM:BOOL=ON</value>
-     <value type="QString">CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++-6</value>
+     <value type="QString">CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/g++-5</value>
      <value type="QString">UPDATE_TRANSLATIONS:BOOL=OFF</value>
     </valuelist>
     <value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/oeichler/Code/cpp/build_QMapShack</value>
diff --git a/README.md b/README.md
index 0c6d8ab..434266f 100644
--- a/README.md
+++ b/README.md
@@ -21,8 +21,13 @@ Dependencies
 
 Next to QT5 you will need the development packages of:
 
-* Proj4
-* GDAL
-* Routino
 
-If you want to compile QMapShack for Windows have a look [at the wiki](https://bitbucket.org/maproom/qmapshack/wiki/BuildWindowsVisualStudio).
\ No newline at end of file
+* [Qt5](https://www.qt.io/) (at least 5.4)
+* [GDAL](http://www.gdal.org/)
+* [Proj4](https://github.com/OSGeo/proj.4/wiki)
+* [Routino](http://www.routino.org/) (at least 3.0)
+* [QuaZip](http://quazip.sourceforge.net/index.html)
+* CMake/Make
+* a C++ compiler (supporting C++11)
+
+If you want to compile QMapShack for Windows have a look [at the wiki](https://bitbucket.org/maproom/qmapshack/wiki/BuildWindowsVisualStudio).
diff --git a/changelog.txt b/changelog.txt
index b47f41b..1bec086 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,3 +1,12 @@
+V 1.8.1
+Fix: Various glitches introduced by the new FIT format
+Fix: Visual tile artefacts in the DEM layer
+[Issue #224] Support pinch-gesture
+[Issue #162] Add "keep last version only" function to objects (tracks, etc...)
+[Issue #221] Offline BRouter & network access
+[Issue #225] BRouter: Renaming tiles fails when updating tiles
+[Issue #215] BRouter (offline) issues (Windows)
+
 V 1.8.0
 Add: Links to quickstart help
 Add: Russian translation
diff --git a/cmake/Modules/FindQuaZip.cmake b/cmake/Modules/FindQuaZip.cmake
index 8fb805c..2984402 100644
--- a/cmake/Modules/FindQuaZip.cmake
+++ b/cmake/Modules/FindQuaZip.cmake
@@ -28,6 +28,9 @@ else (QUAZIP_LIBRARIES AND QUAZIP_INCLUDE_DIRS)
             /usr/include/quazip5
             /usr/local/include/quazip5
             /opt/local/include/quazip5
+            /usr/include/quazip
+            /usr/local/include/quazip
+            /opt/local/include/quazip
             /sw/include/quazip5
             ${CMAKE_INSTALL_PREFIX}/include
             ${QUAZIP_DEV_PATH}/include/
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index d863d99..a380d40 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -83,6 +83,7 @@ endif(APPLE)
 
 
 set( SRCS
+        main.cpp
         GeoMath.cpp
         CMainWindow.cpp
         CSingleInstanceProxy.cpp
@@ -299,6 +300,8 @@ set( SRCS
         gis/fit/defs/CFitFieldProfile.cpp
         gis/fit/decoder/CFitByteDataTransformer.cpp
         gis/fit/decoder/CFitFieldBuilder.cpp
+        gis/fit/decoder/CFitDevFieldDefinition.cpp
+        gis/fit/decoder/CFitDevFieldDefinitionState.cpp
         plot/IPlot.cpp
         plot/CPlotAxis.cpp
         plot/CPlotAxisTime.cpp
@@ -584,6 +587,8 @@ set( HDRS
         gis/fit/defs/CFitFieldProfile.h
         gis/fit/decoder/CFitByteDataTransformer.h
         gis/fit/decoder/CFitFieldBuilder.h
+        gis/fit/decoder/CFitDevFieldDefinition.h
+        gis/fit/decoder/CFitDevFieldDefinitionState.h
         plot/IPlot.h
         plot/CPlotAxis.h
         plot/CPlotAxisTime.h
@@ -766,7 +771,7 @@ if (UNIX AND NOT WIN32 AND NOT APPLE)
     )
 endif()
 
-set(LIBINP
+set(MAININP
         ${SRCS}
         ${HDRS}
         ${UI_HDRS}
@@ -775,11 +780,6 @@ set(LIBINP
         ${${APPLICATION_NAME}_DESKTOP_FILES}
 )
 
-set(MAININP
-    main.cpp
-    ${RC_SRCS}
-)
-
 include_directories(
     ${CMAKE_BINARY_DIR}
 )
@@ -798,7 +798,6 @@ if(APPLE)
      INCLUDE_DIRECTORIES(/System/Library/Frameworks/DiskArbitration.framework)
 endif(APPLE)
 
-add_library(QMS ${LIBINP})
 add_executable(${APPLICATION_NAME} WIN32 ${MAININP})
 
 
@@ -808,21 +807,6 @@ else(Qt5DBus_FOUND)
     set(DBUS_LIB)
 endif(Qt5DBus_FOUND)
 
-target_link_libraries(QMS
-    Qt5::Widgets
-    Qt5::Xml
-    Qt5::Script
-    Qt5::Sql
-    Qt5::WebKitWidgets
-    Qt5::PrintSupport
-    ${DBUS_LIB}
-    ${GDAL_LIBRARIES}
-    ${PROJ_LIBRARIES}
-    ${ROUTINO_LIBRARIES}
-    ${ALGLIB_LIBRARIES}
-    ${QUAZIP_LIBRARIES}
-)
-
 target_link_libraries(${APPLICATION_NAME}
     Qt5::Widgets
     Qt5::Xml
@@ -830,7 +814,6 @@ target_link_libraries(${APPLICATION_NAME}
     Qt5::Sql
     Qt5::WebKitWidgets
     Qt5::PrintSupport
-    QMS
     ${DBUS_LIB}
     ${GDAL_LIBRARIES}
     ${PROJ_LIBRARIES}
diff --git a/src/canvas/CCanvas.cpp b/src/canvas/CCanvas.cpp
index 2e8dcfb..113e495 100644
--- a/src/canvas/CCanvas.cpp
+++ b/src/canvas/CCanvas.cpp
@@ -73,6 +73,8 @@ CCanvas::CCanvas(QWidget *parent, const QString &name)
 
     setMouseTracking(true);
 
+    grabGesture(Qt::PinchGesture);
+
     map     = new CMapDraw(this);
     grid    = new CGrid(map);
     dem     = new CDemDraw(this);
@@ -928,3 +930,35 @@ void CCanvas::print(QPainter& p, const QRectF& area, const QPointF& focus)
 
     setDrawContextSize(oldSize);
 }
+
+bool CCanvas::event(QEvent *event)
+{
+    if (event->type() == QEvent::Gesture)
+    {
+        return gestureEvent(static_cast<QGestureEvent*>(event));
+    }
+    return QWidget::event(event);
+}
+
+bool CCanvas::gestureEvent(QGestureEvent* e)
+{
+    if (QPinchGesture *pinch = dynamic_cast<QPinchGesture *>(e->gesture(Qt::PinchGesture)))
+    {
+        if (pinch->totalChangeFlags() & QPinchGesture::ScaleFactorChanged)
+        {
+            QPointF pos = pinch->centerPoint();
+            QPointF pt1 = pos;
+
+            map->convertPx2Rad(pt1);
+            setZoom(pinch->lastScaleFactor() < pinch->scaleFactor(), needsRedraw);
+            map->convertRad2Px(pt1);
+
+            map->convertRad2Px(posFocus);
+            posFocus -= (pos - pt1);
+            map->convertPx2Rad(posFocus);
+
+            update();
+        }
+    }
+    return true;
+}
diff --git a/src/canvas/CCanvas.h b/src/canvas/CCanvas.h
index 1a7d593..926d0a1 100644
--- a/src/canvas/CCanvas.h
+++ b/src/canvas/CCanvas.h
@@ -30,6 +30,7 @@
 class CMapDraw;
 class CGrid;
 class CDemDraw;
+class QGestureEvent;
 class CGisDraw;
 class CGisItemWpt;
 class CGisItemTrk;
@@ -155,6 +156,8 @@ public slots:
     void slotTriggerCompleteUpdate(CCanvas::redraw_e flags);
 
 protected:
+    bool event(QEvent *) override;
+    bool gestureEvent(QGestureEvent *e);
     void resizeEvent(QResizeEvent *e) override;
     void paintEvent(QPaintEvent  *e) override;
     void mousePressEvent(QMouseEvent  *e) override;
diff --git a/src/canvas/IDrawContext.h b/src/canvas/IDrawContext.h
index 0fcae38..f9b5488 100644
--- a/src/canvas/IDrawContext.h
+++ b/src/canvas/IDrawContext.h
@@ -123,6 +123,11 @@ public:
         return scalesType;
     }
 
+    const QPointF& getZoomFactor() const
+    {
+        return zoomFactor;
+    }
+
     /**
        @brief Set the projection of the draw context
 
@@ -139,6 +144,7 @@ public:
 
     virtual void setScales(const CCanvas::scales_type_e type);
 
+
 signals:
     void sigCanvasUpdate(CCanvas::redraw_e flags);
     void sigStartThread();
diff --git a/src/canvas/IDrawObject.cpp b/src/canvas/IDrawObject.cpp
index 539ed6f..223d13e 100644
--- a/src/canvas/IDrawObject.cpp
+++ b/src/canvas/IDrawObject.cpp
@@ -104,11 +104,15 @@ void IDrawObject::drawTileLQ(const QImage& img, QPolygonF& l, QPainter& p, IDraw
     qreal w   = qCeil( qSqrt(dx1*dx1 + dy1*dy1));
     qreal h   = qCeil( qSqrt(dx2*dx2 + dy2*dy2));
 
+
     // switch to HQ if the gaps get visible
-    if((qAbs(dy1) > 2) || (qAbs(dx2) > 2))
+    if(context.getZoomFactor().x() > 70)
     {
-        drawTileHQ(img, tmp, p, context, pjsrc, pjtar);
-        return;
+        if((qAbs(dy1) > 2) || (qAbs(dx2) > 2))
+        {
+            drawTileHQ(img, tmp, p, context, pjsrc, pjtar);
+            return;
+        }
     }
 
     // calculate rotation. This is not really a reprojection but might be good enough for close zoom levels
@@ -202,8 +206,8 @@ void IDrawObject::drawTileHQ(const QImage& img, QPolygonF& l, QPainter& p, IDraw
             qreal dy1 = pPt[0].y() - pPt[1].y();
             qreal dx2 = pPt[0].x() - pPt[3].x();
             qreal dy2 = pPt[0].y() - pPt[3].y();
-            qreal w   = qCeil( qSqrt(dx1*dx1 + dy1*dy1));
-            qreal h   = qCeil( qSqrt(dx2*dx2 + dy2*dy2));
+            qreal w   = /*qRound*/( qSqrt(dx1*dx1 + dy1*dy1));
+            qreal h   = /*qRound*/( qSqrt(dx2*dx2 + dy2*dy2));
 
             // calculate rotation. This is not really a reprojection but might be good enough for close zoom levels
             qreal a = qAtan(dy1/dx1) * RAD_TO_DEG;
diff --git a/src/dem/IDem.cpp b/src/dem/IDem.cpp
index 01ec879..4fe61a8 100644
--- a/src/dem/IDem.cpp
+++ b/src/dem/IDem.cpp
@@ -58,7 +58,7 @@ IDem::IDem(CDemDraw *parent)
     : IDrawObject(parent)
     , dem(parent)
 {
-    slotSetOpacity(50);
+    slotSetOpacity(17);
     pjtar = pj_init_plus("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
 
     graytable.resize(256);
diff --git a/src/dem/IDem.h b/src/dem/IDem.h
index 372fc70..a6a69fb 100644
--- a/src/dem/IDem.h
+++ b/src/dem/IDem.h
@@ -166,7 +166,7 @@ protected:
 
 private:
     bool bHillshading = false;
-    qreal factorHillshading = 1.0;
+    qreal factorHillshading = 0.1666666716337204;
 
     bool bSlopeColor = false;
     int gradeSlopeColor = 0;
diff --git a/src/gis/IGisItem.cpp b/src/gis/IGisItem.cpp
index 25d5fbc..8dd545a 100644
--- a/src/gis/IGisItem.cpp
+++ b/src/gis/IGisItem.cpp
@@ -470,7 +470,7 @@ void IGisItem::loadHistory(int idx)
     history.histIdxCurrent = idx;
 }
 
-void IGisItem::cutHistory()
+void IGisItem::cutHistoryAfter()
 {
     while(history.events.size() > (history.histIdxCurrent + 1))
     {
@@ -478,6 +478,14 @@ void IGisItem::cutHistory()
     }
 }
 
+void IGisItem::cutHistoryBefore()
+{
+    for (int i = 0; i < history.histIdxCurrent; i++)
+    {
+        history.events[i].data.clear();
+    }
+}
+
 bool IGisItem::isReadOnly() const
 {
     return !(flags & eFlagWriteAllowed) || isOnDevice();
diff --git a/src/gis/IGisItem.h b/src/gis/IGisItem.h
index 948ebdc..e3c975e 100644
--- a/src/gis/IGisItem.h
+++ b/src/gis/IGisItem.h
@@ -436,7 +436,12 @@ public:
     /**
        @brief Remove all history entries younger than the current selected one.
      */
-    void cutHistory();
+    void cutHistoryAfter();
+
+    /**
+       @brief Remove all history entries older than the current selected one.
+    */
+    void cutHistoryBefore();
 
     /**
        @brief Create a clone of itself and pass back the pointer
diff --git a/src/gis/fit/CFitProject.cpp b/src/gis/fit/CFitProject.cpp
index b59f6f4..e2ea16f 100644
--- a/src/gis/fit/CFitProject.cpp
+++ b/src/gis/fit/CFitProject.cpp
@@ -142,15 +142,7 @@ void CFitProject::createGisItems(QFile& file)
     }
     // ql:area is not directly available in FIT (could be calculated)
 
-    // use name of first trk
-    if(name.length() > 0)
-    {
-        setupName(name);
-    }
-    else
-    {
-        setupName(QFileInfo(filename).completeBaseName().replace("_", " "));
-    }
+    setupName(QFileInfo(filename).completeBaseName().replace("_", " "));
 }
 
 CFitProject::~CFitProject()
diff --git a/src/gis/fit/decoder/CFitByteDataTransformer.cpp b/src/gis/fit/decoder/CFitByteDataTransformer.cpp
index 316a9ce..a757e83 100644
--- a/src/gis/fit/decoder/CFitByteDataTransformer.cpp
+++ b/src/gis/fit/decoder/CFitByteDataTransformer.cpp
@@ -21,7 +21,7 @@
 #include "gis/fit/defs/CFitBaseType.h"
 #include "gis/fit/defs/fit_const.h"
 
-unsigned int CFitByteDataTransformer::getUIntValue(const CFitBaseType& baseType, quint8* rawData)
+quint64 CFitByteDataTransformer::getUIntValue(const CFitBaseType& baseType, quint8* rawData)
 {
     switch(baseType.nr())
     {
@@ -37,13 +37,15 @@ unsigned int CFitByteDataTransformer::getUIntValue(const CFitBaseType& baseType,
     case eBaseTypeNrUint32:
     case eBaseTypeNrUint32z:
         return getUint32(rawData);
-
+    case eBaseTypeNrUint64:
+    case eBaseTypeNrUint64z:
+        return getUint64(rawData);
     default:
         return 0;
     }
 }
 
-int CFitByteDataTransformer::getSIntValue(const CFitBaseType& baseType, quint8 *rawData)
+qint64 CFitByteDataTransformer::getSIntValue(const CFitBaseType& baseType, quint8 *rawData)
 {
     switch(baseType.nr())
     {
@@ -55,7 +57,9 @@ int CFitByteDataTransformer::getSIntValue(const CFitBaseType& baseType, quint8 *
 
     case eBaseTypeNrSint32:
         return getSint32(rawData);
-
+        
+    case eBaseTypeNrSint64:
+        return getSint64(rawData);
     default:
         return 0;
     }
@@ -91,6 +95,14 @@ quint32 CFitByteDataTransformer::getUint32(quint8* rawData)
     return ((quint32)rawData[3] << 24) | ((quint32)rawData[2] << 16) | ((quint32)rawData[1] << 8) | (quint32)rawData[0];
 }
 
+quint64 CFitByteDataTransformer::getUint64(quint8* rawData)
+{
+    return ((quint64) rawData[7] << 56) | ((quint64) rawData[6] << 48)
+           | ((quint64) rawData[5] << 40) | ((quint64) rawData[4] << 32)
+           | ((quint64) rawData[3] << 24) | ((quint64) rawData[2] << 16)
+           | ((quint64) rawData[1] << 8) | rawData[0];
+}
+
 qint8 CFitByteDataTransformer::getSint8(quint8* rawData)
 {
     return (qint8) rawData[0];
@@ -106,6 +118,15 @@ qint32 CFitByteDataTransformer::getSint32(quint8* rawData)
     return ((qint32)rawData[3] << 24) | ((qint32)rawData[2] << 16) | ((qint32)rawData[1] << 8) | (qint32)rawData[0];
 }
 
+
+qint64 CFitByteDataTransformer::getSint64(quint8* rawData)
+{
+    return  ((qint64) rawData[7] << 56) | ((qint64) rawData[6] << 48)
+                | ((qint64) rawData[5] << 40) | ((qint64) rawData[4] << 32)
+                | ((qint64) rawData[3] << 24) | ((qint64) rawData[2] << 16)
+                | ((qint64) rawData[1] << 8) | rawData[0];
+}
+
 qreal CFitByteDataTransformer::getFloat32(quint8* rawData)
 {
     qint32 fValue = (qint32) (((qint32)rawData[3] << 24) | ((qint32)rawData[2] << 16) | ((qint32)rawData[1] << 8) | rawData[0]);
diff --git a/src/gis/fit/decoder/CFitByteDataTransformer.h b/src/gis/fit/decoder/CFitByteDataTransformer.h
index dddf84d..422e044 100644
--- a/src/gis/fit/decoder/CFitByteDataTransformer.h
+++ b/src/gis/fit/decoder/CFitByteDataTransformer.h
@@ -28,8 +28,8 @@ class CFitByteDataTransformer
 {
 public:
     CFitByteDataTransformer() = delete;
-    static unsigned int getUIntValue(const CFitBaseType& baseType, quint8* rawData);
-    static int getSIntValue(const CFitBaseType &baseType, quint8 *rawData);
+    static quint64 getUIntValue(const CFitBaseType& baseType, quint8* rawData);
+    static qint64 getSIntValue(const CFitBaseType &baseType, quint8 *rawData);
     static qreal getFloatValue(const CFitBaseType& baseType, quint8* rawData);
     /*
      * param rawData: the fit utf-8 string, 0 terminated.
@@ -42,9 +42,11 @@ private:
     static quint8 getUint8(quint8* rawData);
     static quint16 getUint16(quint8* rawData);
     static quint32 getUint32(quint8* rawData);
+    static quint64 getUint64(quint8* rawData);
     static qint8 getSint8(quint8* rawData);
     static qint16 getSint16(quint8* rawData);
     static qint32 getSint32(quint8* rawData);
+    static qint64 getSint64(quint8* rawData);
     static qreal getFloat32(quint8* rawData);
     static qreal getFloat64(quint8* rawData);
 };
diff --git a/src/gis/fit/decoder/CFitDecoder.cpp b/src/gis/fit/decoder/CFitDecoder.cpp
index 2d41d5a..89da19f 100644
--- a/src/gis/fit/decoder/CFitDecoder.cpp
+++ b/src/gis/fit/decoder/CFitDecoder.cpp
@@ -20,6 +20,7 @@
 #include "gis/fit/decoder/CFitDecoder.h"
 #include "gis/fit/decoder/CFitFieldDataState.h"
 #include "gis/fit/decoder/CFitFieldDefinitionState.h"
+#include "gis/fit/decoder/CFitDevFieldDefinitionState.h"
 #include "gis/fit/decoder/CFitHeaderState.h"
 #include "gis/fit/decoder/CFitRecordContentState.h"
 #include "gis/fit/decoder/CFitRecordHeaderState.h"
@@ -31,6 +32,7 @@ CFitDecoder::CFitDecoder()
     stateMap[eDecoderStateRecord] = new CFitRecordHeaderState(data);
     stateMap[eDecoderStateRecordContent] = new CFitRecordContentState(data);
     stateMap[eDecoderStateFieldDef] = new CFitFieldDefinitionState(data);
+    stateMap[eDecoderStateDevFieldDef] = new CFitDevFieldDefinitionState(data);
     stateMap[eDecoderStateFieldData] = new CFitFieldDataState(data);
     stateMap[eDecoderStateFileCrc] = new CFitCrcState(data);
 }
@@ -45,10 +47,11 @@ CFitDecoder::~CFitDecoder()
 
 void CFitDecoder::resetSharedData()
 {
-    data.defintions = QMap<quint8, CFitDefinitionMessage>();
-    data.defintionHistory = QList<CFitDefinitionMessage>();
+    data.definitions = QMap<quint8, CFitDefinitionMessage>();
+    data.definitionHistory = QList<CFitDefinitionMessage>();
     data.messages = QList<CFitMessage>();
-    data.lastDefintion = nullptr;
+    data.devFieldProfiles = QList<CFitFieldProfile>();
+    data.lastDefinition = nullptr;
     data.lastMessage = nullptr;
     data.timestamp = 0;
     data.lastTimeOffset = 0;
@@ -57,7 +60,7 @@ void CFitDecoder::resetSharedData()
     data.crc = 0;
 }
 
-void printDefintions(const QList<CFitDefinitionMessage>& defs)
+void printDefinitions(const QList<CFitDefinitionMessage>& defs)
 {
     for(int i = 0; i < defs.size(); i++)
     {
@@ -81,9 +84,21 @@ void printMessages(const QList<CFitMessage>& messages)
 
 void CFitDecoder::printDebugInfo()
 {
-    FITDEBUG(1, printDefintions(data.defintionHistory))
+    FITDEBUG(1, printDefinitions(data.definitionHistory))
     FITDEBUG(1, printMessages(data.messages))
 }
+
+QList<QString> decoderStateNames = {"File Header", "Record", "Record Content", "Field Definition",
+                                    "Development Field Definition", "Field Data", "CRC", "End"};
+
+void printByte(QFile& file, decode_state_e state, quint8 dataByte)
+{
+    FITDEBUG(3, qDebug() << QString("decoding byte %1 - %2 - %3")
+            .arg(file.pos(), 6, 10, QLatin1Char(' '))
+            .arg(dataByte, 8, 2, QLatin1Char('0'))
+            .arg(decoderStateNames.at(state)));
+}
+
 void CFitDecoder::decode(QFile &file)
 {
     resetSharedData();
@@ -97,6 +112,7 @@ void CFitDecoder::decode(QFile &file)
         file.getChar((char *) &dataByte);
         try
         {
+            printByte(file, state, dataByte);
             state = stateMap[state]->processByte(dataByte);
             if (state == eDecoderStateEnd)
             {
diff --git a/src/gis/fit/decoder/CFitDefinitionMessage.cpp b/src/gis/fit/decoder/CFitDefinitionMessage.cpp
index bcaf016..372a21e 100644
--- a/src/gis/fit/decoder/CFitDefinitionMessage.cpp
+++ b/src/gis/fit/decoder/CFitDefinitionMessage.cpp
@@ -25,13 +25,14 @@ static const quint8 fitArchitecureEndianMask = 0x01;
 
 
 CFitDefinitionMessage::CFitDefinitionMessage()
-    : CFitDefinitionMessage(fitLocalMesgNrInvalid)
+    : CFitDefinitionMessage(fitLocalMesgNrInvalid, false)
 {
 }
 
 CFitDefinitionMessage::CFitDefinitionMessage(const CFitDefinitionMessage& copy)
     : globalMesgNr(copy.globalMesgNr), architecture(copy.architecture), nrOfFields(copy.nrOfFields),
-    localMesgNr(copy.localMesgNr), fields(copy.fields), messageProfile(CFitProfileLookup::getProfile(globalMesgNr))
+    nrOfDevFields(copy.nrOfDevFields), localMesgNr(copy.localMesgNr), devFlag(copy.devFlag), fields(copy.fields),
+    devFields(copy.devFields), messageProfile(CFitProfileLookup::getProfile(globalMesgNr))
 {
     for(CFitFieldDefinition& field : fields)
     {
@@ -39,9 +40,9 @@ CFitDefinitionMessage::CFitDefinitionMessage(const CFitDefinitionMessage& copy)
     }
 }
 
-CFitDefinitionMessage::CFitDefinitionMessage(quint8 localMesgNr)
-    : globalMesgNr(fitGlobalMesgNrInvalid), architecture(0), nrOfFields(0), localMesgNr(localMesgNr), fields(),
-    messageProfile(CFitProfileLookup::getProfile(fitGlobalMesgNrInvalid))
+CFitDefinitionMessage::CFitDefinitionMessage(quint8 localMesgNr, bool devFlag)
+    : globalMesgNr(fitGlobalMesgNrInvalid), architecture(0), nrOfFields(0), nrOfDevFields(0), localMesgNr(localMesgNr),
+      devFlag(devFlag), fields(), devFields(), messageProfile(CFitProfileLookup::getProfile(fitGlobalMesgNrInvalid))
 {
 }
 
@@ -62,6 +63,11 @@ void CFitDefinitionMessage::setNrOfFields(quint8 nrOfFields)
     this->nrOfFields = nrOfFields;
 }
 
+void CFitDefinitionMessage::setNrOfDevFields(quint8 nrOfDevFields)
+{
+    this->nrOfDevFields = nrOfDevFields;
+}
+
 quint8 CFitDefinitionMessage::getArchitectureBit() const
 {
     return architecture & fitArchitecureEndianMask;
@@ -72,6 +78,11 @@ void CFitDefinitionMessage::addField(CFitFieldDefinition fieldDef)
     fields.append(fieldDef);
 }
 
+void CFitDefinitionMessage::addDevField(CFitFieldDefinition fieldDef)
+{
+    devFields.append(fieldDef);
+}
+
 bool CFitDefinitionMessage::hasField(const quint8 fieldNum) const
 {
     for (int i=0; i< fields.size(); i++)
@@ -112,21 +123,40 @@ const CFitFieldDefinition& CFitDefinitionMessage::getFieldByIndex(const quint16
     return dummyDefinitionField;
 }
 
+const CFitFieldDefinition& CFitDefinitionMessage::getDevFieldByIndex(const quint16 index) const
+{
+    if (index < devFields.size())
+    {
+        return devFields[index];
+    }
+    // dummy field for unknown field nr.
+    static const CFitFieldDefinition dummyDefinitionDevField;
+
+    return dummyDefinitionDevField;
+}
+
 
 QStringList CFitDefinitionMessage::messageInfo() const
 {
     QStringList list;
-    list << QString("Definition %1 (%2) local nr %3, arch %4, # fields %5")
+    list << QString("Definition %1 (%2) local nr %3, arch %4, # fields %5, # dev fields %6")
         .arg(profile().getName())
         .arg(getGlobalMesgNr())
         .arg(getLocalMesgNr())
         .arg(getArchitectureBit())
-        .arg(getNrOfFields());
+        .arg(getNrOfFields())
+        .arg(getNrOfDevFields());
 
     for(const CFitFieldDefinition& field: fields)
     {
         list << field.fieldInfo();
     }
+
+    for(const CFitFieldDefinition& devField: devFields)
+    {
+        list << devField.fieldInfo();
+    }
+
     return list;
 }
 
diff --git a/src/gis/fit/decoder/CFitDefinitionMessage.h b/src/gis/fit/decoder/CFitDefinitionMessage.h
index 71c0dcd..d6b38f8 100644
--- a/src/gis/fit/decoder/CFitDefinitionMessage.h
+++ b/src/gis/fit/decoder/CFitDefinitionMessage.h
@@ -20,6 +20,7 @@
 #define CFITMESSAGEDEFINTION_H
 
 #include "gis/fit/decoder/CFitFieldDefinition.h"
+#include "gis/fit/decoder/CFitDevFieldDefinition.h"
 
 #include <QtCore>
 
@@ -29,7 +30,7 @@ class CFitProfile;
 class CFitDefinitionMessage final
 {
 public:
-    CFitDefinitionMessage(quint8 localMesgNr);
+    CFitDefinitionMessage(quint8 localMesgNr, bool devFlag);
 
     CFitDefinitionMessage();
     CFitDefinitionMessage(const CFitDefinitionMessage& copy);
@@ -37,20 +38,27 @@ public:
     void setArchiteture(quint8 arch);
     void setGlobalMesgNr(quint16 globalMesgNr);
     void setNrOfFields(quint8 nrOfFields);
+    void setNrOfDevFields(quint8 nrOfDevFields);
 
     quint8 getArchitectureBit() const;
     quint16 getGlobalMesgNr()   const { return globalMesgNr; }
     quint8 getNrOfFields()      const { return nrOfFields;   }
+    quint8 getNrOfDevFields()   const { return nrOfDevFields; }
     quint8 getLocalMesgNr()     const { return localMesgNr;  }
+    bool developerFlag()        const { return devFlag; }
 
     const CFitProfile& profile() const { return *messageProfile; }
 
     const QList<CFitFieldDefinition>& getFields() const { return fields; }
+    const QList<CFitFieldDefinition>& getDevFields() const { return devFields; }
+
 
     void addField(CFitFieldDefinition field);
+    void addDevField(CFitFieldDefinition field);
     bool hasField(const quint8 fieldNum) const;
     const CFitFieldDefinition& getField(const quint8 fieldNum) const;
     const CFitFieldDefinition& getFieldByIndex(const quint16 index) const;
+    const CFitFieldDefinition& getDevFieldByIndex(const quint16 index) const;
 
     QStringList messageInfo() const;
 
@@ -59,8 +67,11 @@ private:
     quint16 globalMesgNr;
     quint8 architecture;
     quint8 nrOfFields;
+    quint8 nrOfDevFields;
     quint8 localMesgNr;
+    bool devFlag;
     QList<CFitFieldDefinition> fields;
+    QList<CFitFieldDefinition> devFields;
     const CFitProfile* messageProfile;
 };
 
diff --git a/src/gis/fit/decoder/CFitDevFieldDefinition.cpp b/src/gis/fit/decoder/CFitDevFieldDefinition.cpp
new file mode 100644
index 0000000..4b38735
--- /dev/null
+++ b/src/gis/fit/decoder/CFitDevFieldDefinition.cpp
@@ -0,0 +1,54 @@
+/**********************************************************************************************
+   Copyright (C) 2015 Ivo Kronenberg
+
+   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/fit/decoder/CFitDevFieldDefinition.h"
+
+#include "gis/fit/decoder/CFitDefinitionMessage.h"
+#include "gis/fit/defs/CFitBaseType.h"
+#include "gis/fit/defs/CFitFieldProfile.h"
+#include "gis/fit/defs/CFitProfileLookup.h"
+#include "gis/fit/defs/fit_const.h"
+
+
+CFitDevFieldDefinition::CFitDevFieldDefinition(quint8 fieldNr, quint8 size, quint8 devDataIndex)
+    : fieldNr(fieldNr), size(size), devDataIndex(devDataIndex)
+{
+}
+
+QString CFitDevFieldDefinition::fieldInfo() const
+{
+    QString fstr = QString("DEV FIELD %1: type %3, size %3")
+                   .arg(getFieldNr())
+                   .arg(getSize())
+                   .arg(getDevDataIndex());
+    return fstr;
+}
+
+quint8 CFitDevFieldDefinition::getFieldNr() const
+{
+    return fieldNr;
+}
+
+quint8 CFitDevFieldDefinition::getSize() const
+{
+    return size;
+}
+
+quint8 CFitDevFieldDefinition::getDevDataIndex() const {
+    return devDataIndex;
+}
\ No newline at end of file
diff --git a/src/gis/fit/decoder/CFitFieldDataState.h b/src/gis/fit/decoder/CFitDevFieldDefinition.h
similarity index 63%
copy from src/gis/fit/decoder/CFitFieldDataState.h
copy to src/gis/fit/decoder/CFitDevFieldDefinition.h
index f10159e..6bfaf84 100644
--- a/src/gis/fit/decoder/CFitFieldDataState.h
+++ b/src/gis/fit/decoder/CFitDevFieldDefinition.h
@@ -16,26 +16,28 @@
 
 **********************************************************************************************/
 
-#ifndef CFITFIELDDATASTATE_H
-#define CFITFIELDDATASTATE_H
+#ifndef CFITDEVFIELDDEFINITION_H
+#define CFITDEVFIELDDEFINITION_H
 
-#include "gis/fit/decoder/IFitDecoderState.h"
+#include <QtCore>
 
-static const int fitMaxFieldSize =255;
-
-class CFitFieldDataState final : public IFitDecoderState
+// content of the field description messages
+class CFitDevFieldDefinition final
 {
 public:
-    CFitFieldDataState(shared_state_data_t &data) : IFitDecoderState(data) { reset(); }
-    virtual ~CFitFieldDataState() {}
-    void reset() override;
-    decode_state_e process(quint8 &dataByte) override;
+    CFitDevFieldDefinition(quint8 fieldNr, quint8 size, quint8 devDataIndex);
+    CFitDevFieldDefinition() = default;
+
+    QString fieldInfo() const;
+
+    quint8 getFieldNr() const;
+    quint8 getSize() const;
+    quint8 getDevDataIndex() const;
 
 private:
-    quint8 fieldIndex;
-    quint8 fieldDataIndex;
-    quint8 fieldData[fitMaxFieldSize];
+    quint8 fieldNr = 0;
+    quint8 size = 0;
+    quint8 devDataIndex = 0;
 };
 
-
-#endif // CFITFIELDDATASTATE_H
+#endif // CFITDEVFIELDDEFINITION_H
diff --git a/src/gis/fit/decoder/CFitFieldDefinitionState.cpp b/src/gis/fit/decoder/CFitDevFieldDefinitionState.cpp
similarity index 66%
copy from src/gis/fit/decoder/CFitFieldDefinitionState.cpp
copy to src/gis/fit/decoder/CFitDevFieldDefinitionState.cpp
index 7713812..3a2cad5 100644
--- a/src/gis/fit/decoder/CFitFieldDefinitionState.cpp
+++ b/src/gis/fit/decoder/CFitDevFieldDefinitionState.cpp
@@ -16,28 +16,29 @@
 
 **********************************************************************************************/
 
-#include "gis/fit/decoder/CFitFieldDefinitionState.h"
+#include "gis/fit/decoder/CFitDevFieldDefinitionState.h"
 #include "gis/fit/defs/fit_const.h"
+#include "gis/fit/defs/CFitBaseType.h"
 
 /**
  * byte
- * 0: field definition number
+ * 0: field number
  * 1: size in bytes of field data
- * 2: base type
+ * 2: developer data index (maps to developer data id message)
  */
 
-void CFitFieldDefinitionState::reset()
+void CFitDevFieldDefinitionState::reset()
 {
     offset = 0;
 }
 
-decode_state_e CFitFieldDefinitionState::process(quint8 &dataByte)
+decode_state_e CFitDevFieldDefinitionState::process(quint8 &dataByte)
 {
     switch (offset++)
     {
     case 0:
-        // field definition number
-        defNr = dataByte;
+        // field number
+        fieldNr = dataByte;
         break;
 
     case 1:
@@ -46,20 +47,22 @@ decode_state_e CFitFieldDefinitionState::process(quint8 &dataByte)
         break;
 
     case 2:
-        // field base type
-        type = dataByte;
+        // field developer data index
+        devDataIndex = dataByte;
         // get the previously (in RecordHeaderState) added definition message
         CFitDefinitionMessage* def = latestDefinition();
+        CFitFieldProfile* profile = devFieldProfile(fieldNr);
+
         // add the new field definition
-        def->addField(CFitFieldDefinition(def, defNr, size, type));
+        def->addDevField(CFitFieldDefinition(def, profile, fieldNr, size, profile->getBaseType().baseTypeField()));
         reset();
-        if (def->getFields().size() >= def->getNrOfFields())
+        if (def->getDevFields().size() >= def->getNrOfDevFields())
         {
             FITDEBUG(2, qDebug() << latestDefinition()->messageInfo())
-            endDefintion();
+            endDefinition();
             return eDecoderStateRecord;
         }
     }
 
-    return eDecoderStateFieldDef;
+    return eDecoderStateDevFieldDef;
 }
diff --git a/src/gis/fit/decoder/CFitFieldDataState.h b/src/gis/fit/decoder/CFitDevFieldDefinitionState.h
similarity index 70%
copy from src/gis/fit/decoder/CFitFieldDataState.h
copy to src/gis/fit/decoder/CFitDevFieldDefinitionState.h
index f10159e..05a41dd 100644
--- a/src/gis/fit/decoder/CFitFieldDataState.h
+++ b/src/gis/fit/decoder/CFitDevFieldDefinitionState.h
@@ -16,26 +16,26 @@
 
 **********************************************************************************************/
 
-#ifndef CFITFIELDDATASTATE_H
-#define CFITFIELDDATASTATE_H
+#ifndef CFITDEVFIELDDEFINITIONSTATE_H
+#define CFITDEVFIELDDEFINITIONSTATE_H
 
 #include "gis/fit/decoder/IFitDecoderState.h"
 
-static const int fitMaxFieldSize =255;
-
-class CFitFieldDataState final : public IFitDecoderState
+class CFitDevFieldDefinitionState final : public IFitDecoderState
 {
 public:
-    CFitFieldDataState(shared_state_data_t &data) : IFitDecoderState(data) { reset(); }
-    virtual ~CFitFieldDataState() {}
+    CFitDevFieldDefinitionState(shared_state_data_t &data) : IFitDecoderState(data) { reset(); }
+    virtual ~CFitDevFieldDefinitionState() {}
+
     void reset() override;
     decode_state_e process(quint8 &dataByte) override;
 
 private:
-    quint8 fieldIndex;
-    quint8 fieldDataIndex;
-    quint8 fieldData[fitMaxFieldSize];
-};
+    quint8 offset = 0;
 
+    quint8 fieldNr = 0;
+    quint8 size = 0;
+    quint8 devDataIndex = 0;
+};
 
-#endif // CFITFIELDDATASTATE_H
+#endif //CFITDEVFIELDDEFINITIONSTATE_H
diff --git a/src/gis/fit/decoder/CFitField.cpp b/src/gis/fit/decoder/CFitField.cpp
index bf46e2a..e23b14c 100644
--- a/src/gis/fit/decoder/CFitField.cpp
+++ b/src/gis/fit/decoder/CFitField.cpp
@@ -77,9 +77,10 @@ void CFitField::setProfile(const CFitFieldProfile* profile)
 
 QString CFitField::fieldInfo() const
 {
-    QString str = QString("%1 %2 (%3): %4 %5 %6 %7")
+    QString str = QString("%1 %2%3 (%4): %5 %6 %7 %8")
                   .arg(profile().getTyp())
                   .arg(profile().getName())
+                  .arg(profile().getFieldType()  == eFieldTypeDevelopment ? " DEV" : "")
                   .arg(getFieldDefNr())
                   .arg(value.toString())
                   .arg(profile().getUnits())
diff --git a/src/gis/fit/decoder/CFitFieldBuilder.cpp b/src/gis/fit/decoder/CFitFieldBuilder.cpp
index 48da911..6a9dd3a 100644
--- a/src/gis/fit/decoder/CFitFieldBuilder.cpp
+++ b/src/gis/fit/decoder/CFitFieldBuilder.cpp
@@ -24,6 +24,8 @@
 #include "gis/fit/defs/CFitBaseType.h"
 #include "gis/fit/defs/CFitFieldProfile.h"
 #include "gis/fit/defs/CFitProfileLookup.h"
+#include "gis/fit/defs/CFitProfile.h"
+
 
 void CFitFieldBuilder::evaluateSubfieldsAndExpandComponents(CFitMessage& mesg)
 {
@@ -37,11 +39,16 @@ void CFitFieldBuilder::evaluateSubfieldsAndExpandComponents(CFitMessage& mesg)
     }
 }
 
-CFitField CFitFieldBuilder::buildField(const CFitFieldDefinition &def, quint8 *fieldData, const CFitMessage& message)
+CFitField CFitFieldBuilder::buildField(const CFitFieldDefinition& def, quint8* fieldData, const CFitMessage& message)
+{
+    const CFitFieldProfile* fieldProfile = CFitProfileLookup::getFieldForProfile(message.getGlobalMesgNr(), def.getDefNr());
+    return buildField(*fieldProfile, def, fieldData, message);
+}
+
+CFitField CFitFieldBuilder::buildField(const CFitFieldProfile &fieldProfile, const CFitFieldDefinition &def, quint8 *fieldData, const CFitMessage& message)
 {
     CFitByteDataTransformer::swapFieldData(def, fieldData);
     const CFitBaseType& baseType = def.getBaseType();
-    const CFitFieldProfile* fieldProfile = CFitProfileLookup::getFieldForProfile(message.getGlobalMesgNr(), def.getDefNr());
 
     QVariant value;
     if (baseType.isSignedInt())
@@ -70,7 +77,7 @@ CFitField CFitFieldBuilder::buildField(const CFitFieldDefinition &def, quint8 *f
         throw tr("FIT decoding error: unknown base type %1.").arg(baseType.nr());
     }
     bool valid = isValueValid(def, fieldData);
-    return CFitField(def, fieldProfile, value, valid);
+    return CFitField(def, &fieldProfile, value, valid);
 }
 
 
diff --git a/src/gis/fit/decoder/CFitFieldBuilder.h b/src/gis/fit/decoder/CFitFieldBuilder.h
index bafa299..bec6599 100644
--- a/src/gis/fit/decoder/CFitFieldBuilder.h
+++ b/src/gis/fit/decoder/CFitFieldBuilder.h
@@ -24,6 +24,7 @@
 class CFitField;
 class CFitMessage;
 class CFitFieldDefinition;
+class CFitFieldProfile;
 
 class CFitFieldBuilder
 {
@@ -32,6 +33,7 @@ public:
     CFitFieldBuilder() = delete;
     static void evaluateSubfieldsAndExpandComponents(CFitMessage& mesg);
     static CFitField buildField(const CFitFieldDefinition& def, quint8* fieldData, const CFitMessage& message);
+    static CFitField buildField(const CFitFieldProfile &fieldProfile, const CFitFieldDefinition& def, quint8* fieldData, const CFitMessage& message);
 
 private:
     static bool isValueValid(const CFitFieldDefinition &def, quint8 *fieldData);
diff --git a/src/gis/fit/decoder/CFitFieldDataState.cpp b/src/gis/fit/decoder/CFitFieldDataState.cpp
index 055050b..caf071c 100644
--- a/src/gis/fit/decoder/CFitFieldDataState.cpp
+++ b/src/gis/fit/decoder/CFitFieldDataState.cpp
@@ -20,47 +20,41 @@
 #include "gis/fit/decoder/CFitFieldDataState.h"
 #include "gis/fit/defs/fit_const.h"
 #include "gis/fit/defs/fit_fields.h"
+#include "gis/fit/defs/fit_enums.h"
+#include "gis/fit/defs/CFitBaseType.h"
+#include "gis/fit/defs/CFitProfileLookup.h"
 
 void CFitFieldDataState::reset()
 {
     fieldDataIndex = 0;
     fieldIndex = 0;
+    devFieldIndex = 0;
 }
 
 
 decode_state_e CFitFieldDataState::process(quint8 &dataByte)
 {
     CFitMessage& mesg = *latestMessage();
-    const CFitFieldDefinition& fieldDef = defintion(mesg.getLocalMesgNr())->getFieldByIndex(fieldIndex);
+    CFitDefinitionMessage* defMesg = definition(mesg.getLocalMesgNr());
 
     // add the read byte to the data array
     fieldData[fieldDataIndex++] = dataByte;
 
-    if (fieldDataIndex >= fieldDef.getSize())
+    handleFitField();
+    bool allFieldRead =  fieldIndex >= defMesg->getNrOfFields();
+    if(allFieldRead)
     {
-        // all bytes are read for current field
-
-        // new field with data
-        CFitField f = CFitFieldBuilder::buildField(fieldDef, fieldData, mesg);
-        mesg.addField(f);
-
-        // The special case time record.
-        // timestamp has always the same value for all enums. it does not matter against which we're comparing.
-        if (fieldDef.getDefNr() == eRecordTimestamp)
-        {
-            setTimestamp(f.getValue().toUInt());
-        }
-
-        // new field follows, reset
-        fieldDataIndex = 0;
-        fieldIndex++;
+        handleDevField();
     }
+    bool allDevFielRead = devFieldIndex >= defMesg->getNrOfDevFields();
 
-    if (fieldIndex >= defintion(mesg.getLocalMesgNr())->getNrOfFields())
+    if (allFieldRead && allDevFielRead)
     {
         // Now that the entire message is decoded we may evaluate subfields and expand components
         CFitFieldBuilder::evaluateSubfieldsAndExpandComponents(mesg);
 
+        devProfile(mesg);
+
         reset();
         FITDEBUG(2, qDebug() << mesg.messageInfo())
         // after all fields read, go to next record header
@@ -70,3 +64,180 @@ decode_state_e CFitFieldDataState::process(quint8 &dataByte)
     // there are more fields to read for the current message
     return eDecoderStateFieldData;
 }
+
+
+bool CFitFieldDataState::handleFitField()
+{
+    CFitMessage& mesg = *latestMessage();
+    CFitDefinitionMessage* defMesg = definition(mesg.getLocalMesgNr());
+
+    if (fieldIndex < defMesg->getNrOfFields())
+    {
+        const CFitFieldDefinition& fieldDef = defMesg->getFieldByIndex(fieldIndex);
+        if (fieldDataIndex >= fieldDef.getSize())
+        {
+            // all bytes are read for current field
+
+            // new field with data
+            CFitField f = CFitFieldBuilder::buildField(fieldDef, fieldData, mesg);
+            mesg.addField(f);
+
+            // The special case time record.
+            // timestamp has always the same value for all enums. it does not matter against which we're comparing.
+            if (fieldDef.getDefNr() == eRecordTimestamp)
+            {
+                setTimestamp(f.getValue().toUInt());
+            }
+
+            // new field follows, reset
+            fieldDataIndex = 0;
+            fieldIndex++;
+        }
+    }
+    return fieldIndex >= defMesg->getNrOfFields();
+}
+
+bool CFitFieldDataState::handleDevField()
+{
+    CFitMessage& mesg = *latestMessage();
+    CFitDefinitionMessage* defMesg = definition(mesg.getLocalMesgNr());
+
+    if (devFieldIndex < defMesg->getNrOfDevFields())
+    {
+        const CFitFieldDefinition& fieldDef = defMesg->getDevFieldByIndex(devFieldIndex);
+        if (fieldDataIndex >= fieldDef.getSize())
+        {
+            // handling developer data for mapping the field data to its definitions:
+            // part 2, reading field data and attach dynamic profile
+            CFitFieldProfile* fieldProfile = devFieldProfile(fieldDef.getDefNr());
+            if (fieldProfile->getBaseType().nr() == eBaseTypeNrInvalid)
+            {
+                // test if profile exists
+                throw tr("Missing field definition for development field.");
+            }
+
+            CFitField f = CFitFieldBuilder::buildField(*fieldProfile, fieldDef, fieldData, mesg);
+            mesg.addField(f);
+
+            // new field follows, reset
+            fieldDataIndex = 0;
+            devFieldIndex++;
+        }
+    }
+    return devFieldIndex >= defMesg->getNrOfDevFields();
+}
+
+void CFitFieldDataState::devProfile(CFitMessage& mesg)
+{
+    // handling developer data for mapping the field data to its definitions:
+    // part 1, dynamic profiles creation
+    if (mesg.getGlobalMesgNr() == eMesgNumDeveloperDataId)
+    {
+        clearDevFieldProfiles();
+    }
+    if (mesg.getGlobalMesgNr() == eMesgNumFieldDescription)
+    {
+        CFitFieldProfile devFieldProfile = buildDevFieldProfile(mesg);
+        FITDEBUG(2, qDebug() << devFieldProfile.fieldProfileInfo());
+        addDevFieldProfile(devFieldProfile);
+    }
+}
+
+CFitFieldProfile CFitFieldDataState::buildDevFieldProfile(CFitMessage& mesg)
+{
+    QString fieldName;
+    quint8 fieldDefNr = 0;
+    quint8 devDataIdx = 0;
+    quint8 baseType = eBaseTypeNrInvalid;
+    qreal scale = 0;
+    quint8 array = 0;
+    QString components;
+    qint16 offset = 0;
+    QString units;
+    QString bits;
+    QString accumulate;
+    quint8 baseUnitId = 0;
+    quint8 natvieMesgNum = 0;
+    quint8 nativeFieldNum = 0;
+
+    for (const CFitField field : mesg.getFields()) {
+        if (field.isValidValue()) {
+            switch (field.getFieldDefNr()) {
+                case eFieldDescriptionDeveloperDataIndex:
+                    devDataIdx = (quint8) field.getValue().toUInt();
+                    break;
+                case eFieldDescriptionFieldDefinitionNumber:
+                    fieldDefNr = (quint8) field.getValue().toUInt();
+                    break;
+                case eFieldDescriptionFitBaseTypeId:
+                    baseType = (quint8) field.getValue().toUInt(); // enum
+                    break;
+                case eFieldDescriptionFieldName:
+                    fieldName = field.getValue().toString();
+                    break;
+                case eFieldDescriptionArray:
+                    array = (quint8) field.getValue().toUInt();
+                    break;
+                case eFieldDescriptionComponents:
+                    components = field.getValue().toString();
+                    break;
+                case eFieldDescriptionScale:
+                    scale = (qreal) field.getValue().toDouble();
+                    break;
+                case eFieldDescriptionOffset:
+                    offset = (qint16) field.getValue().toInt();
+                    break;
+                case eFieldDescriptionUnits:
+                    units = field.getValue().toString();
+                    break;
+                case eFieldDescriptionBits:
+                    bits = field.getValue().toString();
+                    break;
+                case eFieldDescriptionAccumulate:
+                    accumulate = field.getValue().toString();
+                    break;
+                case eFieldDescriptionFitBaseUnitId:
+                    baseUnitId = (quint8) field.getValue().toUInt(); // enum
+                    break;
+                case eFieldDescriptionNativeMesgNum:
+                    natvieMesgNum = (quint8) field.getValue().toUInt(); // enum
+                    break;
+                case eFieldDescriptionNativeFieldNum:
+                    nativeFieldNum = (quint8) field.getValue().toUInt();
+                    break;
+                default:
+                    throw tr("FIT decoding error: invalid field def nr %1 while creating dev field profile.")
+                            .arg(field.getFieldDefNr());
+                    break;
+            }
+        }
+    }
+
+    Q_UNUSED(devDataIdx)
+    Q_UNUSED(array)
+    Q_UNUSED(baseUnitId)
+
+    if (natvieMesgNum && nativeFieldNum)
+    {
+        const CFitFieldProfile* nativeFieldProfile = CFitProfileLookup::getFieldForProfile(natvieMesgNum, nativeFieldNum);
+        if (nativeFieldProfile->getBaseType().nr() == eBaseTypeNrInvalid)
+        {
+            qWarning() << "DEV field"<< fieldName <<" field profile for mesg num"<< natvieMesgNum << "and field num" << nativeFieldNum << "does not exist.";
+        }
+        if (nativeFieldProfile->getUnits() != units)
+        {
+            qWarning() << "DEV field" << fieldName << "units" << units <<" do not match existing profile units" << nativeFieldProfile->getUnits();
+        }
+        // scale and offset not allowed if a fit field is overwritten.
+        scale = 0;
+        offset = 0;
+    }
+
+    CFitFieldProfile devFieldProfile = CFitFieldProfile(nullptr, fieldName, *CFitBaseTypeMap::get(baseType), fieldDefNr,
+                                                        scale, offset, units, eFieldTypeDevelopment);
+    // for documentation: the development field profile may contain more fields in the future as can be adumbrated by
+    // the description field enumeration. According to the FIT specification Rev 2.3  table 4-9 - Field Description Messages
+    // those fields are not yet used.
+
+    return devFieldProfile;
+}
\ No newline at end of file
diff --git a/src/gis/fit/decoder/CFitFieldDataState.h b/src/gis/fit/decoder/CFitFieldDataState.h
index f10159e..a407fa5 100644
--- a/src/gis/fit/decoder/CFitFieldDataState.h
+++ b/src/gis/fit/decoder/CFitFieldDataState.h
@@ -32,7 +32,13 @@ public:
     decode_state_e process(quint8 &dataByte) override;
 
 private:
+    bool handleFitField();
+    bool handleDevField();
+    void devProfile(CFitMessage& mesg);
+    CFitFieldProfile buildDevFieldProfile(CFitMessage& mesg);
+
     quint8 fieldIndex;
+    quint8 devFieldIndex;
     quint8 fieldDataIndex;
     quint8 fieldData[fitMaxFieldSize];
 };
diff --git a/src/gis/fit/decoder/CFitFieldDefinition.cpp b/src/gis/fit/decoder/CFitFieldDefinition.cpp
index 41a2595..628c257 100644
--- a/src/gis/fit/decoder/CFitFieldDefinition.cpp
+++ b/src/gis/fit/decoder/CFitFieldDefinition.cpp
@@ -17,7 +17,6 @@
 **********************************************************************************************/
 
 #include "gis/fit/decoder/CFitFieldDefinition.h"
-
 #include "gis/fit/decoder/CFitDefinitionMessage.h"
 #include "gis/fit/defs/CFitBaseType.h"
 #include "gis/fit/defs/CFitFieldProfile.h"
@@ -27,8 +26,14 @@
 static const quint8 fitEndianFlagMask = 0x80;
 
 
+CFitFieldDefinition::CFitFieldDefinition(CFitDefinitionMessage* parent, CFitFieldProfile* fieldProfile, quint8 defNr, quint8 size, quint8 type)
+   : defNr(defNr), size(size), type(type), baseType(CFitBaseTypeMap::get(type)), parentDefintion(parent), fieldProfile(fieldProfile)
+{
+}
+
 CFitFieldDefinition::CFitFieldDefinition(CFitDefinitionMessage* parent, quint8 defNr, quint8 size, quint8 type)
-    : defNr(defNr), size(size), type(type), baseType(CFitBaseTypeMap::get(type)), parentDefintion(parent)
+   : CFitFieldDefinition(parent, nullptr, defNr, size, type)
+
 {
     fieldProfile = CFitProfileLookup::getFieldForProfile(parentDefintion ? parentDefintion->getGlobalMesgNr() : fitGlobalMesgNrInvalid, defNr);
 }
@@ -40,9 +45,10 @@ CFitFieldDefinition::CFitFieldDefinition()
 
 QString CFitFieldDefinition::fieldInfo() const
 {
-    QString fstr = QString("%1 %2 (%3): %4, type %5, size %6, endian %7")
+    QString fstr = QString("%1 %2 %3 (%4): %5, type %6, size %7, endian %8")
                    .arg(profile().hasSubfields() ? "dynamic" : profile().hasComponents() ? "component" : "field")
                    .arg(profile().getName())
+                   .arg(profile().getFieldType() == eFieldTypeDevelopment ? " DEV" : "")
                    .arg(getDefNr())
                    .arg(getBaseType().name())
                    .arg(getType())
diff --git a/src/gis/fit/decoder/CFitFieldDefinition.h b/src/gis/fit/decoder/CFitFieldDefinition.h
index 3b9f3f3..c3fde43 100644
--- a/src/gis/fit/decoder/CFitFieldDefinition.h
+++ b/src/gis/fit/decoder/CFitFieldDefinition.h
@@ -25,9 +25,11 @@ class CFitDefinitionMessage;
 class CFitBaseType;
 class CFitFieldProfile;
 
+
 class CFitFieldDefinition final
 {
 public:
+    CFitFieldDefinition(CFitDefinitionMessage* parent, CFitFieldProfile* fieldProfile, quint8 defNr, quint8 size, quint8 type);
     CFitFieldDefinition(CFitDefinitionMessage* parent, quint8 defNr, quint8 size, quint8 type);
     CFitFieldDefinition();
 
diff --git a/src/gis/fit/decoder/CFitFieldDefinitionState.cpp b/src/gis/fit/decoder/CFitFieldDefinitionState.cpp
index 7713812..95c85d3 100644
--- a/src/gis/fit/decoder/CFitFieldDefinitionState.cpp
+++ b/src/gis/fit/decoder/CFitFieldDefinitionState.cpp
@@ -55,8 +55,13 @@ decode_state_e CFitFieldDefinitionState::process(quint8 &dataByte)
         reset();
         if (def->getFields().size() >= def->getNrOfFields())
         {
+            if(def->developerFlag())
+            {
+                return eDecoderStateRecordContent;
+            }
             FITDEBUG(2, qDebug() << latestDefinition()->messageInfo())
-            endDefintion();
+            endDefinition();
+
             return eDecoderStateRecord;
         }
     }
diff --git a/src/gis/fit/decoder/CFitHeaderState.cpp b/src/gis/fit/decoder/CFitHeaderState.cpp
index f2b9bbe..57d0558 100644
--- a/src/gis/fit/decoder/CFitHeaderState.cpp
+++ b/src/gis/fit/decoder/CFitHeaderState.cpp
@@ -37,7 +37,7 @@
  * 13: CRC MSB
  */
 
-static const quint8 fitProtocolVersionMajor = 1;
+static const quint8 fitProtocolVersionMajor = 2;
 static const quint8 fitProtocolMajorVersionShift = 4;
 static const quint8 fitProtocolMajorVersionMask = 0x0F << fitProtocolMajorVersionShift;
 
diff --git a/src/gis/fit/decoder/CFitMessage.cpp b/src/gis/fit/decoder/CFitMessage.cpp
index d5a0075..d915f2d 100644
--- a/src/gis/fit/decoder/CFitMessage.cpp
+++ b/src/gis/fit/decoder/CFitMessage.cpp
@@ -19,17 +19,18 @@
 #include "gis/fit/decoder/CFitDefinitionMessage.h"
 #include "gis/fit/decoder/CFitMessage.h"
 #include "gis/fit/defs/CFitProfile.h"
+#include "gis/fit/defs/CFitFieldProfile.h"
 #include "gis/fit/defs/CFitProfileLookup.h"
 #include "gis/fit/defs/fit_const.h"
 
 CFitMessage::CFitMessage(const CFitDefinitionMessage& def)
-    : fields(), globalMesgNr(def.getGlobalMesgNr()), localMesgNr(def.getLocalMesgNr()),
+    : fields(), devFields(), globalMesgNr(def.getGlobalMesgNr()), localMesgNr(def.getLocalMesgNr()),
     messageProfile(CFitProfileLookup::getProfile(globalMesgNr))
 {
 }
 
 CFitMessage::CFitMessage()
-    : fields(), globalMesgNr(fitGlobalMesgNrInvalid), localMesgNr(fitLocalMesgNrInvalid),
+    : fields(), devFields(), globalMesgNr(fitGlobalMesgNrInvalid), localMesgNr(fitLocalMesgNrInvalid),
     messageProfile(CFitProfileLookup::getProfile(fitGlobalMesgNrInvalid))
 {
 }
@@ -41,7 +42,14 @@ bool CFitMessage::isValid() const
 
 void CFitMessage::updateFieldProfile(quint8 fieldDefNr, const CFitFieldProfile* fieldProfile)
 {
-    fields[fieldDefNr].setProfile(fieldProfile);
+    if (fieldProfile->getFieldType() == eFieldTypeFit)
+    {
+        fields[fieldDefNr].setProfile(fieldProfile);
+    }
+    if (fieldProfile->getFieldType() == eFieldTypeDevelopment)
+    {
+        devFields[fieldDefNr].setProfile(fieldProfile);
+    }
 }
 
 QStringList CFitMessage::messageInfo() const
@@ -56,6 +64,10 @@ QStringList CFitMessage::messageInfo() const
     {
         list << field.fieldInfo();
     }
+    for(const CFitField &field : devFields)
+    {
+        list << field.fieldInfo();
+    }
     return list;
 }
 
@@ -66,11 +78,22 @@ bool CFitMessage::hasField(const quint8 fieldDefNum) const
 
 void CFitMessage::addField(CFitField &  field)
 {
-    if(fields.contains(field.getFieldDefNr()))
+    if (field.profile().getFieldType() == eFieldTypeFit)
+    {
+        if(fields.contains(field.getFieldDefNr()))
+        {
+            qCritical("fit field %d already added to map.", (int) field.getFieldDefNr());
+        }
+        fields.insert(field.getFieldDefNr(), field);
+    }
+    if (field.profile().getFieldType() == eFieldTypeDevelopment)
     {
-        qCritical("fit field %d already added to map.", (int) field.getFieldDefNr());
+        if(devFields.contains(field.getFieldDefNr()))
+        {
+            qCritical("fit dev field %d already added to map.", (int) field.getFieldDefNr());
+        }
+        devFields.insert(field.getFieldDefNr(), field);
     }
-    fields.insert(field.getFieldDefNr(), field);
 }
 
 bool CFitMessage::isFieldValueValid(const quint8 fieldDefNum) const
diff --git a/src/gis/fit/decoder/CFitMessage.h b/src/gis/fit/decoder/CFitMessage.h
index 810c6ca..fa10e76 100644
--- a/src/gis/fit/decoder/CFitMessage.h
+++ b/src/gis/fit/decoder/CFitMessage.h
@@ -50,6 +50,7 @@ public:
 
 private:
     QMap<quint8, CFitField> fields;
+    QMap<quint8, CFitField> devFields;
     quint16 globalMesgNr;
     quint8 localMesgNr;
     const CFitProfile* messageProfile;
diff --git a/src/gis/fit/decoder/CFitRecordContentState.cpp b/src/gis/fit/decoder/CFitRecordContentState.cpp
index 1cbf998..83c6e46 100644
--- a/src/gis/fit/decoder/CFitRecordContentState.cpp
+++ b/src/gis/fit/decoder/CFitRecordContentState.cpp
@@ -19,14 +19,18 @@
 #include "gis/fit/decoder/CFitRecordContentState.h"
 #include "gis/fit/defs/fit_const.h"
 
-
 /**
  * record content (without field definitions)
  * 0: reserved
  * 1: architecture (0 little, 1 big endian)
  * 2: global message number
  * 3: global message number
+ *
  * 4: number of fields in the data message
+ * 5 - 7: field definitions
+ * if developer flag set
+ * 8: number of developer fields in the data message
+ * 9 - 11: developer field definitions
  */
 void CFitRecordContentState::reset()
 {
@@ -73,7 +77,10 @@ decode_state_e CFitRecordContentState::process(quint8 &dataByte)
         nrOfFields = dataByte;
         def->setNrOfFields(nrOfFields);
 
-        reset();
+        // only reset if developer flag not set, else developer fields follow
+        if(! def->developerFlag()) {
+            reset();
+        }
         if (nrOfFields == 0)
         {
             // no fields, records may follow (either for a data message or definition message)
@@ -82,7 +89,20 @@ decode_state_e CFitRecordContentState::process(quint8 &dataByte)
         // the fields definitions follows
         return eDecoderStateFieldDef;
         break;
+    case 5:
+        // number of development fields
+        nrOfFields = dataByte;
+        def->setNrOfDevFields(nrOfFields);
 
+        reset();
+        if (nrOfFields == 0)
+        {
+            // no fields, records may follow (either for a data message or definition message)
+            return eDecoderStateRecord;
+        }
+        // the fields definitions follows
+        return eDecoderStateDevFieldDef;
+        break;
     default:
         throw tr("FIT decoding error: invalid offset %1 for state 'record content'").arg(offset);
     }
diff --git a/src/gis/fit/decoder/CFitRecordHeaderState.cpp b/src/gis/fit/decoder/CFitRecordHeaderState.cpp
index 211d1a4..b169bb8 100644
--- a/src/gis/fit/decoder/CFitRecordHeaderState.cpp
+++ b/src/gis/fit/decoder/CFitRecordHeaderState.cpp
@@ -25,7 +25,7 @@
  * bit: value description
  * 7: 0 normal Header
  * 6: 0/1 data message / definition message
- * 5: - reserved
+ * 5: 0/1 developer data flag
  * 4: - reserved
  * 3: 0/1 local message type (0-15 -> 0000 - 1111)
  * 2:     local message type
@@ -33,6 +33,7 @@
  * 0:     local message type
  */
 static const quint8 fitRecordHeaderDefBit =  ((quint8) 0x40); // bit 6: 0100 0000
+static const quint8 fitRecordHeaderDevBit = ((quint8) 0x20); // bit 5: 0010 0000
 static const quint8 fitRecordHeaderMesgMask = ((quint8) 0x0F); // bit 0-3: 0000 1111
 
 /*
@@ -58,7 +59,7 @@ decode_state_e CFitRecordHeaderState::process(quint8 &dataByte)
     {
         // this is a compressed timestamp header
         quint8 localMessageType = (dataByte & fitRecordHeaderTimeMesgMask) >> fitRecordHeaderTimeMesgShift;
-        CFitDefinitionMessage* def = defintion(localMessageType);
+        CFitDefinitionMessage* def = definition(localMessageType);
 
         if (!def->hasField(eRecordTimestamp))
         {
@@ -84,13 +85,14 @@ decode_state_e CFitRecordHeaderState::process(quint8 &dataByte)
         if ((dataByte & fitRecordHeaderDefBit) != 0)
         {
             // this is a definition message
-            addDefinition(CFitDefinitionMessage(localMessageType));
+            bool developerDataFlag = dataByte & fitRecordHeaderDevBit;
+            addDefinition(CFitDefinitionMessage(localMessageType, developerDataFlag));
             return eDecoderStateRecordContent;
         }
         else
         {
             // this is a data message
-            addMessage(*defintion(localMessageType));
+            addMessage(*definition(localMessageType));
             // go to eDecoderStateFieldData
             return eDecoderStateFieldData;
         }
diff --git a/src/gis/fit/decoder/IFitDecoderState.cpp b/src/gis/fit/decoder/IFitDecoderState.cpp
index 6c48e6b..884106c 100644
--- a/src/gis/fit/decoder/IFitDecoderState.cpp
+++ b/src/gis/fit/decoder/IFitDecoderState.cpp
@@ -18,7 +18,6 @@
 
 #include "gis/fit/decoder/IFitDecoderState.h"
 
-
 decode_state_e IFitDecoderState::processByte(quint8 &dataByte)
 {
     incFileBytesRead();
@@ -81,18 +80,18 @@ void IFitDecoderState::addMessage(const CFitDefinitionMessage& definition)
 
 void IFitDecoderState::addDefinition(const CFitDefinitionMessage &definition)
 {
-    data.defintions[definition.getLocalMesgNr()] = definition;
-    data.lastDefintion = &data.defintions[definition.getLocalMesgNr()];
+    data.definitions[definition.getLocalMesgNr()] = definition;
+    data.lastDefinition = &data.definitions[definition.getLocalMesgNr()];
 }
 
-void IFitDecoderState::endDefintion()
+void IFitDecoderState::endDefinition()
 {
-    data.defintionHistory.append(*data.lastDefintion);
+    data.definitionHistory.append(*data.lastDefinition);
 }
 
-CFitDefinitionMessage*IFitDecoderState::defintion(quint32 localMessageType)
+CFitDefinitionMessage*IFitDecoderState::definition(quint32 localMessageType)
 {
-    return &(data.defintions[localMessageType]);
+    return &(data.definitions[localMessageType]);
 }
 
 void IFitDecoderState::setFileLength(quint32 fileLength)
@@ -115,3 +114,36 @@ void IFitDecoderState::incFileBytesRead()
 {
     data.fileBytesRead++;
 }
+
+void IFitDecoderState::addDevFieldProfile(const CFitFieldProfile &fieldProfile)
+{
+    // for documentation: a development field definition is linked to an developer data ID. Only the tuple developer data index
+    // and field definition number must be unique. So far no fit file with more than one developer data ID has been created.
+    if(devFieldProfile(fieldProfile.getFieldDefNum())->getFieldDefNum() ==  fieldProfile.getFieldDefNum())
+    {
+        throw tr("FIT decoding error: a development field with the field_definition_number %1 already exists.")
+                .arg(fieldProfile.getFieldDefNum());
+    }
+    data.devFieldProfiles.append(fieldProfile);
+}
+
+CFitFieldProfile* IFitDecoderState::devFieldProfile(quint32 fieldNr)
+{
+    for (int i=0; i < data.devFieldProfiles.size(); i++)
+    {
+        if (fieldNr == data.devFieldProfiles[i].getFieldDefNum())
+        {
+            return &data.devFieldProfiles[i];
+        }
+    }
+    // dummy field for unknown field nr.
+    static CFitFieldProfile dummyFieldProfile;
+    return &dummyFieldProfile;
+
+    //return data.devFieldProfiles[fieldNr];
+}
+
+void IFitDecoderState::clearDevFieldProfiles()
+{
+    data.devFieldProfiles.clear();
+}
diff --git a/src/gis/fit/decoder/IFitDecoderState.h b/src/gis/fit/decoder/IFitDecoderState.h
index 26fd3e5..4acf490 100644
--- a/src/gis/fit/decoder/IFitDecoderState.h
+++ b/src/gis/fit/decoder/IFitDecoderState.h
@@ -21,6 +21,7 @@
 
 #include "gis/fit/decoder/CFitDefinitionMessage.h"
 #include "gis/fit/decoder/CFitMessage.h"
+#include "gis/fit/defs/CFitFieldProfile.h"
 
 #include <QtCore>
 
@@ -31,6 +32,7 @@ typedef enum
     eDecoderStateRecord,
     eDecoderStateRecordContent,
     eDecoderStateFieldDef,
+    eDecoderStateDevFieldDef,
     eDecoderStateFieldData,
     eDecoderStateFileCrc,
     eDecoderStateEnd
@@ -47,11 +49,12 @@ public:
         quint32 fileBytesRead;
         quint8 lastTimeOffset;
         quint32 timestamp;
-        CFitDefinitionMessage* lastDefintion;
+        CFitDefinitionMessage* lastDefinition;
         CFitMessage* lastMessage;
-        QMap<quint8, CFitDefinitionMessage> defintions;
-        QList<CFitDefinitionMessage> defintionHistory;
+        QMap<quint8, CFitDefinitionMessage> definitions;
+        QList<CFitDefinitionMessage> definitionHistory;
         QList<CFitMessage> messages;
+        QList<CFitFieldProfile> devFieldProfiles;
     };
 
     IFitDecoderState(shared_state_data_t &data) : data(data) { }
@@ -71,15 +74,19 @@ protected:
     void incFileBytesRead();
     quint32 bytesLeftToRead();
 
-    CFitDefinitionMessage* latestDefinition() const { return data.lastDefintion; }
-    CFitDefinitionMessage* defintion(quint32 localMessageType);
+    CFitDefinitionMessage* latestDefinition() const { return data.lastDefinition; }
+    CFitDefinitionMessage* definition(quint32 localMessageType);
     void addDefinition(const CFitDefinitionMessage &definition);
-    void endDefintion();
+    void endDefinition();
 
     void setTimestamp(quint32 fullTimestamp);
     void setTimestampOffset(quint32 offsetTimestamp);
     quint32 getTimestamp() const { return data.timestamp; }
     quint16 getCrc() const { return data.crc; }
+    void addDevFieldProfile(const CFitFieldProfile &fieldProfile);
+    CFitFieldProfile* devFieldProfile(quint32 fieldNr);
+    void clearDevFieldProfiles();
+
 
 private:
     void buildCrc(quint8 byte);
diff --git a/src/gis/fit/defs/CFitBaseType.cpp b/src/gis/fit/defs/CFitBaseType.cpp
index 3ce8d17..8ffe77f 100644
--- a/src/gis/fit/defs/CFitBaseType.cpp
+++ b/src/gis/fit/defs/CFitBaseType.cpp
@@ -28,10 +28,10 @@ CFitBaseType::CFitBaseType() : CFitBaseType(eBaseTypeNrInvalid, "invalid", 0,
 CFitBaseType::CFitBaseType(fit_base_type_nr_e baseTypeNr, QString name, quint8 size, std::initializer_list<quint8> invalid)
     : typeSize(size), baseTypeNr(baseTypeNr), namestr(name)
 {
-    quint8 i = 0;
+    quint8 i = (quint8) (size - 1);
     for(quint8 bit : invalid)
     {
-        invalidBytes[i++] = bit;
+        invalidBytes[i--] = bit;
     }
 }
 
@@ -49,6 +49,15 @@ fit_base_type_nr_e CFitBaseType::nr() const
     return baseTypeNr;
 }
 
+quint8 CFitBaseType::baseTypeField() const
+{
+    if(typeSize > 1)
+    {
+        return (quint8) (0x80 | baseTypeNr);
+    }
+    return baseTypeNr;
+}
+
 const quint8* CFitBaseType::invalidValueBytes() const
 {
     return invalidBytes;
@@ -61,7 +70,8 @@ bool CFitBaseType::isInteger() const
 
 bool CFitBaseType::isSignedInt() const
 {
-    return baseTypeNr == eBaseTypeNrSint8 || baseTypeNr == eBaseTypeNrSint16 || baseTypeNr == eBaseTypeNrSint32;
+    return baseTypeNr == eBaseTypeNrSint8 || baseTypeNr == eBaseTypeNrSint16
+           || baseTypeNr == eBaseTypeNrSint32 || baseTypeNr == eBaseTypeNrSint64;
 }
 
 bool CFitBaseType::isUnsignedInt() const
@@ -69,6 +79,7 @@ bool CFitBaseType::isUnsignedInt() const
     return baseTypeNr == eBaseTypeNrUint8 || baseTypeNr == eBaseTypeNrUint8z
            || baseTypeNr == eBaseTypeNrUint16 || baseTypeNr == eBaseTypeNrUint16z
            || baseTypeNr == eBaseTypeNrUint32 || baseTypeNr == eBaseTypeNrUint32z
+           || baseTypeNr == eBaseTypeNrUint64 || baseTypeNr == eBaseTypeNrUint64z
            || baseTypeNr == eBaseTypeNrEnum;
 }
 
@@ -108,12 +119,15 @@ void CFitBaseTypeMap::initialize(QMap<quint8, CFitBaseType>& baseTypesMap)
     baseTypesMap.insert(fitUint16Type.nr(), fitUint16Type);
     baseTypesMap.insert(fitSint32Type.nr(), fitSint32Type);
     baseTypesMap.insert(fitUint32Type.nr(), fitUint32Type);
+    baseTypesMap.insert(fitSint64Type.nr(), fitSint64Type);
+    baseTypesMap.insert(fitUint64Type.nr(), fitUint64Type);
     baseTypesMap.insert(fitStringType.nr(), fitStringType);
     baseTypesMap.insert(fitFloat32Type.nr(), fitFloat32Type);
     baseTypesMap.insert(fitFloat64Type.nr(), fitFloat64Type);
     baseTypesMap.insert(fitUint8zType.nr(), fitUint8zType);
     baseTypesMap.insert(fitUint16zType.nr(), fitUint16zType);
     baseTypesMap.insert(fitUint32zType.nr(), fitUint32zType);
+    baseTypesMap.insert(fitUint64zType.nr(), fitUint64zType);
     baseTypesMap.insert(fitByteType.nr(), fitByteType);
 }
 
diff --git a/src/gis/fit/defs/CFitBaseType.h b/src/gis/fit/defs/CFitBaseType.h
index c5e9650..a8f5414 100644
--- a/src/gis/fit/defs/CFitBaseType.h
+++ b/src/gis/fit/defs/CFitBaseType.h
@@ -37,6 +37,9 @@ typedef enum
     eBaseTypeNrUint16z = 11,
     eBaseTypeNrUint32z = 12,
     eBaseTypeNrByte = 13,
+    eBaseTypeNrSint64 = 14,
+    eBaseTypeNrUint64 = 15,
+    eBaseTypeNrUint64z = 16,
     eBaseTypeNrInvalid = 0xff
 } fit_base_type_nr_e;
 
@@ -48,6 +51,7 @@ public:
 
     quint8 size() const;
     fit_base_type_nr_e nr() const;
+    quint8 baseTypeField() const;
     const quint8* invalidValueBytes() const;
     bool isSizeUndefined() const;
     bool isInteger() const;
@@ -74,6 +78,9 @@ static const CFitBaseType fitSint16Type = CFitBaseType(eBaseTypeNrSint16, "Sint1
 static const CFitBaseType fitUint16Type = CFitBaseType(eBaseTypeNrUint16, "Uint16", sizeof(quint16), {0xFF, 0xFF});
 static const CFitBaseType fitSint32Type = CFitBaseType(eBaseTypeNrSint32, "Sint32", sizeof(qint32), {0x7F, 0xFF, 0xFF, 0xFF});
 static const CFitBaseType fitUint32Type = CFitBaseType(eBaseTypeNrUint32, "Uint32", sizeof(quint32), {0xFF, 0xFF, 0xFF, 0xFF});
+static const CFitBaseType fitSint64Type = CFitBaseType(eBaseTypeNrSint64, "Sint64", sizeof(qint64), {0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF});
+static const CFitBaseType fitUint64Type = CFitBaseType(eBaseTypeNrUint64, "Uint64", sizeof(quint64), {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF});
+
 static const CFitBaseType fitStringType = CFitBaseType(eBaseTypeNrString, "String", 0, {0x00}); // Field is invalid if all bytes are invalid.
 static const CFitBaseType fitFloat32Type = CFitBaseType(eBaseTypeNrFloat32, "Float32", sizeof(float), {0xFF, 0xFF, 0xFF, 0xFF});
 static const CFitBaseType fitFloat64Type = CFitBaseType(eBaseTypeNrFloat64, "Float64", sizeof(double), {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF});
@@ -81,6 +88,8 @@ static const CFitBaseType fitFloat64Type = CFitBaseType(eBaseTypeNrFloat64, "Flo
 static const CFitBaseType fitUint8zType = CFitBaseType(eBaseTypeNrUint8z, "Uint8z", sizeof(quint8), {0x00});
 static const CFitBaseType fitUint16zType = CFitBaseType(eBaseTypeNrUint16z, "Uint16z", sizeof(quint16), {0x00, 0x00});
 static const CFitBaseType fitUint32zType = CFitBaseType(eBaseTypeNrUint32z, "Uint32z", sizeof(quint32), {0x00, 0x00, 0x00, 0x00});
+static const CFitBaseType fitUint64zType = CFitBaseType(eBaseTypeNrUint64z, "Uint64z", sizeof(quint64), {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00});
+
 static const CFitBaseType fitByteType = CFitBaseType(eBaseTypeNrByte, "Byte", 0, {0xFF}); // Field is invalid if all bytes are invalid.
 
 static const CFitBaseType fitInvalidType = CFitBaseType(eBaseTypeNrInvalid, "Invalid", 0, {0});
diff --git a/src/gis/fit/defs/CFitFieldProfile.cpp b/src/gis/fit/defs/CFitFieldProfile.cpp
index 0d2da02..47d272c 100644
--- a/src/gis/fit/defs/CFitFieldProfile.cpp
+++ b/src/gis/fit/defs/CFitFieldProfile.cpp
@@ -21,8 +21,8 @@
 #include "gis/fit/defs/CFitProfile.h"
 #include "gis/fit/defs/fit_const.h"
 
-CFitFieldProfile::CFitFieldProfile(CFitProfile* parent, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, quint16 offset, QString units)
-    : name(name), fieldDefNr(fieldDefNr), scale(scale), offset(offset), units(units),
+CFitFieldProfile::CFitFieldProfile(CFitProfile* parent, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, qint16 offset, QString units, field_type_e fieldType )
+    : name(name), fieldDefNr(fieldDefNr), scale(scale), offset(offset), units(units), fieldType(fieldType),
     baseType(&baseType), profile(parent), subfields(), components()
 {
 }
@@ -32,7 +32,7 @@ CFitFieldProfile::CFitFieldProfile() : CFitFieldProfile(nullptr, "unknown", fitI
 }
 
 CFitFieldProfile::CFitFieldProfile(const CFitFieldProfile& copy)
-    : name(copy.name), fieldDefNr(copy.fieldDefNr), scale(copy.scale), offset(copy.offset), units(copy.units),
+    : name(copy.name), fieldDefNr(copy.fieldDefNr), scale(copy.scale), offset(copy.offset), units(copy.units), fieldType(copy.fieldType),
     baseType(copy.baseType), profile(copy.profile), subfields(copy.subfields), components(copy.components)
 {
 }
@@ -87,7 +87,7 @@ qreal CFitFieldProfile::getScale() const
     return scale;
 }
 
-quint16 CFitFieldProfile::getOffset() const
+qint16 CFitFieldProfile::getOffset() const
 {
     return offset;
 }
@@ -122,8 +122,26 @@ QList<CFitComponentfieldProfile*> CFitFieldProfile::getComponents() const
     return components;
 }
 
+QString CFitFieldProfile::fieldProfileInfo()
+{
+    QString str = QString("%1 %2 (%3): %4 %5")
+            .arg(QString("field profile"))
+            .arg(getName())
+            .arg(getFieldDefNum())
+            .arg(getUnits())
+            .arg(getBaseType().name());
+
+    if(getBaseType().isNumber())
+    {
+        str += QString(" (%1-%2)")
+                .arg(getScale())
+                .arg(getOffset());
+    }
+    return str;
+}
+
 
-CFitSubfieldProfile::CFitSubfieldProfile(CFitProfile* parent, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, quint16
+CFitSubfieldProfile::CFitSubfieldProfile(CFitProfile* parent, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, qint16
                                          offset, QString units, quint8 subRefFieldDefNr, quint8 subRefFieldValue)
     : CFitFieldProfile(parent, name, baseType, fieldDefNr, scale, offset, units),
     refFieldDefNr(subRefFieldDefNr), refFieldValue(subRefFieldValue)
@@ -147,7 +165,7 @@ quint8 CFitSubfieldProfile::getReferencedFieldValue() const
 
 
 CFitComponentfieldProfile::CFitComponentfieldProfile(CFitProfile* parent, QString name, const CFitBaseType& baseType, quint8 fieldDefNr,
-                                                     qreal scale, quint16 offset, QString units, quint8 componentFieldDefNr, quint8 bits)
+                                                     qreal scale, qint16 offset, QString units, quint8 componentFieldDefNr, quint32 bits)
     : CFitFieldProfile(parent, name, baseType, fieldDefNr, scale, offset, units), nrOfBits(bits), componentFieldDefNr(componentFieldDefNr)
 {
 }
@@ -173,7 +191,7 @@ const CFitBaseType& CFitComponentfieldProfile::getBaseType() const
     return getProfile()->getField(componentFieldDefNr)->getBaseType();
 }
 
-quint8 CFitComponentfieldProfile::getBits() const
+quint32 CFitComponentfieldProfile::getBits() const
 {
     return nrOfBits;
 }
@@ -181,7 +199,7 @@ quint8 CFitComponentfieldProfile::getBits() const
 quint32 CFitComponentfieldProfile::getBitmask() const
 {
     quint32 bitmask = 0;
-    for (int i = 0; i < nrOfBits; i++)
+    for (quint32 i = 0; i < nrOfBits; i++)
     {
         bitmask |= (1 << i);
     }
diff --git a/src/gis/fit/defs/CFitFieldProfile.h b/src/gis/fit/defs/CFitFieldProfile.h
index a8bc373..b1c7999 100644
--- a/src/gis/fit/defs/CFitFieldProfile.h
+++ b/src/gis/fit/defs/CFitFieldProfile.h
@@ -26,12 +26,17 @@ class CFitSubfieldProfile;
 class CFitComponentfieldProfile;
 class CFitBaseType;
 
+typedef enum {
+    eFieldTypeFit = 0,
+    eFieldTypeDevelopment = 1,
+} field_type_e;
+
 class CFitFieldProfile
 {
 public:
     CFitFieldProfile();
     CFitFieldProfile(const CFitFieldProfile& copy);
-    CFitFieldProfile(CFitProfile* parent, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, quint16 offset, QString units);
+    CFitFieldProfile(CFitProfile* parent, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, qint16 offset, QString units, field_type_e fieldType = eFieldTypeFit);
     virtual ~CFitFieldProfile();
 
     void addSubfield(CFitSubfieldProfile* subfield);
@@ -44,7 +49,7 @@ public:
     virtual QString getName() const;
     virtual quint8 getFieldDefNum() const;
     virtual qreal getScale() const;
-    virtual quint16 getOffset() const;
+    virtual qint16 getOffset() const;
     virtual bool hasScaleAndOffset() const;
     virtual QString getUnits() const;
     virtual const CFitBaseType& getBaseType() const;
@@ -54,12 +59,15 @@ public:
     QList<CFitComponentfieldProfile*> getComponents() const;
 
     const CFitProfile* getProfile() const;
+    field_type_e getFieldType() const { return fieldType; }
+    QString fieldProfileInfo();
 private:
     QString name;
     quint8 fieldDefNr;
     qreal scale;
-    quint16 offset;
+    qint16 offset;
     QString units;
+    field_type_e fieldType;
 
     const CFitBaseType* baseType;
     CFitProfile* profile;
@@ -71,7 +79,7 @@ private:
 class CFitSubfieldProfile final : public CFitFieldProfile
 {
 public:
-    CFitSubfieldProfile(CFitProfile* parent, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, quint16 offset, QString units,
+    CFitSubfieldProfile(CFitProfile* parent, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, qint16 offset, QString units,
                         quint8 subRefFieldDefNr, quint8 subRefFieldValue);
     CFitSubfieldProfile(const CFitSubfieldProfile& copy);
     CFitSubfieldProfile() : CFitFieldProfile(), refFieldDefNr(0), refFieldValue(0) {}
@@ -89,7 +97,7 @@ private:
 class CFitComponentfieldProfile final : public CFitFieldProfile
 {
 public:
-    CFitComponentfieldProfile(CFitProfile* parent, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, quint16 offset, QString units, quint8 componentFieldDefNr, quint8 bits);
+    CFitComponentfieldProfile(CFitProfile* parent, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, qint16 offset, QString units, quint8 componentFieldDefNr, quint32 bits);
     CFitComponentfieldProfile(const CFitComponentfieldProfile& copy);
     CFitComponentfieldProfile() : CFitFieldProfile(), nrOfBits(0), componentFieldDefNr(0) {}
     virtual ~CFitComponentfieldProfile() {}
@@ -99,12 +107,12 @@ public:
     const CFitBaseType& getBaseType() const override;
 
     QString getTyp() const override { return "component"; }
-    quint8 getBits() const;
+    quint32 getBits() const;
     quint32 getBitmask() const;
 
 private:
 
-    quint8 nrOfBits;
+    quint32 nrOfBits;
     quint8 componentFieldDefNr;
 };
 
diff --git a/src/gis/fit/defs/CFitProfile.cpp b/src/gis/fit/defs/CFitProfile.cpp
index 2d3b52c..0c8e6ac 100644
--- a/src/gis/fit/defs/CFitProfile.cpp
+++ b/src/gis/fit/defs/CFitProfile.cpp
@@ -50,7 +50,7 @@ const CFitFieldProfile* CFitProfile::getField(quint8 fieldDefNr) const
 }
 
 
-void CFitProfile::addField(QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, quint16 offset, QString units)
+void CFitProfile::addField(QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, qint16 offset, QString units)
 {
     CFitFieldProfile* field= new CFitFieldProfile(this, name, baseType, fieldDefNr, scale, offset, units);
     fields.insert(fieldDefNr, field);
@@ -61,12 +61,12 @@ void CFitProfile::addSubfield(QString name, const CFitBaseType& baseType, quint8
     CFitSubfieldProfile* field = new CFitSubfieldProfile(this, name, baseType, fieldDefNr, scale, offset, units, subRefFieldDefNr, subRefFieldValue);
     fields[fieldDefNr]->addSubfield(field);
 }
-void CFitProfile::addComponent(QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, quint16 offset, QString units, quint8 componentFieldDefNr, quint8 bits)
+void CFitProfile::addComponent(QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, qint16 offset, QString units, quint8 componentFieldDefNr, quint32 bits)
 {
     CFitComponentfieldProfile* field = new CFitComponentfieldProfile(this, name, baseType, fieldDefNr, scale, offset, units, componentFieldDefNr, bits);
     fields[fieldDefNr]->addComponent(field);
 }
-void CFitProfile::addComponent(int subfieldIndex, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, quint16 offset, QString units, quint8 componentFieldDefNr, quint8 bits)
+void CFitProfile::addComponent(int subfieldIndex, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, qint16 offset, QString units, quint8 componentFieldDefNr, quint32 bits)
 {
     CFitComponentfieldProfile* field = new  CFitComponentfieldProfile(this, name, baseType, fieldDefNr, scale, offset, units, componentFieldDefNr, bits);
     fields[fieldDefNr]->addComponent(subfieldIndex, field);
diff --git a/src/gis/fit/defs/CFitProfile.h b/src/gis/fit/defs/CFitProfile.h
index ca728b3..ebb8423 100644
--- a/src/gis/fit/defs/CFitProfile.h
+++ b/src/gis/fit/defs/CFitProfile.h
@@ -32,11 +32,11 @@ public:
     CFitProfile(QString name, quint16 globalMesgNr);
     virtual ~CFitProfile();
 
-    void addField(QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, quint16 offset, QString units);
+    void addField(QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, qint16 offset, QString units);
     void addSubfield(QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal
                      scale, quint16 offset, QString units, quint8 subRefFieldDefNr, quint8 subRefFieldValue);
-    void addComponent(QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, quint16 offset, QString units, quint8 componentFieldDefNr, quint8 bits);
-    void addComponent(int subfieldIndex, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, quint16 offset, QString units, quint8 componentFieldDefNr, quint8 bits);
+    void addComponent(QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, qint16 offset, QString units, quint8 componentFieldDefNr, quint32 bits);
+    void addComponent(int subfieldIndex, QString name, const CFitBaseType& baseType, quint8 fieldDefNr, qreal scale, qint16 offset, QString units, quint8 componentFieldDefNr, quint32 bits);
 
 
     const CFitFieldProfile* getField(quint8 fieldDefNr) const;
diff --git a/src/gis/fit/defs/CFitProfileLookup.cpp b/src/gis/fit/defs/CFitProfileLookup.cpp
index ae7180e..30b34d8 100644
--- a/src/gis/fit/defs/CFitProfileLookup.cpp
+++ b/src/gis/fit/defs/CFitProfileLookup.cpp
@@ -136,7 +136,26 @@ void initDeviceSettings(QMap<quint16, CFitProfile*>& profiles)
     CFitProfile* f = new CFitProfile("device_settings", eMesgNumDeviceSettings);
     f->addField("active_time_zone", fitUint8Type, eDeviceSettingsActiveTimeZone, 0, 0, "");
     f->addField("utc_offset", fitUint32Type, eDeviceSettingsUtcOffset, 0, 0, "");
+    f->addField("time_offset", fitUint32Type, eDeviceSettingsTimeOffset, 0, 0, "s");
+    f->addField("time_mode", fitEnumType, eDeviceSettingsTimeMode, 0, 0, "");
     f->addField("time_zone_offset", fitSint8Type, eDeviceSettingsTimeZoneOffset, 4, 0, "hr");
+    f->addField("backlight_mode", fitEnumType, eDeviceSettingsBacklightMode, 0, 0, "");
+    f->addField("activity_tracker_enabled", fitEnumType, eDeviceSettingsActivityTrackerEnabled, 0, 0, "");
+    f->addField("clock_time", fitEnumType, eDeviceSettingsClockTime, 0, 0, "");
+    f->addField("pages_enabled", fitUint16Type, eDeviceSettingsPagesEnabled, 0, 0, "");
+    f->addField("move_alert_enabled", fitEnumType, eDeviceSettingsMoveAlertEnabled, 0, 0, "");
+    f->addField("date_mode", fitEnumType, eDeviceSettingsDateMode, 0, 0, "");
+    f->addField("display_orientation", fitEnumType, eDeviceSettingsDisplayOrientation, 0, 0, "");
+    f->addField("mounting_side", fitEnumType, eDeviceSettingsMountingSide, 0, 0, "");
+    f->addField("default_page", fitUint16Type, eDeviceSettingsDefaultPage, 0, 0, "");
+    f->addField("autosync_min_steps", fitUint16Type, eDeviceSettingsAutosyncMinSteps, 0, 0, "steps");
+    f->addField("autosync_min_time", fitUint16Type, eDeviceSettingsAutosyncMinTime, 0, 0, "minutes");
+    f->addField("lactate_threshold_autodetect_enabled", fitEnumType, eDeviceSettingsLactateThresholdAutodetectEnabled, 0, 0, "");
+    f->addField("ble_auto_upload_enabled", fitEnumType, eDeviceSettingsBleAutoUploadEnabled, 0, 0, "");
+    f->addField("auto_sync_frequency", fitEnumType, eDeviceSettingsAutoSyncFrequency, 0, 0, "");
+    f->addField("auto_activity_detect", fitEnumType, eDeviceSettingsAutoActivityDetect, 0, 0, "");
+    f->addField("number_of_screens", fitUint8Type, eDeviceSettingsNumberOfScreens, 0, 0, "");
+    f->addField("smart_notification_display_orientation", fitEnumType, eDeviceSettingsSmartNotificationDisplayOrientation, 0, 0, "");
     profiles.insert(eMesgNumDeviceSettings, f);
 }
 
@@ -165,7 +184,11 @@ void initUserProfile(QMap<quint16, CFitProfile*>& profiles)
     f->addField("temperature_setting", fitEnumType, eUserProfileTemperatureSetting, 0, 0, "");
     f->addField("local_id", fitEnumType, eUserProfileLocalId, 0, 0, "");
     f->addField("global_id", fitByteType, eUserProfileGlobalId, 0, 0, "");
+    f->addField("wake_time", fitEnumType, eUserProfileWakeTime, 0, 0, "");
+    f->addField("sleep_time", fitEnumType, eUserProfileSleepTime, 0, 0, "");
     f->addField("height_setting", fitEnumType, eUserProfileHeightSetting, 0, 0, "");
+    f->addField("user_running_step_length", fitUint16Type, eUserProfileUserRunningStepLength, 1000, 0, "m");
+    f->addField("user_walking_step_length", fitUint16Type, eUserProfileUserWalkingStepLength, 1000, 0, "m");
     profiles.insert(eMesgNumUserProfile, f);
 }
 
@@ -232,6 +255,43 @@ void initBikeProfile(QMap<quint16, CFitProfile*>& profiles)
     profiles.insert(eMesgNumBikeProfile, f);
 }
 
+void initConnectivity(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("connectivity", eMesgNumConnectivity);
+    f->addField("bluetooth_enabled", fitEnumType, eConnectivityBluetoothEnabled, 0, 0, "");
+    f->addField("bluetooth_le_enabled", fitEnumType, eConnectivityBluetoothLeEnabled, 0, 0, "");
+    f->addField("ant_enabled", fitEnumType, eConnectivityAntEnabled, 0, 0, "");
+    f->addField("name", fitStringType, eConnectivityName, 0, 0, "");
+    f->addField("live_tracking_enabled", fitEnumType, eConnectivityLiveTrackingEnabled, 0, 0, "");
+    f->addField("weather_conditions_enabled", fitEnumType, eConnectivityWeatherConditionsEnabled, 0, 0, "");
+    f->addField("weather_alerts_enabled", fitEnumType, eConnectivityWeatherAlertsEnabled, 0, 0, "");
+    f->addField("auto_activity_upload_enabled", fitEnumType, eConnectivityAutoActivityUploadEnabled, 0, 0, "");
+    f->addField("course_download_enabled", fitEnumType, eConnectivityCourseDownloadEnabled, 0, 0, "");
+    f->addField("workout_download_enabled", fitEnumType, eConnectivityWorkoutDownloadEnabled, 0, 0, "");
+    f->addField("gps_ephemeris_download_enabled", fitEnumType, eConnectivityGpsEphemerisDownloadEnabled, 0, 0, "");
+    f->addField("incident_detection_enabled", fitEnumType, eConnectivityIncidentDetectionEnabled, 0, 0, "");
+    f->addField("grouptrack_enabled", fitEnumType, eConnectivityGrouptrackEnabled, 0, 0, "");
+    profiles.insert(eMesgNumConnectivity, f);
+}
+
+void initWatchfaceSettings(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("watchface_settings", eMesgNumWatchfaceSettings);
+    f->addField("message_index", fitEnumType, eWatchfaceSettingsMessageIndex, 0, 0, "");
+    f->addField("mode", fitEnumType, eWatchfaceSettingsMode, 0, 0, "");
+    f->addField("layout", fitByteType, eWatchfaceSettingsLayout, 0, 0, "");
+    f->addSubfield("digital_layout", fitEnumType, eWatchfaceSettingsLayout, 0, 0, "", eWatchfaceSettingsMode, eWatchfaceModeDigital);
+    f->addSubfield("analog_layout", fitEnumType, eWatchfaceSettingsLayout, 0, 0, "", eWatchfaceSettingsMode, eWatchfaceModeAnalog);
+    profiles.insert(eMesgNumWatchfaceSettings, f);
+}
+
+void initOhrSettings(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("ohr_settings", eMesgNumOhrSettings);
+    f->addField("enabled", fitEnumType, eOhrSettingsEnabled, 0, 0, "");
+    profiles.insert(eMesgNumOhrSettings, f);
+}
+
 void initZonesTarget(QMap<quint16, CFitProfile*>& profiles)
 {
     CFitProfile* f = new CFitProfile("zones_target", eMesgNumZonesTarget);
@@ -313,6 +373,7 @@ void initGoal(QMap<quint16, CFitProfile*>& profiles)
     f->addField("recurrence", fitEnumType, eGoalRecurrence, 0, 0, "");
     f->addField("recurrence_value", fitUint16Type, eGoalRecurrenceValue, 0, 0, "");
     f->addField("enabled", fitEnumType, eGoalEnabled, 0, 0, "");
+    f->addField("source", fitEnumType, eGoalSource, 0, 0, "");
     profiles.insert(eMesgNumGoal, f);
 }
 
@@ -346,8 +407,6 @@ void initSession(QMap<quint16, CFitProfile*>& profiles)
     f->addField("total_timer_time", fitUint32Type, eSessionTotalTimerTime, 1000, 0, "s");
     f->addField("total_distance", fitUint32Type, eSessionTotalDistance, 100, 0, "m");
     f->addField("total_cycles", fitUint32Type, eSessionTotalCycles, 0, 0, "cycles");
-    f->addSubfield("total_strides", fitUint32Type, eSessionTotalCycles, 0, 0, "strides", eSessionSport, eSportRunning);
-    f->addSubfield("total_strides", fitUint32Type, eSessionTotalCycles, 0, 0, "", eSessionSport, eSportWalking);
     f->addField("total_calories", fitUint16Type, eSessionTotalCalories, 0, 0, "kcal");
     f->addField("total_fat_calories", fitUint16Type, eSessionTotalFatCalories, 0, 0, "kcal");
     f->addField("avg_speed", fitUint16Type, eSessionAvgSpeed, 0, 0, "");
@@ -456,6 +515,11 @@ void initSession(QMap<quint16, CFitProfile*>& profiles)
     f->addField("avg_lev_motor_power", fitUint16Type, eSessionAvgLevMotorPower, 0, 0, "watts");
     f->addField("max_lev_motor_power", fitUint16Type, eSessionMaxLevMotorPower, 0, 0, "watts");
     f->addField("lev_battery_consumption", fitUint8Type, eSessionLevBatteryConsumption, 2, 0, "percent");
+    f->addField("avg_vertical_ratio", fitUint16Type, eSessionAvgVerticalRatio, 100, 0, "percent");
+    f->addField("avg_stance_time_balance", fitUint16Type, eSessionAvgStanceTimeBalance, 100, 0, "percent");
+    f->addField("avg_step_length", fitUint16Type, eSessionAvgStepLength, 10, 0, "mm");
+    f->addField("total_anaerobic_training_effect", fitUint8Type, eSessionTotalAnaerobicTrainingEffect, 10, 0, "");
+    f->addField("avg_vam", fitUint16Type, eSessionAvgVam, 1000, 0, "m/s");
     profiles.insert(eMesgNumSession, f);
 }
 
@@ -475,8 +539,6 @@ void initLap(QMap<quint16, CFitProfile*>& profiles)
     f->addField("total_timer_time", fitUint32Type, eLapTotalTimerTime, 1000, 0, "s");
     f->addField("total_distance", fitUint32Type, eLapTotalDistance, 100, 0, "m");
     f->addField("total_cycles", fitUint32Type, eLapTotalCycles, 0, 0, "cycles");
-    f->addSubfield("total_strides", fitUint32Type, eLapTotalCycles, 0, 0, "strides", eLapSport, eSportRunning);
-    f->addSubfield("total_strides", fitUint32Type, eLapTotalCycles, 0, 0, "", eLapSport, eSportWalking);
     f->addField("total_calories", fitUint16Type, eLapTotalCalories, 0, 0, "kcal");
     f->addField("total_fat_calories", fitUint16Type, eLapTotalFatCalories, 0, 0, "kcal");
     f->addField("avg_speed", fitUint16Type, eLapAvgSpeed, 0, 0, "");
@@ -573,6 +635,10 @@ void initLap(QMap<quint16, CFitProfile*>& profiles)
     f->addField("avg_lev_motor_power", fitUint16Type, eLapAvgLevMotorPower, 0, 0, "watts");
     f->addField("max_lev_motor_power", fitUint16Type, eLapMaxLevMotorPower, 0, 0, "watts");
     f->addField("lev_battery_consumption", fitUint8Type, eLapLevBatteryConsumption, 2, 0, "percent");
+    f->addField("avg_vertical_ratio", fitUint16Type, eLapAvgVerticalRatio, 100, 0, "percent");
+    f->addField("avg_stance_time_balance", fitUint16Type, eLapAvgStanceTimeBalance, 100, 0, "percent");
+    f->addField("avg_step_length", fitUint16Type, eLapAvgStepLength, 10, 0, "mm");
+    f->addField("avg_vam", fitUint16Type, eLapAvgVam, 1000, 0, "m/s");
     profiles.insert(eMesgNumLap, f);
 }
 
@@ -622,7 +688,7 @@ void initRecord(QMap<quint16, CFitProfile*>& profiles)
     f->addField("time_from_course", fitSint32Type, eRecordTimeFromCourse, 1000, 0, "s");
     f->addField("cycle_length", fitUint8Type, eRecordCycleLength, 100, 0, "m");
     f->addField("temperature", fitSint8Type, eRecordTemperature, 0, 0, "C");
-    f->addField("speed_1s", fitUint8Type, eRecordSpeed1s, 16, 0, "m/s");
+    f->addField("speed_1s", fitUint8Type, eRecordSpeed1S, 16, 0, "m/s");
     f->addField("cycles", fitUint8Type, eRecordCycles, 0, 0, "");
     f->addComponent("cycles", fitUint8Type, eRecordCycles, 0, 0, "cycles", eRecordTotalCycles, 8);
     f->addField("total_cycles", fitUint32Type, eRecordTotalCycles, 0, 0, "cycles");
@@ -665,6 +731,9 @@ void initRecord(QMap<quint16, CFitProfile*>& profiles)
     f->addField("enhanced_altitude", fitUint32Type, eRecordEnhancedAltitude, 5, 500, "m");
     f->addField("battery_soc", fitUint8Type, eRecordBatterySoc, 2, 0, "percent");
     f->addField("motor_power", fitUint16Type, eRecordMotorPower, 0, 0, "watts");
+    f->addField("vertical_ratio", fitUint16Type, eRecordVerticalRatio, 100, 0, "percent");
+    f->addField("stance_time_balance", fitUint16Type, eRecordStanceTimeBalance, 100, 0, "percent");
+    f->addField("step_length", fitUint16Type, eRecordStepLength, 10, 0, "mm");
     profiles.insert(eMesgNumRecord, f);
 }
 
@@ -694,14 +763,14 @@ void initEvent(QMap<quint16, CFitProfile*>& profiles)
     f->addSubfield("calorie_duration_alert", fitUint32Type, eEventData, 0, 0, "calories", eEventEvent, eEventCalorieDurationAlert);
     f->addSubfield("fitness_equipment_state", fitEnumType, eEventData, 0, 0, "", eEventEvent, eEventFitnessEquipment);
     f->addSubfield("sport_point", fitUint32Type, eEventData, 0, 0, "", eEventEvent, eEventSportPoint);
-    f->addComponent(16, "sport_point", fitUint32Type, eEventData, 1, 0, "", eEventScore, 16);
-    f->addComponent(16, "sport_point", fitUint32Type, eEventData, 1, 0, "", eEventOpponentScore, 16);
+    f->addComponent(16, "sport_point", fitUint32Type, eEventData, 11, 0, "", eEventScore, 1616);
+    f->addComponent(16, "sport_point", fitUint32Type, eEventData, 0, 0, "", eEventOpponentScore, 0);
     f->addSubfield("gear_change_data", fitUint32Type, eEventData, 0, 0, "", eEventEvent, eEventFrontGearChange);
     f->addSubfield("gear_change_data", fitUint32Type, eEventData, 0, 0, "", eEventEvent, eEventRearGearChange);
-    f->addComponent(18, "gear_change_data", fitUint32Type, eEventData, 1, 0, "", eEventRearGearNum, 8);
-    f->addComponent(18, "gear_change_data", fitUint32Type, eEventData, 1, 0, "", eEventRearGear, 8);
-    f->addComponent(18, "gear_change_data", fitUint32Type, eEventData, 1, 0, "", eEventFrontGearNum, 8);
-    f->addComponent(18, "gear_change_data", fitUint32Type, eEventData, 1, 0, "", eEventFrontGear, 8);
+    f->addComponent(18, "gear_change_data", fitUint32Type, eEventData, 1111, 0, "", eEventRearGearNum, 8);
+    f->addComponent(18, "gear_change_data", fitUint32Type, eEventData, 0, 0, "", eEventRearGear, 8);
+    f->addComponent(18, "gear_change_data", fitUint32Type, eEventData, 0, 0, "", eEventFrontGearNum, 8);
+    f->addComponent(18, "gear_change_data", fitUint32Type, eEventData, 0, 0, "", eEventFrontGear, 8);
     f->addSubfield("rider_position", fitEnumType, eEventData, 0, 0, "", eEventEvent, eEventRiderPositionChange);
     f->addSubfield("comm_timeout", fitEnumType, eEventData, 0, 0, "", eEventEvent, eEventCommTimeout);
     f->addField("event_group", fitUint8Type, eEventEventGroup, 0, 0, "");
@@ -766,6 +835,55 @@ void initHrv(QMap<quint16, CFitProfile*>& profiles)
     profiles.insert(eMesgNumHrv, f);
 }
 
+void initWeatherConditions(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("weather_conditions", eMesgNumWeatherConditions);
+    f->addField("timestamp", fitEnumType, eWeatherConditionsTimestamp, 0, 0, "");
+    f->addField("weather_report", fitEnumType, eWeatherConditionsWeatherReport, 0, 0, "");
+    f->addField("temperature", fitSint8Type, eWeatherConditionsTemperature, 0, 0, "C");
+    f->addField("condition", fitEnumType, eWeatherConditionsCondition, 0, 0, "");
+    f->addField("wind_direction", fitUint16Type, eWeatherConditionsWindDirection, 0, 0, "degrees");
+    f->addField("wind_speed", fitUint16Type, eWeatherConditionsWindSpeed, 1000, 0, "m/s");
+    f->addField("precipitation_probability", fitUint8Type, eWeatherConditionsPrecipitationProbability, 0, 0, "");
+    f->addField("temperature_feels_like", fitSint8Type, eWeatherConditionsTemperatureFeelsLike, 0, 0, "C");
+    f->addField("relative_humidity", fitUint8Type, eWeatherConditionsRelativeHumidity, 0, 0, "");
+    f->addField("location", fitStringType, eWeatherConditionsLocation, 0, 0, "");
+    f->addField("observed_at_time", fitEnumType, eWeatherConditionsObservedAtTime, 0, 0, "");
+    f->addField("observed_location_lat", fitSint32Type, eWeatherConditionsObservedLocationLat, 0, 0, "semicircles");
+    f->addField("observed_location_long", fitSint32Type, eWeatherConditionsObservedLocationLong, 0, 0, "semicircles");
+    f->addField("day_of_week", fitEnumType, eWeatherConditionsDayOfWeek, 0, 0, "");
+    f->addField("high_temperature", fitSint8Type, eWeatherConditionsHighTemperature, 0, 0, "C");
+    f->addField("low_temperature", fitSint8Type, eWeatherConditionsLowTemperature, 0, 0, "C");
+    profiles.insert(eMesgNumWeatherConditions, f);
+}
+
+void initWeatherAlert(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("weather_alert", eMesgNumWeatherAlert);
+    f->addField("timestamp", fitEnumType, eWeatherAlertTimestamp, 0, 0, "");
+    f->addField("report_id", fitStringType, eWeatherAlertReportId, 0, 0, "");
+    f->addField("issue_time", fitEnumType, eWeatherAlertIssueTime, 0, 0, "");
+    f->addField("expire_time", fitEnumType, eWeatherAlertExpireTime, 0, 0, "");
+    f->addField("severity", fitEnumType, eWeatherAlertSeverity, 0, 0, "");
+    f->addField("type", fitEnumType, eWeatherAlertType, 0, 0, "");
+    profiles.insert(eMesgNumWeatherAlert, f);
+}
+
+void initGpsMetadata(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("gps_metadata", eMesgNumGpsMetadata);
+    f->addField("timestamp", fitEnumType, eGpsMetadataTimestamp, 0, 0, "s");
+    f->addField("timestamp_ms", fitUint16Type, eGpsMetadataTimestampMs, 0, 0, "ms");
+    f->addField("position_lat", fitSint32Type, eGpsMetadataPositionLat, 0, 0, "semicircles");
+    f->addField("position_long", fitSint32Type, eGpsMetadataPositionLong, 0, 0, "semicircles");
+    f->addField("enhanced_altitude", fitUint32Type, eGpsMetadataEnhancedAltitude, 5, 500, "m");
+    f->addField("enhanced_speed", fitUint32Type, eGpsMetadataEnhancedSpeed, 1000, 0, "m/s");
+    f->addField("heading", fitUint16Type, eGpsMetadataHeading, 100, 0, "degrees");
+    f->addField("utc_timestamp", fitEnumType, eGpsMetadataUtcTimestamp, 0, 0, "s");
+    f->addField("velocity", fitSint16Type, eGpsMetadataVelocity, 100, 0, "m/s");
+    profiles.insert(eMesgNumGpsMetadata, f);
+}
+
 void initCameraEvent(QMap<quint16, CFitProfile*>& profiles)
 {
     CFitProfile* f = new CFitProfile("camera_event", eMesgNumCameraEvent);
@@ -804,9 +922,27 @@ void initAccelerometerData(QMap<quint16, CFitProfile*>& profiles)
     f->addField("calibrated_accel_x", fitFloat32Type, eAccelerometerDataCalibratedAccelX, 0, 0, "g");
     f->addField("calibrated_accel_y", fitFloat32Type, eAccelerometerDataCalibratedAccelY, 0, 0, "g");
     f->addField("calibrated_accel_z", fitFloat32Type, eAccelerometerDataCalibratedAccelZ, 0, 0, "g");
+    f->addField("compressed_calibrated_accel_x", fitSint16Type, eAccelerometerDataCompressedCalibratedAccelX, 0, 0, "mG");
+    f->addField("compressed_calibrated_accel_y", fitSint16Type, eAccelerometerDataCompressedCalibratedAccelY, 0, 0, "mG");
+    f->addField("compressed_calibrated_accel_z", fitSint16Type, eAccelerometerDataCompressedCalibratedAccelZ, 0, 0, "mG");
     profiles.insert(eMesgNumAccelerometerData, f);
 }
 
+void initMagnetometerData(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("magnetometer_data", eMesgNumMagnetometerData);
+    f->addField("timestamp", fitEnumType, eMagnetometerDataTimestamp, 0, 0, "s");
+    f->addField("timestamp_ms", fitUint16Type, eMagnetometerDataTimestampMs, 0, 0, "ms");
+    f->addField("sample_time_offset", fitUint16Type, eMagnetometerDataSampleTimeOffset, 0, 0, "ms");
+    f->addField("mag_x", fitUint16Type, eMagnetometerDataMagX, 0, 0, "counts");
+    f->addField("mag_y", fitUint16Type, eMagnetometerDataMagY, 0, 0, "counts");
+    f->addField("mag_z", fitUint16Type, eMagnetometerDataMagZ, 0, 0, "counts");
+    f->addField("calibrated_mag_x", fitFloat32Type, eMagnetometerDataCalibratedMagX, 0, 0, "G");
+    f->addField("calibrated_mag_y", fitFloat32Type, eMagnetometerDataCalibratedMagY, 0, 0, "G");
+    f->addField("calibrated_mag_z", fitFloat32Type, eMagnetometerDataCalibratedMagZ, 0, 0, "G");
+    profiles.insert(eMesgNumMagnetometerData, f);
+}
+
 void initThreeDSensorCalibration(QMap<quint16, CFitProfile*>& profiles)
 {
     CFitProfile* f = new CFitProfile("three_d_sensor_calibration", eMesgNumThreeDSensorCalibration);
@@ -919,6 +1055,7 @@ void initCourse(QMap<quint16, CFitProfile*>& profiles)
     f->addField("sport", fitEnumType, eCourseSport, 0, 0, "");
     f->addField("name", fitStringType, eCourseName, 0, 0, "");
     f->addField("capabilities", fitEnumType, eCourseCapabilities, 0, 0, "");
+    f->addField("sub_sport", fitEnumType, eCourseSubSport, 0, 0, "");
     profiles.insert(eMesgNumCourse, f);
 }
 
@@ -1065,6 +1202,7 @@ void initSegmentLap(QMap<quint16, CFitProfile*>& profiles)
     f->addField("max_power_position", fitUint16Type, eSegmentLapMaxPowerPosition, 0, 0, "watts");
     f->addField("avg_cadence_position", fitUint8Type, eSegmentLapAvgCadencePosition, 0, 0, "rpm");
     f->addField("max_cadence_position", fitUint8Type, eSegmentLapMaxCadencePosition, 0, 0, "rpm");
+    f->addField("manufacturer", fitEnumType, eSegmentLapManufacturer, 0, 0, "");
     profiles.insert(eMesgNumSegmentLap, f);
 }
 
@@ -1079,6 +1217,7 @@ void initSegmentFile(QMap<quint16, CFitProfile*>& profiles)
     f->addField("leader_group_primary_key", fitUint32Type, eSegmentFileLeaderGroupPrimaryKey, 0, 0, "");
     f->addField("leader_activity_id", fitUint32Type, eSegmentFileLeaderActivityId, 0, 0, "");
     f->addField("leader_activity_id_string", fitStringType, eSegmentFileLeaderActivityIdString, 0, 0, "");
+    f->addField("default_race_leader", fitUint8Type, eSegmentFileDefaultRaceLeader, 0, 0, "");
     profiles.insert(eMesgNumSegmentFile, f);
 }
 
@@ -1102,8 +1241,8 @@ void initWorkoutStep(QMap<quint16, CFitProfile*>& profiles)
     f->addSubfield("duration_time", fitUint32Type, eWorkoutStepDurationValue, 1000, 0, "s", eWorkoutStepDurationType, eWktStepDurationTime);
     f->addSubfield("duration_time", fitUint32Type, eWorkoutStepDurationValue, 0, 0, "", eWorkoutStepDurationType, eWktStepDurationRepetitionTime);
     f->addSubfield("duration_distance", fitUint32Type, eWorkoutStepDurationValue, 100, 0, "m", eWorkoutStepDurationType, eWktStepDurationDistance);
-    f->addSubfield("duration_hr", fitEnumType, eWorkoutStepDurationValue, 0, 0, "%", eWorkoutStepDurationType, eWktStepDurationHrLessThan);
-    f->addSubfield("duration_hr", fitEnumType, eWorkoutStepDurationValue, 0, 0, "or", eWorkoutStepDurationType, eWktStepDurationHrGreaterThan);
+    f->addSubfield("duration_hr", fitEnumType, eWorkoutStepDurationValue, 0, 0, "% or bpm", eWorkoutStepDurationType, eWktStepDurationHrLessThan);
+    f->addSubfield("duration_hr", fitEnumType, eWorkoutStepDurationValue, 0, 0, "", eWorkoutStepDurationType, eWktStepDurationHrGreaterThan);
     f->addSubfield("duration_calories", fitUint32Type, eWorkoutStepDurationValue, 0, 0, "calories", eWorkoutStepDurationType, eWktStepDurationCalories);
     f->addSubfield("duration_step", fitUint32Type, eWorkoutStepDurationValue, 0, 0, "", eWorkoutStepDurationType, eWktStepDurationRepeatUntilStepsCmplt);
     f->addSubfield("duration_step", fitUint32Type, eWorkoutStepDurationValue, 0, 0, "", eWorkoutStepDurationType, eWktStepDurationRepeatUntilTime);
@@ -1113,31 +1252,34 @@ void initWorkoutStep(QMap<quint16, CFitProfile*>& profiles)
     f->addSubfield("duration_step", fitUint32Type, eWorkoutStepDurationValue, 0, 0, "", eWorkoutStepDurationType, eWktStepDurationRepeatUntilHrGreaterThan);
     f->addSubfield("duration_step", fitUint32Type, eWorkoutStepDurationValue, 0, 0, "", eWorkoutStepDurationType, eWktStepDurationRepeatUntilPowerLessThan);
     f->addSubfield("duration_step", fitUint32Type, eWorkoutStepDurationValue, 0, 0, "", eWorkoutStepDurationType, eWktStepDurationRepeatUntilPowerGreaterThan);
-    f->addSubfield("duration_power", fitEnumType, eWorkoutStepDurationValue, 0, 0, "%", eWorkoutStepDurationType, eWktStepDurationPowerLessThan);
-    f->addSubfield("duration_power", fitEnumType, eWorkoutStepDurationValue, 0, 0, "or", eWorkoutStepDurationType, eWktStepDurationPowerGreaterThan);
+    f->addSubfield("duration_power", fitEnumType, eWorkoutStepDurationValue, 0, 0, "% or watts", eWorkoutStepDurationType, eWktStepDurationPowerLessThan);
+    f->addSubfield("duration_power", fitEnumType, eWorkoutStepDurationValue, 0, 0, "", eWorkoutStepDurationType, eWktStepDurationPowerGreaterThan);
     f->addField("target_type", fitEnumType, eWorkoutStepTargetType, 0, 0, "");
     f->addField("target_value", fitUint32Type, eWorkoutStepTargetValue, 0, 0, "");
+    f->addSubfield("target_speed_zone", fitUint32Type, eWorkoutStepTargetValue, 0, 0, "", eWorkoutStepTargetType, eWktStepTargetSpeed);
     f->addSubfield("target_hr_zone", fitUint32Type, eWorkoutStepTargetValue, 0, 0, "", eWorkoutStepTargetType, eWktStepTargetHeartRate);
+    f->addSubfield("target_cadence_zone", fitUint32Type, eWorkoutStepTargetValue, 0, 0, "", eWorkoutStepTargetType, eWktStepTargetCadence);
     f->addSubfield("target_power_zone", fitUint32Type, eWorkoutStepTargetValue, 0, 0, "", eWorkoutStepTargetType, eWktStepTargetPower);
     f->addSubfield("repeat_steps", fitUint32Type, eWorkoutStepTargetValue, 0, 0, "", eWorkoutStepDurationType, eWktStepDurationRepeatUntilStepsCmplt);
     f->addSubfield("repeat_time", fitUint32Type, eWorkoutStepTargetValue, 1000, 0, "s", eWorkoutStepDurationType, eWktStepDurationRepeatUntilTime);
     f->addSubfield("repeat_distance", fitUint32Type, eWorkoutStepTargetValue, 100, 0, "m", eWorkoutStepDurationType, eWktStepDurationRepeatUntilDistance);
     f->addSubfield("repeat_calories", fitUint32Type, eWorkoutStepTargetValue, 0, 0, "calories", eWorkoutStepDurationType, eWktStepDurationRepeatUntilCalories);
-    f->addSubfield("repeat_hr", fitEnumType, eWorkoutStepTargetValue, 0, 0, "%", eWorkoutStepDurationType, eWktStepDurationRepeatUntilHrLessThan);
-    f->addSubfield("repeat_hr", fitEnumType, eWorkoutStepTargetValue, 0, 0, "or", eWorkoutStepDurationType, eWktStepDurationRepeatUntilHrGreaterThan);
-    f->addSubfield("repeat_power", fitEnumType, eWorkoutStepTargetValue, 0, 0, "%", eWorkoutStepDurationType, eWktStepDurationRepeatUntilPowerLessThan);
-    f->addSubfield("repeat_power", fitEnumType, eWorkoutStepTargetValue, 0, 0, "or", eWorkoutStepDurationType, eWktStepDurationRepeatUntilPowerGreaterThan);
+    f->addSubfield("repeat_hr", fitEnumType, eWorkoutStepTargetValue, 0, 0, "% or bpm", eWorkoutStepDurationType, eWktStepDurationRepeatUntilHrLessThan);
+    f->addSubfield("repeat_hr", fitEnumType, eWorkoutStepTargetValue, 0, 0, "", eWorkoutStepDurationType, eWktStepDurationRepeatUntilHrGreaterThan);
+    f->addSubfield("repeat_power", fitEnumType, eWorkoutStepTargetValue, 0, 0, "% or watts", eWorkoutStepDurationType, eWktStepDurationRepeatUntilPowerLessThan);
+    f->addSubfield("repeat_power", fitEnumType, eWorkoutStepTargetValue, 0, 0, "", eWorkoutStepDurationType, eWktStepDurationRepeatUntilPowerGreaterThan);
     f->addField("custom_target_value_low", fitUint32Type, eWorkoutStepCustomTargetValueLow, 0, 0, "");
     f->addSubfield("custom_target_speed_low", fitUint32Type, eWorkoutStepCustomTargetValueLow, 1000, 0, "m/s", eWorkoutStepTargetType, eWktStepTargetSpeed);
-    f->addSubfield("custom_target_heart_rate_low", fitEnumType, eWorkoutStepCustomTargetValueLow, 0, 0, "%", eWorkoutStepTargetType, eWktStepTargetHeartRate);
+    f->addSubfield("custom_target_heart_rate_low", fitEnumType, eWorkoutStepCustomTargetValueLow, 0, 0, "% or bpm", eWorkoutStepTargetType, eWktStepTargetHeartRate);
     f->addSubfield("custom_target_cadence_low", fitUint32Type, eWorkoutStepCustomTargetValueLow, 0, 0, "rpm", eWorkoutStepTargetType, eWktStepTargetCadence);
-    f->addSubfield("custom_target_power_low", fitEnumType, eWorkoutStepCustomTargetValueLow, 0, 0, "%", eWorkoutStepTargetType, eWktStepTargetPower);
+    f->addSubfield("custom_target_power_low", fitEnumType, eWorkoutStepCustomTargetValueLow, 0, 0, "% or watts", eWorkoutStepTargetType, eWktStepTargetPower);
     f->addField("custom_target_value_high", fitUint32Type, eWorkoutStepCustomTargetValueHigh, 0, 0, "");
     f->addSubfield("custom_target_speed_high", fitUint32Type, eWorkoutStepCustomTargetValueHigh, 1000, 0, "m/s", eWorkoutStepTargetType, eWktStepTargetSpeed);
-    f->addSubfield("custom_target_heart_rate_high", fitEnumType, eWorkoutStepCustomTargetValueHigh, 0, 0, "%", eWorkoutStepTargetType, eWktStepTargetHeartRate);
+    f->addSubfield("custom_target_heart_rate_high", fitEnumType, eWorkoutStepCustomTargetValueHigh, 0, 0, "% or bpm", eWorkoutStepTargetType, eWktStepTargetHeartRate);
     f->addSubfield("custom_target_cadence_high", fitUint32Type, eWorkoutStepCustomTargetValueHigh, 0, 0, "rpm", eWorkoutStepTargetType, eWktStepTargetCadence);
-    f->addSubfield("custom_target_power_high", fitEnumType, eWorkoutStepCustomTargetValueHigh, 0, 0, "%", eWorkoutStepTargetType, eWktStepTargetPower);
+    f->addSubfield("custom_target_power_high", fitEnumType, eWorkoutStepCustomTargetValueHigh, 0, 0, "% or watts", eWorkoutStepTargetType, eWktStepTargetPower);
     f->addField("intensity", fitEnumType, eWorkoutStepIntensity, 0, 0, "");
+    f->addField("notes", fitStringType, eWorkoutStepNotes, 0, 0, "");
     profiles.insert(eMesgNumWorkoutStep, f);
 }
 
@@ -1247,17 +1389,44 @@ void initMonitoring(QMap<quint16, CFitProfile*>& profiles)
     f->addField("activity_time", fitUint16Type, eMonitoringActivityTime, 0, 0, "minutes");
     f->addField("active_calories", fitUint16Type, eMonitoringActiveCalories, 0, 0, "kcal");
     f->addField("current_activity_type_intensity", fitByteType, eMonitoringCurrentActivityTypeIntensity, 0, 0, "");
-    f->addComponent("current_activity_type_intensity", fitByteType, eMonitoringCurrentActivityTypeIntensity, 0, 0, "", eMonitoringActivityType, 5);
-    f->addComponent("current_activity_type_intensity", fitByteType, eMonitoringCurrentActivityTypeIntensity, 0, 0, "", eMonitoringIntensity, 3);
+    f->addComponent("current_activity_type_intensity", fitByteType, eMonitoringCurrentActivityTypeIntensity, 0, 0, "", eMonitoringActivityType, 53);
+    f->addComponent("current_activity_type_intensity", fitByteType, eMonitoringCurrentActivityTypeIntensity, 0, 0, "", eMonitoringIntensity, 0);
     f->addField("timestamp_min_8", fitUint8Type, eMonitoringTimestampMin8, 0, 0, "min");
     f->addField("timestamp_16", fitUint16Type, eMonitoringTimestamp16, 0, 0, "s");
     f->addField("heart_rate", fitUint8Type, eMonitoringHeartRate, 0, 0, "bpm");
     f->addField("intensity", fitUint8Type, eMonitoringIntensity, 10, 0, "");
     f->addField("duration_min", fitUint16Type, eMonitoringDurationMin, 0, 0, "min");
     f->addField("duration", fitUint32Type, eMonitoringDuration, 0, 0, "s");
+    f->addField("ascent", fitUint32Type, eMonitoringAscent, 1000, 0, "m");
+    f->addField("descent", fitUint32Type, eMonitoringDescent, 1000, 0, "m");
+    f->addField("moderate_activity_minutes", fitUint16Type, eMonitoringModerateActivityMinutes, 0, 0, "minutes");
+    f->addField("vigorous_activity_minutes", fitUint16Type, eMonitoringVigorousActivityMinutes, 0, 0, "minutes");
     profiles.insert(eMesgNumMonitoring, f);
 }
 
+void initHr(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("hr", eMesgNumHr);
+    f->addField("timestamp", fitEnumType, eHrTimestamp, 0, 0, "");
+    f->addField("fractional_timestamp", fitUint16Type, eHrFractionalTimestamp, 32768, 0, "s");
+    f->addField("time256", fitUint8Type, eHrTime256, 0, 0, "");
+    f->addComponent("time256", fitUint8Type, eHrTime256, 256, 0, "s", eHrFractionalTimestamp, 8);
+    f->addField("filtered_bpm", fitUint8Type, eHrFilteredBpm, 0, 0, "bpm");
+    f->addField("event_timestamp", fitUint32Type, eHrEventTimestamp, 1024, 0, "s");
+    f->addField("event_timestamp_12", fitByteType, eHrEventTimestamp12, 0, 0, "");
+    f->addComponent("event_timestamp_12", fitByteType, eHrEventTimestamp12, 1024, 0, "s", eHrEventTimestamp, 12);
+    f->addComponent("event_timestamp_12", fitByteType, eHrEventTimestamp12, 1024, 0, "s", eHrEventTimestamp, 12);
+    f->addComponent("event_timestamp_12", fitByteType, eHrEventTimestamp12, 1024, 0, "s", eHrEventTimestamp, 12);
+    f->addComponent("event_timestamp_12", fitByteType, eHrEventTimestamp12, 1024, 0, "s", eHrEventTimestamp, 12);
+    f->addComponent("event_timestamp_12", fitByteType, eHrEventTimestamp12, 1024, 0, "s", eHrEventTimestamp, 12);
+    f->addComponent("event_timestamp_12", fitByteType, eHrEventTimestamp12, 1024, 0, "s", eHrEventTimestamp, 12);
+    f->addComponent("event_timestamp_12", fitByteType, eHrEventTimestamp12, 1024, 0, "s", eHrEventTimestamp, 12);
+    f->addComponent("event_timestamp_12", fitByteType, eHrEventTimestamp12, 1024, 0, "s", eHrEventTimestamp, 12);
+    f->addComponent("event_timestamp_12", fitByteType, eHrEventTimestamp12, 1024, 0, "s", eHrEventTimestamp, 12);
+    f->addComponent("event_timestamp_12", fitByteType, eHrEventTimestamp12, 1024, 0, "s", eHrEventTimestamp, 12);
+    profiles.insert(eMesgNumHr, f);
+}
+
 void initMemoGlob(QMap<quint16, CFitProfile*>& profiles)
 {
     CFitProfile* f = new CFitProfile("memo_glob", eMesgNumMemoGlob);
@@ -1268,6 +1437,133 @@ void initMemoGlob(QMap<quint16, CFitProfile*>& profiles)
     profiles.insert(eMesgNumMemoGlob, f);
 }
 
+void initAntChannelId(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("ant_channel_id", eMesgNumAntChannelId);
+    f->addField("channel_number", fitUint8Type, eAntChannelIdChannelNumber, 0, 0, "");
+    f->addField("device_type", fitUint8zType, eAntChannelIdDeviceType, 0, 0, "");
+    f->addField("device_number", fitUint16zType, eAntChannelIdDeviceNumber, 0, 0, "");
+    f->addField("transmission_type", fitUint8zType, eAntChannelIdTransmissionType, 0, 0, "");
+    f->addField("device_index", fitEnumType, eAntChannelIdDeviceIndex, 0, 0, "");
+    profiles.insert(eMesgNumAntChannelId, f);
+}
+
+void initAntRx(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("ant_rx", eMesgNumAntRx);
+    f->addField("timestamp", fitEnumType, eAntRxTimestamp, 0, 0, "s");
+    f->addField("fractional_timestamp", fitUint16Type, eAntRxFractionalTimestamp, 32768, 0, "s");
+    f->addField("mesg_id", fitByteType, eAntRxMesgId, 0, 0, "");
+    f->addField("mesg_data", fitByteType, eAntRxMesgData, 0, 0, "");
+    f->addComponent("mesg_data", fitByteType, eAntRxMesgData, 0, 0, "", eAntRxChannelNumber, 888888888);
+    f->addComponent("mesg_data", fitByteType, eAntRxMesgData, 0, 0, "", eAntRxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntRxMesgData, 0, 0, "", eAntRxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntRxMesgData, 0, 0, "", eAntRxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntRxMesgData, 0, 0, "", eAntRxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntRxMesgData, 0, 0, "", eAntRxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntRxMesgData, 0, 0, "", eAntRxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntRxMesgData, 0, 0, "", eAntRxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntRxMesgData, 0, 0, "", eAntRxData, 0);
+    f->addField("channel_number", fitUint8Type, eAntRxChannelNumber, 0, 0, "");
+    f->addField("data", fitByteType, eAntRxData, 0, 0, "");
+    profiles.insert(eMesgNumAntRx, f);
+}
+
+void initAntTx(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("ant_tx", eMesgNumAntTx);
+    f->addField("timestamp", fitEnumType, eAntTxTimestamp, 0, 0, "s");
+    f->addField("fractional_timestamp", fitUint16Type, eAntTxFractionalTimestamp, 32768, 0, "s");
+    f->addField("mesg_id", fitByteType, eAntTxMesgId, 0, 0, "");
+    f->addField("mesg_data", fitByteType, eAntTxMesgData, 0, 0, "");
+    f->addComponent("mesg_data", fitByteType, eAntTxMesgData, 0, 0, "", eAntTxChannelNumber, 888888888);
+    f->addComponent("mesg_data", fitByteType, eAntTxMesgData, 0, 0, "", eAntTxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntTxMesgData, 0, 0, "", eAntTxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntTxMesgData, 0, 0, "", eAntTxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntTxMesgData, 0, 0, "", eAntTxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntTxMesgData, 0, 0, "", eAntTxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntTxMesgData, 0, 0, "", eAntTxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntTxMesgData, 0, 0, "", eAntTxData, 0);
+    f->addComponent("mesg_data", fitByteType, eAntTxMesgData, 0, 0, "", eAntTxData, 0);
+    f->addField("channel_number", fitUint8Type, eAntTxChannelNumber, 0, 0, "");
+    f->addField("data", fitByteType, eAntTxData, 0, 0, "");
+    profiles.insert(eMesgNumAntTx, f);
+}
+
+void initExdScreenConfiguration(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("exd_screen_configuration", eMesgNumExdScreenConfiguration);
+    f->addField("screen_index", fitUint8Type, eExdScreenConfigurationScreenIndex, 0, 0, "");
+    f->addField("field_count", fitUint8Type, eExdScreenConfigurationFieldCount, 0, 0, "");
+    f->addField("layout", fitEnumType, eExdScreenConfigurationLayout, 0, 0, "");
+    f->addField("screen_enabled", fitEnumType, eExdScreenConfigurationScreenEnabled, 0, 0, "");
+    profiles.insert(eMesgNumExdScreenConfiguration, f);
+}
+
+void initExdDataFieldConfiguration(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("exd_data_field_configuration", eMesgNumExdDataFieldConfiguration);
+    f->addField("screen_index", fitUint8Type, eExdDataFieldConfigurationScreenIndex, 0, 0, "");
+    f->addField("concept_field", fitByteType, eExdDataFieldConfigurationConceptField, 0, 0, "");
+    f->addComponent("concept_field", fitByteType, eExdDataFieldConfigurationConceptField, 0, 0, "", eExdDataFieldConfigurationFieldId, 44);
+    f->addComponent("concept_field", fitByteType, eExdDataFieldConfigurationConceptField, 0, 0, "", eExdDataFieldConfigurationConceptCount, 0);
+    f->addField("field_id", fitUint8Type, eExdDataFieldConfigurationFieldId, 0, 0, "");
+    f->addField("concept_count", fitUint8Type, eExdDataFieldConfigurationConceptCount, 0, 0, "");
+    f->addField("display_type", fitEnumType, eExdDataFieldConfigurationDisplayType, 0, 0, "");
+    f->addField("title", fitStringType, eExdDataFieldConfigurationTitle, 0, 0, "");
+    profiles.insert(eMesgNumExdDataFieldConfiguration, f);
+}
+
+void initExdDataConceptConfiguration(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("exd_data_concept_configuration", eMesgNumExdDataConceptConfiguration);
+    f->addField("screen_index", fitUint8Type, eExdDataConceptConfigurationScreenIndex, 0, 0, "");
+    f->addField("concept_field", fitByteType, eExdDataConceptConfigurationConceptField, 0, 0, "");
+    f->addComponent("concept_field", fitByteType, eExdDataConceptConfigurationConceptField, 0, 0, "", eExdDataConceptConfigurationFieldId, 44);
+    f->addComponent("concept_field", fitByteType, eExdDataConceptConfigurationConceptField, 0, 0, "", eExdDataConceptConfigurationConceptIndex, 0);
+    f->addField("field_id", fitUint8Type, eExdDataConceptConfigurationFieldId, 0, 0, "");
+    f->addField("concept_index", fitUint8Type, eExdDataConceptConfigurationConceptIndex, 0, 0, "");
+    f->addField("data_page", fitUint8Type, eExdDataConceptConfigurationDataPage, 0, 0, "");
+    f->addField("concept_key", fitUint8Type, eExdDataConceptConfigurationConceptKey, 0, 0, "");
+    f->addField("scaling", fitUint8Type, eExdDataConceptConfigurationScaling, 0, 0, "");
+    f->addField("data_units", fitEnumType, eExdDataConceptConfigurationDataUnits, 0, 0, "");
+    f->addField("qualifier", fitEnumType, eExdDataConceptConfigurationQualifier, 0, 0, "");
+    f->addField("descriptor", fitEnumType, eExdDataConceptConfigurationDescriptor, 0, 0, "");
+    f->addField("is_signed", fitEnumType, eExdDataConceptConfigurationIsSigned, 0, 0, "");
+    profiles.insert(eMesgNumExdDataConceptConfiguration, f);
+}
+
+void initFieldDescription(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("field_description", eMesgNumFieldDescription);
+    f->addField("developer_data_index", fitUint8Type, eFieldDescriptionDeveloperDataIndex, 0, 0, "");
+    f->addField("field_definition_number", fitUint8Type, eFieldDescriptionFieldDefinitionNumber, 0, 0, "");
+    f->addField("fit_base_type_id", fitEnumType, eFieldDescriptionFitBaseTypeId, 0, 0, "");
+    f->addField("field_name", fitStringType, eFieldDescriptionFieldName, 0, 0, "");
+    f->addField("array", fitUint8Type, eFieldDescriptionArray, 0, 0, "");
+    f->addField("components", fitStringType, eFieldDescriptionComponents, 0, 0, "");
+    f->addField("scale", fitUint8Type, eFieldDescriptionScale, 0, 0, "");
+    f->addField("offset", fitSint8Type, eFieldDescriptionOffset, 0, 0, "");
+    f->addField("units", fitStringType, eFieldDescriptionUnits, 0, 0, "");
+    f->addField("bits", fitStringType, eFieldDescriptionBits, 0, 0, "");
+    f->addField("accumulate", fitStringType, eFieldDescriptionAccumulate, 0, 0, "");
+    f->addField("fit_base_unit_id", fitEnumType, eFieldDescriptionFitBaseUnitId, 0, 0, "");
+    f->addField("native_mesg_num", fitEnumType, eFieldDescriptionNativeMesgNum, 0, 0, "");
+    f->addField("native_field_num", fitUint8Type, eFieldDescriptionNativeFieldNum, 0, 0, "");
+    profiles.insert(eMesgNumFieldDescription, f);
+}
+
+void initDeveloperDataId(QMap<quint16, CFitProfile*>& profiles)
+{
+    CFitProfile* f = new CFitProfile("developer_data_id", eMesgNumDeveloperDataId);
+    f->addField("developer_id", fitByteType, eDeveloperDataIdDeveloperId, 0, 0, "");
+    f->addField("application_id", fitByteType, eDeveloperDataIdApplicationId, 0, 0, "");
+    f->addField("manufacturer_id", fitEnumType, eDeveloperDataIdManufacturerId, 0, 0, "");
+    f->addField("developer_data_index", fitUint8Type, eDeveloperDataIdDeveloperDataIndex, 0, 0, "");
+    f->addField("application_version", fitUint32Type, eDeveloperDataIdApplicationVersion, 0, 0, "");
+    profiles.insert(eMesgNumDeveloperDataId, f);
+}
+
 // ----------- end generated code -----------
 
 
@@ -1287,6 +1583,9 @@ void initProfiles(QMap<quint16, CFitProfile*>& allProfiles)
     initHrmProfile(allProfiles);
     initSdmProfile(allProfiles);
     initBikeProfile(allProfiles);
+    initConnectivity(allProfiles);
+    initWatchfaceSettings(allProfiles);
+    initOhrSettings(allProfiles);
     initZonesTarget(allProfiles);
     initSport(allProfiles);
     initHrZone(allProfiles);
@@ -1304,9 +1603,13 @@ void initProfiles(QMap<quint16, CFitProfile*>& allProfiles)
     initDeviceInfo(allProfiles);
     initTrainingFile(allProfiles);
     initHrv(allProfiles);
+    initWeatherConditions(allProfiles);
+    initWeatherAlert(allProfiles);
+    initGpsMetadata(allProfiles);
     initCameraEvent(allProfiles);
     initGyroscopeData(allProfiles);
     initAccelerometerData(allProfiles);
+    initMagnetometerData(allProfiles);
     initThreeDSensorCalibration(allProfiles);
     initVideoFrame(allProfiles);
     initObdiiData(allProfiles);
@@ -1331,7 +1634,16 @@ void initProfiles(QMap<quint16, CFitProfile*>& allProfiles)
     initBloodPressure(allProfiles);
     initMonitoringInfo(allProfiles);
     initMonitoring(allProfiles);
+    initHr(allProfiles);
     initMemoGlob(allProfiles);
+    initAntChannelId(allProfiles);
+    initAntRx(allProfiles);
+    initAntTx(allProfiles);
+    initExdScreenConfiguration(allProfiles);
+    initExdDataFieldConfiguration(allProfiles);
+    initExdDataConceptConfiguration(allProfiles);
+    initFieldDescription(allProfiles);
+    initDeveloperDataId(allProfiles);
 
     // invalid profile
     allProfiles.insert(fitGlobalMesgNrInvalid, new CFitProfile());
diff --git a/src/gis/fit/defs/HowToFitGenerator.txt b/src/gis/fit/defs/HowToFitGenerator.txt
index 19d651d..dd6389b 100644
--- a/src/gis/fit/defs/HowToFitGenerator.txt
+++ b/src/gis/fit/defs/HowToFitGenerator.txt
@@ -17,9 +17,9 @@ The input for the generator are two CSV files (beware the line ending must be li
 - Profile_Messages.csv
 - Profile_Types.csv
 
-These csv files are the export from the Excel "Profiles.xlsx" within the FIT SDK (Current Version 16.20).
+These csv files are the export from the Excel "Profiles.xlsx" within the FIT SDK (Current Version 20.27).
 
-The generator "profiles.sh" is a bash script and needs at least bash version 4.3.
+The generator "profiles.py" is a python script and needs python 2.7.
 The generator creates separate files. The code must be placed at the corresponding source code manually 
 (in between the above mentioned comments).
 The generator creates files with the same name as the files mentioned above plus a prefix "gen-" 
diff --git a/src/gis/fit/defs/fit_enums.h b/src/gis/fit/defs/fit_enums.h
index 86fcfdd..979c0a5 100644
--- a/src/gis/fit/defs/fit_enums.h
+++ b/src/gis/fit/defs/fit_enums.h
@@ -20,8 +20,7 @@
 #define FIT_PROFILE_H
 
 // ----------- start generated code -----------
-typedef enum
-{
+typedef enum {
     eFileDevice = 1,
     eFileSettings = 2,
     eFileSport = 3,
@@ -39,12 +38,12 @@ typedef enum
     eFileMonitoringB = 32,
     eFileSegment = 34,
     eFileSegmentList = 35,
+    eFileExdConfiguration = 40,
     eFileMfgRangeMin = 0xF7,
     eFileMfgRangeMax = 0xFE
 } file_e;
 
-typedef enum
-{
+typedef enum {
     eMesgNumFileId = 0,
     eMesgNumCapabilities = 1,
     eMesgNumDeviceSettings = 2,
@@ -81,17 +80,25 @@ typedef enum
     eMesgNumMonitoring = 55,
     eMesgNumTrainingFile = 72,
     eMesgNumHrv = 78,
+    eMesgNumAntRx = 80,
+    eMesgNumAntTx = 81,
+    eMesgNumAntChannelId = 82,
     eMesgNumLength = 101,
     eMesgNumMonitoringInfo = 103,
     eMesgNumPad = 105,
     eMesgNumSlaveDevice = 106,
+    eMesgNumConnectivity = 127,
+    eMesgNumWeatherConditions = 128,
+    eMesgNumWeatherAlert = 129,
     eMesgNumCadenceZone = 131,
+    eMesgNumHr = 132,
     eMesgNumSegmentLap = 142,
     eMesgNumMemoGlob = 145,
     eMesgNumSegmentId = 148,
     eMesgNumSegmentLeaderboardEntry = 149,
     eMesgNumSegmentPoint = 150,
     eMesgNumSegmentFile = 151,
+    eMesgNumWatchfaceSettings = 159,
     eMesgNumGpsMetadata = 160,
     eMesgNumCameraEvent = 161,
     eMesgNumTimestampCorrelation = 162,
@@ -106,60 +113,58 @@ typedef enum
     eMesgNumVideoTitle = 185,
     eMesgNumVideoDescription = 186,
     eMesgNumVideoClip = 187,
+    eMesgNumOhrSettings = 188,
+    eMesgNumExdScreenConfiguration = 200,
+    eMesgNumExdDataFieldConfiguration = 201,
+    eMesgNumExdDataConceptConfiguration = 202,
+    eMesgNumFieldDescription = 206,
+    eMesgNumDeveloperDataId = 207,
+    eMesgNumMagnetometerData = 208,
     eMesgNumMfgRangeMin = 0xFF00,
     eMesgNumMfgRangeMax = 0xFFFE
 } mesg_num_e;
 
-typedef enum
-{
+typedef enum {
     eChecksumClear = 0,
     eChecksumOk = 1
 } checksum_e;
 
-typedef enum
-{
+typedef enum {
     eFileFlagsRead = 0x02,
     eFileFlagsWrite = 0x04,
     eFileFlagsErase = 0x08
 } file_flags_e;
 
-typedef enum
-{
+typedef enum {
     eMesgCountNumPerFile = 0,
     eMesgCountMaxPerFile = 1,
     eMesgCountMaxPerFileType = 2
 } mesg_count_e;
 
-typedef enum
-{
+typedef enum {
     eDateTimeMin = 0x10000000
 } date_time_e;
 
-typedef enum
-{
+typedef enum {
     eLocalDateTimeMin = 0x10000000
 } local_date_time_e;
 
-typedef enum
-{
+typedef enum {
     eMessageIndexSelected = 0x8000,
     eMessageIndexReserved = 0x7000,
     eMessageIndexMask = 0x0FFF
 } message_index_e;
 
-typedef enum
-{
+typedef enum {
     eDeviceIndexCreator = 0
 } device_index_e;
 
-typedef enum
-{
+typedef enum {
     eGenderFemale = 0,
     eGenderMale = 1
 } gender_e;
 
-typedef enum
-{
+typedef enum {
     eLanguageEnglish = 0,
     eLanguageFrench = 1,
     eLanguageItalian = 2,
@@ -186,11 +191,75 @@ typedef enum
     eLanguageFarsi = 23,
     eLanguageBulgarian = 24,
     eLanguageRomanian = 25,
+    eLanguageChinese = 26,
+    eLanguageJapanese = 27,
+    eLanguageKorean = 28,
+    eLanguageTaiwanese = 29,
+    eLanguageThai = 30,
+    eLanguageHebrew = 31,
+    eLanguageBrazilianPortuguese = 32,
+    eLanguageIndonesian = 33,
+    eLanguageMalaysian = 34,
+    eLanguageVietnamese = 35,
+    eLanguageBurmese = 36,
+    eLanguageMongolian = 37,
     eLanguageCustom = 254
 } language_e;
 
-typedef enum
-{
+typedef enum {
+    eLanguageBits0English = 0x01,
+    eLanguageBits0French = 0x02,
+    eLanguageBits0Italian = 0x04,
+    eLanguageBits0German = 0x08,
+    eLanguageBits0Spanish = 0x10,
+    eLanguageBits0Croatian = 0x20,
+    eLanguageBits0Czech = 0x40,
+    eLanguageBits0Danish = 0x80
+} language_bits_0_e;
+
+typedef enum {
+    eLanguageBits1Dutch = 0x01,
+    eLanguageBits1Finnish = 0x02,
+    eLanguageBits1Greek = 0x04,
+    eLanguageBits1Hungarian = 0x08,
+    eLanguageBits1Norwegian = 0x10,
+    eLanguageBits1Polish = 0x20,
+    eLanguageBits1Portuguese = 0x40,
+    eLanguageBits1Slovakian = 0x80
+} language_bits_1_e;
+
+typedef enum {
+    eLanguageBits2Slovenian = 0x01,
+    eLanguageBits2Swedish = 0x02,
+    eLanguageBits2Russian = 0x04,
+    eLanguageBits2Turkish = 0x08,
+    eLanguageBits2Latvian = 0x10,
+    eLanguageBits2Ukrainian = 0x20,
+    eLanguageBits2Arabic = 0x40,
+    eLanguageBits2Farsi = 0x80
+} language_bits_2_e;
+
+typedef enum {
+    eLanguageBits3Bulgarian = 0x01,
+    eLanguageBits3Romanian = 0x02,
+    eLanguageBits3Chinese = 0x04,
+    eLanguageBits3Japanese = 0x08,
+    eLanguageBits3Korean = 0x10,
+    eLanguageBits3Taiwanese = 0x20,
+    eLanguageBits3Thai = 0x40,
+    eLanguageBits3Hebrew = 0x80
+} language_bits_3_e;
+
+typedef enum {
+    eLanguageBits4BrazilianPortuguese = 0x01,
+    eLanguageBits4Indonesian = 0x02,
+    eLanguageBits4Malaysian = 0x04,
+    eLanguageBits4Vietnamese = 0x08,
+    eLanguageBits4Burmese = 0x10,
+    eLanguageBits4Mongolian = 0x20
+} language_bits_4_e;
+
+typedef enum {
     eTimeZoneAlmaty = 0,
     eTimeZoneBangkok = 1,
     eTimeZoneBombay = 2,
@@ -299,27 +368,24 @@ typedef enum
     eTimeZoneAutomatic = 254
 } time_zone_e;
 
-typedef enum
-{
+typedef enum {
     eDisplayMeasureMetric = 0,
-    eDisplayMeasureStatute = 1
+    eDisplayMeasureStatute = 1,
+    eDisplayMeasureNautical = 2
 } display_measure_e;
 
-typedef enum
-{
+typedef enum {
     eDisplayHeartBpm = 0,
     eDisplayHeartMax = 1,
     eDisplayHeartReserve = 2
 } display_heart_e;
 
-typedef enum
-{
+typedef enum {
     eDisplayPowerWatts = 0,
     eDisplayPowerPercentFtp = 1
 } display_power_e;
 
-typedef enum
-{
+typedef enum {
     eDisplayPositionDegree = 0,
     eDisplayPositionDegreeMinute = 1,
     eDisplayPositionDegreeMinuteSecond = 2,
@@ -334,14 +400,14 @@ typedef enum
     eDisplayPositionIndonesianIrian = 11,
     eDisplayPositionIndonesianSouthern = 12,
     eDisplayPositionIndiaZone0 = 13,
-    eDisplayPositionIndiaZoneIA = 14,
-    eDisplayPositionIndiaZoneIB = 15,
-    eDisplayPositionIndiaZoneIIA = 16,
-    eDisplayPositionIndiaZoneIIB = 17,
-    eDisplayPositionIndiaZoneIIIA = 18,
-    eDisplayPositionIndiaZoneIIIB = 19,
-    eDisplayPositionIndiaZoneIVA = 20,
-    eDisplayPositionIndiaZoneIVB = 21,
+    eDisplayPositionIndiaZoneIa = 14,
+    eDisplayPositionIndiaZoneIb = 15,
+    eDisplayPositionIndiaZoneIia = 16,
+    eDisplayPositionIndiaZoneIib = 17,
+    eDisplayPositionIndiaZoneIiia = 18,
+    eDisplayPositionIndiaZoneIiib = 19,
+    eDisplayPositionIndiaZoneIva = 20,
+    eDisplayPositionIndiaZoneIvb = 21,
     eDisplayPositionIrishTransverse = 22,
     eDisplayPositionIrishGrid = 23,
     eDisplayPositionLoran = 24,
@@ -364,8 +430,13 @@ typedef enum
     eDisplayPositionSwedishRef99Grid = 41
 } display_position_e;
 
-typedef enum
-{
+typedef enum {
+    eSwitchOff = 0,
+    eSwitchOn = 1,
+    eSwitchAuto = 2
+} switch_e;
+
+typedef enum {
     eSportGeneric = 0,
     eSportRunning = 1,
     eSportCycling = 2,
@@ -411,11 +482,14 @@ typedef enum
     eSportRafting = 42,
     eSportWindsurfing = 43,
     eSportKitesurfing = 44,
+    eSportTactical = 45,
+    eSportJumpmaster = 46,
+    eSportBoxing = 47,
+    eSportFloorClimbing = 48,
     eSportAll = 254
 } sport_e;
 
-typedef enum
-{
+typedef enum {
     eSportBits0Generic = 0x01,
     eSportBits0Running = 0x02,
     eSportBits0Cycling = 0x04,
@@ -426,8 +500,7 @@ typedef enum
     eSportBits0Soccer = 0x80
 } sport_bits_0_e;
 
-typedef enum
-{
+typedef enum {
     eSportBits1Tennis = 0x01,
     eSportBits1AmericanFootball = 0x02,
     eSportBits1Training = 0x04,
@@ -438,8 +511,7 @@ typedef enum
     eSportBits1Rowing = 0x80
 } sport_bits_1_e;
 
-typedef enum
-{
+typedef enum {
     eSportBits2Mountaineering = 0x01,
     eSportBits2Hiking = 0x02,
     eSportBits2Multisport = 0x04,
@@ -450,8 +522,7 @@ typedef enum
     eSportBits2Boating = 0x80
 } sport_bits_2_e;
 
-typedef enum
-{
+typedef enum {
     eSportBits3Driving = 0x01,
     eSportBits3Golf = 0x02,
     eSportBits3HangGliding = 0x04,
@@ -462,8 +533,7 @@ typedef enum
     eSportBits3RockClimbing = 0x80
 } sport_bits_3_e;
 
-typedef enum
-{
+typedef enum {
     eSportBits4Sailing = 0x01,
     eSportBits4IceSkating = 0x02,
     eSportBits4SkyDiving = 0x04,
@@ -474,17 +544,22 @@ typedef enum
     eSportBits4Wakeboarding = 0x80
 } sport_bits_4_e;
 
-typedef enum
-{
+typedef enum {
     eSportBits5WaterSkiing = 0x01,
     eSportBits5Kayaking = 0x02,
     eSportBits5Rafting = 0x04,
     eSportBits5Windsurfing = 0x08,
-    eSportBits5Kitesurfing = 0x10
+    eSportBits5Kitesurfing = 0x10,
+    eSportBits5Tactical = 0x20,
+    eSportBits5Jumpmaster = 0x40,
+    eSportBits5Boxing = 0x80
 } sport_bits_5_e;
 
-typedef enum
-{
+typedef enum {
+    eSportBits6FloorClimbing = 0x01
+} sport_bits_6_e;
+
+typedef enum {
     eSubSportGeneric = 0,
     eSubSportTreadmill = 1,
     eSubSportStreet = 2,
@@ -527,11 +602,21 @@ typedef enum
     eSubSportRcDrone = 39,
     eSubSportWingsuit = 40,
     eSubSportWhitewater = 41,
+    eSubSportSkateSkiing = 42,
+    eSubSportYoga = 43,
+    eSubSportPilates = 44,
+    eSubSportIndoorRunning = 45,
+    eSubSportGravelCycling = 46,
+    eSubSportEBikeMountain = 47,
+    eSubSportCommuting = 48,
+    eSubSportMixedSurface = 49,
+    eSubSportNavigate = 50,
+    eSubSportTrackMe = 51,
+    eSubSportMap = 52,
     eSubSportAll = 254
 } sub_sport_e;
 
-typedef enum
-{
+typedef enum {
     eSportEventUncategorized = 0,
     eSportEventGeocaching = 1,
     eSportEventFitness = 2,
@@ -543,30 +628,26 @@ typedef enum
     eSportEventTouring = 8
 } sport_event_e;
 
-typedef enum
-{
+typedef enum {
     eActivityManual = 0,
     eActivityAutoMultiSport = 1
 } activity_e;
 
-typedef enum
-{
+typedef enum {
     eIntensityActive = 0,
     eIntensityRest = 1,
     eIntensityWarmup = 2,
     eIntensityCooldown = 3
 } intensity_e;
 
-typedef enum
-{
+typedef enum {
     eSessionTriggerActivityEnd = 0,
     eSessionTriggerManual = 1,
     eSessionTriggerAutoMultiSport = 2,
     eSessionTriggerFitnessEquipment = 3
 } session_trigger_e;
 
-typedef enum
-{
+typedef enum {
     eAutolapTriggerTime = 0,
     eAutolapTriggerDistance = 1,
     eAutolapTriggerPositionStart = 2,
@@ -576,8 +657,7 @@ typedef enum
     eAutolapTriggerOff = 6
 } autolap_trigger_e;
 
-typedef enum
-{
+typedef enum {
     eLapTriggerManual = 0,
     eLapTriggerTime = 1,
     eLapTriggerDistance = 2,
@@ -589,8 +669,31 @@ typedef enum
     eLapTriggerFitnessEquipment = 8
 } lap_trigger_e;
 
-typedef enum
-{
+typedef enum {
+    eTimeModeHour12 = 0,
+    eTimeModeHour24 = 1,
+    eTimeModeMilitary = 2,
+    eTimeModeHour12WithSeconds = 3,
+    eTimeModeHour24WithSeconds = 4,
+    eTimeModeUtc = 5
+} time_mode_e;
+
+typedef enum {
+    eBacklightModeOff = 0,
+    eBacklightModeManual = 1,
+    eBacklightModeKeyAndMessages = 2,
+    eBacklightModeAutoBrightness = 3,
+    eBacklightModeSmartNotifications = 4,
+    eBacklightModeKeyAndMessagesNight = 5,
+    eBacklightModeKeyAndMessagesAndSmartNotifications = 6
+} backlight_mode_e;
+
+typedef enum {
+    eDateModeDayMonth = 0,
+    eDateModeMonthDay = 1
+} date_mode_e;
+
+typedef enum {
     eEventTimer = 0,
     eEventWorkout = 3,
     eEventWorkoutStep = 4,
@@ -629,8 +732,7 @@ typedef enum
     eEventCommTimeout = 47
 } event_e;
 
-typedef enum
-{
+typedef enum {
     eEventTypeStart = 0,
     eEventTypeStop = 1,
     eEventTypeConsecutiveDepreciated = 2,
@@ -643,43 +745,44 @@ typedef enum
     eEventTypeStopDisableAll = 9
 } event_type_e;
 
-typedef enum
-{
+typedef enum {
     eTimerTriggerManual = 0,
     eTimerTriggerAuto = 1,
     eTimerTriggerFitnessEquipment = 2
 } timer_trigger_e;
 
-typedef enum
-{
+typedef enum {
     eFitnessEquipmentStateReady = 0,
     eFitnessEquipmentStateInUse = 1,
     eFitnessEquipmentStatePaused = 2,
     eFitnessEquipmentStateUnknown = 3
 } fitness_equipment_state_e;
 
-typedef enum
-{
+typedef enum {
+    eAutoscrollNone = 0,
+    eAutoscrollSlow = 1,
+    eAutoscrollMedium = 2,
+    eAutoscrollFast = 3
+} autoscroll_e;
+
+typedef enum {
     eActivityClassLevel = 0x7F,
     eActivityClassLevelMax = 100,
     eActivityClassAthlete = 0x80
 } activity_class_e;
 
-typedef enum
-{
+typedef enum {
     eHrZoneCalcCustom = 0,
     eHrZoneCalcPercentMaxHr = 1,
     eHrZoneCalcPercentHrr = 2
 } hr_zone_calc_e;
 
-typedef enum
-{
+typedef enum {
     ePwrZoneCalcCustom = 0,
     ePwrZoneCalcPercentFtp = 1
 } pwr_zone_calc_e;
 
-typedef enum
-{
+typedef enum {
     eWktStepDurationTime = 0,
     eWktStepDurationDistance = 1,
     eWktStepDurationHrLessThan = 2,
@@ -696,31 +799,48 @@ typedef enum
     eWktStepDurationRepeatUntilPowerGreaterThan = 13,
     eWktStepDurationPowerLessThan = 14,
     eWktStepDurationPowerGreaterThan = 15,
+    eWktStepDurationTrainingPeaksTss = 16,
+    eWktStepDurationRepeatUntilPowerLastLapLessThan = 17,
+    eWktStepDurationRepeatUntilMaxPowerLastLapLessThan = 18,
+    eWktStepDurationPower3SLessThan = 19,
+    eWktStepDurationPower10SLessThan = 20,
+    eWktStepDurationPower30SLessThan = 21,
+    eWktStepDurationPower3SGreaterThan = 22,
+    eWktStepDurationPower10SGreaterThan = 23,
+    eWktStepDurationPower30SGreaterThan = 24,
+    eWktStepDurationPowerLapLessThan = 25,
+    eWktStepDurationPowerLapGreaterThan = 26,
+    eWktStepDurationRepeatUntilTrainingPeaksTss = 27,
     eWktStepDurationRepetitionTime = 28
 } wkt_step_duration_e;
 
-typedef enum
-{
+typedef enum {
     eWktStepTargetSpeed = 0,
     eWktStepTargetHeartRate = 1,
     eWktStepTargetOpen = 2,
     eWktStepTargetCadence = 3,
     eWktStepTargetPower = 4,
     eWktStepTargetGrade = 5,
-    eWktStepTargetResistance = 6
+    eWktStepTargetResistance = 6,
+    eWktStepTargetPower3S = 7,
+    eWktStepTargetPower10S = 8,
+    eWktStepTargetPower30S = 9,
+    eWktStepTargetPowerLap = 10,
+    eWktStepTargetSpeedLap = 12,
+    eWktStepTargetHeartRateLap = 13
 } wkt_step_target_e;
 
-typedef enum
-{
+typedef enum {
     eGoalTime = 0,
     eGoalDistance = 1,
     eGoalCalories = 2,
     eGoalFrequency = 3,
-    eGoalSteps = 4
+    eGoalSteps = 4,
+    eGoalAscent = 5,
+    eGoalActiveMinutes = 6
 } goal_e;
 
-typedef enum
-{
+typedef enum {
     eGoalRecurrenceOff = 0,
     eGoalRecurrenceDaily = 1,
     eGoalRecurrenceWeekly = 2,
@@ -729,14 +849,18 @@ typedef enum
     eGoalRecurrenceCustom = 5
 } goal_recurrence_e;
 
-typedef enum
-{
+typedef enum {
+    eGoalSourceAuto = 0,
+    eGoalSourceCommunity = 1,
+    eGoalSourceUser = 2
+} goal_source_e;
+
+typedef enum {
     eScheduleWorkout = 0,
     eScheduleCourse = 1
 } schedule_e;
 
-typedef enum
-{
+typedef enum {
     eCoursePointGeneric = 0,
     eCoursePointSummit = 1,
     eCoursePointValley = 2,
@@ -760,11 +884,12 @@ typedef enum
     eCoursePointSharpLeft = 20,
     eCoursePointSlightRight = 21,
     eCoursePointSharpRight = 22,
-    eCoursePointUTurn = 23
+    eCoursePointUTurn = 23,
+    eCoursePointSegmentStart = 24,
+    eCoursePointSegmentEnd = 25
 } course_point_e;
 
-typedef enum
-{
+typedef enum {
     eManufacturerGarmin = 1,
     eManufacturerGarminFr405Antfs = 2,
     eManufacturerZephyr = 3,
@@ -810,11 +935,11 @@ typedef enum
     eManufacturerBrimBrothers = 44,
     eManufacturerXplova = 45,
     eManufacturerPerceptionDigital = 46,
-    eManufacturerBf1systems = 47,
+    eManufacturerBf1Systems = 47,
     eManufacturerPioneer = 48,
     eManufacturerSpantec = 49,
     eManufacturerMetalogics = 50,
-    eManufacturer4iiiis = 51,
+    eManufacturer4Iiiis = 51,
     eManufacturerSeikoEpson = 52,
     eManufacturerSeikoEpsonOem = 53,
     eManufacturerIforPowell = 54,
@@ -853,14 +978,25 @@ typedef enum
     eManufacturerTacx = 89,
     eManufacturerDirectionTechnology = 90,
     eManufacturerMagtonic = 91,
-    eManufacturer1partcarbon = 92,
+    eManufacturer1Partcarbon = 92,
     eManufacturerInsideRideTechnologies = 93,
     eManufacturerSoundOfMotion = 94,
     eManufacturerStryd = 95,
     eManufacturerIcg = 96,
-    eManufacturerMiPulse = 97,
+    eManufacturerMipulse = 97,
     eManufacturerBsxAthletics = 98,
     eManufacturerLook = 99,
+    eManufacturerCampagnoloSrl = 100,
+    eManufacturerBodyBikeSmart = 101,
+    eManufacturerPraxisworks = 102,
+    eManufacturerLimitsTechnology = 103,
+    eManufacturerTopactionTechnology = 104,
+    eManufacturerCosinuss = 105,
+    eManufacturerFitcare = 106,
+    eManufacturerMagene = 107,
+    eManufacturerGiantManufacturingCo = 108,
+    eManufacturerTigrasport = 109,
+    eManufacturerSalutron = 110,
     eManufacturerDevelopment = 255,
     eManufacturerHealthandlife = 257,
     eManufacturerLezyne = 258,
@@ -871,18 +1007,29 @@ typedef enum
     eManufacturerFaveroElectronics = 263,
     eManufacturerDynovelo = 264,
     eManufacturerStrava = 265,
+    eManufacturerPrecor = 266,
+    eManufacturerBryton = 267,
+    eManufacturerSram = 268,
+    eManufacturerNavman = 269,
+    eManufacturerCobi = 270,
+    eManufacturerSpivi = 271,
+    eManufacturerMioMagellan = 272,
+    eManufacturerEvesports = 273,
+    eManufacturerSensitivusGauge = 274,
+    eManufacturerPodoon = 275,
+    eManufacturerLifeTimeFitness = 276,
+    eManufacturerFalcoEMotors = 277,
     eManufacturerActigraphcorp = 5759
 } manufacturer_e;
 
-typedef enum
-{
+typedef enum {
     eGarminProductHrm1 = 1,
     eGarminProductAxh01 = 2,
     eGarminProductAxb01 = 3,
     eGarminProductAxb02 = 4,
-    eGarminProductHrm2ss = 5,
+    eGarminProductHrm2Ss = 5,
     eGarminProductDsiAlf02 = 6,
-    eGarminProductHrm3ss = 7,
+    eGarminProductHrm3Ss = 7,
     eGarminProductHrmRunSingleByteProductId = 8,
     eGarminProductBsm = 9,
     eGarminProductBcm = 10,
@@ -898,7 +1045,7 @@ typedef enum
     eGarminProductFr405Japan = 987,
     eGarminProductFr60 = 988,
     eGarminProductDsiAlf01 = 1011,
-    eGarminProductFr310xt = 1018,
+    eGarminProductFr310Xt = 1018,
     eGarminProductEdge500 = 1036,
     eGarminProductFr110 = 1124,
     eGarminProductEdge800 = 1169,
@@ -907,7 +1054,7 @@ typedef enum
     eGarminProductChirp = 1253,
     eGarminProductFr110Japan = 1274,
     eGarminProductEdge200 = 1325,
-    eGarminProductFr910xt = 1328,
+    eGarminProductFr910Xt = 1328,
     eGarminProductEdge800Taiwan = 1333,
     eGarminProductEdge800Japan = 1334,
     eGarminProductAlf04 = 1341,
@@ -920,21 +1067,21 @@ typedef enum
     eGarminProductFr610Japan = 1410,
     eGarminProductEdge500Korea = 1422,
     eGarminProductFr70 = 1436,
-    eGarminProductFr310xt4t = 1446,
+    eGarminProductFr310Xt4T = 1446,
     eGarminProductAmx = 1461,
     eGarminProductFr10 = 1482,
     eGarminProductEdge800Korea = 1497,
     eGarminProductSwim = 1499,
-    eGarminProductFr910xtChina = 1537,
+    eGarminProductFr910XtChina = 1537,
     eGarminProductFenix = 1551,
     eGarminProductEdge200Taiwan = 1555,
     eGarminProductEdge510 = 1561,
     eGarminProductEdge810 = 1567,
     eGarminProductTempe = 1570,
-    eGarminProductFr910xtJapan = 1600,
+    eGarminProductFr910XtJapan = 1600,
     eGarminProductFr620 = 1623,
     eGarminProductFr220 = 1632,
-    eGarminProductFr910xtKorea = 1664,
+    eGarminProductFr910XtKorea = 1664,
     eGarminProductFr10Japan = 1688,
     eGarminProductEdge810Japan = 1721,
     eGarminProductVirbElite = 1735,
@@ -942,7 +1089,7 @@ typedef enum
     eGarminProductEdge510Japan = 1742,
     eGarminProductHrmTri = 1743,
     eGarminProductHrmRun = 1752,
-    eGarminProductFr920xt = 1765,
+    eGarminProductFr920Xt = 1765,
     eGarminProductEdge510Asia = 1821,
     eGarminProductEdge810China = 1822,
     eGarminProductEdge810Taiwan = 1823,
@@ -971,40 +1118,61 @@ typedef enum
     eGarminProductFr220Russia = 2073,
     eGarminProductVectorS = 2079,
     eGarminProductEdge1000Korea = 2100,
-    eGarminProductFr920xtTaiwan = 2130,
-    eGarminProductFr920xtChina = 2131,
-    eGarminProductFr920xtJapan = 2132,
+    eGarminProductFr920XtTaiwan = 2130,
+    eGarminProductFr920XtChina = 2131,
+    eGarminProductFr920XtJapan = 2132,
     eGarminProductVirbx = 2134,
     eGarminProductVivoSmartApac = 2135,
     eGarminProductEtrexTouch = 2140,
     eGarminProductEdge25 = 2147,
+    eGarminProductFr25 = 2148,
     eGarminProductVivoFit2 = 2150,
     eGarminProductFr225 = 2153,
+    eGarminProductFr630 = 2156,
+    eGarminProductFr230 = 2157,
     eGarminProductVivoActiveApac = 2160,
     eGarminProductVector2 = 2161,
-    eGarminProductVector2s = 2162,
+    eGarminProductVector2S = 2162,
     eGarminProductVirbxe = 2172,
     eGarminProductFr620Taiwan = 2173,
     eGarminProductFr220Taiwan = 2174,
+    eGarminProductTruswing = 2175,
     eGarminProductFenix3China = 2188,
     eGarminProductFenix3Twn = 2189,
     eGarminProductVariaHeadlight = 2192,
     eGarminProductVariaTaillightOld = 2193,
+    eGarminProductEdgeExplore1000 = 2204,
     eGarminProductFr225Asia = 2219,
     eGarminProductVariaRadarTaillight = 2225,
     eGarminProductVariaRadarDisplay = 2226,
     eGarminProductEdge20 = 2238,
     eGarminProductD2Bravo = 2262,
+    eGarminProductApproachS20 = 2266,
     eGarminProductVariaRemote = 2276,
+    eGarminProductHrm4Run = 2327,
+    eGarminProductVivoActiveHr = 2337,
+    eGarminProductVivoSmartGpsHr = 2347,
+    eGarminProductVivoSmartHr = 2348,
+    eGarminProductVivoMove = 2368,
+    eGarminProductVariaVision = 2398,
+    eGarminProductVivoFit3 = 2406,
+    eGarminProductFenix3Hr = 2413,
+    eGarminProductIndexSmartScale = 2429,
+    eGarminProductFr235 = 2431,
+    eGarminProductOregon7Xx = 2441,
+    eGarminProductRino7Xx = 2444,
+    eGarminProductNautix = 2496,
+    eGarminProductEdge820 = 2530,
+    eGarminProductEdgeExplore820 = 2531,
     eGarminProductSdm4 = 10007,
     eGarminProductEdgeRemote = 10014,
     eGarminProductTrainingCenter = 20119,
+    eGarminProductConnectiqSimulator = 65531,
     eGarminProductAndroidAntplusPlugin = 65532,
     eGarminProductConnect = 65534
 } garmin_product_e;
 
-typedef enum
-{
+typedef enum {
     eAntplusDeviceTypeAntfs = 1,
     eAntplusDeviceTypeBikePower = 11,
     eAntplusDeviceTypeEnvironmentSensorLegacy = 12,
@@ -1016,6 +1184,12 @@ typedef enum
     eAntplusDeviceTypeLightElectricVehicle = 20,
     eAntplusDeviceTypeEnvSensor = 25,
     eAntplusDeviceTypeRacquet = 26,
+    eAntplusDeviceTypeControlHub = 27,
+    eAntplusDeviceTypeMuscleOxygen = 31,
+    eAntplusDeviceTypeBikeLightMain = 35,
+    eAntplusDeviceTypeBikeLightShared = 36,
+    eAntplusDeviceTypeExd = 38,
+    eAntplusDeviceTypeBikeRadar = 40,
     eAntplusDeviceTypeWeightScale = 119,
     eAntplusDeviceTypeHeartRate = 120,
     eAntplusDeviceTypeBikeSpeedCadence = 121,
@@ -1024,16 +1198,14 @@ typedef enum
     eAntplusDeviceTypeStrideSpeedDistance = 124
 } antplus_device_type_e;
 
-typedef enum
-{
+typedef enum {
     eAntNetworkPublic = 0,
     eAntNetworkAntplus = 1,
     eAntNetworkAntfs = 2,
     eAntNetworkPrivate = 3
 } ant_network_e;
 
-typedef enum
-{
+typedef enum {
     eWorkoutCapabilitiesInterval = 0x00000001,
     eWorkoutCapabilitiesCustom = 0x00000002,
     eWorkoutCapabilitiesFitnessEquipment = 0x00000004,
@@ -1050,24 +1222,22 @@ typedef enum
     eWorkoutCapabilitiesProtected = 0x00004000
 } workout_capabilities_e;
 
-typedef enum
-{
+typedef enum {
     eBatteryStatusNew = 1,
     eBatteryStatusGood = 2,
     eBatteryStatusOk = 3,
     eBatteryStatusLow = 4,
     eBatteryStatusCritical = 5,
+    eBatteryStatusCharging = 6,
     eBatteryStatusUnknown = 7
 } battery_status_e;
 
-typedef enum
-{
+typedef enum {
     eHrTypeNormal = 0,
     eHrTypeIrregular = 1
 } hr_type_e;
 
-typedef enum
-{
+typedef enum {
     eCourseCapabilitiesProcessed = 0x00000001,
     eCourseCapabilitiesValid = 0x00000002,
     eCourseCapabilitiesTime = 0x00000004,
@@ -1081,23 +1251,19 @@ typedef enum
     eCourseCapabilitiesBikeway = 0x00000400
 } course_capabilities_e;
 
-typedef enum
-{
+typedef enum {
     eWeightCalculating = 0xFFFE
 } weight_e;
 
-typedef enum
-{
+typedef enum {
     eWorkoutHrBpmOffset = 100
 } workout_hr_e;
 
-typedef enum
-{
+typedef enum {
     eWorkoutPowerWattsOffset = 1000
 } workout_power_e;
 
-typedef enum
-{
+typedef enum {
     eBpStatusNoError = 0,
     eBpStatusErrorIncompleteData = 1,
     eBpStatusErrorNoMeasurement = 2,
@@ -1105,8 +1271,7 @@ typedef enum
     eBpStatusErrorIrregularHeartRate = 4
 } bp_status_e;
 
-typedef enum
-{
+typedef enum {
     eUserLocalIdLocalMin = 0x0000,
     eUserLocalIdLocalMax = 0x000F,
     eUserLocalIdStationaryMin = 0x0010,
@@ -1115,8 +1280,7 @@ typedef enum
     eUserLocalIdPortableMax = 0xFFFE
 } user_local_id_e;
 
-typedef enum
-{
+typedef enum {
     eSwimStrokeFreestyle = 0,
     eSwimStrokeBackstroke = 1,
     eSwimStrokeBreaststroke = 2,
@@ -1126,8 +1290,7 @@ typedef enum
     eSwimStrokeIm = 6
 } swim_stroke_e;
 
-typedef enum
-{
+typedef enum {
     eActivityTypeGeneric = 0,
     eActivityTypeRunning = 1,
     eActivityTypeCycling = 2,
@@ -1135,11 +1298,11 @@ typedef enum
     eActivityTypeFitnessEquipment = 4,
     eActivityTypeSwimming = 5,
     eActivityTypeWalking = 6,
+    eActivityTypeSedentary = 8,
     eActivityTypeAll = 254
 } activity_type_e;
 
-typedef enum
-{
+typedef enum {
     eActivitySubtypeGeneric = 0,
     eActivitySubtypeTreadmill = 1,
     eActivitySubtypeStreet = 2,
@@ -1162,33 +1325,43 @@ typedef enum
     eActivitySubtypeAll = 254
 } activity_subtype_e;
 
-typedef enum
-{
+typedef enum {
     eActivityLevelLow = 0,
     eActivityLevelMedium = 1,
     eActivityLevelHigh = 2
 } activity_level_e;
 
-typedef enum
-{
+typedef enum {
+    eSideRight = 0,
+    eSideLeft = 1
+} side_e;
+
+typedef enum {
     eLeftRightBalanceMask = 0x7F,
     eLeftRightBalanceRight = 0x80
 } left_right_balance_e;
 
-typedef enum
-{
+typedef enum {
     eLeftRightBalance100Mask = 0x3FFF,
     eLeftRightBalance100Right = 0x8000
 } left_right_balance_100_e;
 
-typedef enum
-{
+typedef enum {
     eLengthTypeIdle = 0,
     eLengthTypeActive = 1
 } length_type_e;
 
-typedef enum
-{
+typedef enum {
+    eDayOfWeekSunday = 0,
+    eDayOfWeekMonday = 1,
+    eDayOfWeekTuesday = 2,
+    eDayOfWeekWednesday = 3,
+    eDayOfWeekThursday = 4,
+    eDayOfWeekFriday = 5,
+    eDayOfWeekSaturday = 6
+} day_of_week_e;
+
+typedef enum {
     eConnectivityCapabilitiesBluetooth = 0x00000001,
     eConnectivityCapabilitiesBluetoothLe = 0x00000002,
     eConnectivityCapabilitiesAnt = 0x00000004,
@@ -1202,11 +1375,155 @@ typedef enum
     eConnectivityCapabilitiesExplicitArchive = 0x00000400,
     eConnectivityCapabilitiesSetupIncomplete = 0x00000800,
     eConnectivityCapabilitiesContinueSyncAfterSoftwareUpdate = 0x00001000,
-    eConnectivityCapabilitiesConnectIqAppDownload = 0x00002000
+    eConnectivityCapabilitiesConnectIqAppDownload = 0x00002000,
+    eConnectivityCapabilitiesGolfCourseDownload = 0x00004000,
+    eConnectivityCapabilitiesDeviceInitiatesSync = 0x00008000,
+    eConnectivityCapabilitiesConnectIqWatchAppDownload = 0x00010000,
+    eConnectivityCapabilitiesConnectIqWidgetDownload = 0x00020000,
+    eConnectivityCapabilitiesConnectIqWatchFaceDownload = 0x00040000,
+    eConnectivityCapabilitiesConnectIqDataFieldDownload = 0x00080000,
+    eConnectivityCapabilitiesConnectIqAppManagment = 0x00100000,
+    eConnectivityCapabilitiesSwingSensor = 0x00200000,
+    eConnectivityCapabilitiesSwingSensorRemote = 0x00400000,
+    eConnectivityCapabilitiesIncidentDetection = 0x00800000,
+    eConnectivityCapabilitiesAudioPrompts = 0x01000000,
+    eConnectivityCapabilitiesWifiVerification = 0x02000000,
+    eConnectivityCapabilitiesTrueUp = 0x04000000,
+    eConnectivityCapabilitiesFindMyWatch = 0x08000000,
+    eConnectivityCapabilitiesRemoteManualSync = 0x10000000,
+    eConnectivityCapabilitiesLiveTrackAutoStart = 0x20000000,
+    eConnectivityCapabilitiesLiveTrackMessaging = 0x40000000,
+    eConnectivityCapabilitiesInstantInput = 0x80000000
 } connectivity_capabilities_e;
 
-typedef enum
-{
+typedef enum {
+    eWeatherReportCurrent = 0,
+    eWeatherReportForecast = 1,
+    eWeatherReportHourlyForecast = 1,
+    eWeatherReportDailyForecast = 2
+} weather_report_e;
+
+typedef enum {
+    eWeatherStatusClear = 0,
+    eWeatherStatusPartlyCloudy = 1,
+    eWeatherStatusMostlyCloudy = 2,
+    eWeatherStatusRain = 3,
+    eWeatherStatusSnow = 4,
+    eWeatherStatusWindy = 5,
+    eWeatherStatusThunderstorms = 6,
+    eWeatherStatusWintryMix = 7,
+    eWeatherStatusFog = 8,
+    eWeatherStatusHazy = 11,
+    eWeatherStatusHail = 12,
+    eWeatherStatusScatteredShowers = 13,
+    eWeatherStatusScatteredThunderstorms = 14,
+    eWeatherStatusUnknownPrecipitation = 15,
+    eWeatherStatusLightRain = 16,
+    eWeatherStatusHeavyRain = 17,
+    eWeatherStatusLightSnow = 18,
+    eWeatherStatusHeavySnow = 19,
+    eWeatherStatusLightRainSnow = 20,
+    eWeatherStatusHeavyRainSnow = 21,
+    eWeatherStatusCloudy = 22
+} weather_status_e;
+
+typedef enum {
+    eWeatherSeverityUnknown = 0,
+    eWeatherSeverityWarning = 1,
+    eWeatherSeverityWatch = 2,
+    eWeatherSeverityAdvisory = 3,
+    eWeatherSeverityStatement = 4
+} weather_severity_e;
+
+typedef enum {
+    eWeatherSevereTypeUnspecified = 0,
+    eWeatherSevereTypeTornado = 1,
+    eWeatherSevereTypeTsunami = 2,
+    eWeatherSevereTypeHurricane = 3,
+    eWeatherSevereTypeExtremeWind = 4,
+    eWeatherSevereTypeTyphoon = 5,
+    eWeatherSevereTypeInlandHurricane = 6,
+    eWeatherSevereTypeHurricaneForceWind = 7,
+    eWeatherSevereTypeWaterspout = 8,
+    eWeatherSevereTypeSevereThunderstorm = 9,
+    eWeatherSevereTypeWreckhouseWinds = 10,
+    eWeatherSevereTypeLesSuetesWind = 11,
+    eWeatherSevereTypeAvalanche = 12,
+    eWeatherSevereTypeFlashFlood = 13,
+    eWeatherSevereTypeTropicalStorm = 14,
+    eWeatherSevereTypeInlandTropicalStorm = 15,
+    eWeatherSevereTypeBlizzard = 16,
+    eWeatherSevereTypeIceStorm = 17,
+    eWeatherSevereTypeFreezingRain = 18,
+    eWeatherSevereTypeDebrisFlow = 19,
+    eWeatherSevereTypeFlashFreeze = 20,
+    eWeatherSevereTypeDustStorm = 21,
+    eWeatherSevereTypeHighWind = 22,
+    eWeatherSevereTypeWinterStorm = 23,
+    eWeatherSevereTypeHeavyFreezingSpray = 24,
+    eWeatherSevereTypeExtremeCold = 25,
+    eWeatherSevereTypeWindChill = 26,
+    eWeatherSevereTypeColdWave = 27,
+    eWeatherSevereTypeHeavySnowAlert = 28,
+    eWeatherSevereTypeLakeEffectBlowingSnow = 29,
+    eWeatherSevereTypeSnowSquall = 30,
+    eWeatherSevereTypeLakeEffectSnow = 31,
+    eWeatherSevereTypeWinterWeather = 32,
+    eWeatherSevereTypeSleet = 33,
+    eWeatherSevereTypeSnowfall = 34,
+    eWeatherSevereTypeSnowAndBlowingSnow = 35,
+    eWeatherSevereTypeBlowingSnow = 36,
+    eWeatherSevereTypeSnowAlert = 37,
+    eWeatherSevereTypeArcticOutflow = 38,
+    eWeatherSevereTypeFreezingDrizzle = 39,
+    eWeatherSevereTypeStorm = 40,
+    eWeatherSevereTypeStormSurge = 41,
+    eWeatherSevereTypeRainfall = 42,
+    eWeatherSevereTypeArealFlood = 43,
+    eWeatherSevereTypeCoastalFlood = 44,
+    eWeatherSevereTypeLakeshoreFlood = 45,
+    eWeatherSevereTypeExcessiveHeat = 46,
+    eWeatherSevereTypeHeat = 47,
+    eWeatherSevereTypeWeather = 48,
+    eWeatherSevereTypeHighHeatAndHumidity = 49,
+    eWeatherSevereTypeHumidexAndHealth = 50,
+    eWeatherSevereTypeHumidex = 51,
+    eWeatherSevereTypeGale = 52,
+    eWeatherSevereTypeFreezingSpray = 53,
+    eWeatherSevereTypeSpecialMarine = 54,
+    eWeatherSevereTypeSquall = 55,
+    eWeatherSevereTypeStrongWind = 56,
+    eWeatherSevereTypeLakeWind = 57,
+    eWeatherSevereTypeMarineWeather = 58,
+    eWeatherSevereTypeWind = 59,
+    eWeatherSevereTypeSmallCraftHazardousSeas = 60,
+    eWeatherSevereTypeHazardousSeas = 61,
+    eWeatherSevereTypeSmallCraft = 62,
+    eWeatherSevereTypeSmallCraftWinds = 63,
+    eWeatherSevereTypeSmallCraftRoughBar = 64,
+    eWeatherSevereTypeHighWaterLevel = 65,
+    eWeatherSevereTypeAshfall = 66,
+    eWeatherSevereTypeFreezingFog = 67,
+    eWeatherSevereTypeDenseFog = 68,
+    eWeatherSevereTypeDenseSmoke = 69,
+    eWeatherSevereTypeBlowingDust = 70,
+    eWeatherSevereTypeHardFreeze = 71,
+    eWeatherSevereTypeFreeze = 72,
+    eWeatherSevereTypeFrost = 73,
+    eWeatherSevereTypeFireWeather = 74,
+    eWeatherSevereTypeFlood = 75,
+    eWeatherSevereTypeRipTide = 76,
+    eWeatherSevereTypeHighSurf = 77,
+    eWeatherSevereTypeSmog = 78,
+    eWeatherSevereTypeAirQuality = 79,
+    eWeatherSevereTypeBriskWind = 80,
+    eWeatherSevereTypeAirStagnation = 81,
+    eWeatherSevereTypeLowWater = 82,
+    eWeatherSevereTypeHydrological = 83,
+    eWeatherSevereTypeSpecialWeather = 84
+} weather_severe_type_e;
+
+typedef enum {
     eStrokeTypeNoEvent = 0,
     eStrokeTypeOther = 1,
     eStrokeTypeServe = 2,
@@ -1215,8 +1532,7 @@ typedef enum
     eStrokeTypeSmash = 5
 } stroke_type_e;
 
-typedef enum
-{
+typedef enum {
     eBodyLocationLeftLeg = 0,
     eBodyLocationLeftCalf = 1,
     eBodyLocationLeftShin = 2,
@@ -1252,17 +1568,19 @@ typedef enum
     eBodyLocationRightBrachioradialis = 32,
     eBodyLocationRightForearmExtensors = 33,
     eBodyLocationNeck = 34,
-    eBodyLocationThroat = 35
+    eBodyLocationThroat = 35,
+    eBodyLocationWaistMidBack = 36,
+    eBodyLocationWaistFront = 37,
+    eBodyLocationWaistLeft = 38,
+    eBodyLocationWaistRight = 39
 } body_location_e;
 
-typedef enum
-{
+typedef enum {
     eSegmentLapStatusEnd = 0,
     eSegmentLapStatusFail = 1
 } segment_lap_status_e;
 
-typedef enum
-{
+typedef enum {
     eSegmentLeaderboardTypeOverall = 0,
     eSegmentLeaderboardTypePersonalBest = 1,
     eSegmentLeaderboardTypeConnections = 2,
@@ -1276,21 +1594,18 @@ typedef enum
     eSegmentLeaderboardTypeClubLeader = 10
 } segment_leaderboard_type_e;
 
-typedef enum
-{
+typedef enum {
     eSegmentDeleteStatusDoNotDelete = 0,
     eSegmentDeleteStatusDeleteOne = 1,
     eSegmentDeleteStatusDeleteAll = 2
 } segment_delete_status_e;
 
-typedef enum
-{
+typedef enum {
     eSegmentSelectionTypeStarred = 0,
     eSegmentSelectionTypeSuggested = 1
 } segment_selection_type_e;
 
-typedef enum
-{
+typedef enum {
     eSourceTypeAnt = 0,
     eSourceTypeAntplus = 1,
     eSourceTypeBluetooth = 2,
@@ -1299,22 +1614,45 @@ typedef enum
     eSourceTypeLocal = 5
 } source_type_e;
 
-typedef enum
-{
+typedef enum {
+    eDisplayOrientationAuto = 0,
+    eDisplayOrientationPortrait = 1,
+    eDisplayOrientationLandscape = 2,
+    eDisplayOrientationPortraitFlipped = 3,
+    eDisplayOrientationLandscapeFlipped = 4
+} display_orientation_e;
+
+typedef enum {
+    eWatchfaceModeDigital = 0,
+    eWatchfaceModeAnalog = 1,
+    eWatchfaceModeConnectIq = 2
+} watchface_mode_e;
+
+typedef enum {
+    eDigitalWatchfaceLayoutTraditional = 0,
+    eDigitalWatchfaceLayoutModern = 1,
+    eDigitalWatchfaceLayoutBold = 2
+} digital_watchface_layout_e;
+
+typedef enum {
+    eAnalogWatchfaceLayoutMinimal = 0,
+    eAnalogWatchfaceLayoutTraditional = 1,
+    eAnalogWatchfaceLayoutModern = 2
+} analog_watchface_layout_e;
+
+typedef enum {
     eRiderPositionTypeSeated = 0,
     eRiderPositionTypeStanding = 1
 } rider_position_type_e;
 
-typedef enum
-{
+typedef enum {
     ePowerPhaseTypePowerPhaseStartAngle = 0,
     ePowerPhaseTypePowerPhaseEndAngle = 1,
     ePowerPhaseTypePowerPhaseArcLength = 2,
     ePowerPhaseTypePowerPhaseCenter = 3
 } power_phase_type_e;
 
-typedef enum
-{
+typedef enum {
     eCameraEventTypeVideoStart = 0,
     eCameraEventTypeVideoSplit = 1,
     eCameraEventTypeVideoEnd = 2,
@@ -1323,41 +1661,48 @@ typedef enum
     eCameraEventTypeVideoSecondStreamSplit = 5,
     eCameraEventTypeVideoSecondStreamEnd = 6,
     eCameraEventTypeVideoSplitStart = 7,
-    eCameraEventTypeVideoSecondStreamSplitStart = 8
+    eCameraEventTypeVideoSecondStreamSplitStart = 8,
+    eCameraEventTypeVideoPause = 11,
+    eCameraEventTypeVideoSecondStreamPause = 12,
+    eCameraEventTypeVideoResume = 13,
+    eCameraEventTypeVideoSecondStreamResume = 14
 } camera_event_type_e;
 
-typedef enum
-{
+typedef enum {
     eSensorTypeAccelerometer = 0,
     eSensorTypeGyroscope = 1,
     eSensorTypeCompass = 2
 } sensor_type_e;
 
-typedef enum
-{
+typedef enum {
+    eBikeLightNetworkConfigTypeAuto = 0,
+    eBikeLightNetworkConfigTypeIndividual = 4,
+    eBikeLightNetworkConfigTypeHighVisibility = 5,
+    eBikeLightNetworkConfigTypeTrail = 6
+} bike_light_network_config_type_e;
+
+typedef enum {
     eCommTimeoutTypeWildcardPairingTimeout = 0,
     eCommTimeoutTypePairingTimeout = 1,
     eCommTimeoutTypeConnectionLost = 2,
+    eCommTimeoutTypeConnectionTimeout = 3
 } comm_timeout_type_e;
 
-typedef enum
-{
+typedef enum {
     eCameraOrientationTypeCameraOrientation0 = 0,
     eCameraOrientationTypeCameraOrientation90 = 1,
     eCameraOrientationTypeCameraOrientation180 = 2,
     eCameraOrientationTypeCameraOrientation270 = 3
 } camera_orientation_type_e;
 
-typedef enum
-{
+typedef enum {
     eAttitudeStageFailed = 0,
     eAttitudeStageAligning = 1,
     eAttitudeStageDegraded = 2,
     eAttitudeStageValid = 3
 } attitude_stage_e;
 
-typedef enum
-{
+typedef enum {
     eAttitudeValidityTrackAngleHeadingValid = 0x0001,
     eAttitudeValidityPitchValid = 0x0002,
     eAttitudeValidityRollValid = 0x0004,
@@ -1373,6 +1718,328 @@ typedef enum
     eAttitudeValidityMagneticHeading = 0x1000
 } attitude_validity_e;
 
+typedef enum {
+    eAutoSyncFrequencyNever = 0,
+    eAutoSyncFrequencyOccasionally = 1,
+    eAutoSyncFrequencyFrequent = 2,
+    eAutoSyncFrequencyOnceADay = 3
+} auto_sync_frequency_e;
+
+typedef enum {
+    eExdLayoutFullScreen = 0,
+    eExdLayoutHalfVertical = 1,
+    eExdLayoutHalfHorizontal = 2,
+    eExdLayoutHalfVerticalRightSplit = 3,
+    eExdLayoutHalfHorizontalBottomSplit = 4,
+    eExdLayoutFullQuarterSplit = 5,
+    eExdLayoutHalfVerticalLeftSplit = 6,
+    eExdLayoutHalfHorizontalTopSplit = 7
+} exd_layout_e;
+
+typedef enum {
+    eExdDisplayTypeNumerical = 0,
+    eExdDisplayTypeSimple = 1,
+    eExdDisplayTypeGraph = 2,
+    eExdDisplayTypeBar = 3,
+    eExdDisplayTypeCircleGraph = 4,
+    eExdDisplayTypeVirtualPartner = 5,
+    eExdDisplayTypeBalance = 6,
+    eExdDisplayTypeStringList = 7,
+    eExdDisplayTypeString = 8,
+    eExdDisplayTypeSimpleDynamicIcon = 9,
+    eExdDisplayTypeGauge = 10
+} exd_display_type_e;
+
+typedef enum {
+    eExdDataUnitsNoUnits = 0,
+    eExdDataUnitsLaps = 1,
+    eExdDataUnitsMilesPerHour = 2,
+    eExdDataUnitsKilometersPerHour = 3,
+    eExdDataUnitsFeetPerHour = 4,
+    eExdDataUnitsMetersPerHour = 5,
+    eExdDataUnitsDegreesCelsius = 6,
+    eExdDataUnitsDegreesFarenheit = 7,
+    eExdDataUnitsZone = 8,
+    eExdDataUnitsGear = 9,
+    eExdDataUnitsRpm = 10,
+    eExdDataUnitsBpm = 11,
+    eExdDataUnitsDegrees = 12,
+    eExdDataUnitsMillimeters = 13,
+    eExdDataUnitsMeters = 14,
+    eExdDataUnitsKilometers = 15,
+    eExdDataUnitsFeet = 16,
+    eExdDataUnitsYards = 17,
+    eExdDataUnitsKilofeet = 18,
+    eExdDataUnitsMiles = 19,
+    eExdDataUnitsTime = 20,
+    eExdDataUnitsEnumTurnType = 21,
+    eExdDataUnitsPercent = 22,
+    eExdDataUnitsWatts = 23,
+    eExdDataUnitsWattsPerKilogram = 24,
+    eExdDataUnitsEnumBatteryStatus = 25,
+    eExdDataUnitsEnumBikeLightBeamAngleMode = 26,
+    eExdDataUnitsEnumBikeLightBatteryStatus = 27,
+    eExdDataUnitsEnumBikeLightNetworkConfigType = 28,
+    eExdDataUnitsLights = 29,
+    eExdDataUnitsSeconds = 30,
+    eExdDataUnitsMinutes = 31,
+    eExdDataUnitsHours = 32,
+    eExdDataUnitsCalories = 33,
+    eExdDataUnitsKilojoules = 34,
+    eExdDataUnitsMilliseconds = 35,
+    eExdDataUnitsSecondPerMile = 36,
+    eExdDataUnitsSecondPerKilometer = 37,
+    eExdDataUnitsCentimeter = 38,
+    eExdDataUnitsEnumCoursePoint = 39,
+    eExdDataUnitsBradians = 40,
+    eExdDataUnitsEnumSport = 41,
+    eExdDataUnitsInchesHg = 42,
+    eExdDataUnitsMmHg = 43,
+    eExdDataUnitsMbars = 44,
+    eExdDataUnitsHectoPascals = 45,
+    eExdDataUnitsFeetPerMin = 46,
+    eExdDataUnitsMetersPerMin = 47,
+    eExdDataUnitsMetersPerSec = 48,
+    eExdDataUnitsEightCardinal = 49
+} exd_data_units_e;
+
+typedef enum {
+    eExdQualifiersNoQualifier = 0,
+    eExdQualifiersInstantaneous = 1,
+    eExdQualifiersAverage = 2,
+    eExdQualifiersLap = 3,
+    eExdQualifiersMaximum = 4,
+    eExdQualifiersMaximumAverage = 5,
+    eExdQualifiersMaximumLap = 6,
+    eExdQualifiersLastLap = 7,
+    eExdQualifiersAverageLap = 8,
+    eExdQualifiersToDestination = 9,
+    eExdQualifiersToGo = 10,
+    eExdQualifiersToNext = 11,
+    eExdQualifiersNextCoursePoint = 12,
+    eExdQualifiersTotal = 13,
+    eExdQualifiersThreeSecondAverage = 14,
+    eExdQualifiersTenSecondAverage = 15,
+    eExdQualifiersThirtySecondAverage = 16,
+    eExdQualifiersPercentMaximum = 17,
+    eExdQualifiersPercentMaximumAverage = 18,
+    eExdQualifiersLapPercentMaximum = 19,
+    eExdQualifiersElapsed = 20,
+    eExdQualifiersSunrise = 21,
+    eExdQualifiersSunset = 22,
+    eExdQualifiersComparedToVirtualPartner = 23,
+    eExdQualifiersMaximum24H = 24,
+    eExdQualifiersMinimum24H = 25,
+    eExdQualifiersMinimum = 26,
+    eExdQualifiersFirst = 27,
+    eExdQualifiersSecond = 28,
+    eExdQualifiersThird = 29,
+    eExdQualifiersShifter = 30,
+    eExdQualifiersLastSport = 31,
+    eExdQualifiersMoving = 32,
+    eExdQualifiersStopped = 33,
+    eExdQualifiersZone9 = 242,
+    eExdQualifiersZone8 = 243,
+    eExdQualifiersZone7 = 244,
+    eExdQualifiersZone6 = 245,
+    eExdQualifiersZone5 = 246,
+    eExdQualifiersZone4 = 247,
+    eExdQualifiersZone3 = 248,
+    eExdQualifiersZone2 = 249,
+    eExdQualifiersZone1 = 250
+} exd_qualifiers_e;
+
+typedef enum {
+    eExdDescriptorsBikeLightBatteryStatus = 0,
+    eExdDescriptorsBeamAngleStatus = 1,
+    eExdDescriptorsBateryLevel = 2,
+    eExdDescriptorsLightNetworkMode = 3,
+    eExdDescriptorsNumberLightsConnected = 4,
+    eExdDescriptorsCadence = 5,
+    eExdDescriptorsDistance = 6,
+    eExdDescriptorsEstimatedTimeOfArrival = 7,
+    eExdDescriptorsHeading = 8,
+    eExdDescriptorsTime = 9,
+    eExdDescriptorsBatteryLevel = 10,
+    eExdDescriptorsTrainerResistance = 11,
+    eExdDescriptorsTrainerTargetPower = 12,
+    eExdDescriptorsTimeSeated = 13,
+    eExdDescriptorsTimeStanding = 14,
+    eExdDescriptorsElevation = 15,
+    eExdDescriptorsGrade = 16,
+    eExdDescriptorsAscent = 17,
+    eExdDescriptorsDescent = 18,
+    eExdDescriptorsVerticalSpeed = 19,
+    eExdDescriptorsDi2BatteryLevel = 20,
+    eExdDescriptorsFrontGear = 21,
+    eExdDescriptorsRearGear = 22,
+    eExdDescriptorsGearRatio = 23,
+    eExdDescriptorsHeartRate = 24,
+    eExdDescriptorsHeartRateZone = 25,
+    eExdDescriptorsTimeInHeartRateZone = 26,
+    eExdDescriptorsHeartRateReserve = 27,
+    eExdDescriptorsCalories = 28,
+    eExdDescriptorsGpsAccuracy = 29,
+    eExdDescriptorsGpsSignalStrength = 30,
+    eExdDescriptorsTemperature = 31,
+    eExdDescriptorsTimeOfDay = 32,
+    eExdDescriptorsBalance = 33,
+    eExdDescriptorsPedalSmoothness = 34,
+    eExdDescriptorsPower = 35,
+    eExdDescriptorsFunctionalThresholdPower = 36,
+    eExdDescriptorsIntensityFactor = 37,
+    eExdDescriptorsWork = 38,
+    eExdDescriptorsPowerRatio = 39,
+    eExdDescriptorsNormalizedPower = 40,
+    eExdDescriptorsTrainingStressScore = 41,
+    eExdDescriptorsTimeOnZone = 42,
+    eExdDescriptorsSpeed = 43,
+    eExdDescriptorsLaps = 44,
+    eExdDescriptorsReps = 45,
+    eExdDescriptorsWorkoutStep = 46,
+    eExdDescriptorsCourseDistance = 47,
+    eExdDescriptorsNavigationDistance = 48,
+    eExdDescriptorsCourseEstimatedTimeOfArrival = 49,
+    eExdDescriptorsNavigationEstimatedTimeOfArrival = 50,
+    eExdDescriptorsCourseTime = 51,
+    eExdDescriptorsNavigationTime = 52,
+    eExdDescriptorsCourseHeading = 53,
+    eExdDescriptorsNavigationHeading = 54,
+    eExdDescriptorsPowerZone = 55,
+    eExdDescriptorsTorqueEffectiveness = 56,
+    eExdDescriptorsTimerTime = 57,
+    eExdDescriptorsPowerWeightRatio = 58,
+    eExdDescriptorsLeftPlatformCenterOffset = 59,
+    eExdDescriptorsRightPlatformCenterOffset = 60,
+    eExdDescriptorsLeftPowerPhaseStartAngle = 61,
+    eExdDescriptorsRightPowerPhaseStartAngle = 62,
+    eExdDescriptorsLeftPowerPhaseFinishAngle = 63,
+    eExdDescriptorsRightPowerPhaseFinishAngle = 64,
+    eExdDescriptorsGears = 65,
+    eExdDescriptorsPace = 66,
+    eExdDescriptorsTrainingEffect = 67,
+    eExdDescriptorsVerticalOscillation = 68,
+    eExdDescriptorsVerticalRatio = 69,
+    eExdDescriptorsGroundContactTime = 70,
+    eExdDescriptorsLeftGroundContactTimeBalance = 71,
+    eExdDescriptorsRightGroundContactTimeBalance = 72,
+    eExdDescriptorsStrideLength = 73,
+    eExdDescriptorsRunningCadence = 74,
+    eExdDescriptorsPerformanceCondition = 75,
+    eExdDescriptorsCourseType = 76,
+    eExdDescriptorsTimeInPowerZone = 77,
+    eExdDescriptorsNavigationTurn = 78,
+    eExdDescriptorsCourseLocation = 79,
+    eExdDescriptorsNavigationLocation = 80,
+    eExdDescriptorsCompass = 81,
+    eExdDescriptorsGearCombo = 82,
+    eExdDescriptorsMuscleOxygen = 83,
+    eExdDescriptorsIcon = 84,
+    eExdDescriptorsCompassHeading = 85,
+    eExdDescriptorsGpsHeading = 86,
+    eExdDescriptorsGpsElevation = 87,
+    eExdDescriptorsAnaerobicTrainingEffect = 88,
+    eExdDescriptorsCourse = 89,
+    eExdDescriptorsOffCourse = 90,
+    eExdDescriptorsGlideRatio = 91,
+    eExdDescriptorsVerticalDistance = 92,
+    eExdDescriptorsVmg = 93,
+    eExdDescriptorsAmbientPressure = 94,
+    eExdDescriptorsPressure = 95
+} exd_descriptors_e;
+
+typedef enum {
+    eAutoActivityDetectNone = 0x00000000,
+    eAutoActivityDetectRunning = 0x00000001,
+    eAutoActivityDetectCycling = 0x00000002,
+    eAutoActivityDetectSwimming = 0x00000004,
+    eAutoActivityDetectWalking = 0x00000008,
+    eAutoActivityDetectElliptical = 0x00000020,
+    eAutoActivityDetectSedentary = 0x00000400
+} auto_activity_detect_e;
+
+typedef enum {
+    eSupportedExdScreenLayoutsFullScreen = 0x00000001,
+    eSupportedExdScreenLayoutsHalfVertical = 0x00000002,
+    eSupportedExdScreenLayoutsHalfHorizontal = 0x00000004,
+    eSupportedExdScreenLayoutsHalfVerticalRightSplit = 0x00000008,
+    eSupportedExdScreenLayoutsHalfHorizontalBottomSplit = 0x00000010,
+    eSupportedExdScreenLayoutsFullQuarterSplit = 0x00000020,
+    eSupportedExdScreenLayoutsHalfVerticalLeftSplit = 0x00000040,
+    eSupportedExdScreenLayoutsHalfHorizontalTopSplit = 0x00000080
+} supported_exd_screen_layouts_e;
+
+typedef enum {
+    eFitBaseTypeEnum = 0,
+    eFitBaseTypeSint8 = 1,
+    eFitBaseTypeUint8 = 2,
+    eFitBaseTypeSint16 = 131,
+    eFitBaseTypeUint16 = 132,
+    eFitBaseTypeSint32 = 133,
+    eFitBaseTypeUint32 = 134,
+    eFitBaseTypeString = 7,
+    eFitBaseTypeFloat32 = 136,
+    eFitBaseTypeFloat64 = 137,
+    eFitBaseTypeUint8Z = 10,
+    eFitBaseTypeUint16Z = 139,
+    eFitBaseTypeUint32Z = 140,
+    eFitBaseTypeByte = 13,
+    eFitBaseTypeSint64 = 142,
+    eFitBaseTypeUint64 = 143,
+    eFitBaseTypeUint64Z = 144
+} fit_base_type_e;
+
+typedef enum {
+    eTurnTypeArrivingIdx = 0,
+    eTurnTypeArrivingLeftIdx = 1,
+    eTurnTypeArrivingRightIdx = 2,
+    eTurnTypeArrivingViaIdx = 3,
+    eTurnTypeArrivingViaLeftIdx = 4,
+    eTurnTypeArrivingViaRightIdx = 5,
+    eTurnTypeBearKeepLeftIdx = 6,
+    eTurnTypeBearKeepRightIdx = 7,
+    eTurnTypeContinueIdx = 8,
+    eTurnTypeExitLeftIdx = 9,
+    eTurnTypeExitRightIdx = 10,
+    eTurnTypeFerryIdx = 11,
+    eTurnTypeRoundabout45Idx = 12,
+    eTurnTypeRoundabout90Idx = 13,
+    eTurnTypeRoundabout135Idx = 14,
+    eTurnTypeRoundabout180Idx = 15,
+    eTurnTypeRoundabout225Idx = 16,
+    eTurnTypeRoundabout270Idx = 17,
+    eTurnTypeRoundabout315Idx = 18,
+    eTurnTypeRoundabout360Idx = 19,
+    eTurnTypeRoundaboutNeg45Idx = 20,
+    eTurnTypeRoundaboutNeg90Idx = 21,
+    eTurnTypeRoundaboutNeg135Idx = 22,
+    eTurnTypeRoundaboutNeg180Idx = 23,
+    eTurnTypeRoundaboutNeg225Idx = 24,
+    eTurnTypeRoundaboutNeg270Idx = 25,
+    eTurnTypeRoundaboutNeg315Idx = 26,
+    eTurnTypeRoundaboutNeg360Idx = 27,
+    eTurnTypeRoundaboutGenericIdx = 28,
+    eTurnTypeRoundaboutNegGenericIdx = 29,
+    eTurnTypeSharpTurnLeftIdx = 30,
+    eTurnTypeSharpTurnRightIdx = 31,
+    eTurnTypeTurnLeftIdx = 32,
+    eTurnTypeTurnRightIdx = 33,
+    eTurnTypeUturnLeftIdx = 34,
+    eTurnTypeUturnRightIdx = 35,
+    eTurnTypeIconInvIdx = 36,
+    eTurnTypeIconIdxCnt = 37
+} turn_type_e;
+
+typedef enum {
+    eBikeLightBeamAngleModeManual = 0,
+    eBikeLightBeamAngleModeAuto = 1
+} bike_light_beam_angle_mode_e;
+
+typedef enum {
+    eFitBaseUnitOther = 0,
+    eFitBaseUnitKilogram = 1,
+    eFitBaseUnitPound = 2
+} fit_base_unit_e;
 // ----------- end generated code -----------
 
 #endif // FIT_PROFILE_H
diff --git a/src/gis/fit/defs/fit_fields.h b/src/gis/fit/defs/fit_fields.h
index 1f65afb..dd66c72 100644
--- a/src/gis/fit/defs/fit_fields.h
+++ b/src/gis/fit/defs/fit_fields.h
@@ -19,8 +19,7 @@
 #ifndef FIT_FIELDS_H
 #define FIT_FIELDS_H
 // ----------- start generated code -----------
-typedef enum
-{
+typedef enum {
     eFileIdType = 0,
     eFileIdManufacturer = 1,
     eFileIdProduct = 2,
@@ -30,14 +29,12 @@ typedef enum
     eFileIdProductName = 8
 } message_file_id_e;
 
-typedef enum
-{
+typedef enum {
     eFileCreatorSoftwareVersion = 0,
     eFileCreatorHardwareVersion = 1
 } message_file_creator_e;
 
-typedef enum
-{
+typedef enum {
     eTimestampCorrelationTimestamp = 253,
     eTimestampCorrelationFractionalTimestamp = 0,
     eTimestampCorrelationSystemTimestamp = 1,
@@ -47,29 +44,25 @@ typedef enum
     eTimestampCorrelationSystemTimestampMs = 5
 } message_timestamp_correlation_e;
 
-typedef enum
-{
+typedef enum {
     eSoftwareMessageIndex = 254,
     eSoftwareVersion = 3,
     eSoftwarePartNumber = 5
 } message_software_e;
 
-typedef enum
-{
+typedef enum {
     eSlaveDeviceManufacturer = 0,
     eSlaveDeviceProduct = 1
 } message_slave_device_e;
 
-typedef enum
-{
+typedef enum {
     eCapabilitiesLanguages = 0,
     eCapabilitiesSports = 1,
     eCapabilitiesWorkoutsSupported = 21,
     eCapabilitiesConnectivitySupported = 23
 } message_capabilities_e;
 
-typedef enum
-{
+typedef enum {
     eFileCapabilitiesMessageIndex = 254,
     eFileCapabilitiesType = 0,
     eFileCapabilitiesFlags = 1,
@@ -78,8 +71,7 @@ typedef enum
     eFileCapabilitiesMaxSize = 4
 } message_file_capabilities_e;
 
-typedef enum
-{
+typedef enum {
     eMesgCapabilitiesMessageIndex = 254,
     eMesgCapabilitiesFile = 0,
     eMesgCapabilitiesMesgNum = 1,
@@ -87,8 +79,7 @@ typedef enum
     eMesgCapabilitiesCount = 3
 } message_mesg_capabilities_e;
 
-typedef enum
-{
+typedef enum {
     eFieldCapabilitiesMessageIndex = 254,
     eFieldCapabilitiesFile = 0,
     eFieldCapabilitiesMesgNum = 1,
@@ -96,15 +87,32 @@ typedef enum
     eFieldCapabilitiesCount = 3
 } message_field_capabilities_e;
 
-typedef enum
-{
+typedef enum {
     eDeviceSettingsActiveTimeZone = 0,
     eDeviceSettingsUtcOffset = 1,
-    eDeviceSettingsTimeZoneOffset = 5
+    eDeviceSettingsTimeOffset = 2,
+    eDeviceSettingsTimeMode = 4,
+    eDeviceSettingsTimeZoneOffset = 5,
+    eDeviceSettingsBacklightMode = 12,
+    eDeviceSettingsActivityTrackerEnabled = 36,
+    eDeviceSettingsClockTime = 39,
+    eDeviceSettingsPagesEnabled = 40,
+    eDeviceSettingsMoveAlertEnabled = 46,
+    eDeviceSettingsDateMode = 47,
+    eDeviceSettingsDisplayOrientation = 55,
+    eDeviceSettingsMountingSide = 56,
+    eDeviceSettingsDefaultPage = 57,
+    eDeviceSettingsAutosyncMinSteps = 58,
+    eDeviceSettingsAutosyncMinTime = 59,
+    eDeviceSettingsLactateThresholdAutodetectEnabled = 80,
+    eDeviceSettingsBleAutoUploadEnabled = 86,
+    eDeviceSettingsAutoSyncFrequency = 89,
+    eDeviceSettingsAutoActivityDetect = 90,
+    eDeviceSettingsNumberOfScreens = 94,
+    eDeviceSettingsSmartNotificationDisplayOrientation = 95
 } message_device_settings_e;
 
-typedef enum
-{
+typedef enum {
     eUserProfileMessageIndex = 254,
     eUserProfileFriendlyName = 0,
     eUserProfileGender = 1,
@@ -127,11 +135,14 @@ typedef enum
     eUserProfileTemperatureSetting = 21,
     eUserProfileLocalId = 22,
     eUserProfileGlobalId = 23,
-    eUserProfileHeightSetting = 30
+    eUserProfileWakeTime = 28,
+    eUserProfileSleepTime = 29,
+    eUserProfileHeightSetting = 30,
+    eUserProfileUserRunningStepLength = 31,
+    eUserProfileUserWalkingStepLength = 32
 } message_user_profile_e;
 
-typedef enum
-{
+typedef enum {
     eHrmProfileMessageIndex = 254,
     eHrmProfileEnabled = 0,
     eHrmProfileHrmAntId = 1,
@@ -139,8 +150,7 @@ typedef enum
     eHrmProfileHrmAntIdTransType = 3
 } message_hrm_profile_e;
 
-typedef enum
-{
+typedef enum {
     eSdmProfileMessageIndex = 254,
     eSdmProfileEnabled = 0,
     eSdmProfileSdmAntId = 1,
@@ -151,8 +161,7 @@ typedef enum
     eSdmProfileOdometerRollover = 7
 } message_sdm_profile_e;
 
-typedef enum
-{
+typedef enum {
     eBikeProfileMessageIndex = 254,
     eBikeProfileName = 0,
     eBikeProfileSport = 1,
@@ -187,8 +196,33 @@ typedef enum
     eBikeProfileShimanoDi2Enabled = 44
 } message_bike_profile_e;
 
-typedef enum
-{
+typedef enum {
+    eConnectivityBluetoothEnabled = 0,
+    eConnectivityBluetoothLeEnabled = 1,
+    eConnectivityAntEnabled = 2,
+    eConnectivityName = 3,
+    eConnectivityLiveTrackingEnabled = 4,
+    eConnectivityWeatherConditionsEnabled = 5,
+    eConnectivityWeatherAlertsEnabled = 6,
+    eConnectivityAutoActivityUploadEnabled = 7,
+    eConnectivityCourseDownloadEnabled = 8,
+    eConnectivityWorkoutDownloadEnabled = 9,
+    eConnectivityGpsEphemerisDownloadEnabled = 10,
+    eConnectivityIncidentDetectionEnabled = 11,
+    eConnectivityGrouptrackEnabled = 12
+} message_connectivity_e;
+
+typedef enum {
+    eWatchfaceSettingsMessageIndex = 254,
+    eWatchfaceSettingsMode = 0,
+    eWatchfaceSettingsLayout = 1
+} message_watchface_settings_e;
+
+typedef enum {
+    eOhrSettingsEnabled = 0
+} message_ohr_settings_e;
+
+typedef enum {
     eZonesTargetMaxHeartRate = 1,
     eZonesTargetThresholdHeartRate = 2,
     eZonesTargetFunctionalThresholdPower = 3,
@@ -196,51 +230,44 @@ typedef enum
     eZonesTargetPwrCalcType = 7
 } message_zones_target_e;
 
-typedef enum
-{
+typedef enum {
     eSportSport = 0,
     eSportSubSport = 1,
     eSportName = 3
 } message_sport_e;
 
-typedef enum
-{
+typedef enum {
     eHrZoneMessageIndex = 254,
     eHrZoneHighBpm = 1,
     eHrZoneName = 2
 } message_hr_zone_e;
 
-typedef enum
-{
+typedef enum {
     eSpeedZoneMessageIndex = 254,
     eSpeedZoneHighValue = 0,
     eSpeedZoneName = 1
 } message_speed_zone_e;
 
-typedef enum
-{
+typedef enum {
     eCadenceZoneMessageIndex = 254,
     eCadenceZoneHighValue = 0,
     eCadenceZoneName = 1
 } message_cadence_zone_e;
 
-typedef enum
-{
+typedef enum {
     ePowerZoneMessageIndex = 254,
     ePowerZoneHighValue = 1,
     ePowerZoneName = 2
 } message_power_zone_e;
 
-typedef enum
-{
+typedef enum {
     eMetZoneMessageIndex = 254,
     eMetZoneHighBpm = 1,
     eMetZoneCalories = 2,
     eMetZoneFatCalories = 3
 } message_met_zone_e;
 
-typedef enum
-{
+typedef enum {
     eGoalMessageIndex = 254,
     eGoalSport = 0,
     eGoalSubSport = 1,
@@ -252,11 +279,11 @@ typedef enum
     eGoalTargetValue = 7,
     eGoalRecurrence = 8,
     eGoalRecurrenceValue = 9,
-    eGoalEnabled = 10
+    eGoalEnabled = 10,
+    eGoalSource = 11
 } message_goal_e;
 
-typedef enum
-{
+typedef enum {
     eActivityTimestamp = 253,
     eActivityTotalTimerTime = 0,
     eActivityNumSessions = 1,
@@ -267,8 +294,7 @@ typedef enum
     eActivityEventGroup = 6
 } message_activity_e;
 
-typedef enum
-{
+typedef enum {
     eSessionMessageIndex = 254,
     eSessionTimestamp = 253,
     eSessionEvent = 0,
@@ -382,11 +408,15 @@ typedef enum
     eSessionEnhancedMaxAltitude = 128,
     eSessionAvgLevMotorPower = 129,
     eSessionMaxLevMotorPower = 130,
-    eSessionLevBatteryConsumption = 131
+    eSessionLevBatteryConsumption = 131,
+    eSessionAvgVerticalRatio = 132,
+    eSessionAvgStanceTimeBalance = 133,
+    eSessionAvgStepLength = 134,
+    eSessionTotalAnaerobicTrainingEffect = 137,
+    eSessionAvgVam = 139
 } message_session_e;
 
-typedef enum
-{
+typedef enum {
     eLapMessageIndex = 254,
     eLapTimestamp = 253,
     eLapEvent = 0,
@@ -488,11 +518,14 @@ typedef enum
     eLapEnhancedMaxAltitude = 114,
     eLapAvgLevMotorPower = 115,
     eLapMaxLevMotorPower = 116,
-    eLapLevBatteryConsumption = 117
+    eLapLevBatteryConsumption = 117,
+    eLapAvgVerticalRatio = 118,
+    eLapAvgStanceTimeBalance = 119,
+    eLapAvgStepLength = 120,
+    eLapAvgVam = 121
 } message_lap_e;
 
-typedef enum
-{
+typedef enum {
     eLengthMessageIndex = 254,
     eLengthTimestamp = 253,
     eLengthEvent = 0,
@@ -513,8 +546,7 @@ typedef enum
     eLengthZoneCount = 21
 } message_length_e;
 
-typedef enum
-{
+typedef enum {
     eRecordTimestamp = 253,
     eRecordPositionLat = 0,
     eRecordPositionLong = 1,
@@ -530,7 +562,7 @@ typedef enum
     eRecordTimeFromCourse = 11,
     eRecordCycleLength = 12,
     eRecordTemperature = 13,
-    eRecordSpeed1s = 17,
+    eRecordSpeed1S = 17,
     eRecordCycles = 18,
     eRecordTotalCycles = 19,
     eRecordCompressedAccumulatedPower = 28,
@@ -570,11 +602,13 @@ typedef enum
     eRecordEnhancedSpeed = 73,
     eRecordEnhancedAltitude = 78,
     eRecordBatterySoc = 81,
-    eRecordMotorPower = 82
+    eRecordMotorPower = 82,
+    eRecordVerticalRatio = 83,
+    eRecordStanceTimeBalance = 84,
+    eRecordStepLength = 85
 } message_record_e;
 
-typedef enum
-{
+typedef enum {
     eEventTimestamp = 253,
     eEventEvent = 0,
     eEventEventType = 1,
@@ -590,8 +624,7 @@ typedef enum
     eEventDeviceIndex = 13
 } message_event_e;
 
-typedef enum
-{
+typedef enum {
     eDeviceInfoTimestamp = 253,
     eDeviceInfoDeviceIndex = 0,
     eDeviceInfoDeviceType = 1,
@@ -612,8 +645,7 @@ typedef enum
     eDeviceInfoProductName = 27
 } message_device_info_e;
 
-typedef enum
-{
+typedef enum {
     eTrainingFileTimestamp = 253,
     eTrainingFileType = 0,
     eTrainingFileManufacturer = 1,
@@ -622,13 +654,51 @@ typedef enum
     eTrainingFileTimeCreated = 4
 } message_training_file_e;
 
-typedef enum
-{
+typedef enum {
     eHrvTime = 0
 } message_hrv_e;
 
-typedef enum
-{
+typedef enum {
+    eWeatherConditionsTimestamp = 253,
+    eWeatherConditionsWeatherReport = 0,
+    eWeatherConditionsTemperature = 1,
+    eWeatherConditionsCondition = 2,
+    eWeatherConditionsWindDirection = 3,
+    eWeatherConditionsWindSpeed = 4,
+    eWeatherConditionsPrecipitationProbability = 5,
+    eWeatherConditionsTemperatureFeelsLike = 6,
+    eWeatherConditionsRelativeHumidity = 7,
+    eWeatherConditionsLocation = 8,
+    eWeatherConditionsObservedAtTime = 9,
+    eWeatherConditionsObservedLocationLat = 10,
+    eWeatherConditionsObservedLocationLong = 11,
+    eWeatherConditionsDayOfWeek = 12,
+    eWeatherConditionsHighTemperature = 13,
+    eWeatherConditionsLowTemperature = 14
+} message_weather_conditions_e;
+
+typedef enum {
+    eWeatherAlertTimestamp = 253,
+    eWeatherAlertReportId = 0,
+    eWeatherAlertIssueTime = 1,
+    eWeatherAlertExpireTime = 2,
+    eWeatherAlertSeverity = 3,
+    eWeatherAlertType = 4
+} message_weather_alert_e;
+
+typedef enum {
+    eGpsMetadataTimestamp = 253,
+    eGpsMetadataTimestampMs = 0,
+    eGpsMetadataPositionLat = 1,
+    eGpsMetadataPositionLong = 2,
+    eGpsMetadataEnhancedAltitude = 3,
+    eGpsMetadataEnhancedSpeed = 4,
+    eGpsMetadataHeading = 5,
+    eGpsMetadataUtcTimestamp = 6,
+    eGpsMetadataVelocity = 7
+} message_gps_metadata_e;
+
+typedef enum {
     eCameraEventTimestamp = 253,
     eCameraEventTimestampMs = 0,
     eCameraEventCameraEventType = 1,
@@ -636,8 +706,7 @@ typedef enum
     eCameraEventCameraOrientation = 3
 } message_camera_event_e;
 
-typedef enum
-{
+typedef enum {
     eGyroscopeDataTimestamp = 253,
     eGyroscopeDataTimestampMs = 0,
     eGyroscopeDataSampleTimeOffset = 1,
@@ -649,8 +718,7 @@ typedef enum
     eGyroscopeDataCalibratedGyroZ = 7
 } message_gyroscope_data_e;
 
-typedef enum
-{
+typedef enum {
     eAccelerometerDataTimestamp = 253,
     eAccelerometerDataTimestampMs = 0,
     eAccelerometerDataSampleTimeOffset = 1,
@@ -659,11 +727,25 @@ typedef enum
     eAccelerometerDataAccelZ = 4,
     eAccelerometerDataCalibratedAccelX = 5,
     eAccelerometerDataCalibratedAccelY = 6,
-    eAccelerometerDataCalibratedAccelZ = 7
+    eAccelerometerDataCalibratedAccelZ = 7,
+    eAccelerometerDataCompressedCalibratedAccelX = 8,
+    eAccelerometerDataCompressedCalibratedAccelY = 9,
+    eAccelerometerDataCompressedCalibratedAccelZ = 10
 } message_accelerometer_data_e;
 
-typedef enum
-{
+typedef enum {
+    eMagnetometerDataTimestamp = 253,
+    eMagnetometerDataTimestampMs = 0,
+    eMagnetometerDataSampleTimeOffset = 1,
+    eMagnetometerDataMagX = 2,
+    eMagnetometerDataMagY = 3,
+    eMagnetometerDataMagZ = 4,
+    eMagnetometerDataCalibratedMagX = 5,
+    eMagnetometerDataCalibratedMagY = 6,
+    eMagnetometerDataCalibratedMagZ = 7
+} message_magnetometer_data_e;
+
+typedef enum {
     eThreeDSensorCalibrationTimestamp = 253,
     eThreeDSensorCalibrationSensorType = 0,
     eThreeDSensorCalibrationCalibrationFactor = 1,
@@ -673,15 +755,13 @@ typedef enum
     eThreeDSensorCalibrationOrientationMatrix = 5
 } message_three_d_sensor_calibration_e;
 
-typedef enum
-{
+typedef enum {
     eVideoFrameTimestamp = 253,
     eVideoFrameTimestampMs = 0,
     eVideoFrameFrameNumber = 1
 } message_video_frame_e;
 
-typedef enum
-{
+typedef enum {
     eObdiiDataTimestamp = 253,
     eObdiiDataTimestampMs = 0,
     eObdiiDataTimeOffset = 1,
@@ -693,15 +773,13 @@ typedef enum
     eObdiiDataStartTimestampMs = 7
 } message_obdii_data_e;
 
-typedef enum
-{
+typedef enum {
     eNmeaSentenceTimestamp = 253,
     eNmeaSentenceTimestampMs = 0,
     eNmeaSentenceSentence = 1
 } message_nmea_sentence_e;
 
-typedef enum
-{
+typedef enum {
     eAviationAttitudeTimestamp = 253,
     eAviationAttitudeTimestampMs = 0,
     eAviationAttitudeSystemTime = 1,
@@ -716,29 +794,25 @@ typedef enum
     eAviationAttitudeValidity = 10
 } message_aviation_attitude_e;
 
-typedef enum
-{
+typedef enum {
     eVideoUrl = 0,
     eVideoHostingProvider = 1,
     eVideoDuration = 2
 } message_video_e;
 
-typedef enum
-{
+typedef enum {
     eVideoTitleMessageIndex = 254,
     eVideoTitleMessageCount = 0,
     eVideoTitleText = 1
 } message_video_title_e;
 
-typedef enum
-{
+typedef enum {
     eVideoDescriptionMessageIndex = 254,
     eVideoDescriptionMessageCount = 0,
     eVideoDescriptionText = 1
 } message_video_description_e;
 
-typedef enum
-{
+typedef enum {
     eVideoClipClipNumber = 0,
     eVideoClipStartTimestamp = 1,
     eVideoClipStartTimestampMs = 2,
@@ -748,15 +822,14 @@ typedef enum
     eVideoClipClipEnd = 7
 } message_video_clip_e;
 
-typedef enum
-{
+typedef enum {
     eCourseSport = 4,
     eCourseName = 5,
-    eCourseCapabilities = 6
+    eCourseCapabilities = 6,
+    eCourseSubSport = 7
 } message_course_e;
 
-typedef enum
-{
+typedef enum {
     eCoursePointMessageIndex = 254,
     eCoursePointTimestamp = 1,
     eCoursePointPositionLat = 2,
@@ -767,8 +840,7 @@ typedef enum
     eCoursePointFavorite = 8
 } message_course_point_e;
 
-typedef enum
-{
+typedef enum {
     eSegmentIdName = 0,
     eSegmentIdUuid = 1,
     eSegmentIdSport = 2,
@@ -780,8 +852,7 @@ typedef enum
     eSegmentIdSelectionType = 8
 } message_segment_id_e;
 
-typedef enum
-{
+typedef enum {
     eSegmentLeaderboardEntryMessageIndex = 254,
     eSegmentLeaderboardEntryName = 0,
     eSegmentLeaderboardEntryType = 1,
@@ -791,8 +862,7 @@ typedef enum
     eSegmentLeaderboardEntryActivityIdString = 5
 } message_segment_leaderboard_entry_e;
 
-typedef enum
-{
+typedef enum {
     eSegmentPointMessageIndex = 254,
     eSegmentPointPositionLat = 1,
     eSegmentPointPositionLong = 2,
@@ -801,8 +871,7 @@ typedef enum
     eSegmentPointLeaderTime = 5
 } message_segment_point_e;
 
-typedef enum
-{
+typedef enum {
     eSegmentLapMessageIndex = 254,
     eSegmentLapTimestamp = 253,
     eSegmentLapEvent = 0,
@@ -887,11 +956,11 @@ typedef enum
     eSegmentLapAvgPowerPosition = 79,
     eSegmentLapMaxPowerPosition = 80,
     eSegmentLapAvgCadencePosition = 81,
-    eSegmentLapMaxCadencePosition = 82
+    eSegmentLapMaxCadencePosition = 82,
+    eSegmentLapManufacturer = 83
 } message_segment_lap_e;
 
-typedef enum
-{
+typedef enum {
     eSegmentFileMessageIndex = 254,
     eSegmentFileFileUuid = 1,
     eSegmentFileEnabled = 3,
@@ -899,19 +968,18 @@ typedef enum
     eSegmentFileLeaderType = 7,
     eSegmentFileLeaderGroupPrimaryKey = 8,
     eSegmentFileLeaderActivityId = 9,
-    eSegmentFileLeaderActivityIdString = 10
+    eSegmentFileLeaderActivityIdString = 10,
+    eSegmentFileDefaultRaceLeader = 11
 } message_segment_file_e;
 
-typedef enum
-{
+typedef enum {
     eWorkoutSport = 4,
     eWorkoutCapabilities = 5,
     eWorkoutNumValidSteps = 6,
     eWorkoutWktName = 8
 } message_workout_e;
 
-typedef enum
-{
+typedef enum {
     eWorkoutStepMessageIndex = 254,
     eWorkoutStepWktStepName = 0,
     eWorkoutStepDurationType = 1,
@@ -920,11 +988,11 @@ typedef enum
     eWorkoutStepTargetValue = 4,
     eWorkoutStepCustomTargetValueLow = 5,
     eWorkoutStepCustomTargetValueHigh = 6,
-    eWorkoutStepIntensity = 7
+    eWorkoutStepIntensity = 7,
+    eWorkoutStepNotes = 8
 } message_workout_step_e;
 
-typedef enum
-{
+typedef enum {
     eScheduleManufacturer = 0,
     eScheduleProduct = 1,
     eScheduleSerialNumber = 2,
@@ -934,8 +1002,7 @@ typedef enum
     eScheduleScheduledTime = 6
 } message_schedule_e;
 
-typedef enum
-{
+typedef enum {
     eTotalsMessageIndex = 254,
     eTotalsTimestamp = 253,
     eTotalsTimerTime = 0,
@@ -948,8 +1015,7 @@ typedef enum
     eTotalsSportIndex = 9
 } message_totals_e;
 
-typedef enum
-{
+typedef enum {
     eWeightScaleTimestamp = 253,
     eWeightScaleWeight = 0,
     eWeightScalePercentFat = 1,
@@ -965,8 +1031,7 @@ typedef enum
     eWeightScaleUserProfileIndex = 12
 } message_weight_scale_e;
 
-typedef enum
-{
+typedef enum {
     eBloodPressureTimestamp = 253,
     eBloodPressureSystolicPressure = 0,
     eBloodPressureDiastolicPressure = 1,
@@ -980,8 +1045,7 @@ typedef enum
     eBloodPressureUserProfileIndex = 9
 } message_blood_pressure_e;
 
-typedef enum
-{
+typedef enum {
     eMonitoringInfoTimestamp = 253,
     eMonitoringInfoLocalTimestamp = 0,
     eMonitoringInfoActivityType = 1,
@@ -990,8 +1054,7 @@ typedef enum
     eMonitoringInfoRestingMetabolicRate = 5
 } message_monitoring_info_e;
 
-typedef enum
-{
+typedef enum {
     eMonitoringTimestamp = 253,
     eMonitoringDeviceIndex = 0,
     eMonitoringCalories = 1,
@@ -1016,15 +1079,108 @@ typedef enum
     eMonitoringHeartRate = 27,
     eMonitoringIntensity = 28,
     eMonitoringDurationMin = 29,
-    eMonitoringDuration = 30
+    eMonitoringDuration = 30,
+    eMonitoringAscent = 31,
+    eMonitoringDescent = 32,
+    eMonitoringModerateActivityMinutes = 33,
+    eMonitoringVigorousActivityMinutes = 34
 } message_monitoring_e;
 
-typedef enum
-{
+typedef enum {
+    eHrTimestamp = 253,
+    eHrFractionalTimestamp = 0,
+    eHrTime256 = 1,
+    eHrFilteredBpm = 6,
+    eHrEventTimestamp = 9,
+    eHrEventTimestamp12 = 10
+} message_hr_e;
+
+typedef enum {
     eMemoGlobPartIndex = 250,
     eMemoGlobMemo = 0,
     eMemoGlobMessageNumber = 1,
     eMemoGlobMessageIndex = 2
 } message_memo_glob_e;
+
+typedef enum {
+    eAntChannelIdChannelNumber = 0,
+    eAntChannelIdDeviceType = 1,
+    eAntChannelIdDeviceNumber = 2,
+    eAntChannelIdTransmissionType = 3,
+    eAntChannelIdDeviceIndex = 4
+} message_ant_channel_id_e;
+
+typedef enum {
+    eAntRxTimestamp = 253,
+    eAntRxFractionalTimestamp = 0,
+    eAntRxMesgId = 1,
+    eAntRxMesgData = 2,
+    eAntRxChannelNumber = 3,
+    eAntRxData = 4
+} message_ant_rx_e;
+
+typedef enum {
+    eAntTxTimestamp = 253,
+    eAntTxFractionalTimestamp = 0,
+    eAntTxMesgId = 1,
+    eAntTxMesgData = 2,
+    eAntTxChannelNumber = 3,
+    eAntTxData = 4
+} message_ant_tx_e;
+
+typedef enum {
+    eExdScreenConfigurationScreenIndex = 0,
+    eExdScreenConfigurationFieldCount = 1,
+    eExdScreenConfigurationLayout = 2,
+    eExdScreenConfigurationScreenEnabled = 3
+} message_exd_screen_configuration_e;
+
+typedef enum {
+    eExdDataFieldConfigurationScreenIndex = 0,
+    eExdDataFieldConfigurationConceptField = 1,
+    eExdDataFieldConfigurationFieldId = 2,
+    eExdDataFieldConfigurationConceptCount = 3,
+    eExdDataFieldConfigurationDisplayType = 4,
+    eExdDataFieldConfigurationTitle = 5
+} message_exd_data_field_configuration_e;
+
+typedef enum {
+    eExdDataConceptConfigurationScreenIndex = 0,
+    eExdDataConceptConfigurationConceptField = 1,
+    eExdDataConceptConfigurationFieldId = 2,
+    eExdDataConceptConfigurationConceptIndex = 3,
+    eExdDataConceptConfigurationDataPage = 4,
+    eExdDataConceptConfigurationConceptKey = 5,
+    eExdDataConceptConfigurationScaling = 6,
+    eExdDataConceptConfigurationDataUnits = 8,
+    eExdDataConceptConfigurationQualifier = 9,
+    eExdDataConceptConfigurationDescriptor = 10,
+    eExdDataConceptConfigurationIsSigned = 11
+} message_exd_data_concept_configuration_e;
+
+typedef enum {
+    eFieldDescriptionDeveloperDataIndex = 0,
+    eFieldDescriptionFieldDefinitionNumber = 1,
+    eFieldDescriptionFitBaseTypeId = 2,
+    eFieldDescriptionFieldName = 3,
+    eFieldDescriptionArray = 4,
+    eFieldDescriptionComponents = 5,
+    eFieldDescriptionScale = 6,
+    eFieldDescriptionOffset = 7,
+    eFieldDescriptionUnits = 8,
+    eFieldDescriptionBits = 9,
+    eFieldDescriptionAccumulate = 10,
+    eFieldDescriptionFitBaseUnitId = 13,
+    eFieldDescriptionNativeMesgNum = 14,
+    eFieldDescriptionNativeFieldNum = 15
+} message_field_description_e;
+
+typedef enum {
+    eDeveloperDataIdDeveloperId = 0,
+    eDeveloperDataIdApplicationId = 1,
+    eDeveloperDataIdManufacturerId = 2,
+    eDeveloperDataIdDeveloperDataIndex = 3,
+    eDeveloperDataIdApplicationVersion = 4
+} message_developer_data_id_e;
 // ----------- end generated code -----------
 #endif // FIT_FIELDS_H
diff --git a/src/gis/fit/defs/profiles.py b/src/gis/fit/defs/profiles.py
new file mode 100644
index 0000000..1757447
--- /dev/null
+++ b/src/gis/fit/defs/profiles.py
@@ -0,0 +1,267 @@
+#!/usr/bin/env python
+# vim:fileencoding=utf-8
+
+from __future__ import print_function
+import csv
+
+
+type_csv_filename = './Profile_Types.csv'
+messages_csv_filename = './Profile_Messages.csv'
+
+enum_filename = 'gen-fit_enums.h'
+enum_profiles_filename = 'gen-fit_fields.h'
+profile_code_filename = 'gen-CFitProfileLockup.cpp'
+profile_init_filename = 'gen-CFitProfileLockup-call.cpp'
+
+
+def titlecase(s):
+    s = s.replace('_', ' ')
+    s = s.title()
+    s = s.replace(' ', '')
+    return s
+
+
+def zero_if_null(s, i = None):
+    return default_if_null('0', s, i)
+
+
+def empty_if_none(s, i = None):
+    return default_if_null('', s, i)
+
+
+def default_if_null(default, s, i = None):
+    if i is not None:
+        if len(s) > i:
+            s = s[i]
+        else:
+            s = ''
+
+    if not s:
+        return default
+    return s
+
+
+def write_enum_type(enum_file, enum_list, type_name):
+    if len(enum_list) > 0 and type_name:
+        count = 0
+        print("typedef enum {", file=enum_file)
+        for e in enum_list:
+            if count + 1 < len(enum_list):
+                print('    ' + e + ',', file=enum_file)
+            else:
+                print('    ' + e, file=enum_file)
+            count = count + 1
+        print('} ' + type_name + '_e;', file=enum_file)
+        print(' ', file=enum_file)
+
+def write_enum_file():
+    # field enums
+    count = 0
+    last_type_name = ''
+    enum_list = []
+
+    with open(type_csv_filename, 'r') as csvfile:
+        typereader = csv.reader(csvfile, delimiter=';', quotechar='"')
+        with open(enum_filename, 'w') as enum_file:
+            for row in typereader:
+                type_name = row[0]
+                base_type = row[1]
+                value_name = row[2]
+                value = row[3]
+                comment = row[4]
+
+                if count > 0:
+                    if type_name:
+                        write_enum_type(enum_file, enum_list, last_type_name)
+                        enum_list = []
+                        last_type_name = type_name
+
+                    if value_name and value:
+                        enum_list.append('e' + titlecase(last_type_name) + titlecase(value_name) + ' = ' + value)
+
+                count = count + 1
+            write_enum_type(enum_file, enum_list, last_type_name)
+
+
+def write_message_enums():
+    count = 0
+    last_type_name = ''
+    enum_list = []
+
+    with open(messages_csv_filename, 'r') as csvfile:
+        typereader = csv.reader(csvfile, delimiter=';', quotechar='"')
+        with open(enum_profiles_filename, 'w') as enum_file:
+            for row in typereader:
+                message_name = row[0]
+                field_def_nr = row[1]
+                field_name = row[2]
+
+                if count > 0:
+                    if message_name:
+                        # '} message_' + + '_e;'
+                        write_enum_type(enum_file, enum_list, 'message_' + last_type_name)
+                        enum_list = []
+                        last_type_name = message_name
+
+                    if field_name and field_def_nr:
+                        enum_list.append('e' + titlecase(last_type_name) + titlecase(field_name) + ' = ' + field_def_nr)
+
+                count = count + 1
+            write_enum_type(enum_file, enum_list, 'message_' + last_type_name)
+
+
+
+def write_profile_type(profile_file, field_list, msg_name):
+    if len(field_list) > 0 and msg_name:
+        print('void init' + titlecase(msg_name) + '(QMap<quint16, CFitProfile*>& profiles)', file=profile_file)
+        print('{', file=profile_file)
+        print('    CFitProfile* f = new CFitProfile("' + msg_name + '", eMesgNum' + titlecase(msg_name) + ');', file=profile_file)
+        for f in field_list:
+            print('    f->' + f + ';', file=profile_file)
+        print('    profiles.insert(eMesgNum' + titlecase(msg_name) + ', f);', file=profile_file)
+        print('}', file=profile_file)
+        print(' ', file=profile_file)
+
+
+def write_profile_init(profile_file, msg_name):
+    if msg_name:
+        print('    init' + titlecase(msg_name) + '(allProfiles);', file=profile_file)
+
+
+base_type_map = {
+    'uint8' : 'fitUint8Type', 'uint16': 'fitUint16Type', 'uint32':'fitUint32Type', 'uint64':'fitUint64Type',
+    'sint8':'fitSint8Type', 'sint16':'fitSint16Type', 'sint32': 'fitSint32Type', 'sint64':'fitSint64Type',
+    'uint8z':'fitUint8zType', 'uint16z':'fitUint16zType', 'uint32z':'fitUint32zType', 'uint64z':'fitUint64zType',
+    'float32':'fitFloat32Type', 'float64':'fitFloat64Type',
+    'string':'fitStringType', 'byte':'fitByteType', 'bool':'fitEnumType', '':'fitEnumType'}
+
+
+def base_type(type):
+    if type in base_type_map:
+        return base_type_map[type]
+    return 'fitEnumType'
+
+
+def write_profiles():
+    count = 0
+    subcount = 0
+    last_msg_name = ''
+    field_names = {}
+    add_list = []
+
+    profile_file = open(profile_code_filename, 'w')
+    profile_init_file = open(profile_init_filename, 'w')
+
+    with open(messages_csv_filename, 'r') as csvfile:
+        typereader = csv.reader(csvfile, delimiter=';', quotechar='"')
+        for row in typereader:
+            message_name = row[0]
+            field_def_nr = row[1]
+            field_name = row[2]
+            field_type = row[3]
+            array = row[4]
+            components = row[5]
+            scale = row[6]
+            offset = row[7]
+            units = row[8]
+            bits = row[9]
+            accumulate = row[10]
+            ref_field_name = row[11]
+            ref_field_value = row[12]
+
+            if count > 0:
+                if message_name:
+                    # new message
+                    write_profile_type(profile_file, add_list, last_msg_name)
+                    write_profile_init(profile_init_file, last_msg_name)
+                    add_list = []
+                    last_msg_name = message_name
+
+                elif field_name:
+                    type_name = base_type(field_type)
+                    field_names[field_name] = field_type
+
+                    if field_def_nr and not components:
+                        # normal type
+                        scale = zero_if_null(scale)
+                        offset = zero_if_null(offset)
+
+                        last_field_def_nr = 'e' + titlecase(last_msg_name) + titlecase(field_name)
+                        add_list.append('addField("' + field_name + '", ' + type_name + ', ' + last_field_def_nr + ', '
+                                        + scale + ', ' + offset + ', "' + units + '")')
+                        subcount = 0
+                        # end normal type
+                    else:
+                        # sub type or component type
+
+                        # ref field name is for all elements the same, so take the first one
+                        ref_field_name = empty_if_none(ref_field_name.split(','), 0)
+                        ref_field_value_list = ref_field_value.split(',')
+                        components_list = components.split(',')
+                        scale_list = scale.split(',')
+                        offset_list = offset.split(',')
+                        units_list = units.split(',')
+                        bits_list = bits.split(',')
+
+                        if not field_def_nr:
+                            # sub type
+                            enum_field = 'e' + titlecase(last_msg_name) + titlecase(ref_field_name)
+
+                            # case it has components (scale, offset and units are undefined)
+                            scale = '0'
+                            offset = '0'
+                            units = ''
+                            i = 0
+                            for a in ref_field_value_list:
+                                if not components:
+                                    scale = zero_if_null(scale_list, i)
+                                    offset = zero_if_null(offset_list, i)
+                                    units = empty_if_none(units_list, i)
+
+                                if ref_field_name not in field_names or not field_names[ref_field_name]:
+                                    enum_field_value = 'e' + titlecase(ref_field_name) + titlecase(ref_field_value_list[i])
+                                else:
+                                    enum_field_value = 'e' +titlecase(field_names[ref_field_name]) + titlecase(ref_field_value_list[i])
+
+                                add_list.append('addSubfield("' + field_name + '", ' + type_name + ', ' + last_field_def_nr + ', '
+                                                + scale + ', ' + offset + ', "' + units + '", ' + enum_field + ', ' + enum_field_value+')')
+                                i = i + 1
+                                subcount = subcount + 1
+                            #  end sub type
+                        if components:
+                            # component type
+                            if field_def_nr:
+                                # a component needs always a parent field. add one
+                                last_field_def_nr = 'e' + titlecase(last_msg_name) + titlecase(field_name)
+                                add_list.append('addField("' + field_name + '", ' + type_name + ', ' + last_field_def_nr + ', 0, 0, "")')
+                                subaccess_field = ''
+                            else:
+                                # parent field for component is sub field
+                                subaccess_field = str(subcount - 1) + ', '
+
+                            i = 0
+                            for a in components_list:
+                                scale = zero_if_null(scale_list, i)
+                                if not scale:
+                                    scale = zero_if_null(scale_list, 0)
+                                offset = zero_if_null(offset_list, i)
+                                units = empty_if_none(units_list, i)
+                                if not units:
+                                    units = empty_if_none(units_list, 0)
+                                bits = zero_if_null(bits_list, i)
+                                if not bits:
+                                    bits = zero_if_null(bits_list, 0)
+                                enum_component = 'e' + titlecase(last_msg_name) + titlecase(components_list[i])
+                                add_list.append('addComponent('+ subaccess_field + '"' + field_name + '", ' + type_name + ', ' +
+                                                last_field_def_nr + ', ' + scale + ', ' + offset + ', "' + units + '", ' +
+                                                enum_component + ', ' + bits + ')')
+                                i = i + 1
+                            # end component type
+            count = count + 1
+        write_profile_type(profile_file, add_list, last_msg_name)
+        write_profile_init(profile_init_file, last_msg_name)
+
+
+write_enum_file()
+write_message_enums()
+write_profiles()
\ No newline at end of file
diff --git a/src/gis/fit/defs/profiles.sh b/src/gis/fit/defs/profiles.sh
deleted file mode 100755
index c0847f8..0000000
--- a/src/gis/fit/defs/profiles.sh
+++ /dev/null
@@ -1,316 +0,0 @@
-#!/usr/local/bin/bash
-# /bin/bash
-
-tmp_array=()
-
-function splitField()
-{
-	local  in=$1
-	in=${in#"\""}
-	in=${in%"\""}
-	in=${in//,/ }
-	OLDIFS=$IFS
-	IFS=" "
-	tmp_array=($in)
-	IFS=$OLDIFS
-}
-
-function zeroIfNull()
-{
-    local  __resultvar=$1
-    local  result=$2
-    if [[ "$result" == "" ]]; then
-        result="0"
-    fi
-    
-    eval $__resultvar="'$result'"
-}
-
-
-function titleCase()
-{
-    local __resultvar=$1
-    local string=$2
-    
-    string=${string//_/ }
-    titleCasev=$(echo "$string" | perl -ane ' foreach $wrd ( @F ) { print ucfirst($wrd)." "; } print "\n" ; ')
-    titleCasev=${titleCasev// /}
-
-    eval $__resultvar="'$titleCasev'"
-}
-
-
-function createFieldEnums()
-{
-	COUNT=0
-	lastTypeName=""
-	lastTypeNameCamel=""
-	lastValue=""
-	ENUM_FILE=gen-fit_enums.h
-	rm $ENUM_FILE
-
-	while read typeName baseType valueName value comment
-	do
-		if [[ $COUNT -gt 0 ]]; then
-			if [[ "$typeName" != "" ]]; then
-				lastTypeName=$typeName
-				titleCase lastTypeNameCamel $typeName
-				lastValue=""
-				
-				echo "typedef enum {" >> $ENUM_FILE
-			fi
-			
-			if [[ "$lastValue" != "" && "$valueName" != "" ]]; then
-					echo " $lastValue," >> $ENUM_FILE
-			fi
-			if [[ "$lastTypeName" != "" && "$valueName" == "" && "$typeName" == "" ]]; then
-				echo " $lastValue" >> $ENUM_FILE
-			echo "} ${lastTypeName}_e;"  >> $ENUM_FILE
-				echo "" >> $ENUM_FILE
-			fi
-			
-			if [[ "$valueName" != "" ]]; then 
-				titleCase valueName $valueName
-				lastValue="e$lastTypeNameCamel$valueName = $value"
-			fi
-		fi
-		COUNT=$[$COUNT +1]
-	done < $IN_TYPES
-	echo " $lastValue" >> $ENUM_FILE
-	echo "} ${lastTypeName}_e;"  >> $ENUM_FILE
-}
-
-
-function baseType()
-{
-    local __resultvar=$1
-    local ctype=$2
-    
-    if [[ "$ctype" == "uint8" ]]; then
-        conv="fitUint8Type"
-    elif [[ "$ctype" == "uint16" ]]; then
-        conv="fitUint16Type"
-    elif [[ "$ctype" == "uint32" ]]; then
-        conv="fitUint32Type"
-    elif [[ "$ctype" == "sint8" ]]; then
-        conv="fitSint8Type"
-    elif [[ "$ctype" == "sint16" ]]; then
-        conv="fitSint16Type"
-    elif [[ "$ctype" == "sint32" ]]; then
-        conv="fitSint32Type"
-    elif [[ "$ctype" == "string" ]]; then
-        conv="fitStringType"
-    elif [[ "$ctype" == "uint8z" ]]; then
-        conv="fitUint8zType"
-    elif [[ "$ctype" == "uint16z" ]]; then
-        conv="fitUint16zType"
-    elif [[ "$ctype" == "uint32z" ]]; then    
-        conv="fitUint32zType"
-    elif [[ "$ctype" == "float32" ]]; then
-        conv="fitFloat32Type"
-    elif [[ "$ctype" == "float64" ]]; then
-        conv="fitFloat64Type"
-    elif [[ "$ctype" == "byte" ]]; then
-        conv="fitByteType"
-    elif [[ "$ctype" == "bool" ]]; then
-        conv="fitEnumType"
-    else
-        conv="fitEnumType"
-    fi
-
-    eval $__resultvar="'$conv'"
-}
-
-function createMessageEnums()
-{
-	ENUM_PROFILES_FILE=gen-fit_fields.h
-	rm $ENUM_PROFILES_FILE
-	COUNT=0
-	lastName=""
-	valueName=""
-	lastTypeName=""
-	lastTypeNameCamel=""
-	while read messageName fieldDefNr fieldName fieldType array components scale offset units bits accumulate refFieldName refFieldValeu comment example
-	do
-		if [[ $COUNT -gt 1 ]]; then
-			if [[ "$messageName" != "" ]]; then
-				lastTypeName=$messageName
-				titleCase lastTypeNameCamel $lastTypeName
-				lastValue=""
-				
-				echo "typedef enum {" >> $ENUM_PROFILES_FILE
-			fi
-			
-			if [[ "$lastValue" != "" && "$fieldDefNr" != "" ]]; then
-				echo " $lastValue," >> $ENUM_PROFILES_FILE
-				lastValue=""    
-			fi
-			if [[ "$lastTypeName" != "" && "$fieldName" == "" && "$messageName" == "" && "$lastValue" != "" ]]; then
-				echo " $lastValue" >> $ENUM_PROFILES_FILE
-				echo "} message_${lastTypeName}_e;"  >> $ENUM_PROFILES_FILE
-				echo "" >> $ENUM_PROFILES_FILE
-				lastValue=""
-			fi
-			
-			if [[ "$fieldDefNr" != "" ]]; then 
-				titleCase fieldName $fieldName
-				lastValue="e$lastTypeNameCamel$fieldName = $fieldDefNr"
-			fi
-		fi
-		COUNT=$[$COUNT +1]
-	done < $IN_MESSAGES
-	echo " $lastValue" >> $ENUM_PROFILES_FILE
-	echo "} message_${lastTypeName}_e;"  >> $ENUM_PROFILES_FILE
-}
-
-
-function createProfiles()
-{
-	CODE_FILE=gen-CFitProfileLockup.cpp
-	CALL_FILE=gen-CFitProfileLockup-call.cpp
-	rm $CODE_FILE
-	rm $CALL_FILE
-	
-	COUNT=0
-	subcount=0
-	lastName=""
-	lastFieldDefNr=0
-	typeName=""
-	enumName=""
-	enumField=""
-	enumFieldValue=""
-	enumComponent=""
-	declare -A fieldNames
-	
-	# second run create the source code
-	while read messageName fieldDefNr fieldName fieldType array components scale offset units bits accumulate refFieldName refFieldValue comment example
-	do
-		if [ $COUNT -gt 1 ]; then
-			if [[ "$messageName" != "" ]]; then
-				# new message
-				if [ $COUNT -gt 3 ]; then
-					echo "profiles.insert($enumName, f);" >> $CODE_FILE
-					echo "}" >> $CODE_FILE
-					echo " " >> $CODE_FILE
-				fi
-				titleCase enumName $messageName
-				echo "init$enumName(profiles);" >> $CALL_FILE
-				echo "void init$enumName(QMap<quint16, CFitProfile*>& profiles)" >> $CODE_FILE
-				echo "{" >> $CODE_FILE
-				enumName=eMesgNum$enumName
-				echo "CFitProfile* f = new CFitProfile(\"$messageName\", $enumName);" >> $CODE_FILE
-				
-				lastName=$messageName
-				
-			elif [[ "$fieldName" != "" ]]; then
-				# new fields
-				baseType typeName $fieldType
-				fieldNames["$fieldName"]=$fieldType
-				
-				if [[ "$fieldDefNr" != "" &&  "$components" == "" ]]; then
-					# normal type
-					zeroIfNull scale $scale
-					zeroIfNull offset $offset
-					titleCase lastFieldDefNr "${lastName}_${fieldName}"
-					lastFieldDefNr="e$lastFieldDefNr"
-					echo "f->addField(\"$fieldName\", $typeName, $lastFieldDefNr, $scale, $offset, \"$units\");" >> $CODE_FILE
-					subcount=0
-					# end normal type
-				else
-					# sub type or component type
-					splitField $refFieldName
-					# ref field name is for all elements the same, so take the first one
-					refFieldName=$tmp_array
-					splitField $refFieldValue
-					refFieldValueArray=( "${tmp_array[@]}" )
-					
-					splitField $components
-					componentsArray=( "${tmp_array[@]}" )
-					splitField $scale
-					scaleArray=( "${tmp_array[@]}" )
-					splitField $offset
-					offsetArray=( "${tmp_array[@]}" )
-					splitField $units
-					unitsArray=( "${tmp_array[@]}" )
-					splitField $bits
-					bitsArray=( "${tmp_array[@]}" )
-					
-					if [[ "$fieldDefNr" == "" ]]; then
-						# sub type
-						titleCase enumField "${lastName}_${refFieldName}"
-						enumField=e$enumField
-						for i in "${!refFieldValueArray[@]}"; do
-							if [[ "$components" != "" ]]; then
-								# case it has components (scale, offset and units are undefined)
-								scale="0"
-								offset="0"
-								units=""
-							else
-								zeroIfNull scale ${scaleArray[i]}
-								zeroIfNull offset ${offsetArray[i]}
-								units=${unitsArray[i]}
-							fi
-							
-							titleCase enumFieldValue "${fieldNames[$refFieldName]}_${refFieldValueArray[i]}"
-							if [[ ${fieldNames[$refFieldName]} == "" ]]; then
-								titleCase enumFieldValue "${refFieldName}_${refFieldValueArray[i]}"
-							fi
-							enumFieldValue="e$enumFieldValue"
-							echo "f->addSubfield(\"$fieldName\", $typeName, $lastFieldDefNr, $scale, $offset, \"$units\", $enumField, $enumFieldValue);" >> $CODE_FILE 
-							subcount=$[$subcount +1]
-						done
-						#  end sub type
-					fi
-					if [[ "$components" != "" ]]; then
-						# component type
-						
-						if [[ "$fieldDefNr" != "" ]]; then
-							# a component needs always a parent field. add one
-							titleCase lastFieldDefNr "${lastName}_${fieldName}"
-							lastFieldDefNr="e$lastFieldDefNr"
-							echo "f->addField(\"$fieldName\", $typeName, $lastFieldDefNr, 0, 0, \"\");" >> $CODE_FILE
-							subaccessField=""
-						else
-							# parent field for component is sub field
-							i=$[$subcount -1]
-							subaccessField="$i,"
-						fi
-						for i in "${!componentsArray[@]}"; do
-							zeroIfNull scale ${scaleArray[i]}
-							zeroIfNull offset ${offsetArray[i]}
-							units=${unitsArray[i]}
-							bits=${bitsArray[i]}
-							compName=${componentsArray[i]}
-							titleCase enumComponent "${lastName}_${componentsArray[i]}"
-							enumComponent="e$enumComponent"
-							echo "f->addComponent($subaccessField \"$fieldName\", $typeName, $lastFieldDefNr, $scale, $offset, \"$units\", $enumComponent, $bits);" >> $CODE_FILE
-						done
-						# end component type
-					fi
-				fi
-			fi
-			#else
-			# empty line
-		fi
-		COUNT=$[$COUNT +1]
-	done < $IN_MESSAGES
-	echo "profiles.insert($enumName, f);" >> $CODE_FILE
-	echo "}" >> $CODE_FILE
-}
-
-
-# line ending unix 
-IN_TYPES=./Profile_Types.csv
-IN_MESSAGES=./Profile_Messages.csv
-
-OLDIFS=$IFS
-IFS=";"
-
-[ ! -f $IN_TYPES ] && { echo "$IN_TYPES file not found"; exit 99; }
-createFieldEnums
-
-[ ! -f $IN_MESSAGES ] && { echo "$IN_MESSAGES file not found"; exit 99; }
-createMessageEnums
-createProfiles
-
-IFS=$OLDIFS
diff --git a/src/gis/fit/serialization.cpp b/src/gis/fit/serialization.cpp
index e432c10..4b71aa8 100644
--- a/src/gis/fit/serialization.cpp
+++ b/src/gis/fit/serialization.cpp
@@ -52,7 +52,7 @@ static QDateTime toDateTime(quint32 timestamp)
 static QString dateTimeAsString(quint32 timestamp)
 {
     QDateTime dateTime = toDateTime(timestamp);
-    return dateTime.toString("yyyy-dd-MM-HH-mm-ss");
+    return IUnit::datetime2string(dateTime, true);
 }
 
 template<typename T>
diff --git a/src/gis/rte/router/brouter/CRouterBRouterSetupPage.cpp b/src/gis/rte/router/brouter/CRouterBRouterSetupPage.cpp
index 0d6c353..3601510 100644
--- a/src/gis/rte/router/brouter/CRouterBRouterSetupPage.cpp
+++ b/src/gis/rte/router/brouter/CRouterBRouterSetupPage.cpp
@@ -54,16 +54,6 @@ bool CRouterBRouterSetupPage::isComplete() const
         return profilesListView->model()->rowCount() > 0;
     }
 
-    case CRouterBRouterSetupWizard::ePageOnlineUrl:
-    {
-        return complete;
-    }
-
-    case CRouterBRouterSetupWizard::ePageLocalDetails:
-    {
-        return complete;
-    }
-
     default:
     {
         return false;
diff --git a/src/gis/rte/router/brouter/CRouterBRouterSetupWizard.cpp b/src/gis/rte/router/brouter/CRouterBRouterSetupWizard.cpp
index d0013da..9772dee 100644
--- a/src/gis/rte/router/brouter/CRouterBRouterSetupWizard.cpp
+++ b/src/gis/rte/router/brouter/CRouterBRouterSetupWizard.cpp
@@ -44,7 +44,7 @@ CRouterBRouterSetupWizard::CRouterBRouterSetupWizard()
     connect(checkExpert, &QCheckBox::clicked,    this, &CRouterBRouterSetupWizard::slotCheckExpertClicked);
 
     connect(lineLocalProfilesUrl, &QLineEdit::cursorPositionChanged, this, &CRouterBRouterSetupWizard::slotLocalProfilesUrlCursorPositionChanged);
-    connect(lineLocalProfilesUrl, &QLineEdit::editingFinished, this, &CRouterBRouterSetupWizard::slotLocalProfilesUrlEditingFinished);
+    connect(lineLocalProfilesUrl, &QLineEdit::editingFinished, this, &CRouterBRouterSetupWizard::slotLocalProfilesUrlCursorPositionChanged);
     connect(toolLocalDir, &QToolButton::clicked, this, &CRouterBRouterSetupWizard::slotLocalToolSelectDirectory);
     connect(toolJavaExecutable, &QToolButton::clicked, this, &CRouterBRouterSetupWizard::slotLocalToolSelectJava);
     connect(pushLocalFindJava, &QPushButton::clicked, this, &CRouterBRouterSetupWizard::slotLocalPushFindJava);
@@ -63,7 +63,7 @@ CRouterBRouterSetupWizard::CRouterBRouterSetupWizard()
     connect(toolProfileDown, &QToolButton::clicked, this, &CRouterBRouterSetupWizard::slotProfileDownClicked);
 
     connect(lineOnlineUrl, &QLineEdit::cursorPositionChanged, this, &CRouterBRouterSetupWizard::slotOnlineUrlCursorPositionChanged);
-    connect(lineOnlineUrl, &QLineEdit::editingFinished, this, &CRouterBRouterSetupWizard::slotOnlineUrlEditingFinished);
+    connect(lineOnlineUrl, &QLineEdit::editingFinished, this, &CRouterBRouterSetupWizard::slotOnlineUrlCursorPositionChanged);
 
     connect(setup, &CRouterBRouterSetup::sigOnlineConfigLoaded, this, &CRouterBRouterSetupWizard::slotOnlineConfigLoaded);
     connect(setup, &CRouterBRouterSetup::sigDisplayOnlineProfileFinished, this, &CRouterBRouterSetupWizard::slotDisplayProfile);
@@ -813,17 +813,11 @@ void CRouterBRouterSetupWizard::beginOnlineUrl()
 {
     setOption(QWizard::HaveCustomButton1, true);
     isError = false;
-    pageOnlineUrl->setComplete(false);
     setup->loadOnlineConfig();
 }
 
 void CRouterBRouterSetupWizard::slotOnlineUrlCursorPositionChanged()
 {
-    pageOnlineUrl->setComplete(false);
-}
-
-void CRouterBRouterSetupWizard::slotOnlineUrlEditingFinished()
-{
     setup->onlineWebUrl = lineOnlineUrl->text();
     isError = false;
     setup->loadOnlineConfig();
@@ -837,10 +831,6 @@ void CRouterBRouterSetupWizard::updateOnlineUrl()
     {
         textOnlineUrl->setText(error + ": "+ errorDetails);
     }
-    else
-    {
-        pageOnlineUrl->setComplete(true);
-    }
 }
 
 void CRouterBRouterSetupWizard::resetOnlineUrl()
@@ -861,7 +851,6 @@ void CRouterBRouterSetupWizard::updateLocalDetails() const
     lineLocalNumberThreads->setText(setup->localNumberThreads);
     lineLocalJavaOpts->setText(setup->localJavaOpts);
     textLocalDetails->setVisible(isError);
-    pageLocalDetails->setComplete(!isError);
     if (isError)
     {
         textLocalDetails->setText(error + ": " + errorDetails);
@@ -875,12 +864,7 @@ void CRouterBRouterSetupWizard::beginLocalDetails()
     setup->loadLocalOnlineProfiles();
 }
 
-void CRouterBRouterSetupWizard::slotLocalProfilesUrlCursorPositionChanged() const
-{
-    pageLocalDetails->setComplete(false);
-}
-
-void CRouterBRouterSetupWizard::slotLocalProfilesUrlEditingFinished()
+void CRouterBRouterSetupWizard::slotLocalProfilesUrlCursorPositionChanged()
 {
     setup->onlineProfilesUrl = lineLocalProfilesUrl->text();
     isError = false;
diff --git a/src/gis/rte/router/brouter/CRouterBRouterSetupWizard.h b/src/gis/rte/router/brouter/CRouterBRouterSetupWizard.h
index b66a043..7e1357d 100644
--- a/src/gis/rte/router/brouter/CRouterBRouterSetupWizard.h
+++ b/src/gis/rte/router/brouter/CRouterBRouterSetupWizard.h
@@ -55,10 +55,8 @@ private slots:
     void slotCreateOrUpdateLocalInstallClicked();
     void slotLocalDirectoryCursonPositionChanged() const;
     void slotLocalJavaExecutableCursorPositionChanged() const;
-    void slotLocalProfilesUrlCursorPositionChanged() const;
-    void slotLocalProfilesUrlEditingFinished();
+    void slotLocalProfilesUrlCursorPositionChanged();
     void slotOnlineUrlCursorPositionChanged();
-    void slotOnlineUrlEditingFinished();
     void slotWebLocalBRouterVersionsLoadFinished(bool ok);
     void slotLocalDownloadLinkClicked(const QUrl & url);
     void slotLocalDownloadButtonClicked();
diff --git a/src/gis/rte/router/brouter/CRouterBRouterTilesSelect.cpp b/src/gis/rte/router/brouter/CRouterBRouterTilesSelect.cpp
index f8147ce..4340da2 100644
--- a/src/gis/rte/router/brouter/CRouterBRouterTilesSelect.cpp
+++ b/src/gis/rte/router/brouter/CRouterBRouterTilesSelect.cpp
@@ -597,24 +597,33 @@ void CRouterBRouterTilesSelect::slotDownloadFinished(QNetworkReply* reply)
                 status->file->close();
                 status->file->remove();
             }
-            else if (!status->file->rename(segmentsDir().absoluteFilePath(it.key())))
-            {
-                error(tr("error renaming file %1 to %2: %3")
-                      .arg(status->file->fileName())
-                      .arg(segmentsDir().absoluteFilePath(it.key()))
-                      .arg(status->file->errorString()));
-                status->file->close();
-                status->file->remove();
-            }
             else
             {
-                status->isLocal = true;
-                status->isOutdated = false;
-                status->file->close();
-                QFileInfo info(*status->file);
-                status->localDate = info.created();
-                status->localSize = info.size();
-                clearError();
+                const QString &finalName = segmentsDir().absoluteFilePath(it.key());
+                QFile oldFile(finalName);
+                if (oldFile.exists())
+                {
+                    oldFile.remove();
+                }
+                if (status->file->rename(finalName))
+                {
+                    status->isLocal = true;
+                    status->isOutdated = false;
+                    status->file->close();
+                    QFileInfo info(*status->file);
+                    status->localDate = info.created();
+                    status->localSize = info.size();
+                    clearError();
+                }
+                else
+                {
+                    error(tr("error renaming file %1 to %2: %3")
+                          .arg(status->file->fileName())
+                          .arg(finalName)
+                          .arg(status->file->errorString()));
+                    status->file->close();
+                    status->file->remove();
+                }
             }
             delete status->file;
             status->file = nullptr;
diff --git a/src/gis/rte/router/brouter/CRouterBRouterToolShell.cpp b/src/gis/rte/router/brouter/CRouterBRouterToolShell.cpp
index 83ca087..2a00091 100644
--- a/src/gis/rte/router/brouter/CRouterBRouterToolShell.cpp
+++ b/src/gis/rte/router/brouter/CRouterBRouterToolShell.cpp
@@ -35,6 +35,7 @@ CRouterBRouterToolShell::~CRouterBRouterToolShell()
 
 void CRouterBRouterToolShell::start(const QString &dir, const QString &command, const QStringList &args)
 {
+    isBeingKilled = false;
     stdOut("cd " + dir);
     stdOut(command+" " + args.join(" ") + "\n");
     cmd.setWorkingDirectory(dir);
@@ -46,12 +47,11 @@ void CRouterBRouterToolShell::stop()
 {
     if (cmd.state() != QProcess::NotRunning)
     {
-#if defined(Q_OS_MAC) || defined(Q_OS_LINUX) || defined(Q_OS_FREEBSD) || defined(__FreeBSD_kernel__) || defined(__GNU__)
-        cmd.terminate();
-#elif defined (Q_OS_WIN32)
+#ifdef USE_KILL_FOR_SHUTDOWN
+        isBeingKilled = true;
         cmd.kill();
 #else
-  #error OS not supported
+        cmd.terminate();
 #endif
     }
 }
@@ -63,6 +63,10 @@ void CRouterBRouterToolShell::slotStateChanged(const QProcess::ProcessState newS
 
 void CRouterBRouterToolShell::slotError(const QProcess::ProcessError error) const
 {
+    if (isBeingKilled)
+    {
+        return;
+    }
     emit sigProcessError(error, cmd.errorString());
 }
 
diff --git a/src/gis/rte/router/brouter/CRouterBRouterToolShell.h b/src/gis/rte/router/brouter/CRouterBRouterToolShell.h
index b4366c0..99c9ebe 100644
--- a/src/gis/rte/router/brouter/CRouterBRouterToolShell.h
+++ b/src/gis/rte/router/brouter/CRouterBRouterToolShell.h
@@ -21,6 +21,10 @@
 
 #include "tool/IToolShell.h"
 
+#if defined (Q_OS_WIN32)
+#define USE_KILL_FOR_SHUTDOWN
+#endif
+
 class CRouterBRouterToolShell : public IToolShell
 {
     Q_OBJECT
@@ -41,6 +45,8 @@ private slots:
 
 private:
     void finished(int exitCode, QProcess::ExitStatus status) override;
+
+    bool isBeingKilled { false };
 };
 
 #endif //CROUTERBROUTERTOOLSHELL_H
diff --git a/src/gis/rte/router/brouter/IRouterBRouterSetupWizard.ui b/src/gis/rte/router/brouter/IRouterBRouterSetupWizard.ui
index 9dbe0c7..fe201d2 100644
--- a/src/gis/rte/router/brouter/IRouterBRouterSetupWizard.ui
+++ b/src/gis/rte/router/brouter/IRouterBRouterSetupWizard.ui
@@ -106,7 +106,7 @@
          <string>...</string>
         </property>
         <property name="icon">
-         <iconset resource="../../../resources.qrc">
+         <iconset resource="../../../../resources.qrc">
           <normaloff>:/icons/32x32/PathBlue.png</normaloff>:/icons/32x32/PathBlue.png</iconset>
         </property>
        </widget>
@@ -162,7 +162,7 @@
          <string>...</string>
         </property>
         <property name="icon">
-         <iconset resource="../../../resources.qrc">
+         <iconset resource="../../../../resources.qrc">
           <normaloff>:/icons/32x32/PathBlue.png</normaloff>:/icons/32x32/PathBlue.png</iconset>
         </property>
        </widget>
@@ -342,7 +342,7 @@
            <string>...</string>
           </property>
           <property name="icon">
-           <iconset resource="../../../resources.qrc">
+           <iconset resource="../../../../resources.qrc">
             <normaloff>:/icons/32x32/Right.png</normaloff>:/icons/32x32/Right.png</iconset>
           </property>
          </widget>
@@ -356,7 +356,7 @@
            <string>...</string>
           </property>
           <property name="icon">
-           <iconset resource="../../../resources.qrc">
+           <iconset resource="../../../../resources.qrc">
             <normaloff>:/icons/32x32/Left.png</normaloff>:/icons/32x32/Left.png</iconset>
           </property>
          </widget>
@@ -389,7 +389,7 @@
            <string>...</string>
           </property>
           <property name="icon">
-           <iconset resource="../../../resources.qrc">
+           <iconset resource="../../../../resources.qrc">
             <normaloff>:/icons/32x32/Up.png</normaloff>:/icons/32x32/Up.png</iconset>
           </property>
          </widget>
@@ -400,7 +400,7 @@
            <string>...</string>
           </property>
           <property name="icon">
-           <iconset resource="../../../resources.qrc">
+           <iconset resource="../../../../resources.qrc">
             <normaloff>:/icons/32x32/Down.png</normaloff>:/icons/32x32/Down.png</iconset>
           </property>
          </widget>
@@ -432,7 +432,7 @@
     <string notr="true">4</string>
    </attribute>
   </widget>
-  <widget class="CRouterBRouterSetupPage" name="pageOnlineUrl">
+  <widget class="QWizardPage" name="pageOnlineUrl">
    <property name="sizePolicy">
     <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
      <horstretch>0</horstretch>
@@ -532,7 +532,7 @@
     </item>
    </layout>
   </widget>
-  <widget class="CRouterBRouterSetupPage" name="pageLocalDetails">
+  <widget class="QWizardPage" name="pageLocalDetails">
    <property name="sizePolicy">
     <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
      <horstretch>0</horstretch>
diff --git a/src/icons/32x32/CutHistory.png b/src/icons/32x32/CutHistory.png
deleted file mode 100644
index d607999..0000000
Binary files a/src/icons/32x32/CutHistory.png and /dev/null differ
diff --git a/src/icons/32x32/CutHistoryAfter.png b/src/icons/32x32/CutHistoryAfter.png
new file mode 100644
index 0000000..82acf6d
Binary files /dev/null and b/src/icons/32x32/CutHistoryAfter.png differ
diff --git a/src/icons/32x32/CutHistoryBefore.png b/src/icons/32x32/CutHistoryBefore.png
new file mode 100644
index 0000000..a6b8bc6
Binary files /dev/null and b/src/icons/32x32/CutHistoryBefore.png differ
diff --git a/src/icons/48x48/CutHistory.png b/src/icons/48x48/CutHistory.png
deleted file mode 100644
index 8a9a6d3..0000000
Binary files a/src/icons/48x48/CutHistory.png and /dev/null differ
diff --git a/src/icons/48x48/CutHistoryAfter.png b/src/icons/48x48/CutHistoryAfter.png
new file mode 100644
index 0000000..b67f82c
Binary files /dev/null and b/src/icons/48x48/CutHistoryAfter.png differ
diff --git a/src/icons/48x48/CutHistoryBefore.png b/src/icons/48x48/CutHistoryBefore.png
new file mode 100644
index 0000000..d5cb4eb
Binary files /dev/null and b/src/icons/48x48/CutHistoryBefore.png differ
diff --git a/src/icons/CutHistory.svg b/src/icons/CutHistoryAfter.svg
similarity index 79%
copy from src/icons/CutHistory.svg
copy to src/icons/CutHistoryAfter.svg
index 6c307a1..eafbe5c 100644
--- a/src/icons/CutHistory.svg
+++ b/src/icons/CutHistoryAfter.svg
@@ -13,8 +13,8 @@
    height="64px"
    id="svg3513"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="CutHistory.svg">
+   inkscape:version="0.92.0 r15299"
+   sodipodi:docname="CutHistoryAfter.svg">
   <defs
      id="defs3515" />
   <sodipodi:namedview
@@ -24,17 +24,17 @@
      borderopacity="1.0"
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
-     inkscape:zoom="11"
-     inkscape:cx="-12.101692"
-     inkscape:cy="28.929652"
+     inkscape:zoom="7.7781746"
+     inkscape:cx="27.708419"
+     inkscape:cy="42.604809"
      inkscape:current-layer="layer1"
      showgrid="true"
      inkscape:document-units="px"
      inkscape:grid-bbox="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="996"
-     inkscape:window-x="-2"
-     inkscape:window-y="-3"
+     inkscape:window-width="1280"
+     inkscape:window-height="971"
+     inkscape:window-x="1432"
+     inkscape:window-y="-8"
      inkscape:window-maximized="1">
     <inkscape:grid
        type="xygrid"
@@ -69,7 +69,7 @@
          sodipodi:open="true"
          sodipodi:end="12.08609"
          sodipodi:start="5.8033439"
-         d="m 25.548273,41.153446 c 1.019823,1.959657 0.257938,4.375003 -1.701719,5.394827 -1.959657,1.019823 -4.375003,0.257938 -5.394827,-1.701719 -1.019823,-1.959657 -0.257938,-4.375003 1.701719,-5.394827 1.959048,-1.019506 4.373648,-0.25844 5.394015,1.700161"
+         d="m 25.548273,41.153446 a 4,4 0 0 1 -1.701329,5.394624 4,4 0 0 1 -5.394811,-1.700737 4,4 0 0 1 1.700144,-5.394997 4,4 0 0 1 5.395184,1.699552"
          sodipodi:ry="4"
          sodipodi:rx="4"
          sodipodi:cy="43"
@@ -113,7 +113,7 @@
          sodipodi:open="true"
          sodipodi:end="12.08609"
          sodipodi:start="5.8033439"
-         d="m 25.548273,41.153446 c 1.019823,1.959657 0.257938,4.375003 -1.701719,5.394827 -1.959657,1.019823 -4.375003,0.257938 -5.394827,-1.701719 -1.019823,-1.959657 -0.257938,-4.375003 1.701719,-5.394827 1.959048,-1.019506 4.373648,-0.25844 5.394015,1.700161"
+         d="m 25.548273,41.153446 a 4,4 0 0 1 -1.701329,5.394624 4,4 0 0 1 -5.394811,-1.700737 4,4 0 0 1 1.700144,-5.394997 4,4 0 0 1 5.395184,1.699552"
          sodipodi:ry="4"
          sodipodi:rx="4"
          sodipodi:cy="43"
@@ -126,7 +126,7 @@
          sodipodi:open="true"
          sodipodi:end="12.08609"
          sodipodi:start="5.8033439"
-         d="m 31.887068,31.538362 c 0.254956,0.489914 0.06449,1.09375 -0.42543,1.348706 -0.489914,0.254956 -1.09375,0.06448 -1.348706,-0.42543 -0.254956,-0.489914 -0.06449,-1.09375 0.42543,-1.348706 0.489762,-0.254877 1.093411,-0.06461 1.348503,0.42504"
+         d="m 31.887068,31.538362 a 1,1 0 0 1 -0.425332,1.348655 1,1 0 0 1 -1.348703,-0.425184 1,1 0 0 1 0.425036,-1.348749 1,1 0 0 1 1.348796,0.424888"
          sodipodi:ry="1"
          sodipodi:rx="1"
          sodipodi:cy="32"
@@ -135,5 +135,21 @@
          style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
          sodipodi:type="arc" />
     </g>
+    <g
+       id="g4521"
+       transform="matrix(1.1363636,0,0,1,60.454545,5.9999983)">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path4502"
+         d="m -40,20 22,18"
+         style="fill:none;stroke:#ff0000;stroke-width:2.26771665;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path4502-1"
+         d="M -18,20 -40,38"
+         style="fill:none;stroke:#ff0000;stroke-width:2.26771665;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
   </g>
 </svg>
diff --git a/src/icons/CutHistory.svg b/src/icons/CutHistoryBefore.svg
similarity index 80%
rename from src/icons/CutHistory.svg
rename to src/icons/CutHistoryBefore.svg
index 6c307a1..874967c 100644
--- a/src/icons/CutHistory.svg
+++ b/src/icons/CutHistoryBefore.svg
@@ -13,8 +13,8 @@
    height="64px"
    id="svg3513"
    version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="CutHistory.svg">
+   inkscape:version="0.92.0 r15299"
+   sodipodi:docname="CutHistoryBefore.svg">
   <defs
      id="defs3515" />
   <sodipodi:namedview
@@ -25,16 +25,16 @@
      inkscape:pageopacity="0.0"
      inkscape:pageshadow="2"
      inkscape:zoom="11"
-     inkscape:cx="-12.101692"
+     inkscape:cx="32.094451"
      inkscape:cy="28.929652"
      inkscape:current-layer="layer1"
      showgrid="true"
      inkscape:document-units="px"
      inkscape:grid-bbox="true"
-     inkscape:window-width="1920"
-     inkscape:window-height="996"
-     inkscape:window-x="-2"
-     inkscape:window-y="-3"
+     inkscape:window-width="1280"
+     inkscape:window-height="971"
+     inkscape:window-x="1432"
+     inkscape:window-y="-8"
      inkscape:window-maximized="1">
     <inkscape:grid
        type="xygrid"
@@ -69,7 +69,7 @@
          sodipodi:open="true"
          sodipodi:end="12.08609"
          sodipodi:start="5.8033439"
-         d="m 25.548273,41.153446 c 1.019823,1.959657 0.257938,4.375003 -1.701719,5.394827 -1.959657,1.019823 -4.375003,0.257938 -5.394827,-1.701719 -1.019823,-1.959657 -0.257938,-4.375003 1.701719,-5.394827 1.959048,-1.019506 4.373648,-0.25844 5.394015,1.700161"
+         d="m 25.548273,41.153446 a 4,4 0 0 1 -1.701329,5.394624 4,4 0 0 1 -5.394811,-1.700737 4,4 0 0 1 1.700144,-5.394997 4,4 0 0 1 5.395184,1.699552"
          sodipodi:ry="4"
          sodipodi:rx="4"
          sodipodi:cy="43"
@@ -113,7 +113,7 @@
          sodipodi:open="true"
          sodipodi:end="12.08609"
          sodipodi:start="5.8033439"
-         d="m 25.548273,41.153446 c 1.019823,1.959657 0.257938,4.375003 -1.701719,5.394827 -1.959657,1.019823 -4.375003,0.257938 -5.394827,-1.701719 -1.019823,-1.959657 -0.257938,-4.375003 1.701719,-5.394827 1.959048,-1.019506 4.373648,-0.25844 5.394015,1.700161"
+         d="m 25.548273,41.153446 a 4,4 0 0 1 -1.701329,5.394624 4,4 0 0 1 -5.394811,-1.700737 4,4 0 0 1 1.700144,-5.394997 4,4 0 0 1 5.395184,1.699552"
          sodipodi:ry="4"
          sodipodi:rx="4"
          sodipodi:cy="43"
@@ -126,7 +126,7 @@
          sodipodi:open="true"
          sodipodi:end="12.08609"
          sodipodi:start="5.8033439"
-         d="m 31.887068,31.538362 c 0.254956,0.489914 0.06449,1.09375 -0.42543,1.348706 -0.489914,0.254956 -1.09375,0.06448 -1.348706,-0.42543 -0.254956,-0.489914 -0.06449,-1.09375 0.42543,-1.348706 0.489762,-0.254877 1.093411,-0.06461 1.348503,0.42504"
+         d="m 31.887068,31.538362 a 1,1 0 0 1 -0.425332,1.348655 1,1 0 0 1 -1.348703,-0.425184 1,1 0 0 1 0.425036,-1.348749 1,1 0 0 1 1.348796,0.424888"
          sodipodi:ry="1"
          sodipodi:rx="1"
          sodipodi:cy="32"
@@ -135,5 +135,21 @@
          style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
          sodipodi:type="arc" />
     </g>
+    <g
+       id="g4521"
+       transform="translate(56,-15)">
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path4502"
+         d="m -40,20 22,18"
+         style="fill:none;stroke:#ff0000;stroke-width:2.26771665;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+      <path
+         sodipodi:nodetypes="cc"
+         inkscape:connector-curvature="0"
+         id="path4502-1"
+         d="M -18,20 -40,38"
+         style="fill:none;stroke:#ff0000;stroke-width:2.26771665;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    </g>
   </g>
 </svg>
diff --git a/src/locale/qmapshack.ts b/src/locale/qmapshack.ts
index db82d98..8d4b454 100644
--- a/src/locale/qmapshack.ts
+++ b/src/locale/qmapshack.ts
@@ -122,7 +122,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../canvas/CCanvas.cpp" line="693"/>
+        <location filename="../canvas/CCanvas.cpp" line="695"/>
         <source>Setup Map Background</source>
         <translation type="unfinished"></translation>
     </message>
@@ -724,7 +724,7 @@ To solve this conflict you can create and save a clone, force your version or dr
 <context>
     <name>CFitDecoder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="116"/>
+        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="119"/>
         <source>FIT decoding error: unexpected end of file %1.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -732,12 +732,25 @@ To solve this conflict you can create and save a clone, force your version or dr
 <context>
     <name>CFitFieldBuilder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="70"/>
+        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="77"/>
         <source>FIT decoding error: unknown base type %1.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
+    <name>CFitFieldDataState</name>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="115"/>
+        <source>Missing field definition for development field.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="207"/>
+        <source>FIT decoding error: invalid field def nr %1 while creating dev field profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>CFitHeaderState</name>
     <message>
         <location filename="../gis/fit/decoder/CFitHeaderState.cpp" line="69"/>
@@ -766,12 +779,12 @@ To solve this conflict you can create and save a clone, force your version or dr
 <context>
     <name>CFitRecordContentState</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="66"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="70"/>
         <source>FIT decoding error: architecture %1 not supported.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="87"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="107"/>
         <source>FIT decoding error: invalid offset %1 for state 'record content'</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1870,13 +1883,28 @@ line %2, column %3:
 <context>
     <name>CHistoryListWidget</name>
     <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="34"/>
-        <source>Cut history</source>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="62"/>
+        <source> by %1</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="61"/>
-        <source> by %1</source>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="108"/>
+        <source>Cut history before</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="113"/>
+        <source>Cut history after</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="161"/>
+        <source>History removal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="162"/>
+        <source>The removal is permanent and cannot be undone. <b>Do you really want to delete history before this step?</b></source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -6107,10 +6135,15 @@ If you want to keep just one half you can simply remove the points, or check thi
 <context>
     <name>IFitDecoderState</name>
     <message>
-        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="32"/>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="31"/>
         <source>FIT decoding error: Decoder not in correct state %1 after last data byte in file.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="124"/>
+        <source>FIT decoding error: a development field with the field_definition_number %1 already exists.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>IGisItem</name>
@@ -6146,56 +6179,56 @@ It is either a new item or it has been deleted in the database by someone else.<
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="521"/>
+        <location filename="../gis/IGisItem.cpp" line="529"/>
         <source><h3>%1</h3> This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press 'Ok'.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="522"/>
+        <location filename="../gis/IGisItem.cpp" line="530"/>
         <source>Read Only Mode...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="692"/>
-        <location filename="../gis/IGisItem.cpp" line="745"/>
+        <location filename="../gis/IGisItem.cpp" line="700"/>
+        <location filename="../gis/IGisItem.cpp" line="753"/>
         <source><h4>Description:</h4></source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="695"/>
-        <location filename="../gis/IGisItem.cpp" line="748"/>
+        <location filename="../gis/IGisItem.cpp" line="703"/>
+        <location filename="../gis/IGisItem.cpp" line="756"/>
         <source><p>--- no description ---</p></source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="706"/>
+        <location filename="../gis/IGisItem.cpp" line="714"/>
         <source><h4>Comment:</h4></source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="709"/>
+        <location filename="../gis/IGisItem.cpp" line="717"/>
         <source><p>--- no comment ---</p></source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="720"/>
-        <location filename="../gis/IGisItem.cpp" line="759"/>
+        <location filename="../gis/IGisItem.cpp" line="728"/>
+        <location filename="../gis/IGisItem.cpp" line="767"/>
         <source><h4>Links:</h4></source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="723"/>
-        <location filename="../gis/IGisItem.cpp" line="762"/>
+        <location filename="../gis/IGisItem.cpp" line="731"/>
+        <location filename="../gis/IGisItem.cpp" line="770"/>
         <source><p>--- no links ---</p></source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Edit name...</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Enter new %1 name.</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/src/locale/qmapshack_cs.ts b/src/locale/qmapshack_cs.ts
index 3abd684..116706e 100644
--- a/src/locale/qmapshack_cs.ts
+++ b/src/locale/qmapshack_cs.ts
@@ -122,7 +122,7 @@
         <translation>Pohled %1</translation>
     </message>
     <message>
-        <location filename="../canvas/CCanvas.cpp" line="693"/>
+        <location filename="../canvas/CCanvas.cpp" line="695"/>
         <source>Setup Map Background</source>
         <translation>Nastavit pozadí mapy</translation>
     </message>
@@ -728,7 +728,7 @@ K vyřešení tohoto střetu můžete vytvořit a uložit klona, vynutit svoji v
 <context>
     <name>CFitDecoder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="116"/>
+        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="119"/>
         <source>FIT decoding error: unexpected end of file %1.</source>
         <translation>Chyba při dekódování FIT: Neočekávaný konec souboru %1.</translation>
     </message>
@@ -736,12 +736,25 @@ K vyřešení tohoto střetu můžete vytvořit a uložit klona, vynutit svoji v
 <context>
     <name>CFitFieldBuilder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="70"/>
+        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="77"/>
         <source>FIT decoding error: unknown base type %1.</source>
         <translation>Chyba při dekódování FIT: Neznámý datový typ %1.</translation>
     </message>
 </context>
 <context>
+    <name>CFitFieldDataState</name>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="115"/>
+        <source>Missing field definition for development field.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="207"/>
+        <source>FIT decoding error: invalid field def nr %1 while creating dev field profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>CFitHeaderState</name>
     <message>
         <location filename="../gis/fit/decoder/CFitHeaderState.cpp" line="69"/>
@@ -770,12 +783,12 @@ K vyřešení tohoto střetu můžete vytvořit a uložit klona, vynutit svoji v
 <context>
     <name>CFitRecordContentState</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="66"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="70"/>
         <source>FIT decoding error: architecture %1 not supported.</source>
         <translation>Chyba při dekódování FIT: Architektura %1 není podporována.</translation>
     </message>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="87"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="107"/>
         <source>FIT decoding error: invalid offset %1 for state 'record content'</source>
         <translation>Chyba při dekódování FIT: Neplatný posun %1 pro stav 'zaznamenaný obsah'</translation>
     </message>
@@ -1876,15 +1889,30 @@ line %2, column %3:
 <context>
     <name>CHistoryListWidget</name>
     <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="34"/>
-        <source>Cut history</source>
-        <translation>Vyjmout historii</translation>
-    </message>
-    <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="61"/>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="62"/>
         <source> by %1</source>
         <translation> od %1</translation>
     </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="108"/>
+        <source>Cut history before</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="113"/>
+        <source>Cut history after</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="161"/>
+        <source>History removal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="162"/>
+        <source>The removal is permanent and cannot be undone. <b>Do you really want to delete history before this step?</b></source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>CImportDatabase</name>
@@ -6137,10 +6165,15 @@ Pokud chcete zachovat pouze jednu polovinu, můžete jednoduše odstranit body,
 <context>
     <name>IFitDecoderState</name>
     <message>
-        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="32"/>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="31"/>
         <source>FIT decoding error: Decoder not in correct state %1 after last data byte in file.</source>
         <translation>Chyba při dekódování FIT: Nesprávný stav dekodéru %1 po posledním bytu dat v souboru.</translation>
     </message>
+    <message>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="124"/>
+        <source>FIT decoding error: a development field with the field_definition_number %1 already exists.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>IGisItem</name>
@@ -6177,56 +6210,56 @@ Buď je to nový symbol nebo byl v databázi někým smazán.</translation>
         <translation>Počáteční verze.</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="521"/>
+        <location filename="../gis/IGisItem.cpp" line="529"/>
         <source><h3>%1</h3> This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press 'Ok'.</source>
         <translation><h3>%1</h3> Tento prvek je pravděpodobně pouze pro čtení, protože nebyl vytvořen v programu QMapShack. Obvykle nemáte zájem měnit zavedená data. Ale pokud si myslíte, že je to tentokrát na místě, stiskněte OK.</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="522"/>
+        <location filename="../gis/IGisItem.cpp" line="530"/>
         <source>Read Only Mode...</source>
         <translation>Režim pouze pro čtení...</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="692"/>
-        <location filename="../gis/IGisItem.cpp" line="745"/>
+        <location filename="../gis/IGisItem.cpp" line="700"/>
+        <location filename="../gis/IGisItem.cpp" line="753"/>
         <source><h4>Description:</h4></source>
         <translation><h4>Popis:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="695"/>
-        <location filename="../gis/IGisItem.cpp" line="748"/>
+        <location filename="../gis/IGisItem.cpp" line="703"/>
+        <location filename="../gis/IGisItem.cpp" line="756"/>
         <source><p>--- no description ---</p></source>
         <translation><p>--- žádný popis ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="706"/>
+        <location filename="../gis/IGisItem.cpp" line="714"/>
         <source><h4>Comment:</h4></source>
         <translation><h4>Poznámka:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="709"/>
+        <location filename="../gis/IGisItem.cpp" line="717"/>
         <source><p>--- no comment ---</p></source>
         <translation><p>--- žádná poznámka ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="720"/>
-        <location filename="../gis/IGisItem.cpp" line="759"/>
+        <location filename="../gis/IGisItem.cpp" line="728"/>
+        <location filename="../gis/IGisItem.cpp" line="767"/>
         <source><h4>Links:</h4></source>
         <translation><h4>Odkazy:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="723"/>
-        <location filename="../gis/IGisItem.cpp" line="762"/>
+        <location filename="../gis/IGisItem.cpp" line="731"/>
+        <location filename="../gis/IGisItem.cpp" line="770"/>
         <source><p>--- no links ---</p></source>
         <translation><p>--- žádné odkazy ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Edit name...</source>
         <translation>Upravit název...</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Enter new %1 name.</source>
         <translation>Zadat nový název %1.</translation>
     </message>
diff --git a/src/locale/qmapshack_de.ts b/src/locale/qmapshack_de.ts
index 68b56e3..c9525b7 100644
--- a/src/locale/qmapshack_de.ts
+++ b/src/locale/qmapshack_de.ts
@@ -122,7 +122,7 @@
         <translation>Ansicht %1</translation>
     </message>
     <message>
-        <location filename="../canvas/CCanvas.cpp" line="693"/>
+        <location filename="../canvas/CCanvas.cpp" line="695"/>
         <source>Setup Map Background</source>
         <translation>Kartenhintergrund einstellen</translation>
     </message>
@@ -728,7 +728,7 @@ Um den Konflikt zu lösen, erstellen und speichern Sie einen Klon, erzwingen Ihr
 <context>
     <name>CFitDecoder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="116"/>
+        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="119"/>
         <source>FIT decoding error: unexpected end of file %1.</source>
         <translation>FIT Dekodierfehler: Unerwartetes Ende der Datei %1.</translation>
     </message>
@@ -736,12 +736,25 @@ Um den Konflikt zu lösen, erstellen und speichern Sie einen Klon, erzwingen Ihr
 <context>
     <name>CFitFieldBuilder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="70"/>
+        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="77"/>
         <source>FIT decoding error: unknown base type %1.</source>
         <translation>FIT Dekodierfehler: Unbekannter Datentyp %1.</translation>
     </message>
 </context>
 <context>
+    <name>CFitFieldDataState</name>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="115"/>
+        <source>Missing field definition for development field.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="207"/>
+        <source>FIT decoding error: invalid field def nr %1 while creating dev field profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>CFitHeaderState</name>
     <message>
         <location filename="../gis/fit/decoder/CFitHeaderState.cpp" line="69"/>
@@ -770,12 +783,12 @@ Um den Konflikt zu lösen, erstellen und speichern Sie einen Klon, erzwingen Ihr
 <context>
     <name>CFitRecordContentState</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="66"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="70"/>
         <source>FIT decoding error: architecture %1 not supported.</source>
         <translation>FIT Dekodierfehler: Architektur %1 wird nicht unterstützt.</translation>
     </message>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="87"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="107"/>
         <source>FIT decoding error: invalid offset %1 for state 'record content'</source>
         <translation>FIT Dekodierfehler: Ungültiger Offset %1 für Status 'aufgezeichneter Inhalt'</translation>
     </message>
@@ -1876,15 +1889,30 @@ Zeile %2, Spalte %3:
 <context>
     <name>CHistoryListWidget</name>
     <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="34"/>
-        <source>Cut history</source>
-        <translation>Historie kürzen</translation>
-    </message>
-    <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="61"/>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="62"/>
         <source> by %1</source>
         <translation> von %1</translation>
     </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="108"/>
+        <source>Cut history before</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="113"/>
+        <source>Cut history after</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="161"/>
+        <source>History removal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="162"/>
+        <source>The removal is permanent and cannot be undone. <b>Do you really want to delete history before this step?</b></source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>CImportDatabase</name>
@@ -6139,10 +6167,15 @@ Wenn Sie nur die eine Hälfte behalten wollen, können Sie einfach die Punkte l
 <context>
     <name>IFitDecoderState</name>
     <message>
-        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="32"/>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="31"/>
         <source>FIT decoding error: Decoder not in correct state %1 after last data byte in file.</source>
         <translation>FIT Dekodierfehler: Nicht zutreffender Dekoderstatus %1 nach dem letzten Datenbyte der Datei.</translation>
     </message>
+    <message>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="124"/>
+        <source>FIT decoding error: a development field with the field_definition_number %1 already exists.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>IGisItem</name>
@@ -6178,56 +6211,56 @@ It is either a new item or it has been deleted in the database by someone else.<
         <translation>Erstversion.</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="521"/>
+        <location filename="../gis/IGisItem.cpp" line="529"/>
         <source><h3>%1</h3> This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press 'Ok'.</source>
         <translation><h3>%1</h3> Diese Element ist vermutlich schreibgeschützt, da nicht mit QMapShack erstellt. Normalerweise sollten importierte Daten nicht geändert werden. Wenn doch, drücken Sie 'OK'.</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="522"/>
+        <location filename="../gis/IGisItem.cpp" line="530"/>
         <source>Read Only Mode...</source>
         <translation>Schreibgeschützt...</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="692"/>
-        <location filename="../gis/IGisItem.cpp" line="745"/>
+        <location filename="../gis/IGisItem.cpp" line="700"/>
+        <location filename="../gis/IGisItem.cpp" line="753"/>
         <source><h4>Description:</h4></source>
         <translation><h4>Beschreibung:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="695"/>
-        <location filename="../gis/IGisItem.cpp" line="748"/>
+        <location filename="../gis/IGisItem.cpp" line="703"/>
+        <location filename="../gis/IGisItem.cpp" line="756"/>
         <source><p>--- no description ---</p></source>
         <translation><p>--- keine Beschreibung ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="706"/>
+        <location filename="../gis/IGisItem.cpp" line="714"/>
         <source><h4>Comment:</h4></source>
         <translation><h4>Kommentar:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="709"/>
+        <location filename="../gis/IGisItem.cpp" line="717"/>
         <source><p>--- no comment ---</p></source>
         <translation><p>--- kein Kommentar ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="720"/>
-        <location filename="../gis/IGisItem.cpp" line="759"/>
+        <location filename="../gis/IGisItem.cpp" line="728"/>
+        <location filename="../gis/IGisItem.cpp" line="767"/>
         <source><h4>Links:</h4></source>
         <translation><h4>Verknüpfungen:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="723"/>
-        <location filename="../gis/IGisItem.cpp" line="762"/>
+        <location filename="../gis/IGisItem.cpp" line="731"/>
+        <location filename="../gis/IGisItem.cpp" line="770"/>
         <source><p>--- no links ---</p></source>
         <translation><p>--- keine Verknüpfungen---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Edit name...</source>
         <translation>Name bearbeiten...</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Enter new %1 name.</source>
         <translation>Geben Sie einen neuen %1namen ein.</translation>
     </message>
diff --git a/src/locale/qmapshack_es.ts b/src/locale/qmapshack_es.ts
index 49783f0..d676801 100644
--- a/src/locale/qmapshack_es.ts
+++ b/src/locale/qmapshack_es.ts
@@ -122,7 +122,7 @@
         <translation>Vista %1</translation>
     </message>
     <message>
-        <location filename="../canvas/CCanvas.cpp" line="693"/>
+        <location filename="../canvas/CCanvas.cpp" line="695"/>
         <source>Setup Map Background</source>
         <translation type="unfinished"></translation>
     </message>
@@ -724,7 +724,7 @@ To solve this conflict you can create and save a clone, force your version or dr
 <context>
     <name>CFitDecoder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="116"/>
+        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="119"/>
         <source>FIT decoding error: unexpected end of file %1.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -732,12 +732,25 @@ To solve this conflict you can create and save a clone, force your version or dr
 <context>
     <name>CFitFieldBuilder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="70"/>
+        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="77"/>
         <source>FIT decoding error: unknown base type %1.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
+    <name>CFitFieldDataState</name>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="115"/>
+        <source>Missing field definition for development field.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="207"/>
+        <source>FIT decoding error: invalid field def nr %1 while creating dev field profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>CFitHeaderState</name>
     <message>
         <location filename="../gis/fit/decoder/CFitHeaderState.cpp" line="69"/>
@@ -766,12 +779,12 @@ To solve this conflict you can create and save a clone, force your version or dr
 <context>
     <name>CFitRecordContentState</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="66"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="70"/>
         <source>FIT decoding error: architecture %1 not supported.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="87"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="107"/>
         <source>FIT decoding error: invalid offset %1 for state 'record content'</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1872,13 +1885,28 @@ línea %2, columna %3.
 <context>
     <name>CHistoryListWidget</name>
     <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="34"/>
-        <source>Cut history</source>
-        <translation>Cortar historial</translation>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="62"/>
+        <source> by %1</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="61"/>
-        <source> by %1</source>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="108"/>
+        <source>Cut history before</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="113"/>
+        <source>Cut history after</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="161"/>
+        <source>History removal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="162"/>
+        <source>The removal is permanent and cannot be undone. <b>Do you really want to delete history before this step?</b></source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -6122,10 +6150,15 @@ If you want to keep just one half you can simply remove the points, or check thi
 <context>
     <name>IFitDecoderState</name>
     <message>
-        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="32"/>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="31"/>
         <source>FIT decoding error: Decoder not in correct state %1 after last data byte in file.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="124"/>
+        <source>FIT decoding error: a development field with the field_definition_number %1 already exists.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>IGisItem</name>
@@ -6161,56 +6194,56 @@ It is either a new item or it has been deleted in the database by someone else.<
         <translation type="unfinished">Versión inicial</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="521"/>
+        <location filename="../gis/IGisItem.cpp" line="529"/>
         <source><h3>%1</h3> This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press 'Ok'.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="522"/>
+        <location filename="../gis/IGisItem.cpp" line="530"/>
         <source>Read Only Mode...</source>
         <translation type="unfinished">Modo Sólo Lectura...</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="692"/>
-        <location filename="../gis/IGisItem.cpp" line="745"/>
+        <location filename="../gis/IGisItem.cpp" line="700"/>
+        <location filename="../gis/IGisItem.cpp" line="753"/>
         <source><h4>Description:</h4></source>
         <translation type="unfinished"><h4>Descripción:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="695"/>
-        <location filename="../gis/IGisItem.cpp" line="748"/>
+        <location filename="../gis/IGisItem.cpp" line="703"/>
+        <location filename="../gis/IGisItem.cpp" line="756"/>
         <source><p>--- no description ---</p></source>
         <translation type="unfinished"><p>---sin descripción---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="706"/>
+        <location filename="../gis/IGisItem.cpp" line="714"/>
         <source><h4>Comment:</h4></source>
         <translation type="unfinished"><h4>Comentario:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="709"/>
+        <location filename="../gis/IGisItem.cpp" line="717"/>
         <source><p>--- no comment ---</p></source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="720"/>
-        <location filename="../gis/IGisItem.cpp" line="759"/>
+        <location filename="../gis/IGisItem.cpp" line="728"/>
+        <location filename="../gis/IGisItem.cpp" line="767"/>
         <source><h4>Links:</h4></source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="723"/>
-        <location filename="../gis/IGisItem.cpp" line="762"/>
+        <location filename="../gis/IGisItem.cpp" line="731"/>
+        <location filename="../gis/IGisItem.cpp" line="770"/>
         <source><p>--- no links ---</p></source>
         <translation type="unfinished"><p>--- sin links ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Edit name...</source>
         <translation type="unfinished">Editar nombre...</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Enter new %1 name.</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/src/locale/qmapshack_fr.ts b/src/locale/qmapshack_fr.ts
index 32ee656..24e6012 100644
--- a/src/locale/qmapshack_fr.ts
+++ b/src/locale/qmapshack_fr.ts
@@ -122,7 +122,7 @@
         <translation>Vue %1</translation>
     </message>
     <message>
-        <location filename="../canvas/CCanvas.cpp" line="693"/>
+        <location filename="../canvas/CCanvas.cpp" line="695"/>
         <source>Setup Map Background</source>
         <translation>Réglage de l'arrière-plan de la carte</translation>
     </message>
@@ -728,7 +728,7 @@ Pour résoudre ce conflit vous pouvez créer et sauvegarder un clone, forcer vot
 <context>
     <name>CFitDecoder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="116"/>
+        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="119"/>
         <source>FIT decoding error: unexpected end of file %1.</source>
         <translation>erreur de décodage FIT : fin de fichier inatendue %1.</translation>
     </message>
@@ -736,12 +736,25 @@ Pour résoudre ce conflit vous pouvez créer et sauvegarder un clone, forcer vot
 <context>
     <name>CFitFieldBuilder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="70"/>
+        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="77"/>
         <source>FIT decoding error: unknown base type %1.</source>
         <translation>erreur de décodage FIT : type de base %1 inconnu.</translation>
     </message>
 </context>
 <context>
+    <name>CFitFieldDataState</name>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="115"/>
+        <source>Missing field definition for development field.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="207"/>
+        <source>FIT decoding error: invalid field def nr %1 while creating dev field profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>CFitHeaderState</name>
     <message>
         <location filename="../gis/fit/decoder/CFitHeaderState.cpp" line="69"/>
@@ -770,12 +783,12 @@ Pour résoudre ce conflit vous pouvez créer et sauvegarder un clone, forcer vot
 <context>
     <name>CFitRecordContentState</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="66"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="70"/>
         <source>FIT decoding error: architecture %1 not supported.</source>
         <translation>Erreur de décodage FIT : architecture %1 non supportée</translation>
     </message>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="87"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="107"/>
         <source>FIT decoding error: invalid offset %1 for state 'record content'</source>
         <translation>Erreur de décodage FIT : décalage invalide %1 pour l'état 'contenu d'enregistrement'</translation>
     </message>
@@ -1876,15 +1889,30 @@ ligne %2, colonne %3:
 <context>
     <name>CHistoryListWidget</name>
     <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="34"/>
-        <source>Cut history</source>
-        <translation>Tronquer l'historique</translation>
-    </message>
-    <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="61"/>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="62"/>
         <source> by %1</source>
         <translation>par %1</translation>
     </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="108"/>
+        <source>Cut history before</source>
+        <translation>Tronquer l'historique antérieur</translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="113"/>
+        <source>Cut history after</source>
+        <translation>Tronquer l'historique postérieur</translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="161"/>
+        <source>History removal</source>
+        <translation>Supression de l'historique</translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="162"/>
+        <source>The removal is permanent and cannot be undone. <b>Do you really want to delete history before this step?</b></source>
+        <translation>La suppression est permanente et ne peut être annulée. <b>Voulez-vous vraiment supprimer l'historique antérieur à cette étape ?</b></translation>
+    </message>
 </context>
 <context>
     <name>CImportDatabase</name>
@@ -6135,10 +6163,15 @@ Si vous voulez conserver seulement une moitié vous pouvez simplement enlever le
 <context>
     <name>IFitDecoderState</name>
     <message>
-        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="32"/>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="31"/>
         <source>FIT decoding error: Decoder not in correct state %1 after last data byte in file.</source>
         <translation>Error de décodage FIT : le décodeur n'est pas dans l'état attendu %1 après le dernier octet de donnée du fichier</translation>
     </message>
+    <message>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="124"/>
+        <source>FIT decoding error: a development field with the field_definition_number %1 already exists.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>IGisItem</name>
@@ -6174,56 +6207,56 @@ It is either a new item or it has been deleted in the database by someone else.<
         <translation>Version initiale</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="521"/>
+        <location filename="../gis/IGisItem.cpp" line="529"/>
         <source><h3>%1</h3> This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press 'Ok'.</source>
         <translation><h3>%1</h3>Cet élément est probablement en lecture seule car il n'a pas été créé dans QMapShack. En général les données importées ne sont pas modifiées par les utilisateurs. Mais si c'est bien votre intention cliquez 'OK'.</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="522"/>
+        <location filename="../gis/IGisItem.cpp" line="530"/>
         <source>Read Only Mode...</source>
         <translation>Mode lecture seule</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="692"/>
-        <location filename="../gis/IGisItem.cpp" line="745"/>
+        <location filename="../gis/IGisItem.cpp" line="700"/>
+        <location filename="../gis/IGisItem.cpp" line="753"/>
         <source><h4>Description:</h4></source>
         <translation><h4>Description:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="695"/>
-        <location filename="../gis/IGisItem.cpp" line="748"/>
+        <location filename="../gis/IGisItem.cpp" line="703"/>
+        <location filename="../gis/IGisItem.cpp" line="756"/>
         <source><p>--- no description ---</p></source>
         <translation><p>--- pas de description ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="706"/>
+        <location filename="../gis/IGisItem.cpp" line="714"/>
         <source><h4>Comment:</h4></source>
         <translation><h4>Commentaire:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="709"/>
+        <location filename="../gis/IGisItem.cpp" line="717"/>
         <source><p>--- no comment ---</p></source>
         <translation><p>--- pas de commentaire ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="720"/>
-        <location filename="../gis/IGisItem.cpp" line="759"/>
+        <location filename="../gis/IGisItem.cpp" line="728"/>
+        <location filename="../gis/IGisItem.cpp" line="767"/>
         <source><h4>Links:</h4></source>
         <translation><h4>Liens:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="723"/>
-        <location filename="../gis/IGisItem.cpp" line="762"/>
+        <location filename="../gis/IGisItem.cpp" line="731"/>
+        <location filename="../gis/IGisItem.cpp" line="770"/>
         <source><p>--- no links ---</p></source>
         <translation><p>--- pas de liens ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Edit name...</source>
         <translation>Éditer le nom...</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Enter new %1 name.</source>
         <translation>Entrez un nouveau %1 nom.</translation>
     </message>
diff --git a/src/locale/qmapshack_nl.ts b/src/locale/qmapshack_nl.ts
index cc19000..26b9773 100644
--- a/src/locale/qmapshack_nl.ts
+++ b/src/locale/qmapshack_nl.ts
@@ -122,7 +122,7 @@
         <translation>Venster %1</translation>
     </message>
     <message>
-        <location filename="../canvas/CCanvas.cpp" line="693"/>
+        <location filename="../canvas/CCanvas.cpp" line="695"/>
         <source>Setup Map Background</source>
         <translation type="unfinished"></translation>
     </message>
@@ -728,7 +728,7 @@ Om dit conflict op te lossen kan een kloon gemaakt en opgelagen worden, forceer
 <context>
     <name>CFitDecoder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="116"/>
+        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="119"/>
         <source>FIT decoding error: unexpected end of file %1.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -736,12 +736,25 @@ Om dit conflict op te lossen kan een kloon gemaakt en opgelagen worden, forceer
 <context>
     <name>CFitFieldBuilder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="70"/>
+        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="77"/>
         <source>FIT decoding error: unknown base type %1.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
+    <name>CFitFieldDataState</name>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="115"/>
+        <source>Missing field definition for development field.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="207"/>
+        <source>FIT decoding error: invalid field def nr %1 while creating dev field profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
     <name>CFitHeaderState</name>
     <message>
         <location filename="../gis/fit/decoder/CFitHeaderState.cpp" line="69"/>
@@ -770,12 +783,12 @@ Om dit conflict op te lossen kan een kloon gemaakt en opgelagen worden, forceer
 <context>
     <name>CFitRecordContentState</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="66"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="70"/>
         <source>FIT decoding error: architecture %1 not supported.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="87"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="107"/>
         <source>FIT decoding error: invalid offset %1 for state 'record content'</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1876,15 +1889,30 @@ lijn %2, kolom %3:
 <context>
     <name>CHistoryListWidget</name>
     <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="34"/>
-        <source>Cut history</source>
-        <translation>Historie wissen</translation>
-    </message>
-    <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="61"/>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="62"/>
         <source> by %1</source>
         <translation> per %1</translation>
     </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="108"/>
+        <source>Cut history before</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="113"/>
+        <source>Cut history after</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="161"/>
+        <source>History removal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="162"/>
+        <source>The removal is permanent and cannot be undone. <b>Do you really want to delete history before this step?</b></source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>CImportDatabase</name>
@@ -6138,10 +6166,15 @@ Als er alleen een halve track bewaard moet worden kunnen de overige punten verwi
 <context>
     <name>IFitDecoderState</name>
     <message>
-        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="32"/>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="31"/>
         <source>FIT decoding error: Decoder not in correct state %1 after last data byte in file.</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="124"/>
+        <source>FIT decoding error: a development field with the field_definition_number %1 already exists.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>IGisItem</name>
@@ -6177,56 +6210,56 @@ It is either a new item or it has been deleted in the database by someone else.<
         <translation>Orginele versie.</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="521"/>
+        <location filename="../gis/IGisItem.cpp" line="529"/>
         <source><h3>%1</h3> This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press 'Ok'.</source>
         <translation><h3>%1<h3>Dit element is waarschijnlijk alleen lezen omdat dit niet gemaakt is in QMapShack. Normaal hoeven geen gegevens aangepast te worden na het importeren.  Om toch aan te passen druk dan op 'OK'.</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="522"/>
+        <location filename="../gis/IGisItem.cpp" line="530"/>
         <source>Read Only Mode...</source>
         <translation>Alleen lezen modus...</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="692"/>
-        <location filename="../gis/IGisItem.cpp" line="745"/>
+        <location filename="../gis/IGisItem.cpp" line="700"/>
+        <location filename="../gis/IGisItem.cpp" line="753"/>
         <source><h4>Description:</h4></source>
         <translation><h4>Beschrijving:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="695"/>
-        <location filename="../gis/IGisItem.cpp" line="748"/>
+        <location filename="../gis/IGisItem.cpp" line="703"/>
+        <location filename="../gis/IGisItem.cpp" line="756"/>
         <source><p>--- no description ---</p></source>
         <translation><p>--- geen beschrijving ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="706"/>
+        <location filename="../gis/IGisItem.cpp" line="714"/>
         <source><h4>Comment:</h4></source>
         <translation><h4>Notitie:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="709"/>
+        <location filename="../gis/IGisItem.cpp" line="717"/>
         <source><p>--- no comment ---</p></source>
         <translation><p>--- geen notitie ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="720"/>
-        <location filename="../gis/IGisItem.cpp" line="759"/>
+        <location filename="../gis/IGisItem.cpp" line="728"/>
+        <location filename="../gis/IGisItem.cpp" line="767"/>
         <source><h4>Links:</h4></source>
         <translation><h4>Links:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="723"/>
-        <location filename="../gis/IGisItem.cpp" line="762"/>
+        <location filename="../gis/IGisItem.cpp" line="731"/>
+        <location filename="../gis/IGisItem.cpp" line="770"/>
         <source><p>--- no links ---</p></source>
         <translation><p>--- geen links ---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Edit name...</source>
         <translation type="unfinished">Bewerk naam...</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Enter new %1 name.</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/src/locale/qmapshack_ru.desktop b/src/locale/qmapshack_ru.desktop
index 7f15e0b..f4890ae 100644
--- a/src/locale/qmapshack_ru.desktop
+++ b/src/locale/qmapshack_ru.desktop
@@ -1,3 +1,3 @@
 #Translations
-Name[de]=QMapShack
-GenericName[de]= Администрация GPS данных и карт
\ No newline at end of file
+Name[ru]=QMapShack
+GenericName[ru]= Администрация GPS данных и карт
diff --git a/src/locale/qmapshack_ru.ts b/src/locale/qmapshack_ru.ts
index 5cf6208..4b0edf1 100644
--- a/src/locale/qmapshack_ru.ts
+++ b/src/locale/qmapshack_ru.ts
@@ -122,7 +122,7 @@
         <translation>Вид %1</translation>
     </message>
     <message>
-        <location filename="../canvas/CCanvas.cpp" line="693"/>
+        <location filename="../canvas/CCanvas.cpp" line="695"/>
         <source>Setup Map Background</source>
         <translation>Настройка фона карт</translation>
     </message>
@@ -728,7 +728,7 @@ To solve this conflict you can create and save a clone, force your version or dr
 <context>
     <name>CFitDecoder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="116"/>
+        <location filename="../gis/fit/decoder/CFitDecoder.cpp" line="119"/>
         <source>FIT decoding error: unexpected end of file %1.</source>
         <translation>Ошибка декодирования FIT: неожиданный конец файла %1.</translation>
     </message>
@@ -736,12 +736,25 @@ To solve this conflict you can create and save a clone, force your version or dr
 <context>
     <name>CFitFieldBuilder</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="70"/>
+        <location filename="../gis/fit/decoder/CFitFieldBuilder.cpp" line="77"/>
         <source>FIT decoding error: unknown base type %1.</source>
         <translation>Ошибка декодирования FIT: неизвестный базовый тип %1.</translation>
     </message>
 </context>
 <context>
+    <name>CFitFieldDataState</name>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="115"/>
+        <source>Missing field definition for development field.</source>
+        <translation>Отсутствует определение поля для поля развития.</translation>
+    </message>
+    <message>
+        <location filename="../gis/fit/decoder/CFitFieldDataState.cpp" line="207"/>
+        <source>FIT decoding error: invalid field def nr %1 while creating dev field profile.</source>
+        <translation>Ошибка декодирования FIT: неправильный номер определения поля %1 при создании профиля поля развития.</translation>
+    </message>
+</context>
+<context>
     <name>CFitHeaderState</name>
     <message>
         <location filename="../gis/fit/decoder/CFitHeaderState.cpp" line="69"/>
@@ -770,12 +783,12 @@ To solve this conflict you can create and save a clone, force your version or dr
 <context>
     <name>CFitRecordContentState</name>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="66"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="70"/>
         <source>FIT decoding error: architecture %1 not supported.</source>
         <translation>Ошибка декодирования FIT: архитектура %1 не поддерживается.</translation>
     </message>
     <message>
-        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="87"/>
+        <location filename="../gis/fit/decoder/CFitRecordContentState.cpp" line="107"/>
         <source>FIT decoding error: invalid offset %1 for state 'record content'</source>
         <translation>Ошибка декодирования FIT: неправильное смещение %1 для состояния 'содержимое записи'</translation>
     </message>
@@ -1876,15 +1889,30 @@ line %2, column %3:
 <context>
     <name>CHistoryListWidget</name>
     <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="34"/>
-        <source>Cut history</source>
-        <translation>Вырезать историю</translation>
-    </message>
-    <message>
-        <location filename="../widgets/CHistoryListWidget.cpp" line="61"/>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="62"/>
         <source> by %1</source>
         <translation>от %1</translation>
     </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="108"/>
+        <source>Cut history before</source>
+        <translation>Удалить историю до этого шага</translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="113"/>
+        <source>Cut history after</source>
+        <translation>Удалить историю после этого шага</translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="161"/>
+        <source>History removal</source>
+        <translation>Удалить историю</translation>
+    </message>
+    <message>
+        <location filename="../widgets/CHistoryListWidget.cpp" line="162"/>
+        <source>The removal is permanent and cannot be undone. <b>Do you really want to delete history before this step?</b></source>
+        <translation>Удаление является постоянным и не может быть отменено. <b>Вы действительно хотите удалить историю перед этим шагом?</b></translation>
+    </message>
 </context>
 <context>
     <name>CImportDatabase</name>
@@ -6141,10 +6169,15 @@ If you want to keep just one half you can simply remove the points, or check thi
 <context>
     <name>IFitDecoderState</name>
     <message>
-        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="32"/>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="31"/>
         <source>FIT decoding error: Decoder not in correct state %1 after last data byte in file.</source>
         <translation>Ошибка декодирования FIT: декодер в неверном состоянии %1 после последнего байта в файле.</translation>
     </message>
+    <message>
+        <location filename="../gis/fit/decoder/IFitDecoderState.cpp" line="124"/>
+        <source>FIT decoding error: a development field with the field_definition_number %1 already exists.</source>
+        <translation>Ошибка декодирования FIT: поле развития с номером определения поля %1 уже существует.</translation>
+    </message>
 </context>
 <context>
     <name>IGisItem</name>
@@ -6181,56 +6214,56 @@ It is either a new item or it has been deleted in the database by someone else.<
         <translation>Исходная версия.</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="521"/>
+        <location filename="../gis/IGisItem.cpp" line="529"/>
         <source><h3>%1</h3> This element is probably read-only because it was not created within QMapShack. Usually you should not want to change imported data. But if you think that is ok press 'Ok'.</source>
         <translation><h3>%1</h3> Вероятно, это элемент доступен только для чтения, потому что он не был создан внутри QMapShack. Обычно нет необходимости изменить импортированные данные. Но если для вас это приемлемо нажмите "Да".</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="522"/>
+        <location filename="../gis/IGisItem.cpp" line="530"/>
         <source>Read Only Mode...</source>
         <translation>Режим 'только чтения'...</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="692"/>
-        <location filename="../gis/IGisItem.cpp" line="745"/>
+        <location filename="../gis/IGisItem.cpp" line="700"/>
+        <location filename="../gis/IGisItem.cpp" line="753"/>
         <source><h4>Description:</h4></source>
         <translation><h4>Описание:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="695"/>
-        <location filename="../gis/IGisItem.cpp" line="748"/>
+        <location filename="../gis/IGisItem.cpp" line="703"/>
+        <location filename="../gis/IGisItem.cpp" line="756"/>
         <source><p>--- no description ---</p></source>
         <translation><p>---нет описания---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="706"/>
+        <location filename="../gis/IGisItem.cpp" line="714"/>
         <source><h4>Comment:</h4></source>
         <translation><h4>Комментарий:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="709"/>
+        <location filename="../gis/IGisItem.cpp" line="717"/>
         <source><p>--- no comment ---</p></source>
         <translation><p>---нет комментария---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="720"/>
-        <location filename="../gis/IGisItem.cpp" line="759"/>
+        <location filename="../gis/IGisItem.cpp" line="728"/>
+        <location filename="../gis/IGisItem.cpp" line="767"/>
         <source><h4>Links:</h4></source>
         <translation><h4>Ссылки:</h4></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="723"/>
-        <location filename="../gis/IGisItem.cpp" line="762"/>
+        <location filename="../gis/IGisItem.cpp" line="731"/>
+        <location filename="../gis/IGisItem.cpp" line="770"/>
         <source><p>--- no links ---</p></source>
         <translation><p>---нет ссылок---</p></translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Edit name...</source>
         <translation>Изменить имя...</translation>
     </message>
     <message>
-        <location filename="../gis/IGisItem.cpp" line="838"/>
+        <location filename="../gis/IGisItem.cpp" line="846"/>
         <source>Enter new %1 name.</source>
         <translation>Задать новое имя (%1).</translation>
     </message>
diff --git a/src/resources.qrc b/src/resources.qrc
index 9dc7e59..aa0b2d7 100644
--- a/src/resources.qrc
+++ b/src/resources.qrc
@@ -99,7 +99,8 @@
         <file>icons/32x32/Cut.png</file>
         <file>icons/32x32/CutMode1.png</file>
         <file>icons/32x32/CutMode2.png</file>
-        <file>icons/32x32/CutHistory.png</file>
+        <file>icons/32x32/CutHistoryAfter.png</file>
+        <file>icons/32x32/CutHistoryBefore.png</file>
         <file>icons/32x32/Copy.png</file>
         <file>icons/32x32/Move.png</file>
         <file>icons/32x32/Paste.png</file>
@@ -291,7 +292,8 @@
         <file>icons/48x48/Cut.png</file>
         <file>icons/48x48/CutMode1.png</file>
         <file>icons/48x48/CutMode2.png</file>
-        <file>icons/48x48/CutHistory.png</file>
+        <file>icons/48x48/CutHistoryAfter.png</file>
+        <file>icons/48x48/CutHistoryBefore.png</file>
         <file>icons/48x48/Copy.png</file>
         <file>icons/48x48/Move.png</file>
         <file>icons/48x48/Paste.png</file>
diff --git a/src/widgets/CHistoryListWidget.cpp b/src/widgets/CHistoryListWidget.cpp
index 180a52c..2908909 100644
--- a/src/widgets/CHistoryListWidget.cpp
+++ b/src/widgets/CHistoryListWidget.cpp
@@ -20,6 +20,8 @@
 #include "gis/prj/IGisProject.h"
 #include "widgets/CHistoryListWidget.h"
 
+#include "CMainWindow.h"
+
 #include <QtWidgets>
 
 CHistoryListWidget::CHistoryListWidget(QWidget *parent)
@@ -31,7 +33,10 @@ CHistoryListWidget::CHistoryListWidget(QWidget *parent)
     connect(this, &CHistoryListWidget::customContextMenuRequested, this, &CHistoryListWidget::slotContextMenu);
 
     menu = new QMenu(this);
-    actionCutHistory = menu->addAction(QIcon("://icons/32x32/CutHistory.png"),tr("Cut history"), this, SLOT(slotCutHistory()));
+
+    actionCutHistoryBefore = menu->addAction(QIcon("://icons/32x32/CutHistoryBefore.png"), tr("Cut history before"), this, SLOT(slotCutHistoryBefore()));
+    actionCutHistoryAfter = menu->addAction(QIcon("://icons/32x32/CutHistoryAfter.png"), tr("Cut history after"), this, SLOT(slotCutHistoryAfter()));
+
 }
 
 CHistoryListWidget::~CHistoryListWidget()
@@ -95,17 +100,20 @@ void CHistoryListWidget::slotSelectionChanged()
 
 void CHistoryListWidget::slotContextMenu(const QPoint& point)
 {
-    if(currentRow() == (count() - 1) || (count() == 0))
+    if ((count() == 0) || (count() == 1)) // nothing can be done if there is 0 (should not happen) or 1 event in history
     {
         return;
     }
 
+    actionCutHistoryBefore->setEnabled(currentRow() > 0);
+    actionCutHistoryAfter->setEnabled(currentRow() < count() - 1);
+ 
     QPoint p = mapToGlobal(point);
     menu->exec(p);
 }
 
 
-void CHistoryListWidget::slotCutHistory()
+void CHistoryListWidget::slotCutHistoryAfter()
 {
     if(currentRow() == (count() - 1))
     {
@@ -118,7 +126,7 @@ void CHistoryListWidget::slotCutHistory()
         return;
     }
 
-    item->cutHistory();
+    item->cutHistoryAfter();
     item->updateDecoration(IGisItem::eMarkChanged, IGisItem::eMarkNone);
 
     IGisProject * project = dynamic_cast<IGisProject*>(item->parent());
@@ -129,3 +137,39 @@ void CHistoryListWidget::slotCutHistory()
 
     emit sigChanged();
 }
+
+
+
+void CHistoryListWidget::slotCutHistoryBefore()
+{
+    if (currentRow() == 0)
+    {
+        return;
+    }
+
+    IGisItem * item = CGisWidget::self().getItemByKey(key);
+    if (nullptr == item)
+    {
+        return;
+    }
+
+    int res = QMessageBox::warning(CMainWindow::getBestWidgetForParent(), tr("History removal")
+        , tr("The removal is permanent and cannot be undone. "
+          "<b>Do you really want to delete history before this step?</b>")
+        , QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
+    if (res == QMessageBox::No)
+    {
+        return;
+    }
+
+    item->cutHistoryBefore();
+    item->updateDecoration(IGisItem::eMarkChanged, IGisItem::eMarkNone);
+
+    IGisProject * project = dynamic_cast<IGisProject*>(item->parent());
+    if (project)
+    {
+        project->setChanged();
+    }
+
+    emit sigChanged();
+}
diff --git a/src/widgets/CHistoryListWidget.h b/src/widgets/CHistoryListWidget.h
index 1aa0433..ea5acb9 100644
--- a/src/widgets/CHistoryListWidget.h
+++ b/src/widgets/CHistoryListWidget.h
@@ -37,12 +37,14 @@ signals:
 private slots:
     void slotSelectionChanged();
     void slotContextMenu(const QPoint& point);
-    void slotCutHistory();
+    void slotCutHistoryAfter();
+    void slotCutHistoryBefore();
 
 private:
     IGisItem::key_t key;
     QMenu * menu;
-    QAction * actionCutHistory;
+    QAction * actionCutHistoryAfter;
+    QAction * actionCutHistoryBefore;
 };
 
 #endif //CHISTORYLISTWIDGET_H

-- 
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