From 720a5c63998727603bc25f18eda87ea5c6db3f2c Mon Sep 17 00:00:00 2001
From: "l.dressen" <l.dressen@fz-juelich.de>
Date: Wed, 3 Jul 2024 13:52:07 +0200
Subject: [PATCH] Should throw error on reading ill-formed .pet-file (e.g.
 wrong decimal separator)

---
 src/calibration/extrCalibration.cpp           |  75 +-
 src/petrack.cpp                               | 108 +--
 src/petrack.h                                 |   4 +-
 src/ui/dialogs/codeMarkerWidget.cpp           | 118 +--
 src/ui/dialogs/colorMarkerWidget.cpp          |  87 +--
 src/ui/dialogs/multiColorMarkerWidget.cpp     | 106 +--
 src/ui/dialogs/stereoWidget.cpp               |  81 +-
 src/ui/main-windows/alignmentGridBox.cpp      |  63 +-
 src/ui/main-windows/control.cpp               | 735 +++++-------------
 src/ui/main-windows/coordinateSystemBox.cpp   | 117 +--
 src/ui/main-windows/correction.cpp            |  52 +-
 src/ui/main-windows/correction.h              |   8 +-
 src/ui/main-windows/extrinsicBox.cpp          |  44 +-
 src/ui/main-windows/filterBeforeBox.cpp       |  76 +-
 src/ui/main-windows/intrinsicBox.cpp          | 133 +---
 src/ui/visualization/moCapController.cpp      | 137 +---
 src/util/CMakeLists.txt                       |   4 +-
 src/util/helper.cpp                           |  30 -
 src/util/helper.h                             |  70 --
 src/util/importHelper.cpp                     | 255 ++++++
 src/util/importHelper.h                       | 162 ++++
 .../data/old_pet_files/2006.pet               |  47 ++
 .../data/old_pet_files/2008.pet               |  39 +
 .../data/old_pet_files/2009.pet               |  58 ++
 .../data/old_pet_files/2012.pet               |  65 ++
 .../data/old_pet_files/2013.pet               |  65 ++
 .../data/old_pet_files/2014.pet               |  67 ++
 .../data/old_pet_files/2015.pet               |  71 ++
 .../data/old_pet_files/2016.pet               |  76 ++
 .../data/old_pet_files/2017.pet               |  83 ++
 .../data/old_pet_files/2018.pet               |  83 ++
 .../data/old_pet_files/2019.pet               |  83 ++
 .../regression_test/tests/test_oldPetFiles.py |  74 ++
 .../calibration/tst_extrCalibration.cpp       |   2 +-
 .../unit_test/ui/main-windows/tst_control.cpp |   2 +-
 35 files changed, 1696 insertions(+), 1584 deletions(-)
 create mode 100644 src/util/importHelper.cpp
 create mode 100644 src/util/importHelper.h
 create mode 100644 tests/regression_test/data/old_pet_files/2006.pet
 create mode 100644 tests/regression_test/data/old_pet_files/2008.pet
 create mode 100644 tests/regression_test/data/old_pet_files/2009.pet
 create mode 100644 tests/regression_test/data/old_pet_files/2012.pet
 create mode 100644 tests/regression_test/data/old_pet_files/2013.pet
 create mode 100644 tests/regression_test/data/old_pet_files/2014.pet
 create mode 100644 tests/regression_test/data/old_pet_files/2015.pet
 create mode 100644 tests/regression_test/data/old_pet_files/2016.pet
 create mode 100644 tests/regression_test/data/old_pet_files/2017.pet
 create mode 100644 tests/regression_test/data/old_pet_files/2018.pet
 create mode 100644 tests/regression_test/data/old_pet_files/2019.pet
 create mode 100644 tests/regression_test/tests/test_oldPetFiles.py

diff --git a/src/calibration/extrCalibration.cpp b/src/calibration/extrCalibration.cpp
index f37d03d33..3247fd669 100644
--- a/src/calibration/extrCalibration.cpp
+++ b/src/calibration/extrCalibration.cpp
@@ -19,6 +19,7 @@
 #include "extrCalibration.h"
 
 #include "control.h"
+#include "importHelper.h"
 #include "logger.h"
 #include "pMessageBox.h"
 #include "petrack.h"
@@ -970,70 +971,40 @@ void ExtrCalibration::getXml(QDomElement &elem)
 
 void ReprojectionError::getXml(QDomElement &subElem)
 {
-    if(subElem.hasAttribute("AVG_PH"))
+    mPointHeightAvg    = readDouble(subElem, "AVG_PH", 0);
+    mPointHeightStdDev = readDouble(subElem, "SD_PH", 0);
+    if(mPointHeightStdDev < 0)
     {
-        mPointHeightAvg = subElem.attribute("AVG_PH").toDouble();
+        mPointHeightVariance = -1;
     }
-    if(subElem.hasAttribute("SD_PH"))
-    {
-        mPointHeightStdDev = subElem.attribute("SD_PH").toDouble();
-        if(mPointHeightStdDev < 0)
-        {
-            mPointHeightVariance = -1;
-        }
-        else
-        {
-            mPointHeightVariance = pow(mPointHeightStdDev, 2);
-        }
-    }
-    if(subElem.hasAttribute("MAX_PH"))
-    {
-        mPointHeightMax = subElem.attribute("MAX_PH").toDouble();
-    }
-    if(subElem.hasAttribute("AVG_DH"))
-    {
-        mDefaultHeightAvg = subElem.attribute("AVG_DH").toDouble();
-    }
-    if(subElem.hasAttribute("SD_DH"))
-    {
-        mDefaultHeightStdDev = subElem.attribute("SD_DH").toDouble();
-        if(mDefaultHeightStdDev < 0)
-        {
-            mDefaultHeightVariance = -1;
-        }
-        else
-        {
-            mDefaultHeightVariance = pow(mDefaultHeightStdDev, 2);
-        }
-    }
-    if(subElem.hasAttribute("MAX_DH"))
+    else
     {
-        mDefaultHeightMax = subElem.attribute("MAX_DH").toDouble();
+        mPointHeightVariance = pow(mPointHeightStdDev, 2);
     }
-    if(subElem.hasAttribute("AVG_PX"))
+    mPointHeightMax      = readDouble(subElem, "MAX_PH", 0);
+    mDefaultHeightAvg    = readDouble(subElem, "AVG_DH", 0);
+    mDefaultHeightStdDev = readDouble(subElem, "SD_DH", 0);
+    if(mDefaultHeightStdDev < 0)
     {
-        mPixelAvg = subElem.attribute("AVG_PX").toDouble();
+        mDefaultHeightVariance = -1;
     }
-    if(subElem.hasAttribute("SD_PX"))
+    else
     {
-        mPixelStdDev = subElem.attribute("SD_PX").toDouble();
-        if(mPixelStdDev < 0)
-        {
-            mPixelVariance = -1;
-        }
-        else
-        {
-            mPixelVariance = pow(mPixelStdDev, 2);
-        }
+        mDefaultHeightVariance = pow(mDefaultHeightStdDev, 2);
     }
-    if(subElem.hasAttribute("MAX_PX"))
+    mDefaultHeightMax = readDouble(subElem, "MAX_DH", 0);
+    mPixelAvg         = readDouble(subElem, "AVG_PX", 0);
+    mPixelStdDev      = readDouble(subElem, "SD_PX", 0);
+    if(mPixelStdDev < 0)
     {
-        mPixelMax = subElem.attribute("MAX_PX").toDouble();
+        mPixelVariance = -1;
     }
-    if(subElem.hasAttribute("USED_HEIGHT"))
+    else
     {
-        mUsedDefaultHeight = subElem.attribute("USED_HEIGHT").toDouble();
+        mPixelVariance = pow(mPixelStdDev, 2);
     }
+    mPixelMax          = readDouble(subElem, "MAX_PX", 0);
+    mUsedDefaultHeight = readDouble(subElem, "USED_HEIGHT", 0);
 
     auto data = getData();
     mValid    = !std::any_of(data.begin(), data.end(), [](double a) { return !std::isfinite(a) || a < 0; });
diff --git a/src/petrack.cpp b/src/petrack.cpp
index a6f95be06..8fac72196 100644
--- a/src/petrack.cpp
+++ b/src/petrack.cpp
@@ -41,8 +41,8 @@
 #include "extrinsicBox.h"
 #include "filterBeforeBox.h"
 #include "gridItem.h"
-#include "helper.h"
 #include "imageItem.h"
+#include "importHelper.h"
 #include "intrinsicBox.h"
 #include "keybindingDialog.h"
 #include "logger.h"
@@ -356,9 +356,6 @@ Petrack::Petrack(QString petrackVersion) :
     // um im background subtraction filter das hoehenbild zu beruecksichtigen
     mBackgroundFilter.setStereoContext(&mStereoContext);
 
-    mAutoBackTrack          = true;  // ist der default, dann wenn in XML-Datei nicht drin steht
-    mAutoTrackOptimizeColor = false; // ist der default, dann wenn in XML-Datei nicht drin steht
-
     setLoading(false);
 }
 Petrack::~Petrack()
@@ -500,14 +497,7 @@ void Petrack::openXml(QDomDocument &doc, bool openSeq)
                     }
                 }
             }
-            if(elem.hasAttribute("STATUS_HEIGHT"))
-            {
-                if(mStatusPosRealHeight) // null kann eigentlich nicht vorkommen, da im constructor von petrack erzeugt
-                                         // wird
-                {
-                    mStatusPosRealHeight->setValue(elem.attribute("STATUS_HEIGHT").toDouble());
-                }
-            }
+            loadDoubleValue(elem, "STATUS_HEIGHT", mStatusPosRealHeight);
         }
         else if(elem.tagName() == "STEREO")
         {
@@ -533,14 +523,8 @@ void Petrack::openXml(QDomDocument &doc, bool openSeq)
         {
             mControlWidget->getXml(elem, petVersion);
             QDomElement tmpElem = (elem.firstChildElement("TRACKING")).firstChildElement("PATH");
-            if(tmpElem.hasAttribute("ONLY_PEOPLE_NR"))
-            {
-                onlyPeopleNr = tmpElem.attribute("ONLY_PEOPLE_NR").toInt();
-            }
-            if(tmpElem.hasAttribute("ONLY_PEOPLE_NR_LIST"))
-            {
-                onlyPeopleNrList = tmpElem.attribute("ONLY_PEOPLE_NR_LIST");
-            }
+            onlyPeopleNr        = readInt(tmpElem, "ONLY_PEOPLE_NR", 1);
+            onlyPeopleNrList    = readQString(tmpElem, "ONLY_PEOPLE_NR_LIST", "");
         }
         else if(elem.tagName() == "EXTR_CALIBRATION")
         {
@@ -548,75 +532,31 @@ void Petrack::openXml(QDomDocument &doc, bool openSeq)
         }
         else if(elem.tagName() == "PLAYER")
         {
-            if(elem.hasAttribute("FRAME"))
-            {
-                frame = elem.attribute("FRAME").toInt();
-            }
+            frame = readInt(elem, "FRAME", -1);
             // handle old projects (prior to 0.10.2), which don't differentiate between sequence fps and playback fps
-            if(elem.hasAttribute("FPS"))
-            {
-                oldFps = elem.attribute("FPS").toDouble();
-            }
-            if(elem.hasAttribute("SEQUENCE_FPS"))
-            {
-                sequenceFps = elem.attribute("SEQUENCE_FPS").toDouble();
-            }
-            if(elem.hasAttribute("PLAYBACK_FPS"))
-            {
-                playbackFps = elem.attribute("PLAYBACK_FPS").toDouble();
-            }
-            if(elem.hasAttribute("SOURCE_FRAME_IN"))
-            {
-                sourceFrameIn = elem.attribute("SOURCE_FRAME_IN").toInt();
-            }
-            if(elem.hasAttribute("SOURCE_FRAME_OUT"))
-            {
-                sourceFrameOut = elem.attribute("SOURCE_FRAME_OUT").toInt();
-            }
-            if(elem.hasAttribute("PLAYER_SPEED_FIXED"))
-            {
-                mPlayerWidget->setPlayerSpeedLimited(elem.attribute("PLAYER_SPEED_FIXED").toInt());
-            }
+            oldFps         = readDouble(elem, "FPS", -1);
+            sequenceFps    = readDouble(elem, "SEQUENCE_FPS", -1);
+            playbackFps    = readDouble(elem, "PLAYBACK_FPS", -1);
+            sourceFrameIn  = readInt(elem, "SOURCE_FRAME_IN", -1);
+            sourceFrameOut = readInt(elem, "SOURCE_FRAME_OUT", -1);
+            mPlayerWidget->setPlayerSpeedLimited(readBool(elem, "PLAYER_SPEED_FIXED", false));
         }
         else if(elem.tagName() == "VIEW")
         {
-            if(elem.hasAttribute("ANTIALIAS"))
-            {
-                mAntialiasAct->setChecked(elem.attribute("ANTIALIAS").toInt() == Qt::Checked);
-            }
-            if(elem.hasAttribute("OPENGL"))
-            {
-                mOpenGLAct->setChecked(elem.attribute("OPENGL").toInt() == Qt::Checked);
-            }
-            if(elem.hasAttribute("SAVE_TRANSFORMED"))
-            {
-                mCropZoomViewAct->setChecked(elem.attribute("SAVE_TRANSFORMED") == Qt::Checked);
-            }
-            if(elem.hasAttribute("TRANSFORMATION"))
-            {
-                QString     matStr = elem.attribute("TRANSFORMATION");
-                QTextStream in(&matStr);
-                in >> zoom >> rotate >> hScroll >> vScroll;
-            }
-            if(elem.hasAttribute("CAMERA"))
-            {
-                cam = (enum Camera) elem.attribute("CAMERA").toInt();
-            }
-            if(elem.hasAttribute("HIDE_CONTROLS"))
-            {
-                mHideControlsAct->setChecked(elem.attribute("HIDE_CONTROLS").toInt() == Qt::Checked);
-            }
+            loadBoolValue(elem, "ANTIALIAS", mAntialiasAct, false);
+            loadBoolValue(elem, "OPENGL", mOpenGLAct, false);
+            loadBoolValue(elem, "SAVE_TRANSFORMED", mCropZoomViewAct, false);
+            QString     matStr = readQString(elem, "TRANSFORMATION");
+            QTextStream in(&matStr);
+            in >> zoom >> rotate >> hScroll >> vScroll;
+
+            cam = (enum Camera) readInt(elem, "CAMERA", static_cast<int>(cameraUnset));
+            loadBoolValue(elem, "HIDE_CONTROLS", mHideControlsAct, false);
         }
         else if(elem.tagName() == "AUTO_TRACK")
         {
-            if(elem.hasAttribute("BACK_TRACK"))
-            {
-                mAutoBackTrack = elem.attribute("BACK_TRACK").toInt();
-            }
-            if(elem.hasAttribute("OPTIMZE_COLOR"))
-            {
-                mAutoTrackOptimizeColor = elem.attribute("OPTIMZE_COLOR").toInt();
-            }
+            mAutoBackTrack          = readBool(elem, "BACK_TRACK", true);
+            mAutoTrackOptimizeColor = readBool(elem, "OPTIMIZE_COLOR", false);
         }
         else if(elem.tagName() == "MISSING_FRAMES")
         {
@@ -626,8 +566,8 @@ void Petrack::openXml(QDomDocument &doc, bool openSeq)
                 auto node             = elem.firstChildElement("FRAME");
                 for(; !node.isNull(); node = node.nextSiblingElement("FRAME"))
                 {
-                    size_t num   = node.attribute("NUM_FRAME").toUInt();
-                    int    count = node.attribute("NUM_MISSING").toInt();
+                    size_t num   = readInt(node, "NUM_FRAME");
+                    int    count = readInt(node, "NUM_MISSING");
                     missingFrames.push_back(MissingFrame{num, count});
                 }
             }
diff --git a/src/petrack.h b/src/petrack.h
index b472f2731..3573186fd 100644
--- a/src/petrack.h
+++ b/src/petrack.h
@@ -479,8 +479,8 @@ private:
 
     double mShowFPS;
 
-    bool mAutoBackTrack;
-    bool mAutoTrackOptimizeColor;
+    bool mAutoBackTrack          = true;
+    bool mAutoTrackOptimizeColor = false;
     bool mLoading;
 
     MoCapStorage    mMoCapStorage;
diff --git a/src/ui/dialogs/codeMarkerWidget.cpp b/src/ui/dialogs/codeMarkerWidget.cpp
index 6612c7518..14a7a194a 100644
--- a/src/ui/dialogs/codeMarkerWidget.cpp
+++ b/src/ui/dialogs/codeMarkerWidget.cpp
@@ -18,6 +18,7 @@
 
 #include "codeMarkerWidget.h"
 
+#include "importHelper.h"
 #include "pMessageBox.h"
 #include "recognition.h"
 #include "ui_codeMarker.h"
@@ -172,104 +173,33 @@ void CodeMarkerWidget::getXml(QDomElement &elem)
     {
         if(subElem.tagName() == "DICTIONARY")
         {
-            if(subElem.hasAttribute("ID"))
-            {
-                mUi->dictList->setCurrentIndex(subElem.attribute("ID").toInt());
-            }
+            loadActiveIndex(subElem, "ID", mUi->dictList, 0);
         }
 
         if(subElem.tagName() == "PARAM")
         {
-            if(subElem.hasAttribute("ADAPTIVE_THRESH_WIN_SIZE_MIN"))
-            {
-                mUi->adaptiveThreshWinSizeMin->setValue(subElem.attribute("ADAPTIVE_THRESH_WIN_SIZE_MIN").toInt());
-            }
-            if(subElem.hasAttribute("ADAPTIVE_THRESH_WIN_SIZE_MAX"))
-            {
-                mUi->adaptiveThreshWinSizeMax->setValue(subElem.attribute("ADAPTIVE_THRESH_WIN_SIZE_MAX").toInt());
-            }
-            if(subElem.hasAttribute("ADAPTIVE_THRESH_WIN_SIZE_STEP"))
-            {
-                mUi->adaptiveThreshWinSizeStep->setValue(subElem.attribute("ADAPTIVE_THRESH_WIN_SIZE_STEP").toInt());
-            }
-            if(subElem.hasAttribute("ADAPTIVE_THRESH_CONSTANT"))
-            {
-                mUi->adaptiveThreshConstant->setValue(subElem.attribute("ADAPTIVE_THRESH_CONSTANT").toInt());
-            }
-            if(subElem.hasAttribute("MIN_MARKER_PERIMETER"))
-            {
-                mUi->minMarkerPerimeter->setValue(subElem.attribute("MIN_MARKER_PERIMETER").toDouble());
-            }
-            if(subElem.hasAttribute("MAX_MARKER_PERIMETER"))
-            {
-                mUi->maxMarkerPerimeter->setValue(subElem.attribute("MAX_MARKER_PERIMETER").toDouble());
-            }
-            if(subElem.hasAttribute("MAX_RATIO_ERROR"))
-            {
-                mUi->polygonalApproxAccuracyRate->setValue(subElem.attribute("MAX_RATIO_ERROR").toDouble());
-            }
-            if(subElem.hasAttribute("MIN_CORNER_DISTANCE"))
-            {
-                mUi->minCornerDistance->setValue(subElem.attribute("MIN_CORNER_DISTANCE").toDouble());
-            }
-            if(subElem.hasAttribute("MIN_DISTANCE_TO_BORDER"))
-            {
-                mUi->minDistanceToBorder->setValue(subElem.attribute("MIN_DISTANCE_TO_BORDER").toInt());
-            }
-            if(subElem.hasAttribute("MIN_MARKER_DISTANCE"))
-            {
-                mUi->minMarkerDistance->setValue(subElem.attribute("MIN_MARKER_DISTANCE").toDouble());
-            }
-            if(subElem.hasAttribute("CORNER_REFINEMENT"))
-            {
-                mUi->doCornerRefinement->setChecked(subElem.attribute("CORNER_REFINEMENT").toInt());
-            }
-            if(subElem.hasAttribute("CORNER_REFINEMENT_WIN_SIZE"))
-            {
-                mUi->cornerRefinementWinSize->setValue(subElem.attribute("CORNER_REFINEMENT_WIN_SIZE").toInt());
-            }
-            if(subElem.hasAttribute("CORNER_REFINEMENT_MAX_ITERATIONS"))
-            {
-                mUi->cornerRefinementMaxIterations->setValue(
-                    subElem.attribute("CORNER_REFINEMENT_MAX_ITERATIONS").toInt());
-            }
-            if(subElem.hasAttribute("CORNER_REFINEMENT_MIN_ACCURACY"))
-            {
-                mUi->cornerRefinementMinAccuracy->setValue(
-                    subElem.attribute("CORNER_REFINEMENT_MIN_ACCURACY").toDouble());
-            }
-            if(subElem.hasAttribute("MARKER_BORDER_BITS"))
-            {
-                mUi->markerBorderBits->setValue(subElem.attribute("MARKER_BORDER_BITS").toInt());
-            }
-            if(subElem.hasAttribute("PERSPECTIVE_REMOVE_PIXEL_PER_CELL"))
-            {
-                mUi->perspectiveRemovePixelPerCell->setValue(
-                    subElem.attribute("PERSPECTIVE_REMOVE_PIXEL_PER_CELL").toInt());
-            }
-            if(subElem.hasAttribute("PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL"))
-            {
-                mUi->perspectiveRemoveIgnoredMarginPerCell->setValue(
-                    subElem.attribute("PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL").toDouble());
-            }
-            if(subElem.hasAttribute("MAX_ERRONEOUS_BITS_IN_BORDER_RATE"))
-            {
-                mUi->maxErroneousBitsInBorderRate->setValue(
-                    subElem.attribute("MAX_ERRONEOUS_BITS_IN_BORDER_RATE").toDouble());
-            }
-            if(subElem.hasAttribute("MIN_OTSU_STD_DEV"))
-            {
-                mUi->minOtsuStdDev->setValue(subElem.attribute("MIN_OTSU_STD_DEV").toDouble());
-            }
-            if(subElem.hasAttribute("ERROR_CORRECTION_RATE"))
-            {
-                mUi->errorCorrectionRate->setValue(subElem.attribute("ERROR_CORRECTION_RATE").toDouble());
-            }
-            if(subElem.hasAttribute("SHOW_DETECTED_CANDIDATES"))
-            {
-                mUi->showDetectedCandidates->setCheckState(
-                    subElem.attribute("SHOW_DETECTED_CANDIDATES").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
+            loadIntValue(subElem, "ADAPTIVE_THRESH_WIN_SIZE_MIN", mUi->adaptiveThreshWinSizeMin);
+            loadIntValue(subElem, "ADAPTIVE_THRESH_WIN_SIZE_MAX", mUi->adaptiveThreshWinSizeMax);
+            loadIntValue(subElem, "ADAPTIVE_THRESH_WIN_SIZE_STEP", mUi->adaptiveThreshWinSizeStep);
+            loadIntValue(subElem, "ADAPTIVE_THRESH_CONSTANT", mUi->adaptiveThreshConstant);
+            loadDoubleValue(subElem, "MIN_MARKER_PERIMETER", mUi->minMarkerPerimeter);
+            loadDoubleValue(subElem, "MAX_MARKER_PERIMETER", mUi->maxMarkerPerimeter);
+            loadDoubleValue(subElem, "MAX_RATIO_ERROR", mUi->polygonalApproxAccuracyRate);
+            loadDoubleValue(subElem, "MIN_CORNER_DISTANCE", mUi->minCornerDistance);
+            loadIntValue(subElem, "MIN_DISTANCE_TO_BORDER", mUi->minDistanceToBorder);
+            loadDoubleValue(subElem, "MIN_MARKER_DISTANCE", mUi->minMarkerDistance);
+            loadBoolValue(subElem, "CORNER_REFINEMENT", mUi->doCornerRefinement);
+            loadIntValue(subElem, "CORNER_REFINEMENT_WIN_SIZE", mUi->cornerRefinementWinSize);
+            loadIntValue(subElem, "CORNER_REFINEMENT_MAX_ITERATIONS", mUi->cornerRefinementMaxIterations);
+            loadDoubleValue(subElem, "CORNER_REFINEMENT_MIN_ACCURACY", mUi->cornerRefinementMinAccuracy);
+            loadIntValue(subElem, "MARKER_BORDER_BITS", mUi->markerBorderBits);
+            loadIntValue(subElem, "PERSPECTIVE_REMOVE_PIXEL_PER_CELL", mUi->perspectiveRemovePixelPerCell);
+            loadDoubleValue(
+                subElem, "PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL", mUi->perspectiveRemoveIgnoredMarginPerCell);
+            loadDoubleValue(subElem, "MAX_ERRONEOUS_BITS_IN_BORDER_RATE", mUi->maxErroneousBitsInBorderRate);
+            loadDoubleValue(subElem, "MIN_OTSU_STD_DEV", mUi->minOtsuStdDev);
+            loadDoubleValue(subElem, "ERROR_CORRECTION_RATE", mUi->errorCorrectionRate);
+            loadBoolValue(subElem, "SHOW_DETECTED_CANDIDATES", mUi->showDetectedCandidates);
         }
     }
 }
diff --git a/src/ui/dialogs/colorMarkerWidget.cpp b/src/ui/dialogs/colorMarkerWidget.cpp
index 3053da78d..59d96335b 100644
--- a/src/ui/dialogs/colorMarkerWidget.cpp
+++ b/src/ui/dialogs/colorMarkerWidget.cpp
@@ -18,6 +18,8 @@
 
 #include "colorMarkerWidget.h"
 
+#include "importHelper.h"
+
 ColorMarkerWidget::ColorMarkerWidget(QWidget *parent) : QWidget(parent)
 {
     mMainWindow = (class Petrack *) parent;
@@ -99,33 +101,15 @@ void ColorMarkerWidget::getXml(QDomElement &elem)
     {
         if(subElem.tagName() == "MASK")
         {
-            if(subElem.hasAttribute("SHOW"))
-            {
-                showMask->setCheckState(subElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("OPACITY"))
-            {
-                opacity->setValue(subElem.attribute("OPACITY").toInt());
-            }
-            if(subElem.hasAttribute("MASK"))
-            {
-                maskMask->setCheckState(subElem.attribute("MASK").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
+            loadBoolValue(subElem, "SHOW", showMask);
+            loadIntValue(subElem, "OPACITY", opacity);
+            loadBoolValue(subElem, "MASK", maskMask);
         }
         if(subElem.tagName() == "FROM_COLOR")
         {
-            if(subElem.hasAttribute("HUE"))
-            {
-                h = subElem.attribute("HUE").toInt();
-            }
-            if(subElem.hasAttribute("SATURATION"))
-            {
-                s = subElem.attribute("SATURATION").toInt();
-            }
-            if(subElem.hasAttribute("VALUE"))
-            {
-                v = subElem.attribute("VALUE").toInt();
-            }
+            h = readInt(subElem, "HUE");
+            s = readInt(subElem, "SATURATION");
+            v = readInt(subElem, "VALUE");
 
             col.setHsv(h, s, v);
             if(col.isValid())
@@ -140,18 +124,9 @@ void ColorMarkerWidget::getXml(QDomElement &elem)
         }
         if(subElem.tagName() == "TO_COLOR")
         {
-            if(subElem.hasAttribute("HUE"))
-            {
-                h = subElem.attribute("HUE").toInt();
-            }
-            if(subElem.hasAttribute("SATURATION"))
-            {
-                s = subElem.attribute("SATURATION").toInt();
-            }
-            if(subElem.hasAttribute("VALUE"))
-            {
-                v = subElem.attribute("VALUE").toInt();
-            }
+            h = readInt(subElem, "HUE");
+            s = readInt(subElem, "SATURATION");
+            v = readInt(subElem, "VALUE");
 
             col.setHsv(h, s, v);
             if(col.isValid())
@@ -166,38 +141,14 @@ void ColorMarkerWidget::getXml(QDomElement &elem)
         }
         if(subElem.tagName() == "PARAM")
         {
-            if(subElem.hasAttribute("INVERS_HUE"))
-            {
-                inversHue->setCheckState(subElem.attribute("INVERS_HUE").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("CLOSE_RADIUS"))
-            {
-                closeRadius->setValue(subElem.attribute("CLOSE_RADIUS").toInt());
-            }
-            if(subElem.hasAttribute("CLOSE_USED"))
-            {
-                useClose->setCheckState(subElem.attribute("CLOSE_USED").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("OPEN_RADIUS"))
-            {
-                openRadius->setValue(subElem.attribute("OPEN_RADIUS").toInt());
-            }
-            if(subElem.hasAttribute("OPEN_USED"))
-            {
-                useOpen->setCheckState(subElem.attribute("OPEN_USED").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("MIN_AREA"))
-            {
-                minArea->setValue(subElem.attribute("MIN_AREA").toInt());
-            }
-            if(subElem.hasAttribute("MAX_AREA"))
-            {
-                maxArea->setValue(subElem.attribute("MAX_AREA").toInt());
-            }
-            if(subElem.hasAttribute("MAX_RATIO"))
-            {
-                maxRatio->setValue(subElem.attribute("MAX_RATIO").toDouble());
-            }
+            loadBoolValue(subElem, "INVERS_HUE", inversHue);
+            loadIntValue(subElem, "CLOSE_RADIUS", closeRadius);
+            loadBoolValue(subElem, "CLOSE_USED", useClose);
+            loadIntValue(subElem, "OPEN_RADIUS", openRadius);
+            loadBoolValue(subElem, "OPEN_USED", useOpen);
+            loadIntValue(subElem, "MIN_AREA", minArea);
+            loadIntValue(subElem, "MAX_AREA", maxArea);
+            loadDoubleValue(subElem, "MAX_RATIO", maxRatio);
         }
     }
 }
diff --git a/src/ui/dialogs/multiColorMarkerWidget.cpp b/src/ui/dialogs/multiColorMarkerWidget.cpp
index 7f86a089d..050a71741 100644
--- a/src/ui/dialogs/multiColorMarkerWidget.cpp
+++ b/src/ui/dialogs/multiColorMarkerWidget.cpp
@@ -18,6 +18,8 @@
 
 #include "multiColorMarkerWidget.h"
 
+#include "importHelper.h"
+
 MultiColorMarkerWidget::MultiColorMarkerWidget(QWidget *parent) : QWidget(parent)
 {
     mMainWindow = (class Petrack *) parent;
@@ -76,102 +78,38 @@ void MultiColorMarkerWidget::getXml(QDomElement &elem)
     {
         if(subElem.tagName() == "MASK")
         {
-            if(subElem.hasAttribute("SHOW"))
-            {
-                showMask->setCheckState(subElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("OPACITY"))
-            {
-                opacity->setValue(subElem.attribute("OPACITY").toInt());
-            }
-            if(subElem.hasAttribute("MASK"))
-            {
-                maskMask->setCheckState(subElem.attribute("MASK").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
+            loadBoolValue(subElem, "SHOW", showMask);
+            loadIntValue(subElem, "OPACITY", opacity);
+            loadBoolValue(subElem, "MASK", maskMask);
         }
         if(subElem.tagName() == "BLACK_DOT")
         {
-            if(subElem.hasAttribute("USE"))
-            {
-                useDot->setCheckState(subElem.attribute("USE").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("SIZE"))
-            {
-                dotSize->setValue(subElem.attribute("SIZE").toDouble());
-            }
-            if(subElem.hasAttribute("IGNORE_WITHOUT"))
-            {
-                ignoreWithoutDot->setCheckState(
-                    subElem.attribute("IGNORE_WITHOUT").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("USE_COLOR"))
-            {
-                useColor->setCheckState(subElem.attribute("USE_COLOR").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("RESTRICT_POSITION"))
-            {
-                restrictPosition->setCheckState(
-                    subElem.attribute("RESTRICT_POSITION").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
+            loadBoolValue(subElem, "USE", useDot);
+            loadDoubleValue(subElem, "SIZE", dotSize);
+            loadBoolValue(subElem, "IGNORE_WITHOUT", ignoreWithoutDot);
+            loadBoolValue(subElem, "USE_COLOR", useColor);
+            loadBoolValue(subElem, "RESTRICT_POSITION", restrictPosition);
         }
         if(subElem.tagName() == "CODE_MARKER")
         {
-            if(subElem.hasAttribute("USE"))
-            {
-                useCodeMarker->setCheckState(subElem.attribute("USE").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("IGNORE_WITHOUT"))
-            {
-                ignoreWithoutDot->setCheckState(
-                    subElem.attribute("IGNORE_WITHOUT").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
+            loadBoolValue(subElem, "USE", useCodeMarker);
+            // ignoreWithoutDot handles black dot and code marker and is therefore only read once
         }
         if(subElem.tagName() == "AUTO_CORRECT")
         {
-            if(subElem.hasAttribute("USE"))
-            {
-                autoCorrect->setCheckState(subElem.attribute("USE").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("ONLY_EXPORT"))
-            {
-                autoCorrectOnlyExport->setCheckState(
-                    subElem.attribute("ONLY_EXPORT").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
+            loadBoolValue(subElem, "USE", autoCorrect);
+            loadBoolValue(subElem, "ONLY_EXPORT", autoCorrectOnlyExport, false);
         }
         if(subElem.tagName() == "PARAM")
         {
-            if(subElem.hasAttribute("CLOSE_RADIUS"))
-            {
-                closeRadius->setValue(subElem.attribute("CLOSE_RADIUS").toInt());
-            }
-            if(subElem.hasAttribute("CLOSE_USED"))
-            {
-                useClose->setCheckState(subElem.attribute("CLOSE_USED").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("OPEN_RADIUS"))
-            {
-                openRadius->setValue(subElem.attribute("OPEN_RADIUS").toInt());
-            }
-            if(subElem.hasAttribute("OPEN_USED"))
-            {
-                useOpen->setCheckState(subElem.attribute("OPEN_USED").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("MIN_AREA"))
-            {
-                minArea->setValue(subElem.attribute("MIN_AREA").toInt());
-            }
-            if(subElem.hasAttribute("MAX_AREA"))
-            {
-                maxArea->setValue(subElem.attribute("MAX_AREA").toInt());
-            }
-            if(subElem.hasAttribute("USE_HEAD_SIZE"))
-            {
-                useHeadSize->setCheckState(subElem.attribute("USE_HEAD_SIZE").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("MAX_RATIO"))
-            {
-                maxRatio->setValue(subElem.attribute("MAX_RATIO").toDouble());
-            }
+            loadIntValue(subElem, "CLOSE_RADIUS", closeRadius);
+            loadBoolValue(subElem, "CLOSE_USED", useClose);
+            loadIntValue(subElem, "OPEN_RADIUS", openRadius);
+            loadBoolValue(subElem, "OPEN_USED", useOpen);
+            loadIntValue(subElem, "MIN_AREA", minArea);
+            loadIntValue(subElem, "MAX_AREA", maxArea);
+            loadBoolValue(subElem, "USE_HEAD_SIZE", useHeadSize, false);
+            loadDoubleValue(subElem, "MAX_RATIO", maxRatio);
         }
     }
 }
diff --git a/src/ui/dialogs/stereoWidget.cpp b/src/ui/dialogs/stereoWidget.cpp
index 95d2a353f..65f583668 100644
--- a/src/ui/dialogs/stereoWidget.cpp
+++ b/src/ui/dialogs/stereoWidget.cpp
@@ -18,6 +18,7 @@
 
 #include "stereoWidget.h"
 
+#include "importHelper.h"
 #include "logger.h"
 
 StereoWidget::StereoWidget(QWidget *parent) : QWidget(parent)
@@ -86,83 +87,33 @@ void StereoWidget::getXml(QDomElement &elem)
     {
         if(subElem.tagName() == "DISPARITY")
         {
-            if(subElem.hasAttribute("OPACITY"))
-            {
-                opacity->setValue(subElem.attribute("OPACITY").toInt());
-            }
-            if(subElem.hasAttribute("SHOW"))
-            {
-                stereoShowDisparity->setCheckState(subElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("COLOR"))
-            {
-                stereoColor->setCurrentIndex(subElem.attribute("COLOR").toInt());
-            }
-            if(subElem.hasAttribute("ALGO"))
-            {
-                stereoDispAlgo->setCurrentIndex(subElem.attribute("ALGO").toInt());
-            }
-            if(subElem.hasAttribute("HIDE_INVALID"))
-            {
-                hideWrong->setCheckState(subElem.attribute("HIDE_INVALID").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
+            loadIntValue(subElem, "OPACITY", opacity, 100);
+            loadBoolValue(subElem, "SHOW", stereoShowDisparity, false);
+            loadActiveIndex(subElem, "COLOR", stereoColor, 0);
+            loadActiveIndex(subElem, "ALGO", stereoDispAlgo, 0);
+            loadBoolValue(subElem, "HIDE_INVALID", hideWrong, false);
 
             for(subSubElem = subElem.firstChildElement(); !subSubElem.isNull();
                 subSubElem = subSubElem.nextSiblingElement())
             {
                 if(subSubElem.tagName() == "VALUES")
                 {
-                    if(subSubElem.hasAttribute("MIN"))
-                    {
-                        minDisparity->setValue(subSubElem.attribute("MIN").toInt());
-                    }
-                    if(subSubElem.hasAttribute("MAX"))
-                    {
-                        maxDisparity->setValue(subSubElem.attribute("MAX").toInt());
-                    }
+                    loadIntValue(subSubElem, "MIN", minDisparity, 0);
+                    loadIntValue(subSubElem, "MAX", maxDisparity, 100);
                 }
                 else if(subSubElem.tagName() == "MASK")
                 {
-                    if(subSubElem.hasAttribute("SIZE"))
-                    {
-                        stereoMaskSize->setValue(subSubElem.attribute("SIZE").toInt());
-                    }
-                    if(subSubElem.hasAttribute("EDGE_SIZE"))
-                    {
-                        edgeMaskSize->setValue(subSubElem.attribute("EDGE_SIZE").toInt());
-                    }
-                    if(subSubElem.hasAttribute("USE_EDGE"))
-                    {
-                        useEdge->setCheckState(subSubElem.attribute("USE_EDGE").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadIntValue(subSubElem, "SIZE", stereoMaskSize, 7);
+                    loadIntValue(subSubElem, "EDGE_SIZE", edgeMaskSize, 5);
+                    loadBoolValue(subSubElem, "USE_EDGE", useEdge, false);
                 }
                 else if(subSubElem.tagName() == "USE")
                 {
-                    if(subSubElem.hasAttribute("RECO"))
-                    {
-                        stereoUseForReco->setCheckState(
-                            subSubElem.attribute("RECO").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("HEIGHT"))
-                    {
-                        stereoUseForHeight->setCheckState(
-                            subSubElem.attribute("HEIGHT").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("HEIGHT_EVER"))
-                    {
-                        stereoUseForHeightEver->setCheckState(
-                            subSubElem.attribute("HEIGHT_EVER").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("EXPORT"))
-                    {
-                        stereoUseForExport->setCheckState(
-                            subSubElem.attribute("EXPORT").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("CALIB_CENTER"))
-                    {
-                        stereoUseCalibrationCenter->setCheckState(
-                            subSubElem.attribute("CALIB_CENTER").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "RECO", stereoUseForReco, false);
+                    loadBoolValue(subSubElem, "HEIGHT", stereoUseForHeight, false);
+                    loadBoolValue(subSubElem, "HEIGHT_EVER", stereoUseForHeightEver, true);
+                    loadBoolValue(subSubElem, "EXPORT", stereoUseForExport, false);
+                    loadBoolValue(subSubElem, "CALIB_CENTER", stereoUseCalibrationCenter, true);
                 }
                 else
                 {
diff --git a/src/ui/main-windows/alignmentGridBox.cpp b/src/ui/main-windows/alignmentGridBox.cpp
index 97f937c38..6c8bf858a 100644
--- a/src/ui/main-windows/alignmentGridBox.cpp
+++ b/src/ui/main-windows/alignmentGridBox.cpp
@@ -18,6 +18,7 @@
 
 #include "alignmentGridBox.h"
 
+#include "importHelper.h"
 #include "pGroupBox.h"
 #include "ui_alignmentGridBox.h"
 
@@ -113,54 +114,18 @@ bool AlignmentGridBox::getXml(QDomElement &subSubElem)
 {
     if(subSubElem.tagName() == "ALIGNMENT_GRID")
     {
-        if(subSubElem.hasAttribute("GRID_DIMENSION"))
-        {
-            mUi->gridTab->setCurrentIndex(subSubElem.attribute("GRID_DIMENSION").toInt());
-        }
-        else
-        {
-            mUi->gridTab->setCurrentIndex(1); //  = 2D
-        }
-        if(subSubElem.hasAttribute("SHOW"))
-        {
-            mUi->gridShow->setCheckState(subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("FIX"))
-        {
-            mUi->gridFix->setCheckState(subSubElem.attribute("FIX").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("ROTATE"))
-        {
-            setValue(mUi->gridRotate, subSubElem.attribute("ROTATE").toInt());
-        }
-        if(subSubElem.hasAttribute("TRANS_X"))
-        {
-            setValue(mUi->gridTransX, subSubElem.attribute("TRANS_X").toInt());
-        }
-        if(subSubElem.hasAttribute("TRANS_Y"))
-        {
-            setValue(mUi->gridTransY, subSubElem.attribute("TRANS_Y").toInt());
-        }
-        if(subSubElem.hasAttribute("SCALE"))
-        {
-            setValue(mUi->gridScale, subSubElem.attribute("SCALE").toInt());
-        }
-        if(subSubElem.hasAttribute("GRID3D_TRANS_X"))
-        {
-            setValue(mUi->grid3DTransX, subSubElem.attribute("GRID3D_TRANS_X").toInt());
-        }
-        if(subSubElem.hasAttribute("GRID3D_TRANS_Y"))
-        {
-            setValue(mUi->grid3DTransY, subSubElem.attribute("GRID3D_TRANS_Y").toInt());
-        }
-        if(subSubElem.hasAttribute("GRID3D_TRANS_Z"))
-        {
-            setValue(mUi->grid3DTransZ, subSubElem.attribute("GRID3D_TRANS_Z").toInt());
-        }
-        if(subSubElem.hasAttribute("GRID3D_RESOLUTION"))
-        {
-            setValue(mUi->grid3DResolution, subSubElem.attribute("GRID3D_RESOLUTION").toInt());
-        }
+        loadActiveIndex(subSubElem, "GRID_DIMENSION", mUi->gridTab, 1);
+        loadBoolValue(subSubElem, "SHOW", mUi->gridShow, false);
+        loadBoolValue(subSubElem, "FIX", mUi->gridFix, false);
+        loadIntValue(subSubElem, "ROTATE", mUi->gridRotate, 0);
+        loadIntValue(subSubElem, "TRANS_X", mUi->gridTransX, 0);
+        loadIntValue(subSubElem, "TRANS_Y", mUi->gridTransY, 0);
+        loadIntValue(subSubElem, "SCALE", mUi->gridScale, 100);
+        loadIntValue(subSubElem, "GRID3D_TRANS_X", mUi->grid3DTransX, 0);
+        loadIntValue(subSubElem, "GRID3D_TRANS_Y", mUi->grid3DTransY, 0);
+        loadIntValue(subSubElem, "GRID3D_TRANS_Z", mUi->grid3DTransZ, 0);
+        loadIntValue(subSubElem, "GRID3D_RESOLUTION", mUi->grid3DResolution, 100);
+
         if(subSubElem.hasAttribute("IMMUTABLE"))
         {
             if(this->parent())
@@ -168,7 +133,7 @@ bool AlignmentGridBox::getXml(QDomElement &subSubElem)
                 auto *parent = dynamic_cast<PGroupBox *>(this->parent()->parent());
                 if(parent)
                 {
-                    parent->setImmutable(subSubElem.attribute("IMMUTABLE").toInt());
+                    parent->setImmutable(readBool(subSubElem, "IMMUTABLE", false));
                 }
             }
         }
diff --git a/src/ui/main-windows/control.cpp b/src/ui/main-windows/control.cpp
index bd53a6919..a7c045b19 100644
--- a/src/ui/main-windows/control.cpp
+++ b/src/ui/main-windows/control.cpp
@@ -31,6 +31,7 @@
 #include "extrinsicBox.h"
 #include "extrinsicParameters.h"
 #include "filterBeforeBox.h"
+#include "importHelper.h"
 #include "intrinsicBox.h"
 #include "logger.h"
 #include "multiColorMarkerWidget.h"
@@ -1969,11 +1970,8 @@ void Control::getXml(const QDomElement &elem, const QString &version)
 {
     QDomElement subElem, subSubElem, subSubSubElem;
 
+    loadActiveIndex(elem, "TAB", mUi->tabs, 0);
 
-    if(elem.hasAttribute("TAB"))
-    {
-        mUi->tabs->setCurrentIndex(elem.attribute("TAB").toInt());
-    }
     for(subElem = elem.firstChildElement(); !subElem.isNull(); subElem = subElem.nextSiblingElement())
     {
         if(subElem.tagName() == "CALIBRATION")
@@ -2003,30 +2001,24 @@ void Control::getXml(const QDomElement &elem, const QString &version)
                 }
                 else if(subSubElem.tagName() == "BORDER")
                 {
-                    if(subSubElem.hasAttribute("COLOR"))
-                    {
-                        QColor color(subSubElem.attribute("COLOR"));
-                        mMainWindow->getBorderFilter()->getBorderColR().setValue(color.red());
-                        mMainWindow->getBorderFilter()->getBorderColG().setValue(color.green());
-                        mMainWindow->getBorderFilter()->getBorderColB().setValue(color.blue());
-                    }
+                    QColor color(readQString(subSubElem, "COLOR"));
+                    mMainWindow->getBorderFilter()->getBorderColR().setValue(color.red());
+                    mMainWindow->getBorderFilter()->getBorderColG().setValue(color.green());
+                    mMainWindow->getBorderFilter()->getBorderColB().setValue(color.blue());
                 }
                 else if(subSubElem.tagName() == "BG_SUB")
                 {
-                    if(subSubElem.hasAttribute("FILE"))
+                    QString f = readQString(subSubElem, "FILE", "");
+                    if(f != "")
                     {
-                        QString f = subSubElem.attribute("FILE");
-                        if(f != "")
+                        if(getExistingFile(f, mMainWindow->getProFileName()) != "")
                         {
-                            if(getExistingFile(f, mMainWindow->getProFileName()) != "")
-                            {
-                                mMainWindow->getBackgroundFilter()->setFilename(
-                                    getExistingFile(subSubElem.attribute("FILE"), mMainWindow->getProFileName()));
-                            }
-                            else
-                            {
-                                SPDLOG_WARN("Background subtracting file not readable!");
-                            }
+                            mMainWindow->getBackgroundFilter()->setFilename(
+                                getExistingFile(f, mMainWindow->getProFileName()));
+                        }
+                        else
+                        {
+                            SPDLOG_WARN("Background subtracting file not readable!");
                         }
                     }
                 }
@@ -2043,24 +2035,17 @@ void Control::getXml(const QDomElement &elem, const QString &version)
             {
                 if(subSubElem.tagName() == "PERFORM")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->performRecognition->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("METHOD"))
+                    loadBoolValue(subSubElem, "ENABLED", mUi->performRecognition);
+
+                    auto recognitionMethod = static_cast<reco::RecognitionMethod>(
+                        readInt(subSubElem, "METHOD", static_cast<int>(reco::RecognitionMethod::MultiColor)));
+                    auto foundIndex = mUi->recoMethod->findData(QVariant::fromValue(recognitionMethod));
+                    if(foundIndex == -1)
                     {
-                        auto recognitionMethod =
-                            static_cast<reco::RecognitionMethod>(subSubElem.attribute("METHOD").toInt());
-                        auto foundIndex = mUi->recoMethod->findData(QVariant::fromValue(recognitionMethod));
-                        if(foundIndex == -1)
-                        {
-                            throw std::invalid_argument(
-                                "Recognition Method could not be found, please check your input");
-                        }
-                        mUi->recoMethod->setCurrentIndex(foundIndex);
+                        throw std::invalid_argument("Recognition Method could not be found, please check your input");
                     }
-                    else if(newerThanVersion("0.8.6", version))
+                    mUi->recoMethod->setCurrentIndex(foundIndex);
+                    if(newerThanVersion("0.8.6", version))
                     {
                         // old default was Hermes-Marker
                         auto foundIndex =
@@ -2072,100 +2057,51 @@ void Control::getXml(const QDomElement &elem, const QString &version)
                         }
                         mUi->recoMethod->setCurrentIndex(foundIndex);
                     }
-                    if(subSubElem.hasAttribute("STEP"))
-                    {
-                        mUi->recoStep->setValue(subSubElem.attribute("STEP").toInt());
-                    }
+                    loadIntValue(subSubElem, "STEP", mUi->recoStep);
                 }
                 else if(subSubElem.tagName() == "REGION_OF_INTEREST")
                 {
                     double x = 0, y = 0, w = 0, h = 0;
-                    if(subSubElem.hasAttribute("SHOW"))
-                    {
-                        mUi->roiShow->setCheckState(subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("FIX"))
-                    {
-                        mUi->roiFix->setCheckState(subSubElem.attribute("FIX").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("X"))
-                    {
-                        x = subSubElem.attribute("X").toDouble();
-                    }
-                    if(subSubElem.hasAttribute("Y"))
-                    {
-                        y = subSubElem.attribute("Y").toDouble();
-                    }
-                    if(subSubElem.hasAttribute("WIDTH"))
-                    {
-                        w = subSubElem.attribute("WIDTH").toDouble();
-                    }
-                    if(subSubElem.hasAttribute("HEIGHT"))
-                    {
-                        h = subSubElem.attribute("HEIGHT").toDouble();
-                    }
+                    loadBoolValue(subSubElem, "SHOW", mUi->roiShow, false);
+                    loadBoolValue(subSubElem, "FIX", mUi->roiFix, false);
+
+                    x = readDouble(subSubElem, "X");
+                    y = readDouble(subSubElem, "Y");
+                    w = readDouble(subSubElem, "WIDTH");
+                    h = readDouble(subSubElem, "HEIGHT");
+
                     mMainWindow->getRecoRoiItem()->setRect(x, y, w, h);
                 }
                 else if(subSubElem.tagName() == "MARKER")
                 {
-                    if(subSubElem.hasAttribute("BRIGHTNESS"))
-                    {
-                        mUi->markerBrightness->setValue(subSubElem.attribute("BRIGHTNESS").toInt());
-                    }
-                    if(subSubElem.hasAttribute("IGNORE_WITHOUT"))
-                    {
-                        mUi->markerIgnoreWithout->setCheckState(
-                            subSubElem.attribute("IGNORE_WITHOUT").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadIntValue(subSubElem, "BRIGHTNESS", mUi->markerBrightness);
+                    loadBoolValue(subSubElem, "IGNORE_WITHOUT", mUi->markerIgnoreWithout);
                 }
                 else if(subSubElem.tagName() == "SIZE_COLOR")
                 {
                     mColorChanging = true; // damit bei Anpassungen Farbbild nicht immer wieder neu bestimmt wird
-                    if(subSubElem.hasAttribute("SHOW"))
-                    {
-                        mUi->recoShowColor->setCheckState(
-                            subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("AUTO_WB"))
-                    {
-                        mUi->recoAutoWB->setCheckState(
-                            subSubElem.attribute("AUTO_WB").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("X"))
-                    {
-                        mUi->recoColorX->setCurrentIndex(subSubElem.attribute("X").toInt());
-                    }
-                    if(subSubElem.hasAttribute("Y"))
-                    {
-                        mUi->recoColorY->setCurrentIndex(subSubElem.attribute("Y").toInt());
-                    }
-                    if(subSubElem.hasAttribute("Z"))
-                    {
-                        mUi->recoColorZ->setValue(subSubElem.attribute("Z").toInt());
-                    }
-                    if(subSubElem.hasAttribute("GREY_LEVEL"))
-                    {
-                        mUi->recoGreyLevel->setValue(subSubElem.attribute("GREY_LEVEL").toInt());
+                    loadBoolValue(subSubElem, "SHOW", mUi->recoShowColor);
+                    loadBoolValue(subSubElem, "AUTO_WB", mUi->recoAutoWB);
+                    loadActiveIndex(subSubElem, "X", mUi->recoColorX);
+                    loadActiveIndex(subSubElem, "Y", mUi->recoColorY);
+                    loadIntValue(subSubElem, "Z", mUi->recoColorZ);
+                    loadIntValue(subSubElem, "GREY_LEVEL", mUi->recoGreyLevel);
+                    loadIntValue(subSubElem, "SYMBOL_SIZE", mUi->recoSymbolSize);
+
+                    mColorChanging = false;
+                    // MODEL setzen erzeugt Bild neu
+                    // damit auch bild neu erzeugt wird, wenn sich index nicht aendert:
+                    if(mUi->recoColorModel->currentIndex() == readInt(subSubElem, "MODEL"))
+                    {
+                        mIndexChanging = false;
+                        on_recoColorModel_currentIndexChanged(mUi->recoColorModel->currentIndex());
                     }
-                    if(subSubElem.hasAttribute("SYMBOL_SIZE"))
-                    {
-                        mUi->recoSymbolSize->setValue(subSubElem.attribute("SYMBOL_SIZE").toInt());
-                    }
-                    mColorChanging = false; // MODEL setzen erzeugt Bild neu
-                    if(subSubElem.hasAttribute("MODEL"))
+                    else
                     {
-                        // damit auch bild neu erzeugt wird, wenn sich index nicht aendert:
-                        if(mUi->recoColorModel->currentIndex() == subSubElem.attribute("MODEL").toInt())
-                        {
-                            mIndexChanging = false;
-                            on_recoColorModel_currentIndexChanged(mUi->recoColorModel->currentIndex());
-                        }
-                        else
-                        {
-                            mUi->recoColorModel->setCurrentIndex(subSubElem.attribute("MODEL").toInt());
-                        }
+                        mUi->recoColorModel->setCurrentIndex(readInt(subSubElem, "MODEL"));
                     }
 
+
                     double x = 0., y = 0., width = 0., height = 0., mapHeightValue = DEFAULT_HEIGHT;
                     bool   colored = true, invHue = false;
                     QColor fromCol, toCol;
@@ -2179,67 +2115,30 @@ void Control::getXml(const QDomElement &elem, const QString &version)
                     {
                         if(subSubSubElem.tagName() == "MAP")
                         {
-                            if(subSubSubElem.hasAttribute("X"))
-                            {
-                                x = subSubSubElem.attribute("X").toDouble();
-                            }
-                            if(subSubSubElem.hasAttribute("Y"))
-                            {
-                                y = subSubSubElem.attribute("Y").toDouble();
-                            }
-                            if(subSubSubElem.hasAttribute("WIDTH"))
-                            {
-                                width = subSubSubElem.attribute("WIDTH").toDouble();
-                            }
-                            if(subSubSubElem.hasAttribute("HEIGHT"))
-                            {
-                                height = subSubSubElem.attribute("HEIGHT").toDouble();
-                            }
-                            if(subSubSubElem.hasAttribute("COLORED"))
-                            {
-                                colored = subSubSubElem.attribute("COLORED").toInt();
-                            }
-                            if(subSubSubElem.hasAttribute("MAP_HEIGHT"))
-                            {
-                                mapHeightValue = subSubSubElem.attribute("MAP_HEIGHT").toDouble();
-                            }
+                            x              = readDouble(subSubSubElem, "X");
+                            y              = readDouble(subSubSubElem, "Y");
+                            width          = readDouble(subSubSubElem, "WIDTH");
+                            height         = readDouble(subSubSubElem, "HEIGHT");
+                            colored        = readBool(subSubSubElem, "COLORED");
+                            mapHeightValue = readDouble(subSubSubElem, "MAP_HEIGHT");
+                            h              = readInt(subSubSubElem, "FROM_HUE", 0);
+                            s              = readInt(subSubSubElem, "FROM_SAT", 0);
+                            v              = readInt(subSubSubElem, "FROM_VAL", 128);
 
-                            if(subSubSubElem.hasAttribute("FROM_HUE"))
-                            {
-                                h = subSubSubElem.attribute("FROM_HUE").toInt();
-                            }
-                            if(subSubSubElem.hasAttribute("FROM_SAT"))
-                            {
-                                s = subSubSubElem.attribute("FROM_SAT").toInt();
-                            }
-                            if(subSubSubElem.hasAttribute("FROM_VAL"))
-                            {
-                                v = subSubSubElem.attribute("FROM_VAL").toInt();
-                            }
                             if(h >= 0)
                             {
                                 fromCol.setHsv(h, s, v);
                             }
-                            if(subSubSubElem.hasAttribute("TO_HUE"))
-                            {
-                                h = subSubSubElem.attribute("TO_HUE").toInt();
-                            }
-                            if(subSubSubElem.hasAttribute("TO_SAT"))
-                            {
-                                s = subSubSubElem.attribute("TO_SAT").toInt();
-                            }
-                            if(subSubSubElem.hasAttribute("TO_VAL"))
-                            {
-                                v = subSubSubElem.attribute("TO_VAL").toInt();
-                            }
+
+                            h = readInt(subSubSubElem, "TO_HUE", 359);
+                            s = readInt(subSubSubElem, "TO_SAT", 255);
+                            v = readInt(subSubSubElem, "TO_VAL", 255);
+
                             if(h >= 0)
                             {
                                 toCol.setHsv(h, s, v);
                             }
-                            if(subSubSubElem.hasAttribute("INV_HUE"))
-                            {
-                                invHue = subSubSubElem.attribute("INV_HUE").toInt();
-                            }
+                            invHue = readBool(subSubSubElem, "INV_HUE", false);
 
                             mUi->colorPlot->getMapItem()->addMap(
                                 x, y, width, height, colored, mapHeightValue, fromCol, toCol, invHue);
@@ -2252,50 +2151,38 @@ void Control::getXml(const QDomElement &elem, const QString &version)
                     }
 
                     mUi->mapNr->setMaximum(mUi->colorPlot->getMapItem()->mapNum() - 1);
-                    if(subSubElem.hasAttribute("MAP_NUMBER")) // hiermit werden aus map-datenstruktur richtige map
-                                                              // angezeigt, daher am ende
-                    {
-                        mUi->mapNr->setValue(subSubElem.attribute("MAP_NUMBER").toInt());
-                        on_mapNr_valueChanged(
-                            subSubElem.attribute("MAP_NUMBER").toInt()); // nochmal explizit aufrufen, falls 0, dann
-                                                                         // wuerde valueChanged nicht on_... durchlaufen
-                    }
-                    if(subSubElem.hasAttribute("DEFAULT_HEIGHT"))
-                    {
-                        mUi->mapDefaultHeight->setValue(subSubElem.attribute("DEFAULT_HEIGHT").toDouble());
-                    }
+                    loadIntValue(
+                        subSubElem,
+                        "MAP_NUMBER",
+                        mUi->mapNr); // here conversion from map data structure to real map, therefore at the end
+                    on_mapNr_valueChanged(readInt(
+                        subSubElem,
+                        "MAP_NUMBER")); // explicitely called if 0, otherwise the signal wouldn't fire
+                    loadDoubleValue(subSubElem, "DEFAULT_HEIGHT", mUi->mapDefaultHeight);
                 }
-
                 else if(subSubElem.tagName() == "READ_HEIGHTS")
                 {
-                    if(subSubElem.hasAttribute("HEIGHT_FILE"))
+                    QString heightFileName = readQString(subSubElem, "HEIGHT_FILE");
+                    if(!getExistingFile(heightFileName, mMainWindow->getProFileName()).isEmpty())
                     {
-                        QString heightFileName = (subSubElem.attribute("HEIGHT_FILE"));
-                        if(!getExistingFile(heightFileName, mMainWindow->getProFileName()).isEmpty())
-                        {
-                            mMainWindow->setHeightFileName(
-                                getExistingFile(heightFileName, mMainWindow->getProFileName()));
-                        }
-                        else
-                        {
-                            mMainWindow->setHeightFileName(heightFileName);
-                        }
+                        mMainWindow->setHeightFileName(getExistingFile(heightFileName, mMainWindow->getProFileName()));
+                    }
+                    else
+                    {
+                        mMainWindow->setHeightFileName(heightFileName);
                     }
                 }
 
                 else if(subSubElem.tagName() == "READ_MARKER_IDS")
                 {
-                    if(subSubElem.hasAttribute("MARKER_FILE"))
+                    QString fm = readQString(subSubElem, "MARKER_FILE");
+                    if(getExistingFile(fm, mMainWindow->getProFileName()) != "")
                     {
-                        QString fm = subSubElem.attribute("MARKER_FILE");
-                        if(getExistingFile(fm, mMainWindow->getProFileName()) != "")
-                        {
-                            mMainWindow->setMarkerIDFileName(getExistingFile(fm, mMainWindow->getProFileName()));
-                        }
-                        else
-                        {
-                            mMainWindow->setMarkerIDFileName(fm);
-                        }
+                        mMainWindow->setMarkerIDFileName(getExistingFile(fm, mMainWindow->getProFileName()));
+                    }
+                    else
+                    {
+                        mMainWindow->setMarkerIDFileName(fm);
                     }
                 }
 
@@ -2312,399 +2199,158 @@ void Control::getXml(const QDomElement &elem, const QString &version)
             {
                 if(subSubElem.tagName() == "ONLINE_CALCULATION")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->trackOnlineCalc->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->trackOnlineCalc);
                 }
                 else if(subSubElem.tagName() == "REPEAT_BELOW")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->trackRepeat->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("QUALITY"))
-                    {
-                        mUi->trackRepeatQual->setValue(subSubElem.attribute("QUALITY").toInt());
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->trackRepeat);
+                    loadIntValue(subSubElem, "QUALITY", mUi->trackRepeatQual);
                 }
                 else if(subSubElem.tagName() == "EXTRAPOLATION")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->trackExtrapolation->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->trackExtrapolation);
                 }
                 else if(subSubElem.tagName() == "MERGE")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->trackMerge->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->trackMerge);
                 }
                 else if(subSubElem.tagName() == "ONLY_VISIBLE")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->trackOnlySelected->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->trackOnlySelected);
                 }
                 else if(subSubElem.tagName() == "SEARCH_MISSING_FRAMES")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->trackMissingFrames->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->trackMissingFrames);
                 }
                 else if(subSubElem.tagName() == "RECALCULATE_MEDIAN_HEIGHT")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->trackRecalcHeight->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->trackRecalcHeight);
                 }
                 else if(subSubElem.tagName() == "REGION_OF_INTEREST")
                 {
                     double x = 0, y = 0, w = 0, h = 0;
-                    if(subSubElem.hasAttribute("SHOW"))
-                    {
-                        mUi->trackRoiShow->setCheckState(
-                            subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("FIX"))
-                    {
-                        mUi->trackRoiFix->setCheckState(
-                            subSubElem.attribute("FIX").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("X"))
-                    {
-                        x = subSubElem.attribute("X").toDouble();
-                    }
-                    if(subSubElem.hasAttribute("Y"))
-                    {
-                        y = subSubElem.attribute("Y").toDouble();
-                    }
-                    if(subSubElem.hasAttribute("WIDTH"))
-                    {
-                        w = subSubElem.attribute("WIDTH").toDouble();
-                    }
-                    if(subSubElem.hasAttribute("HEIGHT"))
-                    {
-                        h = subSubElem.attribute("HEIGHT").toDouble();
-                    }
+
+                    loadBoolValue(subSubElem, "SHOW", mUi->trackRoiShow, false);
+                    loadBoolValue(subSubElem, "FIX", mUi->trackRoiFix, false);
+
+                    x = readDouble(subSubElem, "X");
+                    y = readDouble(subSubElem, "Y");
+                    w = readDouble(subSubElem, "WIDTH");
+                    h = readDouble(subSubElem, "HEIGHT");
+
                     mMainWindow->getTrackRoiItem()->setRect(x, y, w, h);
                 }
                 else if(subSubElem.tagName() == "ALLOW_ALTERNATE_HEIGHT")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->trackAlternateHeight->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->trackAlternateHeight);
                 }
                 else if(subSubElem.tagName() == "EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->exportElimTp->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->exportElimTp);
                 }
                 else if(subSubElem.tagName() == "EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->exportElimTrj->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->exportElimTrj);
                 }
                 else if(subSubElem.tagName() == "EXPORT_SMOOTH")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->exportSmooth->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->exportSmooth);
                 }
                 else if(subSubElem.tagName() == "EXPORT_VIEWING_DIRECTION")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->exportViewDir->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->exportViewDir);
                 }
                 else if(subSubElem.tagName() == "EXPORT_ANGLE_OF_VIEW")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->exportAngleOfView->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->exportAngleOfView);
                 }
                 else if(subSubElem.tagName() == "EXPORT_USE_METER")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->exportUseM->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->exportUseM);
                 }
                 else if(subSubElem.tagName() == "EXPORT_COMMENT")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->exportComment->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->exportComment);
                 }
                 else if(subSubElem.tagName() == "EXPORT_MARKERID")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->exportMarkerID->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->exportMarkerID);
                 }
                 else if((subSubElem.tagName() == "TEST_EQUAL") && (!newerThanVersion(version, QString("0.10.0"))))
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mCorrectionWidget->setTestEqualCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    mCorrectionWidget->setTestEqualChecked(readBool(subSubElem, "ENABLED"));
                 }
                 else if((subSubElem.tagName() == "TEST_VELOCITY") && (!newerThanVersion(version, QString("0.10.0"))))
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mCorrectionWidget->setTestVelocityCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    mCorrectionWidget->setTestVelocityChecked(readBool(subSubElem, "ENABLED"));
                 }
                 else if((subSubElem.tagName() == "TEST_INSIDE") && (!newerThanVersion(version, QString("0.10.0"))))
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mCorrectionWidget->setTestInsideCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    mCorrectionWidget->setTestInsideChecked(readBool(subSubElem, "ENABLED"));
                 }
                 else if((subSubElem.tagName() == "TEST_LENGTH") && (!newerThanVersion(version, QString("0.10.0"))))
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mCorrectionWidget->setTestLengthCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    mCorrectionWidget->setTestLengthChecked(readBool(subSubElem, "ENABLED"));
                 }
                 else if(subSubElem.tagName() == "TRACK_FILE")
                 {
-                    if(subSubElem.hasAttribute("FILENAME"))
+                    if(getExistingFile(readQString(subSubElem, "FILENAME"), mMainWindow->getProFileName()) != "")
                     {
-                        if(getExistingFile(subSubElem.attribute("FILENAME"), mMainWindow->getProFileName()) != "")
-                        {
-                            mMainWindow->setTrackFileName(
-                                getExistingFile(subSubElem.attribute("FILENAME"), mMainWindow->getProFileName()));
-                        }
-                        else // eigentlich nicht lesbar, aber so wird wenigstens beim projekt speichern wieder mit
-                             // weggeschrieben
-                        {
-                            mMainWindow->setTrackFileName(subSubElem.attribute("FILENAME"));
-                        }
+                        mMainWindow->setTrackFileName(
+                            getExistingFile(readQString(subSubElem, "FILENAME"), mMainWindow->getProFileName()));
+                    }
+                    else // eigentlich nicht lesbar, aber so wird wenigstens beim projekt speichern wieder mit
+                         // weggeschrieben
+                    {
+                        mMainWindow->setTrackFileName(readQString(subSubElem, "FILENAME"));
                     }
                 }
                 else if(subSubElem.tagName() == "SEARCH_REGION")
                 {
-                    if(subSubElem.hasAttribute("SCALE"))
-                    {
-                        mUi->trackRegionScale->setValue(subSubElem.attribute("SCALE").toInt());
-                    }
-                    if(subSubElem.hasAttribute("LEVELS"))
-                    {
-                        mUi->trackRegionLevels->setValue(subSubElem.attribute("LEVELS").toInt());
-                    }
-                    if(subSubElem.hasAttribute("MAX_ERROR"))
-                    {
-                        mUi->trackErrorExponent->setValue(subSubElem.attribute("MAX_ERROR").toInt());
-                    }
-                    if(subSubElem.hasAttribute("SHOW"))
-                    {
-                        mUi->trackShowSearchSize->setCheckState(
-                            subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("ADAPTIVE"))
-                    {
-                        mUi->adaptiveLevel->setCheckState(
-                            subSubElem.attribute("ADAPTIVE").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadIntValue(subSubElem, "SCALE", mUi->trackRegionScale);
+                    loadIntValue(subSubElem, "LEVELS", mUi->trackRegionLevels);
+                    loadIntValue(subSubElem, "MAX_ERROR", mUi->trackErrorExponent, 0);
+                    loadBoolValue(subSubElem, "SHOW", mUi->trackShowSearchSize, false);
+                    loadBoolValue(subSubElem, "ADAPTIVE", mUi->adaptiveLevel, false);
                 }
                 else if(subSubElem.tagName() == "PATH")
                 {
-                    if(subSubElem.hasAttribute("SHOW"))
-                    {
-                        mUi->trackShow->setCheckState(
-                            subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("SHOW_COMPLETE"))
-                    {
-                        mUi->trackShowComplPath->setCheckState(
-                            subSubElem.attribute("SHOW_COMPLETE").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    else
-                    {
-                        mUi->trackShowComplPath->setCheckState(Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("FIX"))
-                    {
-                        mUi->trackFix->setCheckState(subSubElem.attribute("FIX").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-
-                    if(subSubElem.hasAttribute("ONLY_VISIBLE"))
-                    {
-                        mUi->trackShowOnlyVisible->setCheckState(
-                            subSubElem.attribute("ONLY_VISIBLE").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("ONLY_PEOPLE"))
-                    {
-                        mUi->trackShowOnly->setCheckState(
-                            subSubElem.attribute("ONLY_PEOPLE").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-
-                    if(subSubElem.hasAttribute("ONLY_PEOPLE_LIST"))
-                    {
-                        mUi->trackShowOnlyList->setCheckState(
-                            subSubElem.attribute("ONLY_PEOPLE_LIST").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-
+                    loadBoolValue(subSubElem, "SHOW_COMPLETE", mUi->trackShowComplPath, false);
+                    loadBoolValue(subSubElem, "SHOW", mUi->trackShow, true);
+                    loadBoolValue(subSubElem, "FIX", mUi->trackFix, false);
+                    loadBoolValue(subSubElem, "ONLY_VISIBLE", mUi->trackShowOnlyVisible, false);
+                    loadBoolValue(subSubElem, "ONLY_PEOPLE", mUi->trackShowOnly, false);
+                    loadBoolValue(subSubElem, "ONLY_PEOPLE_LIST", mUi->trackShowOnlyList, false);
                     // IMPORTANT: reading ONLY_PEOPLE_NR is done in petrack.cpp, as the trajectories need to be
                     // loaded before!
-                    if(subSubElem.hasAttribute("SHOW_CURRENT_POINT"))
-                    {
-                        mUi->trackShowCurrentPoint->setCheckState(
-                            subSubElem.attribute("SHOW_CURRENT_POINT").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("SHOW_POINTS"))
-                    {
-                        mUi->trackShowPoints->setCheckState(
-                            subSubElem.attribute("SHOW_POINTS").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("SHOW_PATH"))
-                    {
-                        mUi->trackShowPath->setCheckState(
-                            subSubElem.attribute("SHOW_PATH").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("SHOW_COLLECTIVE_COLOR"))
-                    {
-                        mUi->trackShowColColor->setCheckState(
-                            subSubElem.attribute("SHOW_COLLECTIVE_COLOR").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("SHOW_COLOR_MARKER"))
-                    {
-                        mUi->trackShowColorMarker->setCheckState(
-                            subSubElem.attribute("SHOW_COLOR_MARKER").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("SHOW_NUMBER"))
-                    {
-                        mUi->trackShowNumber->setCheckState(
-                            subSubElem.attribute("SHOW_NUMBER").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("SHOW_GROUND_POSITION"))
-                    {
-                        mUi->trackShowGroundPosition->setCheckState(
-                            subSubElem.attribute("SHOW_GROUND_POSITION").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("SHOW_GROUND_PATH"))
-                    {
-                        mUi->trackShowGroundPath->setCheckState(
-                            subSubElem.attribute("SHOW_GROUND_PATH").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("TRACK_PATH_COLOR"))
-                    {
-                        QColor color(subSubElem.attribute("TRACK_PATH_COLOR"));
-                        setTrackPathColor(color);
-                    }
-                    if(subSubElem.hasAttribute("TRACK_GROUND_PATH_COLOR"))
-                    {
-                        QColor color(subSubElem.attribute("TRACK_GROUND_PATH_COLOR"));
-                        setTrackGroundPathColor(color);
-                    }
-                    if(subSubElem.hasAttribute("HEAD_SIZE"))
-                    {
-                        mUi->trackHeadSized->setCheckState(
-                            subSubElem.attribute("HEAD_SIZE").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("CURRENT_POINT_SIZE"))
-                    {
-                        mUi->trackCurrentPointSize->setValue(subSubElem.attribute("CURRENT_POINT_SIZE").toInt());
-                    }
-                    if(subSubElem.hasAttribute("CURRENT_POINT_LINE_WIDTH"))
-                    {
-                        mUi->trackCurrentPointLineWidth->setValue(
-                            subSubElem.attribute("CURRENT_POINT_LINE_WIDTH").toInt());
-                    }
-                    if(subSubElem.hasAttribute("POINTS_SIZE"))
-                    {
-                        mUi->trackPointSize->setValue(subSubElem.attribute("POINTS_SIZE").toInt());
-                    }
-                    if(subSubElem.hasAttribute("SHOW_POINTS_LINE_WIDTH"))
-                    {
-                        mUi->trackShowPointsLineWidth->setValue(subSubElem.attribute("SHOW_POINTS_LINE_WIDTH").toInt());
-                    }
-                    if(subSubElem.hasAttribute("PATH_SIZE"))
-                    {
-                        mUi->trackPathWidth->setValue(subSubElem.attribute("PATH_SIZE").toInt());
-                    }
-                    if(subSubElem.hasAttribute("COLLECTIVE_COLOR_SIZE"))
-                    {
-                        mUi->trackColColorSize->setValue(subSubElem.attribute("COLLECTIVE_COLOR_SIZE").toInt());
-                    }
-                    if(subSubElem.hasAttribute("COLOR_MARKER_SIZE"))
-                    {
-                        mUi->trackColorMarkerSize->setValue(subSubElem.attribute("COLOR_MARKER_SIZE").toInt());
-                    }
-                    if(subSubElem.hasAttribute("COLOR_MARKER_LINE_WIDTH"))
-                    {
-                        mUi->trackColorMarkerLineWidth->setValue(
-                            subSubElem.attribute("COLOR_MARKER_LINE_WIDTH").toInt());
-                    }
-                    if(subSubElem.hasAttribute("NUMBER_SIZE"))
-                    {
-                        mUi->trackNumberSize->setValue(subSubElem.attribute("NUMBER_SIZE").toInt());
-                    }
-                    if(subSubElem.hasAttribute("GROUND_POSITION_SIZE"))
-                    {
-                        mUi->trackGroundPositionSize->setValue(subSubElem.attribute("GROUND_POSITION_SIZE").toInt());
-                    }
-                    if(subSubElem.hasAttribute("GROUND_PATH_SIZE"))
-                    {
-                        mUi->trackGroundPathSize->setValue(subSubElem.attribute("GROUND_PATH_SIZE").toInt());
-                    }
-                    if(subSubElem.hasAttribute("POINTS_COLORED"))
-                    {
-                        mUi->trackShowPointsColored->setCheckState(
-                            subSubElem.attribute("POINTS_COLORED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("NUMBER_BOLD"))
-                    {
-                        mUi->trackNumberBold->setCheckState(
-                            subSubElem.attribute("NUMBER_BOLD").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("BEFORE"))
-                    {
-                        mUi->trackShowBefore->setValue(subSubElem.attribute("BEFORE").toInt());
-                    }
-                    if(subSubElem.hasAttribute("AFTER"))
-                    {
-                        mUi->trackShowAfter->setValue(subSubElem.attribute("AFTER").toInt());
-                    }
+                    loadBoolValue(subSubElem, "SHOW_CURRENT_POINT", mUi->trackShowCurrentPoint, true);
+                    loadBoolValue(subSubElem, "SHOW_POINTS", mUi->trackShowPoints, false);
+                    loadBoolValue(subSubElem, "SHOW_PATH", mUi->trackShowPath, true);
+                    loadBoolValue(subSubElem, "SHOW_COLLECTIVE_COLOR", mUi->trackShowColColor, true);
+                    loadBoolValue(subSubElem, "SHOW_COLOR_MARKER", mUi->trackShowColorMarker, true);
+                    loadBoolValue(subSubElem, "SHOW_NUMBER", mUi->trackShowNumber, true);
+                    loadBoolValue(subSubElem, "SHOW_GROUND_POSITION", mUi->trackShowGroundPosition, false);
+                    loadBoolValue(subSubElem, "SHOW_GROUND_PATH", mUi->trackShowGroundPath, false);
+
+                    setTrackPathColor(readQString(subSubElem, "TRACK_PATH_COLOR", "#ff0000"));
+                    setTrackGroundPathColor(readQString(subSubElem, "TRACK_GROUND_PATH_COLOR", "#00ff00"));
+
+                    loadBoolValue(subSubElem, "HEAD_SIZE", mUi->trackHeadSized, true);
+                    loadIntValue(subSubElem, "CURRENT_POINT_SIZE", mUi->trackCurrentPointSize, 60);
+                    loadIntValue(subSubElem, "CURRENT_POINT_LINE_WIDTH", mUi->trackCurrentPointLineWidth, 1);
+                    loadIntValue(subSubElem, "POINTS_SIZE", mUi->trackPointSize, 7);
+                    loadIntValue(subSubElem, "SHOW_POINTS_LINE_WIDTH", mUi->trackShowPointsLineWidth, 1);
+                    loadIntValue(subSubElem, "PATH_SIZE", mUi->trackPathWidth, 2);
+                    loadIntValue(subSubElem, "COLLECTIVE_COLOR_SIZE", mUi->trackColColorSize, 11);
+                    loadIntValue(subSubElem, "COLOR_MARKER_SIZE", mUi->trackColorMarkerSize, 14);
+                    loadIntValue(subSubElem, "COLOR_MARKER_LINE_WIDTH", mUi->trackColorMarkerLineWidth, 1);
+                    loadIntValue(subSubElem, "NUMBER_SIZE", mUi->trackNumberSize, 14);
+                    loadIntValue(subSubElem, "GROUND_POSITION_SIZE", mUi->trackGroundPositionSize, 1);
+                    loadIntValue(subSubElem, "GROUND_PATH_SIZE", mUi->trackGroundPathSize, 1);
+                    loadBoolValue(subSubElem, "POINTS_COLORED", mUi->trackShowPointsColored, true);
+                    loadBoolValue(subSubElem, "NUMBER_BOLD", mUi->trackNumberBold, true);
+                    loadIntValue(subSubElem, "BEFORE", mUi->trackShowBefore, 15);
+                    loadIntValue(subSubElem, "AFTER", mUi->trackShowAfter, 15);
                 }
                 else
                 {
@@ -2719,51 +2365,20 @@ void Control::getXml(const QDomElement &elem, const QString &version)
             {
                 if(subSubElem.tagName() == "SEARCH_MISSING_FRAMES")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->anaMissingFrames->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->anaMissingFrames);
                 }
                 else if(subSubElem.tagName() == "MARK_ACTUAL")
                 {
-                    if(subSubElem.hasAttribute("ENABLED"))
-                    {
-                        mUi->anaMarkAct->setCheckState(
-                            subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadBoolValue(subSubElem, "ENABLED", mUi->anaMarkAct);
                 }
                 else if(subSubElem.tagName() == "CALCULATION")
                 {
-                    if(subSubElem.hasAttribute("STEP_SIZE"))
-                    {
-                        mUi->anaStep->setValue(subSubElem.attribute("STEP_SIZE").toInt());
-                    }
-                    if(subSubElem.hasAttribute("CONSIDER_X"))
-                    {
-                        mUi->anaConsiderX->setCheckState(
-                            subSubElem.attribute("CONSIDER_X").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("CONSIDER_Y"))
-                    {
-                        mUi->anaConsiderY->setCheckState(
-                            subSubElem.attribute("CONSIDER_Y").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("ABSOLUTE"))
-                    {
-                        mUi->anaConsiderAbs->setCheckState(
-                            subSubElem.attribute("ABSOLUTE").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("REVERSE"))
-                    {
-                        mUi->anaConsiderRev->setCheckState(
-                            subSubElem.attribute("REVERSE").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
-                    if(subSubElem.hasAttribute("SHOW_VORONOI"))
-                    {
-                        mUi->showVoronoiCells->setCheckState(
-                            subSubElem.attribute("SHOW_VORONOI").toInt() ? Qt::Checked : Qt::Unchecked);
-                    }
+                    loadIntValue(subSubElem, "STEP_SIZE", mUi->anaStep);
+                    loadBoolValue(subSubElem, "CONSIDER_X", mUi->anaConsiderX);
+                    loadBoolValue(subSubElem, "CONSIDER_Y", mUi->anaConsiderY);
+                    loadBoolValue(subSubElem, "ABSOLUTE", mUi->anaConsiderAbs);
+                    loadBoolValue(subSubElem, "REVERSE", mUi->anaConsiderRev);
+                    loadBoolValue(subSubElem, "SHOW_VORONOI", mUi->showVoronoiCells, false);
                 }
                 else
                 {
diff --git a/src/ui/main-windows/coordinateSystemBox.cpp b/src/ui/main-windows/coordinateSystemBox.cpp
index aff734256..96fbf71da 100644
--- a/src/ui/main-windows/coordinateSystemBox.cpp
+++ b/src/ui/main-windows/coordinateSystemBox.cpp
@@ -22,6 +22,7 @@
 #include "extrCalibration.h"
 #include "extrinsicBox.h"
 #include "imageItem.h"
+#include "importHelper.h"
 #include "intrinsicBox.h"
 #include "pGroupBox.h"
 #include "ui_coordinateSystemBox.h"
@@ -378,101 +379,37 @@ bool CoordinateSystemBox::getXml(const QDomElement &subSubElem)
 {
     if(subSubElem.tagName() == "EXTRINSIC_PARAMETERS")
     {
-        if(subSubElem.hasAttribute("SHOW_CALIB_POINTS"))
-        {
-            mUi->extCalibPointsShow->setCheckState(
-                subSubElem.attribute("SHOW_CALIB_POINTS").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
+        loadBoolValue(subSubElem, "SHOW_CALIB_POINTS", mUi->extCalibPointsShow, false);
+        loadActiveIndex(subSubElem, "COORD_DIMENSION", mUi->coordTab, 0);
+        loadBoolValue(subSubElem, "SHOW", mUi->coordShow, false);
+        loadBoolValue(subSubElem, "FIX", mUi->coordFix, false);
+        loadIntValue(subSubElem, "ROTATE", mUi->coordRotate, 0);
 
-        if(subSubElem.hasAttribute("COORD_DIMENSION"))
-        {
-            mUi->coordTab->setCurrentIndex(subSubElem.attribute("COORD_DIMENSION").toInt());
-        }
-        else
-        {
-            mUi->coordTab->setCurrentIndex(1); //  = 2D
-            mExtrBox.setEnabledExtrParams(false);
-        }
 
-        if(subSubElem.hasAttribute("SHOW"))
-        {
-            mUi->coordShow->setCheckState(subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("FIX"))
-        {
-            mUi->coordFix->setCheckState(subSubElem.attribute("FIX").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("ROTATE"))
-        {
-            mUi->coordRotate->setValue(subSubElem.attribute("ROTATE").toInt());
-        }
-        if(subSubElem.hasAttribute("TRANS_X"))
-        {
-            int trans_x = subSubElem.attribute("TRANS_X").toInt();
-            if(trans_x > mUi->coordTransX->maximum())
-            {
-                setCalibCoordTransXMax(trans_x);
-            }
-            mUi->coordTransX->setValue(trans_x);
-        }
-        if(subSubElem.hasAttribute("TRANS_Y"))
-        {
-            int trans_y = subSubElem.attribute("TRANS_Y").toInt();
-            if(trans_y > mUi->coord3DTransY->maximum())
-            {
-                setCalibCoordTransYMax(trans_y);
-            }
-            mUi->coordTransY->setValue(trans_y);
-        }
-        mUi->coordTransY->setValue(subSubElem.attribute("TRANS_Y").toInt());
-        if(subSubElem.hasAttribute("SCALE"))
-        {
-            mUi->coordScale->setValue(subSubElem.attribute("SCALE").toInt());
-        }
-        if(subSubElem.hasAttribute("ALTITUDE"))
-        {
-            mUi->coordAltitude->setValue(subSubElem.attribute("ALTITUDE").toDouble());
-        }
-        if(subSubElem.hasAttribute("UNIT"))
-        {
-            mUi->coordUnit->setValue(subSubElem.attribute("UNIT").toDouble());
-        }
-        if(subSubElem.hasAttribute("USE_INTRINSIC_CENTER"))
-        {
-            mUi->coordUseIntrinsic->setCheckState(
-                subSubElem.attribute("USE_INTRINSIC_CENTER").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("COORD3D_TRANS_X"))
-        {
-            mUi->coord3DTransX->setValue(subSubElem.attribute("COORD3D_TRANS_X").toInt());
-        }
-        if(subSubElem.hasAttribute("COORD3D_TRANS_Y"))
-        {
-            mUi->coord3DTransY->setValue(subSubElem.attribute("COORD3D_TRANS_Y").toInt());
-        }
-        if(subSubElem.hasAttribute("COORD3D_TRANS_Z"))
-        {
-            mUi->coord3DTransZ->setValue(subSubElem.attribute("COORD3D_TRANS_Z").toInt());
-        }
-        if(subSubElem.hasAttribute("COORD3D_AXIS_LEN"))
+        int trans_x = readInt(subSubElem, "TRANS_X", 0);
+        if(trans_x > mUi->coordTransX->maximum())
         {
-            mUi->coord3DAxeLen->setValue(subSubElem.attribute("COORD3D_AXIS_LEN").toInt());
+            setCalibCoordTransXMax(trans_x);
         }
-        if(subSubElem.hasAttribute("COORD3D_SWAP_X"))
-        {
-            mUi->coord3DSwapX->setCheckState(
-                subSubElem.attribute("COORD3D_SWAP_X").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("COORD3D_SWAP_Y"))
-        {
-            mUi->coord3DSwapY->setCheckState(
-                subSubElem.attribute("COORD3D_SWAP_Y").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("COORD3D_SWAP_Z"))
+        mUi->coordTransX->setValue(trans_x);
+
+        int trans_y = readInt(subSubElem, "TRANS_Y", 0);
+        if(trans_y > mUi->coord3DTransY->maximum())
         {
-            mUi->coord3DSwapZ->setCheckState(
-                subSubElem.attribute("COORD3D_SWAP_Z").toInt() ? Qt::Checked : Qt::Unchecked);
+            setCalibCoordTransYMax(trans_y);
         }
+        loadIntValue(subSubElem, "TRANS_Y", mUi->coordTransY, 0);
+        loadIntValue(subSubElem, "SCALE", mUi->coordScale, 100);
+        loadDoubleValue(subSubElem, "ALTITUDE", mUi->coordAltitude, 535);
+        loadDoubleValue(subSubElem, "UNIT", mUi->coordUnit, 100);
+        loadBoolValue(subSubElem, "USE_INTRINSIC_CENTER", mUi->coordUseIntrinsic, false);
+        loadIntValue(subSubElem, "COORD3D_TRANS_X", mUi->coord3DTransX, 0);
+        loadIntValue(subSubElem, "COORD3D_TRANS_Y", mUi->coord3DTransY, 0);
+        loadIntValue(subSubElem, "COORD3D_TRANS_Z", mUi->coord3DTransZ, 0);
+        loadIntValue(subSubElem, "COORD3D_AXIS_LEN", mUi->coord3DAxeLen, 200);
+        loadBoolValue(subSubElem, "COORD3D_SWAP_X", mUi->coord3DSwapX, false);
+        loadBoolValue(subSubElem, "COORD3D_SWAP_Y", mUi->coord3DSwapY, false);
+        loadBoolValue(subSubElem, "COORD3D_SWAP_Z", mUi->coord3DSwapZ, false);
 
         if(subSubElem.hasAttribute("IMMUTABLE_COORD_BOX"))
         {
@@ -481,7 +418,7 @@ bool CoordinateSystemBox::getXml(const QDomElement &subSubElem)
                 auto *parent = dynamic_cast<PGroupBox *>(this->parent()->parent());
                 if(parent)
                 {
-                    parent->setImmutable(subSubElem.attribute("IMMUTABLE_COORD_BOX").toInt());
+                    parent->setImmutable(readBool(subSubElem, "IMMUTABLE_COORD_BOX", false));
                 }
             }
         }
diff --git a/src/ui/main-windows/correction.cpp b/src/ui/main-windows/correction.cpp
index ae8af8f99..e4f40afff 100644
--- a/src/ui/main-windows/correction.cpp
+++ b/src/ui/main-windows/correction.cpp
@@ -20,6 +20,7 @@
 
 #include "animation.h"
 #include "control.h"
+#include "importHelper.h"
 #include "pMessageBox.h"
 #include "personStorage.h"
 #include "player.h"
@@ -198,36 +199,36 @@ bool Correction::getTestEqualChecked() const
 {
     return mUi->chbEqual->isChecked();
 }
-void Correction::setTestEqualCheckState(Qt::CheckState testEqual)
+void Correction::setTestEqualChecked(bool testEqual)
 {
-    mUi->chbEqual->setCheckState(testEqual);
+    mUi->chbEqual->setChecked(testEqual);
 }
 
 bool Correction::getTestVelocityChecked() const
 {
     return mUi->chbVelocity->isChecked();
 }
-void Correction::setTestVelocityCheckState(Qt::CheckState testVelocity)
+void Correction::setTestVelocityChecked(bool testVelocity)
 {
-    mUi->chbVelocity->setCheckState(testVelocity);
+    mUi->chbVelocity->setChecked(testVelocity);
 }
 
 bool Correction::getTestLengthChecked() const
 {
     return mUi->chbLength->isChecked();
 }
-void Correction::setTestLengthCheckState(Qt::CheckState testLength)
+void Correction::setTestLengthChecked(bool testLength)
 {
-    mUi->chbLength->setCheckState(testLength);
+    mUi->chbLength->setChecked(testLength);
 }
 
 bool Correction::getTestInsideChecked() const
 {
     return mUi->chbInside->isChecked();
 }
-void Correction::setTestInsideCheckState(Qt::CheckState testInside)
+void Correction::setTestInsideChecked(bool testInside)
 {
-    mUi->chbInside->setCheckState(testInside);
+    mUi->chbInside->setChecked(testInside);
 }
 
 void Correction::selectedRowChanged()
@@ -545,43 +546,22 @@ bool Correction::getXml(const QDomElement &correctionElem)
     {
         if(subElem.tagName() == "EQUALITY")
         {
-            if(subElem.hasAttribute("ENABLED"))
-            {
-                mUi->chbEqual->setCheckState(subElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("DISTANCE"))
-            {
-                setValue(mUi->spbxEqualityDistance, subElem.attribute("DISTANCE").toDouble());
-            }
+            loadBoolValue(subElem, "ENABLED", mUi->chbEqual);
+            loadDoubleValue(subElem, "DISTANCE", mUi->spbxEqualityDistance);
         }
         else if(subElem.tagName() == "VELOCITY")
         {
-            if(subElem.hasAttribute("ENABLED"))
-            {
-                mUi->chbVelocity->setCheckState(subElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
+            loadBoolValue(subElem, "ENABLED", mUi->chbVelocity);
         }
         else if(subElem.tagName() == "LENGTH")
         {
-            if(subElem.hasAttribute("ENABLED"))
-            {
-                mUi->chbLength->setCheckState(subElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("MIN_LENGTH"))
-            {
-                setValue(mUi->spbxMinFrameLength, subElem.attribute("MIN_LENGTH").toDouble());
-            }
+            loadBoolValue(subElem, "ENABLED", mUi->chbLength);
+            loadDoubleValue(subElem, "MIN_LENGTH", mUi->spbxMinFrameLength);
         }
         else if(subElem.tagName() == "INSIDE")
         {
-            if(subElem.hasAttribute("ENABLED"))
-            {
-                mUi->chbInside->setCheckState(subElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-            }
-            if(subElem.hasAttribute("MARGIN"))
-            {
-                setValue(mUi->spbxInsideMargin, subElem.attribute("MARGIN").toDouble());
-            }
+            loadBoolValue(subElem, "ENABLED", mUi->chbInside);
+            loadIntValue(subElem, "MARGIN", mUi->spbxInsideMargin);
         }
         else
         {
diff --git a/src/ui/main-windows/correction.h b/src/ui/main-windows/correction.h
index 7e4008c42..225b3483c 100644
--- a/src/ui/main-windows/correction.h
+++ b/src/ui/main-windows/correction.h
@@ -69,16 +69,16 @@ public:
     ~Correction() override;
 
     bool getTestEqualChecked() const;
-    void setTestEqualCheckState(Qt::CheckState testEqual);
+    void setTestEqualChecked(bool testEqual);
 
     bool getTestVelocityChecked() const;
-    void setTestVelocityCheckState(Qt::CheckState testVelocity);
+    void setTestVelocityChecked(bool testVelocity);
 
     bool getTestLengthChecked() const;
-    void setTestLengthCheckState(Qt::CheckState testLength);
+    void setTestLengthChecked(bool testLength);
 
     bool getTestInsideChecked() const;
-    void setTestInsideCheckState(Qt::CheckState testInside);
+    void setTestInsideChecked(bool testInside);
 
     void setXml(QDomElement &elem) const;
     bool getXml(const QDomElement &elem);
diff --git a/src/ui/main-windows/extrinsicBox.cpp b/src/ui/main-windows/extrinsicBox.cpp
index 029d5a91f..706f3168a 100644
--- a/src/ui/main-windows/extrinsicBox.cpp
+++ b/src/ui/main-windows/extrinsicBox.cpp
@@ -20,6 +20,7 @@
 
 #include "extrCalibration.h"
 #include "helper.h"
+#include "importHelper.h"
 #include "pGroupBox.h"
 #include "ui_extrinsicBox.h"
 
@@ -241,41 +242,20 @@ bool ExtrinsicBox::getXml(QDomElement &subSubElem)
     if(subSubElem.tagName() == "EXTRINSIC_PARAMETERS")
     {
         ExtrinsicParameters params;
-        if(subSubElem.hasAttribute("EXTR_ROT_1"))
-        {
-            params.rot1 = subSubElem.attribute("EXTR_ROT_1").toDouble();
-        }
-        if(subSubElem.hasAttribute("EXTR_ROT_2"))
-        {
-            params.rot2 = subSubElem.attribute("EXTR_ROT_2").toDouble();
-        }
-        if(subSubElem.hasAttribute("EXTR_ROT_3"))
-        {
-            params.rot3 = subSubElem.attribute("EXTR_ROT_3").toDouble();
-        }
-        if(subSubElem.hasAttribute("EXTR_TRANS_1"))
-        {
-            params.trans1 = subSubElem.attribute("EXTR_TRANS_1").toDouble();
-        }
-        if(subSubElem.hasAttribute("EXTR_TRANS_2"))
-        {
-            params.trans2 = subSubElem.attribute("EXTR_TRANS_2").toDouble();
-        }
-        if(subSubElem.hasAttribute("EXTR_TRANS_3"))
-        {
-            params.trans3 = subSubElem.attribute("EXTR_TRANS_3").toDouble();
-        }
+
+        params.rot1   = readDouble(subSubElem, "EXTR_ROT_1", 0);
+        params.rot2   = readDouble(subSubElem, "EXTR_ROT_2", 0);
+        params.rot3   = readDouble(subSubElem, "EXTR_ROT_3", 0);
+        params.trans1 = readDouble(subSubElem, "EXTR_TRANS_1", 0);
+        params.trans2 = readDouble(subSubElem, "EXTR_TRANS_2", 0);
+        params.trans3 = readDouble(subSubElem, "EXTR_TRANS_3", -500);
         setExtrinsicParameters(params);
 
         if(subSubElem.hasAttribute("EXTERNAL_CALIB_FILE"))
         {
-            if(getExistingFile(QString::fromStdString(subSubElem.attribute("EXTERNAL_CALIB_FILE").toStdString())) != "")
-            {
-                mExtrCalibration.setExtrCalibFile(
-                    getExistingFile(QString::fromStdString(subSubElem.attribute("EXTERNAL_CALIB_FILE").toStdString())));
-                // mMainWindow->isLoading() is true; doesn't perform calibration -> ignore return
-                mExtrCalibration.loadExtrCalibFile();
-            }
+            mExtrCalibration.setExtrCalibFile(getExistingFile(readQString(subSubElem, "EXTERNAL_CALIB_FILE")));
+            // mMainWindow->isLoading() is true; doesn't perform calibration -> ignore return
+            mExtrCalibration.loadExtrCalibFile();
         }
 
         if(subSubElem.hasAttribute("IMMUTABLE_EXTRINSIC_BOX"))
@@ -285,7 +265,7 @@ bool ExtrinsicBox::getXml(QDomElement &subSubElem)
                 auto *parent = dynamic_cast<PGroupBox *>(this->parent()->parent());
                 if(parent)
                 {
-                    parent->setImmutable(subSubElem.attribute("IMMUTABLE_EXTRINSIC_BOX").toInt());
+                    parent->setImmutable(readBool(subSubElem, "IMMUTABLE_EXTRINSIC_BOX", false));
                 }
             }
         }
diff --git a/src/ui/main-windows/filterBeforeBox.cpp b/src/ui/main-windows/filterBeforeBox.cpp
index 4c141f7e6..672f2d9f8 100644
--- a/src/ui/main-windows/filterBeforeBox.cpp
+++ b/src/ui/main-windows/filterBeforeBox.cpp
@@ -22,7 +22,7 @@
 #include "backgroundItem.h"
 #include "borderFilter.h"
 #include "brightContrastFilter.h"
-#include "helper.h"
+#include "importHelper.h"
 #include "pGroupBox.h"
 #include "pMessageBox.h"
 #include "swapFilter.h"
@@ -88,84 +88,40 @@ bool FilterBeforeBox::getXmlSub(QDomElement &subSubElem)
             auto *parent = dynamic_cast<PGroupBox *>(this->parent()->parent());
             if(parent)
             {
-                parent->setImmutable(subSubElem.attribute("IMMUTABLE").toInt());
+                parent->setImmutable(readBool(subSubElem, "IMMUTABLE", false));
             }
         }
     }
     else if(subSubElem.tagName() == "BRIGHTNESS")
     {
-        if(subSubElem.hasAttribute("ENABLED"))
-        {
-            mUi->filterBrightContrast->setCheckState(
-                subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("VALUE"))
-        {
-            mUi->filterBrightParam->setValue(subSubElem.attribute("VALUE").toInt());
-        }
+        loadBoolValue(subSubElem, "ENABLED", mUi->filterBrightContrast);
+        loadIntValue(subSubElem, "VALUE", mUi->filterBrightParam);
     }
     else if(subSubElem.tagName() == "CONTRAST")
     {
-        if(subSubElem.hasAttribute("ENABLED"))
-        {
-            mUi->filterBrightContrast->setCheckState(
-                subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("VALUE"))
-        {
-            mUi->filterContrastParam->setValue(subSubElem.attribute("VALUE").toInt());
-        }
+        loadBoolValue(subSubElem, "ENABLED", mUi->filterBrightContrast);
+        loadIntValue(subSubElem, "VALUE", mUi->filterContrastParam);
     }
     else if(subSubElem.tagName() == "BORDER")
     {
-        if(subSubElem.hasAttribute("ENABLED"))
-        {
-            mUi->filterBorder->setCheckState(subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("VALUE"))
-        {
-            setValue(mUi->filterBorderParamSize, subSubElem.attribute("VALUE").toInt());
-        }
+        loadBoolValue(subSubElem, "ENABLED", mUi->filterBorder);
+        loadIntValue(subSubElem, "VALUE", mUi->filterBorderParamSize);
         // bgColor still needs to be read by control
         return false;
     }
     else if(subSubElem.tagName() == "SWAP")
     {
-        if(subSubElem.hasAttribute("ENABLED"))
-        {
-            mUi->filterSwap->setCheckState(subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("HORIZONTALLY"))
-        {
-            mUi->filterSwapH->setCheckState(subSubElem.attribute("HORIZONTALLY").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("VERTICALLY"))
-        {
-            mUi->filterSwapV->setCheckState(subSubElem.attribute("VERTICALLY").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
+        loadBoolValue(subSubElem, "ENABLED", mUi->filterSwap);
+        loadBoolValue(subSubElem, "HORIZONTALLY", mUi->filterSwapH);
+        loadBoolValue(subSubElem, "VERTICALLY", mUi->filterSwapV);
     }
     else if(subSubElem.tagName() == "BG_SUB")
     {
-        if(subSubElem.hasAttribute("ENABLED"))
-        {
-            mUi->filterBg->setCheckState(subSubElem.attribute("ENABLED").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("UPDATE"))
-        {
-            mUi->filterBgUpdate->setCheckState(subSubElem.attribute("UPDATE").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("SHOW"))
-        {
-            mUi->filterBgShow->setCheckState(subSubElem.attribute("SHOW").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("DELETE"))
-        {
-            mUi->filterBgDeleteTrj->setCheckState(subSubElem.attribute("DELETE").toInt() ? Qt::Checked : Qt::Unchecked);
-        }
-        if(subSubElem.hasAttribute("DELETE_NUMBER"))
-        {
-            mUi->filterBgDeleteNumber->setValue(subSubElem.attribute("DELETE_NUMBER").toInt());
-        }
+        loadBoolValue(subSubElem, "ENABLED", mUi->filterBg);
+        loadBoolValue(subSubElem, "UPDATE", mUi->filterBgUpdate, false);
+        loadBoolValue(subSubElem, "SHOW", mUi->filterBgShow, false);
+        loadBoolValue(subSubElem, "DELETE", mUi->filterBgDeleteTrj, true);
+        loadIntValue(subSubElem, "DELETE_NUMBER", mUi->filterBgDeleteNumber, 3);
         // control still needs to read file
         return false;
     }
diff --git a/src/ui/main-windows/intrinsicBox.cpp b/src/ui/main-windows/intrinsicBox.cpp
index 1674042a0..a2cbb3ba5 100644
--- a/src/ui/main-windows/intrinsicBox.cpp
+++ b/src/ui/main-windows/intrinsicBox.cpp
@@ -22,6 +22,7 @@
 #include "calibFilter.h"
 #include "extrinsicBox.h"
 #include "helper.h"
+#include "importHelper.h"
 #include "pGroupBox.h"
 #include "pMessageBox.h"
 #include "ui_intrinsicBox.h"
@@ -137,88 +138,27 @@ void IntrinsicBox::imageSizeChanged(int width, int height, int borderDiff)
 IntrinsicCameraParams IntrinsicBox::getXmlParams(const QDomElement &elem)
 {
     IntrinsicCameraParams params;
-    if(elem.hasAttribute("FX"))
-    {
-        params.setFx(elem.attribute("FX").toDouble());
-    }
-    if(elem.hasAttribute("FY"))
-    {
-        params.setFy(elem.attribute("FY").toDouble());
-    }
-    if(elem.hasAttribute("CX"))
-    {
-        params.setCx(elem.attribute("CX").toDouble());
-    }
-    if(elem.hasAttribute("CY"))
-    {
-        params.setCy(elem.attribute("CY").toDouble());
-    }
-    if(elem.hasAttribute("R2"))
-    {
-        params.setR2(elem.attribute("R2").toDouble());
-    }
-    if(elem.hasAttribute("R4"))
-    {
-        params.setR4(elem.attribute("R4").toDouble());
-    }
-    if(elem.hasAttribute("R6"))
-    {
-        params.setR6(elem.attribute("R6").toDouble());
-    }
-    if(elem.hasAttribute("TX"))
-    {
-        params.setTx(elem.attribute("TX").toDouble());
-    }
-    if(elem.hasAttribute("TY"))
-    {
-        params.setTy(elem.attribute("TY").toDouble());
-    }
-    if(elem.hasAttribute("K4"))
-    {
-        params.setK4(elem.attribute("K4").toDouble());
-    }
-    if(elem.hasAttribute("K5"))
-    {
-        params.setK5(elem.attribute("K5").toDouble());
-    }
-    if(elem.hasAttribute("K6"))
-    {
-        params.setK6(elem.attribute("K6").toDouble());
-    }
-    if(elem.hasAttribute("S1"))
-    {
-        params.setS1(elem.attribute("S1").toDouble());
-    }
-    if(elem.hasAttribute("S2"))
-    {
-        params.setS2(elem.attribute("S2").toDouble());
-    }
-    if(elem.hasAttribute("S3"))
-    {
-        params.setS3(elem.attribute("S3").toDouble());
-    }
-    if(elem.hasAttribute("S4"))
-    {
-        params.setS4(elem.attribute("S4").toDouble());
-    }
-    if(elem.hasAttribute("TAUX"))
-    {
-        params.setTaux(elem.attribute("TAUX").toDouble());
-    }
-    if(elem.hasAttribute("TAUY"))
-    {
-        params.setTauy(elem.attribute("TAUY").toDouble());
-    }
-    if(elem.hasAttribute("ReprError"))
-    {
-        bool conversionSuccessful;
-        params.reprojectionError = elem.attribute("ReprError").toDouble(&conversionSuccessful);
-        if(!conversionSuccessful)
-        {
-            // Qt sets to inf instead of nan
-            params.reprojectionError = std::numeric_limits<double>::quiet_NaN();
-        }
-    }
+
+    params.setFx(readDouble(elem, "FX", 881));
+    params.setFy(readDouble(elem, "FY", 881));
+    params.setCx(readDouble(elem, "CX", 551.5));
+    params.setCy(readDouble(elem, "CY", 383.5));
+    params.setR2(readDouble(elem, "R2", 0));
+    params.setR4(readDouble(elem, "R4", 0));
+    params.setR6(readDouble(elem, "R6", 0));
+    params.setTx(readDouble(elem, "TX", 0));
+    params.setTy(readDouble(elem, "TY", 0));
+    params.setK4(readDouble(elem, "K4", 0));
+    params.setK5(readDouble(elem, "K5", 0));
+    params.setK6(readDouble(elem, "K6", 0));
+    params.setS1(readDouble(elem, "S1", 0));
+    params.setS2(readDouble(elem, "S2", 0));
+    params.setS3(readDouble(elem, "S3", 0));
+    params.setS4(readDouble(elem, "S4", 0));
+    params.setTaux(readDouble(elem, "TAUX", 0));
+    params.setTauy(readDouble(elem, "TAUY", 0));
+    params.reprojectionError = readDouble(elem, "ReprError", std::numeric_limits<double>::quiet_NaN());
+
     return params;
 }
 
@@ -256,32 +196,23 @@ bool IntrinsicBox::getXml(QDomElement &subSubElem)
 {
     if(subSubElem.tagName() == "PATTERN")
     {
-        if(subSubElem.hasAttribute("BOARD_SIZE_X"))
-        {
-            mUi->boardSizeX->setValue(subSubElem.attribute("BOARD_SIZE_X").toInt());
-        }
-        if(subSubElem.hasAttribute("BOARD_SIZE_Y"))
-        {
-            mUi->boardSizeY->setValue(subSubElem.attribute("BOARD_SIZE_Y").toInt());
-        }
-        if(subSubElem.hasAttribute("SQUARE_SIZE"))
-        {
-            mUi->squareSize->setValue(subSubElem.attribute("SQUARE_SIZE").toDouble());
-        }
+        loadIntValue(subSubElem, "BOARD_SIZE_X", mUi->boardSizeX, 6);
+        loadIntValue(subSubElem, "BOARD_SIZE_Y", mUi->boardSizeY, 8);
+        loadDoubleValue(subSubElem, "SQUARE_SIZE", mUi->squareSize, 4.6);
     }
     else if(subSubElem.tagName() == "INTRINSIC_PARAMETERS")
     {
-        loadValue(subSubElem, "ENABLED", mUi->apply);
+        loadBoolValue(subSubElem, "ENABLED", mUi->apply, false);
         // signals are supposed to change model values; but since we read them in
         // from a valid file, no changes are neccessary -> can safely block signals
-        loadValue(subSubElem, "QUAD_ASPECT_RATIO", mUi->quadAspectRatio);
-        loadValue(subSubElem, "FIX_CENTER", mUi->fixCenter);
-        loadValue(subSubElem, "TANG_DIST", mUi->tangDist);
+        loadBoolValue(subSubElem, "QUAD_ASPECT_RATIO", mUi->quadAspectRatio, false);
+        loadBoolValue(subSubElem, "FIX_CENTER", mUi->fixCenter, false);
+        loadBoolValue(subSubElem, "TANG_DIST", mUi->tangDist, false);
 
         if(subSubElem.elementsByTagName("OLD_MODEL").isEmpty())
         {
             // old file with only one model
-            if(subSubElem.hasAttribute("EXT_MODEL_ENABLED") && subSubElem.attribute("EXT_MODEL_ENABLED").toInt())
+            if(subSubElem.hasAttribute("EXT_MODEL_ENABLED") && readBool(subSubElem, "EXT_MODEL_ENABLED"))
             {
                 mModelsParams.extModelParams = getXmlParams(subSubElem);
                 mModelsParams.oldModelParams = IntrinsicCameraParams{};
@@ -301,7 +232,7 @@ bool IntrinsicBox::getXml(QDomElement &subSubElem)
         checkModelParams(mModelsParams.oldModelParams);
         checkModelParams(mModelsParams.extModelParams);
 
-        loadValue(subSubElem, "EXT_MODEL_ENABLED", mUi->extModelCheckBox);
+        loadBoolValue(subSubElem, "EXT_MODEL_ENABLED", mUi->extModelCheckBox, false);
 
         loadCalibFiles(subSubElem);
 
@@ -351,7 +282,7 @@ bool IntrinsicBox::getXml(QDomElement &subSubElem)
                 auto *parent = dynamic_cast<PGroupBox *>(this->parent()->parent());
                 if(parent)
                 {
-                    parent->setImmutable(subSubElem.attribute("IMMUTABLE").toInt());
+                    parent->setImmutable(readBool(subSubElem, "IMMUTABLE", false));
                 }
             }
         }
diff --git a/src/ui/visualization/moCapController.cpp b/src/ui/visualization/moCapController.cpp
index 2fd6f227a..571a01396 100644
--- a/src/ui/visualization/moCapController.cpp
+++ b/src/ui/visualization/moCapController.cpp
@@ -19,7 +19,7 @@
 #include "moCapController.h"
 
 #include "IO.h"
-#include "helper.h"
+#include "importHelper.h"
 #include "logger.h"
 #include "moCapPerson.h"
 
@@ -317,20 +317,10 @@ void MoCapController::setXml(QDomElement &elem)
 void MoCapController::getXml(const QDomElement &elem)
 {
     // NOTE: Maybe only load the c3d-files once show is activated
-    if(elem.hasAttribute("SHOW"))
-    {
-        bool isVisible = elem.attribute("SHOW").toInt();
-        setShowMoCap(isVisible);
-    }
-    if(elem.hasAttribute("COLOR"))
-    {
-        QColor color(elem.attribute("COLOR"));
-        setColor(color);
-    }
-    if(elem.hasAttribute("SIZE"))
-    {
-        setThickness(elem.attribute("SIZE").toInt());
-    }
+
+    setShowMoCap(readBool(elem, "SHOW"));
+    setColor(readQString(elem, "COLOR"));
+    setThickness(readInt(elem, "SIZE"));
 
     std::vector<MoCapPersonMetadata> savedMetadata;
     try
@@ -340,96 +330,43 @@ void MoCapController::getXml(const QDomElement &elem)
             if(subElem.tagName() == "PERSON")
             {
                 MoCapPersonMetadata metadata;
-                bool                ok;
                 QString             path;
-                if(subElem.hasAttribute("FILE") && subElem.hasAttribute("SYSTEM"))
+                path               = readQString(subElem, "FILE");
+                const QString file = getExistingFile(path);
+                path               = path.split(";").size() == 2 ? path.split(";").at(1) :
+                                                                   "Saved path is invalid"
+                                                                   "";
+                int system         = readInt(subElem, "SYSTEM");
+                if(system < 0 || system >= MoCapSystem::END)
                 {
-                    path               = subElem.attribute("FILE");
-                    const QString file = getExistingFile(path);
-                    path               = path.split(";").size() == 2 ? path.split(";").at(1) :
-                                                                       "Saved path is invalid"
-                                                                       "";
-                    int system         = subElem.attribute("SYSTEM").toInt(&ok);
-
-                    if(!ok)
-                    {
-                        std::stringstream ss;
-                        ss << "Element SYSTEM of " << path << " does not contain a valid integer!";
-                        throw std::invalid_argument(ss.str());
-                    }
-                    if(system < 0 || system >= MoCapSystem::END)
-                    {
-                        std::stringstream ss;
-                        ss << "System index " << system << " of file " << path
-                           << " is not associated with an implemented MoCap system.";
-                        throw std::invalid_argument(ss.str());
-                    }
-
-                    metadata.setFilepath(file.toStdString(), static_cast<MoCapSystem>(system));
+                    throw std::invalid_argument(
+                        QString("System index %1 of file %2 is not associated with an implemented MoCap system.")
+                            .arg(system)
+                            .arg(path)
+                            .toStdString());
                 }
-                if(subElem.hasAttribute("TIME_OFFSET"))
-                {
-                    metadata.setUserTimeOffset(subElem.attribute("TIME_OFFSET").toDouble(&ok));
-                    std::stringstream ss;
-                    ss << "Element TIME_OFFSET of file " << path << " does not contain a valid floating-point number!";
-                    if(!ok)
-                    {
-                        throw std::invalid_argument(ss.str());
-                    }
-                }
-                if(subElem.hasAttribute("SAMPLE_RATE"))
-                {
-                    metadata.setSamplerate(subElem.attribute("SAMPLE_RATE").toInt(&ok));
-                    std::stringstream ss;
-                    ss << "Element SAMPLE_RATE of file " << path << " does not contain a valid integer!";
-                    if(!ok)
-                    {
-                        throw std::invalid_argument(ss.str());
-                    }
-                }
-                if(subElem.hasAttribute("VISIBLE"))
-                {
-                    metadata.setVisible(subElem.attribute("VISIBLE").toInt(&ok));
-                    std::stringstream ss;
-                    ss << "Element VISIBLE of file " << path
-                       << " does not contain a valid value integer (should be 0 or 1)!";
-                    if(!ok)
-                    {
-                        throw std::invalid_argument(ss.str());
-                    }
-                }
-                if(subElem.hasAttribute("ANGLE"))
-                {
-                    double            angle = subElem.attribute("ANGLE").toDouble(&ok);
-                    std::stringstream ss;
-                    ss << "Element ANGLE of file " << path
-                       << " does not contain a valid angle (should be between -360 and 360)!";
-                    if(!ok || abs(angle) > 360)
-                    {
-                        throw std::invalid_argument(ss.str());
-                    }
-                    metadata.setAngle(angle);
-                }
-                if(subElem.hasAttribute("TRANS_X") && subElem.hasAttribute("TRANS_Y") &&
-                   subElem.hasAttribute("TRANS_Z"))
+                metadata.setFilepath(file.toStdString(), static_cast<MoCapSystem>(system));
+                metadata.setUserTimeOffset(readDouble(subElem, "TIME_OFFSET", 0));
+                metadata.setSamplerate(readInt(subElem, "SAMPLE_RATE"));
+                metadata.setVisible(readBool(subElem, "VISIBLE", false));
+
+
+                double angle = readDouble(subElem, "ANGLE", 0);
+                if(abs(angle) > 360)
                 {
-                    bool   allOk  = true;
-                    double transX = subElem.attribute("TRANS_X").toDouble(&ok);
-                    allOk &= ok;
-                    double transY = subElem.attribute("TRANS_Y").toDouble(&ok);
-                    allOk &= ok;
-                    double transZ = subElem.attribute("TRANS_Z").toDouble(&ok);
-                    allOk &= ok;
-
-                    std::stringstream ss;
-                    ss << "Element TRANS of file " << path << " does not contain a valid translation!";
-                    if(!allOk)
-                    {
-                        throw std::invalid_argument(ss.str());
-                    }
-                    metadata.setTranslation(
-                        cv::Affine3f(cv::Mat::eye(3, 3, CV_32F), cv::Vec3f(transX, transY, transZ)));
+                    throw std::invalid_argument(
+                        QString(
+                            "Element ANGLE of file %1 does not contain a valid angle (should be between -360 and 360)!")
+                            .arg(path)
+                            .toStdString());
                 }
+                metadata.setAngle(angle);
+
+                double transX = readDouble(subElem, "TRANS_X", 0);
+                double transY = readDouble(subElem, "TRANS_Y", 0);
+                double transZ = readDouble(subElem, "TRANS_Z", 0);
+                metadata.setTranslation(cv::Affine3f(cv::Mat::eye(3, 3, CV_32F), cv::Vec3f(transX, transY, transZ)));
+
                 savedMetadata.push_back(metadata);
             }
         }
diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt
index fc9829bfa..3ce07e544 100644
--- a/src/util/CMakeLists.txt
+++ b/src/util/CMakeLists.txt
@@ -7,5 +7,7 @@ target_sources(petrack_core PRIVATE
     helper.h             
     logger.h             
     vector.cpp           
-    vector.h             
+    vector.h
+    importHelper.h
+    importHelper.cpp
 )
diff --git a/src/util/helper.cpp b/src/util/helper.cpp
index a4bd14ae2..2388da1bb 100644
--- a/src/util/helper.cpp
+++ b/src/util/helper.cpp
@@ -20,7 +20,6 @@
 
 #include "logger.h"
 
-#include <QCheckBox>
 #include <algorithm>
 #include <opencv2/opencv.hpp>
 
@@ -255,32 +254,3 @@ bool newerThanVersion(const QString &q1, const QString &q2)
     }
     return false;
 }
-
-
-void loadValueBlocked(const QDomElement &elem, const QString &name, QCheckBox *widget)
-{
-    if(elem.hasAttribute(name))
-    {
-        QSignalBlocker blocker(widget);
-        setValue(widget, bool(elem.attribute(name).toInt()));
-    }
-}
-
-void setValue(QCheckBox *widget, bool value)
-{
-    widget->setChecked(value);
-}
-
-void setValueBlocked(QCheckBox *widget, bool value)
-{
-    QSignalBlocker blocker(widget);
-    widget->setChecked(value);
-}
-
-void loadValue(const QDomElement &elem, const QString &name, QCheckBox *widget)
-{
-    if(elem.hasAttribute(name))
-    {
-        setValue(widget, bool(elem.attribute(name).toInt()));
-    }
-}
diff --git a/src/util/helper.h b/src/util/helper.h
index e8559bf95..86ba4725e 100644
--- a/src/util/helper.h
+++ b/src/util/helper.h
@@ -25,8 +25,6 @@
 #include <opencv2/core/types.hpp>
 #include <opencv2/opencv.hpp>
 
-class QCheckBox;
-
 extern const QString commandLineOptionsString;
 extern QString       proFileName; ///< Path to the project (.pet) file; defined in helper.cpp
 
@@ -293,73 +291,5 @@ T computeMedian(std::vector<T> data)
     return 0.5 * (data[data.size() / 2] + data[(data.size() - 1) / 2]);
 }
 
-#include <QDomElement>
-
-template <typename T>
-void setValue(T widget, double value)
-{
-    if(widget->minimum() > value || widget->maximum() < value)
-    {
-        std::stringstream ss;
-        ss << "Value " << value << " for " << widget->objectName().toStdString() << " is out of range from "
-           << widget->minimum() << " to " << widget->maximum();
-        throw std::domain_error(ss.str());
-    }
-    widget->setValue(value);
-}
-
-void setValue(QCheckBox *widget, bool value);
-
-template <typename T>
-void loadValue(const QDomElement &elem, const QString &name, T widget)
-{
-    if(elem.hasAttribute(name))
-    {
-        setValue(widget, elem.attribute(name).toDouble());
-    }
-}
-
-void loadValue(const QDomElement &elem, const QString &name, QCheckBox *widget);
 
-template <typename T>
-void setValueBlocked(T widget, double value)
-{
-    if(widget->minimum() > value || widget->maximum() < value)
-    {
-        std::stringstream ss;
-        ss << "Value " << value << " for " << widget->objectName().toStdString() << " is out of range from "
-           << widget->minimum() << " to " << widget->maximum();
-        throw std::domain_error(ss.str());
-    }
-    widget->blockSignals(true);
-    widget->setValue(value);
-    widget->blockSignals(false);
-}
-
-void setValueBlocked(QCheckBox *widget, bool value);
-
-
-template <typename T>
-void loadValueBlocked(const QDomElement &elem, const QString &name, T widget)
-{
-    if(elem.hasAttribute(name))
-    {
-        QSignalBlocker blocker(widget);
-        setValue(widget, elem.attribute(name).toDouble());
-    }
-}
-
-void loadValueBlocked(const QDomElement &elem, const QString &name, QCheckBox *widget);
-
-template <typename T>
-void checkValueValid(T widget, double value)
-{
-    if(widget->minimum() > value || widget->maximum() < value)
-    {
-        std::stringstream ss;
-        ss << "Value " << value << " for " << widget->objectName().toStdString() << " is out of range from "
-           << widget->minimum() << " to " << widget->maximum();
-        throw std::domain_error(ss.str());
-    }
-}
 #endif
diff --git a/src/util/importHelper.cpp b/src/util/importHelper.cpp
new file mode 100644
index 000000000..b3f5e0905
--- /dev/null
+++ b/src/util/importHelper.cpp
@@ -0,0 +1,255 @@
+/*
+ * PeTrack - Software for tracking pedestrians movement in videos
+ * Copyright (C) 2024 Forschungszentrum Jülich GmbH, IAS-7
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+#include "importHelper.h"
+
+#include <QAction>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QGroupBox>
+#include <QTabWidget>
+
+void loadBoolValueBlocked(const QDomElement &elem, const QString &name, QCheckBox *widget)
+{
+    QSignalBlocker blocker(widget);
+    setValue(widget, readBool(elem, name));
+}
+
+void setValue(QCheckBox *widget, bool value)
+{
+    widget->setChecked(value);
+}
+
+double readDouble(const QDomElement &elem, const QString &name, const double &defaultVal)
+{
+    if(elem.hasAttribute(name))
+    {
+        bool   parsedSuccessfully = false;
+        double value              = elem.attribute(name).toDouble(&parsedSuccessfully);
+        if(!parsedSuccessfully)
+        {
+            throw std::domain_error(
+                QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.")
+                    .arg(name)
+                    .arg(value)
+                    .arg(elem.tagName())
+                    .toStdString());
+        }
+        return value;
+    }
+    return defaultVal;
+}
+
+double readDouble(const QDomElement &elem, const QString &name)
+{
+    if(elem.hasAttribute(name))
+    {
+        bool   parsedSuccessfully = false;
+        double value              = elem.attribute(name).toDouble(&parsedSuccessfully);
+        if(!parsedSuccessfully)
+        {
+            throw std::domain_error(
+                QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.")
+                    .arg(name)
+                    .arg(value)
+                    .arg(elem.tagName())
+                    .toStdString());
+        }
+        return value;
+    }
+    throw std::domain_error(QString("Required parameter %1 is missing in the .pet-file.").arg(name).toStdString());
+}
+
+int readInt(const QDomElement &elem, const QString &name, const int defaultVal)
+{
+    if(elem.hasAttribute(name))
+    {
+        bool parsedSuccessfully = false;
+        int  value              = elem.attribute(name).toInt(&parsedSuccessfully);
+        if(!parsedSuccessfully)
+        {
+            throw std::domain_error(
+                QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.")
+                    .arg(name)
+                    .arg(value)
+                    .arg(elem.tagName())
+                    .toStdString());
+        }
+        return value;
+    }
+    return defaultVal;
+}
+
+int readInt(const QDomElement &elem, const QString &name)
+{
+    if(elem.hasAttribute(name))
+    {
+        bool parsedSuccessfully = false;
+        int  value              = elem.attribute(name).toInt(&parsedSuccessfully);
+        if(!parsedSuccessfully)
+        {
+            throw std::domain_error(
+                QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.")
+                    .arg(name)
+                    .arg(value)
+                    .arg(elem.tagName())
+                    .toStdString());
+        }
+        return value;
+    }
+    throw std::domain_error(QString("Required parameter %1 is missing in the .pet-file.").arg(name).toStdString());
+}
+
+QString readQString(const QDomElement &elem, const QString &name, const QString &defaultVal)
+{
+    if(elem.hasAttribute(name))
+    {
+        return elem.attribute(name);
+    }
+    return defaultVal;
+}
+
+QString readQString(const QDomElement &elem, const QString &name)
+{
+    if(elem.hasAttribute(name))
+    {
+        return elem.attribute(name);
+    }
+    throw std::domain_error(QString("Required parameter %1 is missing in the .pet-file.").arg(name).toStdString());
+}
+
+bool readBool(const QDomElement &elem, const QString &name, const bool &defaultVal)
+{
+    if(elem.hasAttribute(name))
+    {
+        bool parsedSuccessfully = false;
+        int  value              = elem.attribute(name).toInt(&parsedSuccessfully);
+        if(!parsedSuccessfully)
+        {
+            throw std::domain_error(
+                QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.")
+                    .arg(name)
+                    .arg(value)
+                    .arg(elem.tagName())
+                    .toStdString());
+        }
+        // implicitely casting int to bool otherwise returns true for every number except 0
+        if(value == 1 || value == Qt::Checked)
+        {
+            return true;
+        }
+        if(value == 0)
+        {
+            return false;
+        }
+        throw std::domain_error(
+            QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.")
+                .arg(name)
+                .arg(value)
+                .arg(elem.tagName())
+                .toStdString());
+    }
+    return defaultVal;
+}
+
+bool readBool(const QDomElement &elem, const QString &name)
+{
+    if(elem.hasAttribute(name))
+    {
+        bool parsedSuccessfully = false;
+        int  value              = elem.attribute(name).toInt(&parsedSuccessfully);
+        if(!parsedSuccessfully)
+        {
+            throw std::domain_error(
+                QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.")
+                    .arg(name)
+                    .arg(value)
+                    .arg(elem.tagName())
+                    .toStdString());
+        }
+        // implicitely casting int to bool otherwise returns true for every number except 0
+        if(value == 1 || value == Qt::Checked)
+        {
+            return true;
+        }
+        else if(value == 0)
+        {
+            return false;
+        }
+        else
+        {
+            throw std::domain_error(
+                QString("Could not parse parameter %1 successfully. Value: %2, Node: %3. Ill-formed .pet-file.")
+                    .arg(name)
+                    .arg(value)
+                    .arg(elem.tagName())
+                    .toStdString());
+        }
+    }
+    throw std::domain_error(QString("Required parameter %1 is missing in the .pet-file.").arg(name).toStdString());
+}
+
+void setValueBlocked(QCheckBox *widget, bool value)
+{
+    QSignalBlocker blocker(widget);
+    widget->setChecked(value);
+}
+
+void loadValue(const QDomElement &elem, const QString &name, QCheckBox *widget)
+{
+    setValue(widget, readBool(elem, name));
+}
+
+void loadActiveIndex(const QDomElement &elem, const QString &name, QComboBox *widget, const int defaultVal)
+{
+    widget->setCurrentIndex(readInt(elem, name, defaultVal));
+}
+
+void loadActiveIndex(const QDomElement &elem, const QString &name, QComboBox *widget)
+{
+    widget->setCurrentIndex(readInt(elem, name));
+}
+
+void loadActiveIndex(const QDomElement &elem, const QString &name, QTabWidget *widget, const int defaultVal)
+{
+    widget->setCurrentIndex(readInt(elem, name, defaultVal));
+}
+
+void loadActiveIndex(const QDomElement &elem, const QString &name, QTabWidget *widget)
+{
+    widget->setCurrentIndex(readInt(elem, name));
+}
+
+void loadBoolValue(const QDomElement &elem, const QString &name, QGroupBox *widget, const bool defaultVal)
+{
+    widget->setChecked(readBool(elem, name, defaultVal));
+}
+
+void loadBoolValue(const QDomElement &elem, const QString &name, QGroupBox *widget)
+{
+    widget->setChecked(readBool(elem, name));
+}
+
+void loadBoolValue(const QDomElement &elem, const QString &name, QAction *widget, const bool defaultVal)
+{
+    widget->setChecked(readBool(elem, name, defaultVal));
+}
+void loadBoolValue(const QDomElement &elem, const QString &name, QAction *widget)
+{
+    widget->setChecked(readBool(elem, name));
+}
\ No newline at end of file
diff --git a/src/util/importHelper.h b/src/util/importHelper.h
new file mode 100644
index 000000000..2380eda14
--- /dev/null
+++ b/src/util/importHelper.h
@@ -0,0 +1,162 @@
+/*
+ * PeTrack - Software for tracking pedestrians movement in videos
+ * Copyright (C) 2024 Forschungszentrum Jülich GmbH, IAS-7
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef IMPORTHELPER_H
+#define IMPORTHELPER_H
+
+#include <QDomElement>
+#include <QFileInfo>
+#include <sstream>
+
+class QCheckBox;
+class QComboBox;
+class QGroupBox;
+class QTabWidget;
+class QAction;
+
+
+template <typename T>
+void setValue(T widget, double value);
+void setValue(QCheckBox *widget, bool value);
+
+double  readDouble(const QDomElement &elem, const QString &name, const double &defaultVal);
+double  readDouble(const QDomElement &elem, const QString &name);
+int     readInt(const QDomElement &elem, const QString &name, const int defaultVal);
+int     readInt(const QDomElement &elem, const QString &name);
+QString readQString(const QDomElement &elem, const QString &name, const QString &defaultVal);
+QString readQString(const QDomElement &elem, const QString &name);
+bool    readBool(const QDomElement &elem, const QString &name, const bool &defaultVal);
+bool    readBool(const QDomElement &elem, const QString &name);
+
+template <typename T>
+void loadIntValue(const QDomElement &elem, const QString &name, T widget, const int defaultVal);
+template <typename T>
+void loadIntValue(const QDomElement &elem, const QString &name, T widget);
+template <typename T>
+void loadDoubleValue(const QDomElement &elem, const QString &name, T widget, const double defaultVal);
+template <typename T>
+void loadDoubleValue(const QDomElement &elem, const QString &name, T widget);
+template <typename T>
+void loadBoolValue(const QDomElement &elem, const QString &name, T widget);
+template <typename T>
+void loadBoolValue(const QDomElement &elem, const QString &name, T widget);
+void loadBoolValue(const QDomElement &elem, const QString &name, QGroupBox *widget, bool defaultVal);
+void loadBoolValue(const QDomElement &elem, const QString &name, QGroupBox *widget);
+void loadBoolValue(const QDomElement &elem, const QString &name, QAction *widget, bool defaultVal);
+void loadBoolValue(const QDomElement &elem, const QString &name, QAction *widget);
+void loadActiveIndex(const QDomElement &elem, const QString &name, QComboBox *widget, const int defaultVal);
+void loadActiveIndex(const QDomElement &elem, const QString &name, QComboBox *widget);
+void loadActiveIndex(const QDomElement &elem, const QString &name, QTabWidget *widget, const int defaultVal);
+void loadActiveIndex(const QDomElement &elem, const QString &name, QTabWidget *widget);
+
+template <typename T>
+void setValueBlocked(T widget, double value);
+void setValueBlocked(QCheckBox *widget, bool value);
+
+template <typename T>
+void loadDoubleValueBlocked(const QDomElement &elem, const QString &name, T widget);
+void loadBoolValueBlocked(const QDomElement &elem, const QString &name, QCheckBox *widget);
+
+template <typename T>
+void checkValueValid(T widget, double value);
+
+
+template <typename T>
+inline void setValue(T widget, double value)
+{
+    if(widget->minimum() > value || widget->maximum() < value)
+    {
+        std::stringstream ss;
+        ss << "Value " << value << " for " << widget->objectName().toStdString() << " is out of range from "
+           << widget->minimum() << " to " << widget->maximum();
+        throw std::domain_error(ss.str());
+    }
+    widget->setValue(value);
+}
+
+template <typename T>
+void loadIntValue(const QDomElement &elem, const QString &name, T widget, const int defaultVal)
+{
+    setValue(widget, readInt(elem, name, defaultVal));
+}
+
+template <typename T>
+void loadIntValue(const QDomElement &elem, const QString &name, T widget)
+{
+    setValue(widget, readInt(elem, name));
+}
+
+template <typename T>
+void loadDoubleValue(const QDomElement &elem, const QString &name, T widget, const double defaultVal)
+{
+    setValue(widget, readDouble(elem, name, defaultVal));
+}
+
+template <typename T>
+void loadDoubleValue(const QDomElement &elem, const QString &name, T widget)
+{
+    setValue(widget, readDouble(elem, name));
+}
+
+template <typename T>
+void loadBoolValue(const QDomElement &elem, const QString &name, T widget, bool defaultVal)
+{
+    setValue(widget, readBool(elem, name, defaultVal));
+}
+
+template <typename T>
+void loadBoolValue(const QDomElement &elem, const QString &name, T widget)
+{
+    setValue(widget, readBool(elem, name));
+}
+
+template <typename T>
+void setValueBlocked(T widget, double value)
+{
+    if(widget->minimum() > value || widget->maximum() < value)
+    {
+        std::stringstream ss;
+        ss << "Value " << value << " for " << widget->objectName().toStdString() << " is out of range from "
+           << widget->minimum() << " to " << widget->maximum();
+        throw std::domain_error(ss.str());
+    }
+    widget->blockSignals(true);
+    widget->setValue(value);
+    widget->blockSignals(false);
+}
+
+template <typename T>
+void loadDoubleValueBlocked(const QDomElement &elem, const QString &name, T widget)
+{
+    QSignalBlocker blocker(widget);
+    setValue(widget, readDouble(elem, name));
+}
+
+template <typename T>
+void checkValueValid(T widget, double value)
+{
+    if(widget->minimum() > value || widget->maximum() < value)
+    {
+        std::stringstream ss;
+        ss << "Value " << value << " for " << widget->objectName().toStdString() << " is out of range from "
+           << widget->minimum() << " to " << widget->maximum();
+        throw std::domain_error(ss.str());
+    }
+}
+
+#endif // IMPORTHELPER_H
diff --git a/tests/regression_test/data/old_pet_files/2006.pet b/tests/regression_test/data/old_pet_files/2006.pet
new file mode 100644
index 000000000..5029f895c
--- /dev/null
+++ b/tests/regression_test/data/old_pet_files/2006.pet
@@ -0,0 +1,47 @@
+<?xml version="1.0" ?>
+<!DOCTYPE PETRACK>
+<PETRACK VERSION="0.6" >
+    <MAIN SRC="D:/Petrack/b090.avi" STATUS_HEIGHT="180" />
+    <CONTROL TAB="2" >
+        <CALIBRATION>
+            <BRIGHTNESS ENABLED="0" VALUE="0" />
+            <CONTRAST ENABLED="0" VALUE="0" />
+            <BORDER ENABLED="1" VALUE="39" COLOR="#000000" />
+            <BG_SUB ENABLED="0" />
+            <INTRINSIC_PARAMETERS FX="882.16" FY="882.16" R2="-0.378664" TANG_DIST="1" CALIB_FILES="C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/22.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/1.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/2.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/3.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/4.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/5.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/6.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/7.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/8.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/9.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/10.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/11.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/12.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/13.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/14.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/15.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/16.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/17.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/18.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/19.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/20.png, C:/Dokumente und Einstellungen/Maik Boltes/Eigene Dateien/diss/src/opencv/calibrate/pattern_usb_tamron_cam2/v2/21.png" CX="589.5" R4="0.158617" TX="-0.000241" CY="461.5" TY="0.000312" ENABLED="1" FIX_CENTER="1" QUAD_ASPECT_RATIO="1" />
+            <EXTRINSIC_PARAMETERS FIX="1" ALTITUDE="537" UNIT="46" USE_INTRINSIC_CENTER="0" SCALE="767" TILT_X="4000" TILT_Y="4000" TRANS_X="5179" TRANS_Y="2170" SHOW="0" ROTATE="27" />
+            <ALIGNMENT_GRID FIX="1" SCALE="768" TRANS_X="245" TRANS_Y="657" SHOW="0" ROTATE="27" />
+        </CALIBRATION>
+        <RECOGNITION>
+            <PERFORM ENABLED="0" STEP="5" />
+            <REGION_OF_INTEREST FIX="1" WIDTH="1008.917665008991" X="9.940092883276023" Y="82.80615101111441" HEIGHT="583.3232280366677" SHOW="1" />
+            <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1" />
+            <SIZE_COLOR SYMBOL_SIZE="9" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="33" MAP_NUMBER="0" DEFAULT_HEIGHT="180" SHOW="1" >
+                <MAP WIDTH="11" X="0" Y="58.5" MAP_HEIGHT="205.5" HEIGHT="189" COLORED="1" />
+                <MAP WIDTH="33" X="327" Y="58.5" MAP_HEIGHT="200.5" HEIGHT="189" COLORED="1" />
+                <MAP WIDTH="32" X="11" Y="58" MAP_HEIGHT="195.5" HEIGHT="190" COLORED="1" />
+                <MAP WIDTH="63" X="43" Y="23" MAP_HEIGHT="190.5" HEIGHT="225" COLORED="1" />
+                <MAP WIDTH="55" X="106" Y="23" MAP_HEIGHT="185.5" HEIGHT="225" COLORED="1" />
+                <MAP WIDTH="36" X="161" Y="23" MAP_HEIGHT="180.5" HEIGHT="225" COLORED="1" />
+                <MAP WIDTH="40" X="197" Y="23" MAP_HEIGHT="175.5" HEIGHT="225" COLORED="1" />
+                <MAP WIDTH="29" X="213" Y="75" MAP_HEIGHT="170.5" HEIGHT="83" COLORED="0" />
+                <MAP WIDTH="57" X="185" Y="23" MAP_HEIGHT="165.5" HEIGHT="63" COLORED="0" />
+            </SIZE_COLOR>
+        </RECOGNITION>
+        <TRACKING>
+            <ONLINE_CALCULATION ENABLED="0" />
+            <REPEAT_BELOW QUALITY="50" ENABLED="0" />
+            <SEARCH_MISSING_FRAMES ENABLED="1" />
+            <TRACK_FILE FILENAME="D:/Petrack/Matthias/b090MM.trc" />
+            <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0" />
+            <PATH SHOW="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" SHOW_CURRENT_POINT="1" AFTER="10" FIX="0" PATH_SIZE="3" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="1" NUMBER_BOLD="1" CURRENT_POINT_SIZE="60" ONLY_PEOPLE_NR="1" POINTS_COLORED="1" SHOW_POINTS="0" BEFORE="10" SHOW_COLOR_MARKER="1" SHOW_PATH="1" HEAD_SIZE="1" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="1" POINTS_SIZE="7" />
+        </TRACKING>
+        <ANALYSIS>
+            <SEARCH_MISSING_FRAMES ENABLED="1" />
+            <MARK_ACTUAL ENABLED="0" />
+            <CALCULATION STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0" />
+        </ANALYSIS>
+    </CONTROL>
+    <PLAYER FRAME="0" />
+    <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="249 0 0 -77" ANTIALIAS="0" OPENGL="0" />
+</PETRACK>
diff --git a/tests/regression_test/data/old_pet_files/2008.pet b/tests/regression_test/data/old_pet_files/2008.pet
new file mode 100644
index 000000000..7006bbac5
--- /dev/null
+++ b/tests/regression_test/data/old_pet_files/2008.pet
@@ -0,0 +1,39 @@
+<?xml version="1.0" ?>
+<!DOCTYPE PETRACK>
+<PETRACK VERSION="0.6" >
+    <MAIN SRC="H:/labor08/versuchsreihe1/dv/34_95qual.avi" STATUS_HEIGHT="0" />
+    <CONTROL TAB="2" >
+        <CALIBRATION>
+            <BRIGHTNESS ENABLED="0" VALUE="0" />
+            <CONTRAST ENABLED="0" VALUE="0" />
+            <BORDER ENABLED="1" VALUE="10" COLOR="#000000" />
+            <BG_SUB ENABLED="0" />
+            <INTRINSIC_PARAMETERS FX="844.86" FY="867.38" R2="-0.213522" TANG_DIST="1" CALIB_FILES="H:/labor08/pattern/dv/01.bmp, H:/labor08/pattern/dv/18.bmp, H:/labor08/pattern/dv/17.bmp, H:/labor08/pattern/dv/16.bmp, H:/labor08/pattern/dv/15.bmp, H:/labor08/pattern/dv/14.bmp, H:/labor08/pattern/dv/13.bmp, H:/labor08/pattern/dv/12.bmp, H:/labor08/pattern/dv/11.bmp, H:/labor08/pattern/dv/10.bmp, H:/labor08/pattern/dv/09.bmp, H:/labor08/pattern/dv/08.bmp, H:/labor08/pattern/dv/07.bmp, H:/labor08/pattern/dv/06.bmp, H:/labor08/pattern/dv/05.bmp, H:/labor08/pattern/dv/04.bmp, H:/labor08/pattern/dv/03.bmp, H:/labor08/pattern/dv/02.bmp" CX="388.1" R4="0.175628" TX="-0.002302" CY="288.24" TY="-0.002336" ENABLED="1" FIX_CENTER="0" QUAD_ASPECT_RATIO="0" />
+            <EXTRINSIC_PARAMETERS FIX="1" ALTITUDE="535" UNIT="200" USE_INTRINSIC_CENTER="0" SCALE="3600" TILT_X="4000" TILT_Y="4000" TRANS_X="1700" TRANS_Y="5030" SHOW="0" ROTATE="0" />
+            <ALIGNMENT_GRID FIX="0" SCALE="200" TRANS_X="0" TRANS_Y="0" SHOW="0" ROTATE="0" />
+        </CALIBRATION>
+        <RECOGNITION>
+            <PERFORM ENABLED="0" STEP="5" />
+            <REGION_OF_INTEREST FIX="0" WIDTH="720" X="3.378258500303088" Y="-1.69349062472503" HEIGHT="576" SHOW="1" />
+            <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1" />
+            <SIZE_COLOR SYMBOL_SIZE="5" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="50" MAP_NUMBER="0" DEFAULT_HEIGHT="50" SHOW="1" >
+                <MAP WIDTH="0" X="1" Y="0" MAP_HEIGHT="180" HEIGHT="0" COLORED="1" />
+            </SIZE_COLOR>
+        </RECOGNITION>
+        <TRACKING>
+            <ONLINE_CALCULATION ENABLED="0" />
+            <REPEAT_BELOW QUALITY="50" ENABLED="0" />
+            <SEARCH_MISSING_FRAMES ENABLED="1" />
+            <TRACK_FILE FILENAME="H:/labor08/versuchsreihe1/dv/34_trajectories.JL.trc" />
+            <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0" />
+            <PATH SHOW="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" SHOW_CURRENT_POINT="1" AFTER="15" FIX="0" PATH_SIZE="2" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="1" NUMBER_BOLD="1" CURRENT_POINT_SIZE="60" ONLY_PEOPLE_NR="1" POINTS_COLORED="1" SHOW_POINTS="0" BEFORE="15" SHOW_COLOR_MARKER="1" SHOW_PATH="1" HEAD_SIZE="0" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="1" POINTS_SIZE="7" />
+        </TRACKING>
+        <ANALYSIS>
+            <SEARCH_MISSING_FRAMES ENABLED="1" />
+            <MARK_ACTUAL ENABLED="0" />
+            <CALCULATION STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0" />
+        </ANALYSIS>
+    </CONTROL>
+    <PLAYER FRAME="1898" />
+    <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="262 0 0 0" ANTIALIAS="1" OPENGL="0" />
+</PETRACK>
diff --git a/tests/regression_test/data/old_pet_files/2009.pet b/tests/regression_test/data/old_pet_files/2009.pet
new file mode 100644
index 000000000..963f1a942
--- /dev/null
+++ b/tests/regression_test/data/old_pet_files/2009.pet
@@ -0,0 +1,58 @@
+<?xml version="1.0" ?>
+<!DOCTYPE PETRACK>
+<PETRACK VERSION="0.7">
+    <MAIN SRC="" STATUS_HEIGHT="176"/>
+    <CONTROL TAB="2">
+        <CALIBRATION>
+            <BRIGHTNESS ENABLED="0" VALUE="0"/>
+            <CONTRAST ENABLED="0" VALUE="0"/>
+            <BORDER ENABLED="0" VALUE="0" COLOR="#000000"/>
+            <BG_SUB ENABLED="0"/>
+            <INTRINSIC_PARAMETERS FX="881" FY="881" R2="0" TANG_DIST="1" CALIB_FILES="" CX="590" R4="0" TX="0" CY="430" TY="0" ENABLED="1" FIX_CENTER="0" QUAD_ASPECT_RATIO="0"/>
+            <EXTRINSIC_PARAMETERS FIX="1" ALTITUDE="1190" UNIT="120" USE_INTRINSIC_CENTER="0" SCALE="938" TILT_X="4000" TILT_Y="4000" TRANS_X="10829" TRANS_Y="4353" SHOW="1" ROTATE="906"/>
+            <ALIGNMENT_GRID FIX="1" SCALE="1254" TRANS_X="1252" TRANS_Y="2115" SHOW="0" ROTATE="5"/>
+        </CALIBRATION>
+        <RECOGNITION>
+            <PERFORM ENABLED="1" STEP="1"/>
+            <REGION_OF_INTEREST FIX="1" WIDTH="614.842581257741" X="289.9924112199483" Y="333.6979739895014" HEIGHT="304.8768709170594" SHOW="1"/>
+            <MARKER BRIGHTNESS="59" IGNORE_WITHOUT="1"/>
+            <SIZE_COLOR SYMBOL_SIZE="10" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="50" MAP_NUMBER="0" DEFAULT_HEIGHT="176" SHOW="0">
+                <MAP WIDTH="0" X="0" Y="0" MAP_HEIGHT="180" HEIGHT="0" COLORED="1"/>
+            </SIZE_COLOR>
+        </RECOGNITION>
+        <TRACKING>
+            <ONLINE_CALCULATION ENABLED="1"/>
+            <REPEAT_BELOW QUALITY="50" ENABLED="0"/>
+            <EXTRAPOLATION ENABLED="1"/>
+            <MERGE ENABLED="0"/>
+            <ONLY_VISIBLE ENABLED="1"/>
+            <SEARCH_MISSING_FRAMES ENABLED="0"/>
+            <RECALCULATE_MEDIAN_HEIGHT ENABLED="0"/>
+            <ALLOW_ALTERNATE_HEIGHT ENABLED="1"/>
+            <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="1"/>
+            <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="1"/>
+            <EXPORT_SMOOTH ENABLED="1"/>
+            <TEST_EQUAL ENABLED="1"/>
+            <TEST_VELOCITY ENABLED="1"/>
+            <TEST_INSIDE ENABLED="1"/>
+            <TEST_LENGTH ENABLED="1"/>
+            <TRACK_FILE FILENAME=""/>
+            <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0"/>
+            <PATH SHOW="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" SHOW_CURRENT_POINT="1" AFTER="15" FIX="0" PATH_SIZE="2" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="0" NUMBER_BOLD="1" CURRENT_POINT_SIZE="34" ONLY_PEOPLE_NR="1" POINTS_COLORED="1" SHOW_POINTS="0" BEFORE="15" SHOW_COLOR_MARKER="0" SHOW_PATH="1" HEAD_SIZE="1" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="0" POINTS_SIZE="7"/>
+        </TRACKING>
+        <ANALYSIS>
+            <SEARCH_MISSING_FRAMES ENABLED="0"/>
+            <MARK_ACTUAL ENABLED="0"/>
+            <CALCULATION STEP_SIZE="25" CONSIDER_X="1" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0"/>
+        </ANALYSIS>
+    </CONTROL>
+    <STEREO>
+        <DISPARITY OPACITY="50" HIDE_INVALID="1" SHOW="0" COLOR="0">
+            <VALUES MIN="18" MAX="56"/>
+            <MASK USE_EDGE="1" SIZE="9" EDGE_SIZE="3"/>
+            <USE CALIB_CENTER="1" HEIGHT_EVER="1" EXPORT="0" HEIGHT="1" RECO="0"/>
+        </DISPARITY>
+    </STEREO>
+    <PLAYER FRAME="0"/>
+    <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="249 0 0 0" CAMERA="1" ANTIALIAS="0" OPENGL="0"/>
+</PETRACK>
diff --git a/tests/regression_test/data/old_pet_files/2012.pet b/tests/regression_test/data/old_pet_files/2012.pet
new file mode 100644
index 000000000..1dd86a272
--- /dev/null
+++ b/tests/regression_test/data/old_pet_files/2012.pet
@@ -0,0 +1,65 @@
+<?xml version="1.0" ?>
+<!DOCTYPE PETRACK>
+<PETRACK VERSION="0.7">
+    <MAIN SRC="/home/zam/salden/Masterstudium/Masterarbeit/Fahrrad_Experiment/Fahrrad_Experiment_new.jpg;home/zam/salden/Masterstudium/Masterarbeit/Fahrrad_Experiment/Fahrrad_Experiment_new.jpg" STATUS_HEIGHT="0"/>
+    <CONTROL TAB="0">
+        <CALIBRATION>
+            <BRIGHTNESS ENABLED="0" VALUE="0"/>
+            <CONTRAST ENABLED="0" VALUE="0"/>
+            <BORDER ENABLED="0" VALUE="0" COLOR="#000000"/>
+            <SWAP VERTICALLY="0" ENABLED="0" HORIZONTALLY="0"/>
+            <BG_SUB ENABLED="0" UPDATE="0" FILE="" SHOW="0"/>
+            <INTRINSIC_PARAMETERS FX="1416" FY="1417" R2="0" TANG_DIST="1" CALIB_FILES="/home/salden/Entwicklung/PeopleCount/petrack-build-desktop" CX="959.5" R4="0" TX="0" CY="539.5" TY="0" ENABLED="0" FIX_CENTER="1" QUAD_ASPECT_RATIO="0"/>
+            <EXTRINSIC_PARAMETERS FIX="0" ALTITUDE="535" UNIT="100" USE_INTRINSIC_CENTER="0" SCALE="2116" TILT_X="4000" TILT_Y="4000" TRANS_X="0" TRANS_Y="0" SHOW="1" ROTATE="0"/>
+            <ALIGNMENT_GRID FIX="0" SCALE="100" TRANS_X="1000" TRANS_Y="1000" SHOW="1" ROTATE="0"/>
+        </CALIBRATION>
+        <RECOGNITION>
+            <PERFORM METHOD="1" ENABLED="1" STEP="5"/>
+            <REGION_OF_INTEREST FIX="0" WIDTH="1920" X="0" Y="0" HEIGHT="1080" SHOW="0"/>
+            <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1"/>
+            <SIZE_COLOR SYMBOL_SIZE="10" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="50" MAP_NUMBER="0" DEFAULT_HEIGHT="180" SHOW="1">
+                <MAP WIDTH="0" X="0" Y="0" MAP_HEIGHT="180" HEIGHT="0" COLORED="1"/>
+            </SIZE_COLOR>
+        </RECOGNITION>
+        <TRACKING>
+            <ONLINE_CALCULATION ENABLED="1"/>
+            <REPEAT_BELOW QUALITY="50" ENABLED="1"/>
+            <EXTRAPOLATION ENABLED="1"/>
+            <MERGE ENABLED="0"/>
+            <ONLY_VISIBLE ENABLED="1"/>
+            <SEARCH_MISSING_FRAMES ENABLED="1"/>
+            <RECALCULATE_MEDIAN_HEIGHT ENABLED="1"/>
+            <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_SMOOTH ENABLED="1"/>
+            <TEST_EQUAL ENABLED="1"/>
+            <TEST_VELOCITY ENABLED="1"/>
+            <TEST_INSIDE ENABLED="1"/>
+            <TEST_LENGTH ENABLED="1"/>
+            <TRACK_FILE FILENAME=""/>
+            <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0"/>
+            <PATH SHOW="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" SHOW_CURRENT_POINT="1" AFTER="15" FIX="0" PATH_SIZE="2" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="1" NUMBER_BOLD="1" CURRENT_POINT_SIZE="60" ONLY_PEOPLE_NR="1" POINTS_COLORED="1" SHOW_POINTS="0" BEFORE="15" SHOW_COLOR_MARKER="1" SHOW_PATH="1" HEAD_SIZE="1" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="1" POINTS_SIZE="7"/>
+        </TRACKING>
+        <ANALYSIS>
+            <SEARCH_MISSING_FRAMES ENABLED="1"/>
+            <MARK_ACTUAL ENABLED="0"/>
+            <CALCULATION STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0"/>
+        </ANALYSIS>
+    </CONTROL>
+    <STEREO>
+        <DISPARITY OPACITY="100" ALGO="0" HIDE_INVALID="1" SHOW="0" COLOR="0">
+            <VALUES MIN="0" MAX="100"/>
+            <MASK USE_EDGE="0" SIZE="7" EDGE_SIZE="5"/>
+            <USE CALIB_CENTER="1" HEIGHT_EVER="1" EXPORT="0" HEIGHT="0" RECO="0"/>
+        </DISPARITY>
+    </STEREO>
+    <COLOR_MARKER>
+        <MASK OPACITY="100" SHOW="0" MASK="1"/>
+        <FROM_COLOR HUE="0" SATURATION="0" VALUE="128"/>
+        <TO_COLOR HUE="359" SATURATION="255" VALUE="255"/>
+        <PARAM CLOSE_RADIUS="2" INVERS_HUE="0" CLOSE_USED="1" MAX_AREA="5000" MIN_AREA="1000" OPEN_USED="1" MAX_RATIO="2" OPEN_RADIUS="5"/>
+    </COLOR_MARKER>
+    <PLAYER FRAME="0"/>
+    <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="181 0 0 0" CAMERA="2" ANTIALIAS="0" OPENGL="0"/>
+</PETRACK>
diff --git a/tests/regression_test/data/old_pet_files/2013.pet b/tests/regression_test/data/old_pet_files/2013.pet
new file mode 100644
index 000000000..bd6c21884
--- /dev/null
+++ b/tests/regression_test/data/old_pet_files/2013.pet
@@ -0,0 +1,65 @@
+<?xml version="1.0" ?>
+<!DOCTYPE PETRACK>
+<PETRACK VERSION="0.7">
+    <MAIN SRC="D:/diss/vortraege/2013.01.28_Japan_Versuche/cam1/00049000.jpg;00049000.jpg" STATUS_HEIGHT="0"/>
+    <CONTROL TAB="0">
+        <CALIBRATION>
+            <BRIGHTNESS ENABLED="0" VALUE="0"/>
+            <CONTRAST ENABLED="0" VALUE="0"/>
+            <BORDER ENABLED="1" VALUE="40" COLOR="#000000"/>
+            <SWAP VERTICALLY="0" ENABLED="0" HORIZONTALLY="0"/>
+            <BG_SUB ENABLED="0" UPDATE="0" FILE="" SHOW="0"/>
+            <INTRINSIC_PARAMETERS FX="1653.49" FY="1673.56" R2="0.000681" TANG_DIST="1" CALIB_FILES="D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049000.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049034.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049056.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049074.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049108.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049200.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049225.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049243.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049258.jpg, D:\diss\vortraege\2013.01.28_Japan_Versuche\cam\00049282.jpg" CX="1045.31" R4="-0.227154" TX="0.004273" CY="670" TY="0.000448" ENABLED="1" FIX_CENTER="0" QUAD_ASPECT_RATIO="0"/>
+            <EXTRINSIC_PARAMETERS FIX="0" ALTITUDE="535" UNIT="100" USE_INTRINSIC_CENTER="0" SCALE="1000" TILT_X="4000" TILT_Y="4000" TRANS_X="4000" TRANS_Y="4000" SHOW="0" ROTATE="0"/>
+            <ALIGNMENT_GRID FIX="0" SCALE="200" TRANS_X="0" TRANS_Y="0" SHOW="0" ROTATE="0"/>
+        </CALIBRATION>
+        <RECOGNITION>
+            <PERFORM METHOD="1" ENABLED="0" STEP="5"/>
+            <REGION_OF_INTEREST FIX="0" WIDTH="1920" X="0" Y="0" HEIGHT="1080" SHOW="0"/>
+            <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1"/>
+            <SIZE_COLOR SYMBOL_SIZE="10" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="50" MAP_NUMBER="0" DEFAULT_HEIGHT="180" SHOW="1">
+                <MAP WIDTH="0" X="0" Y="0" MAP_HEIGHT="180" HEIGHT="0" COLORED="1"/>
+            </SIZE_COLOR>
+        </RECOGNITION>
+        <TRACKING>
+            <ONLINE_CALCULATION ENABLED="0"/>
+            <REPEAT_BELOW QUALITY="50" ENABLED="1"/>
+            <EXTRAPOLATION ENABLED="1"/>
+            <MERGE ENABLED="0"/>
+            <ONLY_VISIBLE ENABLED="1"/>
+            <SEARCH_MISSING_FRAMES ENABLED="1"/>
+            <RECALCULATE_MEDIAN_HEIGHT ENABLED="1"/>
+            <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_SMOOTH ENABLED="1"/>
+            <TEST_EQUAL ENABLED="1"/>
+            <TEST_VELOCITY ENABLED="1"/>
+            <TEST_INSIDE ENABLED="1"/>
+            <TEST_LENGTH ENABLED="1"/>
+            <TRACK_FILE FILENAME=""/>
+            <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0"/>
+            <PATH SHOW="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" SHOW_CURRENT_POINT="1" AFTER="15" FIX="0" PATH_SIZE="2" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="1" NUMBER_BOLD="1" CURRENT_POINT_SIZE="60" ONLY_PEOPLE_NR="1" POINTS_COLORED="1" SHOW_POINTS="0" BEFORE="15" SHOW_COLOR_MARKER="1" SHOW_PATH="1" HEAD_SIZE="1" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="1" POINTS_SIZE="7"/>
+        </TRACKING>
+        <ANALYSIS>
+            <SEARCH_MISSING_FRAMES ENABLED="1"/>
+            <MARK_ACTUAL ENABLED="0"/>
+            <CALCULATION STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0"/>
+        </ANALYSIS>
+    </CONTROL>
+    <STEREO>
+        <DISPARITY OPACITY="100" ALGO="0" HIDE_INVALID="1" SHOW="0" COLOR="0">
+            <VALUES MIN="0" MAX="100"/>
+            <MASK USE_EDGE="0" SIZE="7" EDGE_SIZE="5"/>
+            <USE CALIB_CENTER="1" HEIGHT_EVER="1" EXPORT="0" HEIGHT="0" RECO="0"/>
+        </DISPARITY>
+    </STEREO>
+    <COLOR_MARKER>
+        <MASK OPACITY="100" SHOW="0" MASK="1"/>
+        <FROM_COLOR HUE="0" SATURATION="0" VALUE="0"/>
+        <TO_COLOR HUE="359" SATURATION="255" VALUE="255"/>
+        <PARAM CLOSE_RADIUS="2" INVERS_HUE="0" CLOSE_USED="1" MAX_AREA="5000" MIN_AREA="1000" OPEN_USED="1" MAX_RATIO="2" OPEN_RADIUS="5"/>
+    </COLOR_MARKER>
+    <PLAYER FRAME="4"/>
+    <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="205 0 0 0" CAMERA="2" ANTIALIAS="0" OPENGL="0"/>
+</PETRACK>
diff --git a/tests/regression_test/data/old_pet_files/2014.pet b/tests/regression_test/data/old_pet_files/2014.pet
new file mode 100644
index 000000000..19bd381e9
--- /dev/null
+++ b/tests/regression_test/data/old_pet_files/2014.pet
@@ -0,0 +1,67 @@
+<?xml version="1.0" ?>
+<!DOCTYPE PETRACK>
+<PETRACK VERSION="0.8">
+    <MAIN SRC="/usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/3D_calib_images/3D_Punkte_Uebersicht.jpg;3D_calib_images/3D_Punkte_Uebersicht.jpg" STATUS_HEIGHT="0"/>
+    <CONTROL TAB="0">
+        <CALIBRATION>
+            <BRIGHTNESS ENABLED="0" VALUE="0"/>
+            <CONTRAST ENABLED="0" VALUE="0"/>
+            <BORDER ENABLED="0" VALUE="60" COLOR="#000000"/>
+            <SWAP VERTICALLY="0" ENABLED="0" HORIZONTALLY="0"/>
+            <BG_SUB ENABLED="0" UPDATE="0" FILE="" DELETE="1" SHOW="0" DELETE_NUMBER="3"/>
+            <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="9" SQUARE_SIZE="3"/>
+            <INTRINSIC_PARAMETERS FX="1156.59" FY="1149.15" R2="-0.097071" TANG_DIST="1" CALIB_FILES="/usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild001.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild002.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild003.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild004.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild005.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild006.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild007.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild008.jpg, /usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/calib_images/00000.MTS.Standbild009.jpg" CX="944.54" R4="0.016589" TX="-0.000412" CY="544.87" TY="-0.003728" ENABLED="1" FIX_CENTER="0" QUAD_ASPECT_RATIO="0"/>
+            <EXTRINSIC_PARAMETERS SHOW="1" COORD3D_AXIS_LEN="1000" UNIT="100" FIX="0" COORD_DIMENSION="0" ROTATE="0" EXTR_TRANS_1="-191.6842" USE_INTRINSIC_CENTER="0" EXTR_ROT_1="2.66151" EXTR_TRANS_2="173.10289" EXTR_ROT_2="0.37189" EXTR_TRANS_3="-357.29825" EXTR_ROT_3="-0.09617000000000001" COORD3D_SWAP_X="0" COORD3D_TRANS_X="0" COORD3D_SWAP_Y="0" COORD3D_TRANS_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_Z="0" EXTERNAL_CALIB_FILE="/usr/nfs/fs1/ped/experiments/2014.09.09_Juelich_Rotunde_TestFuerWuppertal/raw/cam5/3D_calib_images/3d_calib.3dc;3D_calib_images/3d_calib.3dc" SHOW_CALIB_POINTS="1" SCALE="1" TRANS_X="0" ALTITUDE="535" TRANS_Y="0"/>
+            <ALIGNMENT_GRID FIX="0" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_RESOLUTION="60" GRID3D_TRANS_Z="0" SCALE="1" TRANS_X="0" TRANS_Y="0" GRID_DIMENSION="0" SHOW="1" ROTATE="0"/>
+        </CALIBRATION>
+        <RECOGNITION>
+            <PERFORM METHOD="1" ENABLED="0" STEP="5"/>
+            <REGION_OF_INTEREST FIX="0" WIDTH="1920" X="0" Y="0" HEIGHT="1080" SHOW="0"/>
+            <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1"/>
+            <SIZE_COLOR SYMBOL_SIZE="10" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="50" MAP_NUMBER="0" DEFAULT_HEIGHT="180" SHOW="1">
+                <MAP WIDTH="0" X="0" Y="0" MAP_HEIGHT="180" HEIGHT="0" COLORED="1"/>
+            </SIZE_COLOR>
+        </RECOGNITION>
+        <TRACKING>
+            <ONLINE_CALCULATION ENABLED="0"/>
+            <REPEAT_BELOW QUALITY="50" ENABLED="1"/>
+            <EXTRAPOLATION ENABLED="1"/>
+            <MERGE ENABLED="0"/>
+            <ONLY_VISIBLE ENABLED="1"/>
+            <SEARCH_MISSING_FRAMES ENABLED="1"/>
+            <RECALCULATE_MEDIAN_HEIGHT ENABLED="1"/>
+            <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_SMOOTH ENABLED="1"/>
+            <EXPORT_VIEWING_DIRECTION ENABLED="0"/>
+            <TEST_EQUAL ENABLED="1"/>
+            <TEST_VELOCITY ENABLED="1"/>
+            <TEST_INSIDE ENABLED="1"/>
+            <TEST_LENGTH ENABLED="1"/>
+            <TRACK_FILE FILENAME=""/>
+            <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0"/>
+            <PATH SHOW="1" NUMBER_SIZE="14" ONLY_PEOPLE="0" SHOW_CURRENT_POINT="1" AFTER="15" FIX="0" PATH_SIZE="2" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="1" NUMBER_BOLD="1" CURRENT_POINT_SIZE="60" ONLY_PEOPLE_NR="1" POINTS_COLORED="1" SHOW_POINTS="0" BEFORE="15" SHOW_COLOR_MARKER="1" SHOW_PATH="1" HEAD_SIZE="1" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="1" POINTS_SIZE="7"/>
+        </TRACKING>
+        <ANALYSIS>
+            <SEARCH_MISSING_FRAMES ENABLED="1"/>
+            <MARK_ACTUAL ENABLED="0"/>
+            <CALCULATION STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0"/>
+        </ANALYSIS>
+    </CONTROL>
+    <STEREO>
+        <DISPARITY OPACITY="100" ALGO="0" HIDE_INVALID="1" SHOW="0" COLOR="0">
+            <VALUES MIN="0" MAX="100"/>
+            <MASK USE_EDGE="0" SIZE="7" EDGE_SIZE="5"/>
+            <USE CALIB_CENTER="1" HEIGHT_EVER="1" EXPORT="0" HEIGHT="0" RECO="0"/>
+        </DISPARITY>
+    </STEREO>
+    <COLOR_MARKER>
+        <MASK OPACITY="100" SHOW="0" MASK="1"/>
+        <FROM_COLOR HUE="0" SATURATION="0" VALUE="0"/>
+        <TO_COLOR HUE="359" SATURATION="255" VALUE="255"/>
+        <PARAM CLOSE_RADIUS="2" INVERS_HUE="0" CLOSE_USED="1" MAX_AREA="5000" MIN_AREA="1000" OPEN_USED="1" MAX_RATIO="2" OPEN_RADIUS="5"/>
+    </COLOR_MARKER>
+    <PLAYER FRAME="0"/>
+    <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="215 0 0 0" CAMERA="2" ANTIALIAS="0" OPENGL="0"/>
+</PETRACK>
diff --git a/tests/regression_test/data/old_pet_files/2015.pet b/tests/regression_test/data/old_pet_files/2015.pet
new file mode 100644
index 000000000..56b9f3bb6
--- /dev/null
+++ b/tests/regression_test/data/old_pet_files/2015.pet
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<!DOCTYPE PETRACK>
+<PETRACK VERSION="0.8">
+    <MAIN SRC="C:/Ped_Experiment_6_3_2015/Extracted Videos and Frames/Day 2_Afternoon/6_Three exits (b=90cm, Block exit 2)_Half participants_Free speed/Framers/6000.jpg;../../Extracted Videos and Frames/Day 2_Afternoon/6_Three exits (b=90cm, Block exit 2)_Half participants_Free speed/Framers/6000.jpg" STATUS_HEIGHT="0"/>
+    <CONTROL TAB="2">
+        <CALIBRATION>
+            <BRIGHTNESS ENABLED="0" VALUE="0"/>
+            <CONTRAST ENABLED="0" VALUE="0"/>
+            <BORDER ENABLED="0" VALUE="52" COLOR="#000000"/>
+            <SWAP VERTICALLY="0" ENABLED="0" HORIZONTALLY="0"/>
+            <BG_SUB ENABLED="0" UPDATE="0" FILE="" DELETE="1" SHOW="0" DELETE_NUMBER="3"/>
+            <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="3"/>
+            <INTRINSIC_PARAMETERS FX="843.63" FY="844.03" R2="-0.248841" TANG_DIST="1" CALIB_FILES="O:\calibration\gopro\frames\GOPR0027.MP4.05_19_38_49.Standbild001.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_19_40_41.Standbild002.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_19_49_30.Standbild003.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_19_52_04.Standbild004.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_19_53_48.Standbild005.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_19_57_36.Standbild006.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_20_00_18.Standbild007.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_20_38_49.Standbild008.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_20_41_03.Standbild009.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_20_42_34.Standbild010.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_20_51_16.Standbild011.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_00_44.Standbild012.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_05_39.Standbild013.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_14_01.Standbild014.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_16_25.Standbild015.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_18_43.Standbild016.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_20_39.Standbild017.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_23_44.Standbild018.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_25_05.Standbild019.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_27_22.Standbild020.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_28_24.Standbild023.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_32_44.Standbild021.png, O:\calibration\gopro\frames\GOPR0027.MP4.05_21_33_41.Standbild022.png" CX="947.11" R4="0.07615" TX="-0.000462" CY="719.09" TY="0.000548" R6="-0.011373" ENABLED="1" K4="0" FIX_CENTER="0" K5="0" QUAD_ASPECT_RATIO="0" K6="0"/>
+            <EXTRINSIC_PARAMETERS SHOW="1" COORD3D_AXIS_LEN="500" UNIT="100" FIX="1" COORD_DIMENSION="0" ROTATE="0" EXTR_TRANS_1="-27.37763" USE_INTRINSIC_CENTER="0" EXTR_ROT_1="3.08211" EXTR_TRANS_2="39.23102" EXTR_ROT_2="0.08334999999999999" EXTR_TRANS_3="-907.97292" EXTR_ROT_3="-0.07198" COORD3D_SWAP_X="0" COORD3D_TRANS_X="0" COORD3D_SWAP_Y="0" COORD3D_TRANS_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_Z="0" EXTERNAL_CALIB_FILE="C:/Ped_Experiment_6_3_2015/day2_afternoon/trajectories/../../calibration/gopro/external/day2_afternoon/day2_afternoon_external.3dc;../../calibration/gopro/external/day2_afternoon/day2_afternoon_external.3dc" SHOW_CALIB_POINTS="0" SCALE="1" TRANS_X="0" ALTITUDE="835" TRANS_Y="0"/>
+            <ALIGNMENT_GRID FIX="1" GRID3D_TRANS_X="0" GRID3D_TRANS_Y="0" GRID3D_RESOLUTION="100" GRID3D_TRANS_Z="0" SCALE="1" TRANS_X="0" TRANS_Y="0" GRID_DIMENSION="0" SHOW="1" ROTATE="0"/>
+        </CALIBRATION>
+        <RECOGNITION>
+            <PERFORM METHOD="3" ENABLED="1" STEP="1"/>
+            <REGION_OF_INTEREST FIX="1" WIDTH="1281" X="313" Y="0" HEIGHT="1149" SHOW="1"/>
+            <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1"/>
+            <SIZE_COLOR SYMBOL_SIZE="10" AUTO_WB="0" X="0" Y="1" MODEL="0" Z="255" GREY_LEVEL="50" MAP_NUMBER="0" DEFAULT_HEIGHT="170" SHOW="1">
+                <MAP WIDTH="58" TO_SAT="255" X="101" FROM_SAT="64" INV_HUE="0" Y="64" MAP_HEIGHT="170" HEIGHT="191" TO_HUE="159" COLORED="1" FROM_HUE="101" FROM_VAL="138" TO_VAL="255"/>
+            </SIZE_COLOR>
+        </RECOGNITION>
+        <TRACKING>
+            <ONLINE_CALCULATION ENABLED="1"/>
+            <REPEAT_BELOW QUALITY="50" ENABLED="0"/>
+            <EXTRAPOLATION ENABLED="0"/>
+            <MERGE ENABLED="0"/>
+            <ONLY_VISIBLE ENABLED="1"/>
+            <SEARCH_MISSING_FRAMES ENABLED="0"/>
+            <RECALCULATE_MEDIAN_HEIGHT ENABLED="0"/>
+            <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_SMOOTH ENABLED="0"/>
+            <EXPORT_VIEWING_DIRECTION ENABLED="0"/>
+            <TEST_EQUAL ENABLED="1"/>
+            <TEST_VELOCITY ENABLED="1"/>
+            <TEST_INSIDE ENABLED="1"/>
+            <TEST_LENGTH ENABLED="1"/>
+            <TRACK_FILE FILENAME="C:/Ped_Experiment_6_3_2015/day2_afternoon/trajectories/1.trc;1.trc"/>
+            <SEARCH_REGION LEVELS="3" SCALE="16" SHOW="0"/>
+            <PATH SHOW="1" NUMBER_SIZE="20" ONLY_PEOPLE="1" SHOW_CURRENT_POINT="1" AFTER="-1" FIX="0" PATH_SIZE="2" ONLY_VISIBLE="0" COLOR_MARKER_SIZE="14" SHOW_COLLECTIVE_COLOR="0" NUMBER_BOLD="1" CURRENT_POINT_SIZE="6" ONLY_PEOPLE_NR="28" POINTS_COLORED="1" SHOW_POINTS="1" BEFORE="-1" SHOW_COLOR_MARKER="0" SHOW_PATH="1" HEAD_SIZE="0" COLLECTIVE_COLOR_SIZE="11" SHOW_NUMBER="1" POINTS_SIZE="6"/>
+        </TRACKING>
+        <ANALYSIS>
+            <SEARCH_MISSING_FRAMES ENABLED="1"/>
+            <MARK_ACTUAL ENABLED="0"/>
+            <CALCULATION STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1" REVERSE="0"/>
+        </ANALYSIS>
+    </CONTROL>
+    <STEREO>
+        <DISPARITY OPACITY="100" ALGO="0" HIDE_INVALID="1" SHOW="0" COLOR="0">
+            <VALUES MIN="0" MAX="100"/>
+            <MASK USE_EDGE="0" SIZE="7" EDGE_SIZE="5"/>
+            <USE CALIB_CENTER="1" HEIGHT_EVER="1" EXPORT="0" HEIGHT="0" RECO="0"/>
+        </DISPARITY>
+    </STEREO>
+    <COLOR_MARKER>
+        <MASK OPACITY="60" SHOW="1" MASK="1"/>
+        <FROM_COLOR HUE="100" SATURATION="34" VALUE="147"/>
+        <TO_COLOR HUE="188" SATURATION="255" VALUE="255"/>
+        <PARAM CLOSE_RADIUS="4" INVERS_HUE="0" CLOSE_USED="1" MAX_AREA="1000" MIN_AREA="200" OPEN_USED="1" MAX_RATIO="2" OPEN_RADIUS="4"/>
+    </COLOR_MARKER>
+    <MULTI_COLOR_MARKER>
+        <MASK OPACITY="60" SHOW="0" MASK="1"/>
+        <PARAM CLOSE_RADIUS="5" CLOSE_USED="1" MAX_AREA="2000" MIN_AREA="500" OPEN_USED="1" MAX_RATIO="2" OPEN_RADIUS="5"/>
+    </MULTI_COLOR_MARKER>
+    <PLAYER FRAME="704"/>
+    <VIEW SAVE_TRANSFORMED="0" TRANSFORMATION="224 0 0 0" CAMERA="2" ANTIALIAS="0" OPENGL="0"/>
+</PETRACK>
diff --git a/tests/regression_test/data/old_pet_files/2016.pet b/tests/regression_test/data/old_pet_files/2016.pet
new file mode 100644
index 000000000..880b6a4ee
--- /dev/null
+++ b/tests/regression_test/data/old_pet_files/2016.pet
@@ -0,0 +1,76 @@
+<?xml version="1.0" ?>
+<!DOCTYPE PETRACK>
+<PETRACK VERSION="0.8">
+    <MAIN SRC="P:/ped/experiments/2016.05.12_Juelich_Rotunde_SensorFusionInertialSensor/export/chair/chair_circle_1.wmv;chair_circle_1.wmv" STATUS_HEIGHT="0"/>
+    <CONTROL TAB="1">
+        <CALIBRATION>
+            <BRIGHTNESS VALUE="0" ENABLED="0"/>
+            <CONTRAST VALUE="0" ENABLED="0"/>
+            <BORDER VALUE="102" COLOR="#000000" ENABLED="1"/>
+            <SWAP VERTICALLY="0" ENABLED="0" HORIZONTALLY="0"/>
+            <BG_SUB FILE="" SHOW="0" DELETE="1" UPDATE="0" ENABLED="0" DELETE_NUMBER="3"/>
+            <PATTERN BOARD_SIZE_Y="8" SQUARE_SIZE="4.6" BOARD_SIZE_X="6"/>
+            <INTRINSIC_PARAMETERS K4="0" FY="850.22" R2="-0.247709" K5="0" FX="849.98" R6="-0.009362000000000001" CY="910.39" K6="0" R4="0.07044400000000001" FIX_CENTER="0" QUAD_ASPECT_RATIO="0" TX="0.000302" TANG_DIST="1" ENABLED="1" CX="1167.03" TY="0.000569" CALIB_FILES="P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_04_18.Standbild002.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_05_02.Standbild001.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_07_23.Standbild003.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_08_12.Standbild004.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_12_14.Standbild006.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_14_23.Standbild005.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_19_06.Standbild007.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_19_21.Standbild008.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_22_09.Standbild009.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_24_17.Standbild010.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_25_17.Standbild011.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_27_17.Standbild012.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_28_00.Standbild013.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_28_11.Standbild014.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_31_12.Standbild015.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_32_16.Standbild016.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_39_00.Standbild017.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_45_15.Standbild018.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_51_24.Standbild019.png, P:/ped/cameras/gopro_4/calibration/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_56_04.Standbild020.png"/>
+            <EXTRINSIC_PARAMETERS EXTR_TRANS_2="-17.34664" EXTR_ROT_1="-0.05002" COORD3D_SWAP_X="0" ALTITUDE="535" TRANS_Y="0" COORD3D_SWAP_Z="0" COORD3D_TRANS_X="0" EXTR_TRANS_3="-376.53916" EXTERNAL_CALIB_FILE="P:/ped/experiments/2016.05.12_Juelich_Rotunde_SensorFusionInertialSensor/data/calibration/gopro_part1/extrinsic/gopro_part1_extrinsic_calib.3dc;../../data/calibration/gopro_part1/extrinsic/gopro_part1_extrinsic_calib.3dc" UNIT="100" COORD3D_TRANS_Y="0" SHOW="0" TRANS_X="0" FIX="0" COORD3D_AXIS_LEN="200" USE_INTRINSIC_CENTER="0" SHOW_CALIB_POINTS="0" SCALE="100" COORD_DIMENSION="0" EXTR_TRANS_1="-16.12053" ROTATE="0" COORD3D_SWAP_Y="0" EXTR_ROT_2="-0.0412" EXTR_ROT_3="0.28595" COORD3D_TRANS_Z="0"/>
+            <ALIGNMENT_GRID GRID3D_TRANS_Z="0" GRID_DIMENSION="0" SHOW="0" TRANS_Y="0" SCALE="100" TRANS_X="0" ROTATE="0" GRID3D_RESOLUTION="60" GRID3D_TRANS_Y="0" FIX="0" GRID3D_TRANS_X="0"/>
+        </CALIBRATION>
+        <RECOGNITION>
+            <PERFORM METHOD="5" STEP="1" ENABLED="0"/>
+            <REGION_OF_INTEREST SHOW="0" WIDTH="2224" X="-164" Y="-78" HEIGHT="1518" FIX="0"/>
+            <MARKER IGNORE_WITHOUT="1" BRIGHTNESS="50"/>
+            <SIZE_COLOR SHOW="1" MAP_NUMBER="0" X="0" GREY_LEVEL="50" AUTO_WB="0" SYMBOL_SIZE="10" MODEL="0" Y="1" Z="255" DEFAULT_HEIGHT="180">
+                <MAP TO_HUE="41" WIDTH="22" MAP_HEIGHT="137" X="19" INV_HUE="0" FROM_HUE="19" FROM_SAT="185" FROM_VAL="171" Y="185" HEIGHT="59" TO_SAT="244" TO_VAL="236" COLORED="1"/>
+            </SIZE_COLOR>
+        </RECOGNITION>
+        <TRACKING>
+            <ONLINE_CALCULATION ENABLED="0"/>
+            <REPEAT_BELOW QUALITY="50" ENABLED="1"/>
+            <EXTRAPOLATION ENABLED="1"/>
+            <MERGE ENABLED="0"/>
+            <ONLY_VISIBLE ENABLED="1"/>
+            <SEARCH_MISSING_FRAMES ENABLED="1"/>
+            <RECALCULATE_MEDIAN_HEIGHT ENABLED="1"/>
+            <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_SMOOTH ENABLED="1"/>
+            <EXPORT_VIEWING_DIRECTION ENABLED="0"/>
+            <EXPORT_ANGLE_OF_VIEW ENABLED="0"/>
+            <EXPORT_USE_METER ENABLED="0"/>
+            <TEST_EQUAL ENABLED="1"/>
+            <TEST_VELOCITY ENABLED="1"/>
+            <TEST_INSIDE ENABLED="1"/>
+            <TEST_LENGTH ENABLED="1"/>
+            <TRACK_FILE FILENAME="P:/ped/experiments/2016.05.12_Juelich_Rotunde_SensorFusionInertialSensor/export/chair/chair_circle_1.trc;chair_circle_1.trc"/>
+            <SEARCH_REGION MAX_ERROR="0" SHOW="0" SCALE="16" LEVELS="3"/>
+            <PATH ONLY_VISIBLE="0" ONLY_PEOPLE_NR="1" NUMBER_BOLD="1" CURRENT_POINT_SIZE="31" NUMBER_SIZE="14" PATH_SIZE="2" HEAD_SIZE="1" BEFORE="25" SHOW_GROUND_PATH="1" TRACK_GROUND_PATH_COLOR="#00ff00" POINTS_COLORED="1" SHOW="1" COLLECTIVE_COLOR_SIZE="11" SHOW_GROUND_POSITION="1" SHOW_COLLECTIVE_COLOR="1" SHOW_POINTS="0" FIX="0" SHOW_NUMBER="1" POINTS_SIZE="7" TRACK_PATH_COLOR="#ff0000" COLOR_MARKER_SIZE="14" GROUND_PATH_SIZE="1" SHOW_COLOR_MARKER="1" GROUND_POSITION_SIZE="1" SHOW_CURRENT_POINT="1" AFTER="25" SHOW_PATH="1" ONLY_PEOPLE="0"/>
+        </TRACKING>
+        <ANALYSIS>
+            <SEARCH_MISSING_FRAMES ENABLED="1"/>
+            <MARK_ACTUAL ENABLED="0"/>
+            <CALCULATION REVERSE="0" CONSIDER_X="0" STEP_SIZE="25" ABSOLUTE="0" CONSIDER_Y="1"/>
+        </ANALYSIS>
+    </CONTROL>
+    <STEREO>
+        <DISPARITY ALGO="0" SHOW="0" HIDE_INVALID="1" COLOR="0" OPACITY="100">
+            <VALUES MAX="100" MIN="0"/>
+            <MASK EDGE_SIZE="5" SIZE="7" USE_EDGE="0"/>
+            <USE CALIB_CENTER="1" EXPORT="0" RECO="0" HEIGHT_EVER="1" HEIGHT="0"/>
+        </DISPARITY>
+    </STEREO>
+    <COLOR_MARKER>
+        <MASK SHOW="0" OPACITY="100" MASK="1"/>
+        <FROM_COLOR HUE="0" VALUE="0" SATURATION="0"/>
+        <TO_COLOR HUE="359" VALUE="255" SATURATION="255"/>
+        <PARAM MAX_RATIO="2" MAX_AREA="5000" MIN_AREA="1000" OPEN_RADIUS="5" OPEN_USED="1" CLOSE_USED="1" CLOSE_RADIUS="2" INVERS_HUE="0"/>
+    </COLOR_MARKER>
+    <MULTI_COLOR_MARKER>
+        <BLACK_DOT USE="0" RESTRICT_POSITION="0" IGNORE_WITHOUT="1" SIZE="5" USE_COLOR="0"/>
+        <AUTO_CORRECT USE="1"/>
+        <MASK SHOW="0" OPACITY="75" MASK="1"/>
+        <PARAM MAX_RATIO="2" MAX_AREA="6500" MIN_AREA="1900" USE_HEAD_SIZE="0" OPEN_RADIUS="5" OPEN_USED="1" CLOSE_USED="1" CLOSE_RADIUS="2"/>
+    </MULTI_COLOR_MARKER>
+    <PLAYER FRAME="0" SOURCE_FRAME_OUT="2870" SOURCE_FRAME_IN="0" FPS="25"/>
+    <VIEW CAMERA="2" SAVE_TRANSFORMED="0" ANTIALIAS="0" TRANSFORMATION="214 0 0 -124" OPENGL="0"/>
+    <AUTO_TRACK OPTIMZE_COLOR="0" BACK_TRACK="1"/>
+</PETRACK>
diff --git a/tests/regression_test/data/old_pet_files/2017.pet b/tests/regression_test/data/old_pet_files/2017.pet
new file mode 100644
index 000000000..021eada10
--- /dev/null
+++ b/tests/regression_test/data/old_pet_files/2017.pet
@@ -0,0 +1,83 @@
+<?xml version="1.0" ?>
+<!DOCTYPE PETRACK>
+<PETRACK VERSION="0.8">
+    <MAIN SRC="/Volumes/ExFAT2TB/day1_morning/gopro4_2/100GOPRO/GP013623.MP4;100GOPRO/GP013623.MP4" STATUS_HEIGHT="0"/>
+    <CONTROL TAB="2">
+        <CALIBRATION>
+            <BRIGHTNESS ENABLED="0" VALUE="0"/>
+            <CONTRAST ENABLED="0" VALUE="0"/>
+            <BORDER ENABLED="1" VALUE="215" COLOR="#000000"/>
+            <SWAP ENABLED="0" VERTICALLY="0" HORIZONTALLY="0"/>
+            <BG_SUB UPDATE="0" DELETE="1" ENABLED="0" FILE="" SHOW="0" DELETE_NUMBER="3"/>
+            <PATTERN BOARD_SIZE_X="6" BOARD_SIZE_Y="8" SQUARE_SIZE="4.6"/>
+            <INTRINSIC_PARAMETERS FX="835.66" K4="0" FY="835.76" K5="0" FIX_CENTER="0" K6="0" CALIB_FILES="" ENABLED="1" CX="1397.98" TX="0.000337" QUAD_ASPECT_RATIO="0" CY="1138.93" TY="7e-06" TANG_DIST="1" R2="-0.246701" R4="0.07269200000000001" R6="-0.010224"/>
+            <EXTRINSIC_PARAMETERS COORD3D_TRANS_Z="0" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" SHOW_CALIB_POINTS="0" COORD_DIMENSION="1" COORD3D_AXIS_LEN="200" EXTR_ROT_1="0" EXTR_ROT_2="0" EXTR_ROT_3="0" EXTR_TRANS_1="0" EXTERNAL_CALIB_FILE="" EXTR_TRANS_2="0" EXTR_TRANS_3="-500" FIX="0" TRANS_X="0" TRANS_Y="0" SHOW="1" UNIT="100" ALTITUDE="535" ROTATE="0" USE_INTRINSIC_CENTER="0" SCALE="100" COORD3D_TRANS_X="0" COORD3D_TRANS_Y="0"/>
+            <ALIGNMENT_GRID FIX="0" GRID3D_RESOLUTION="100" TRANS_X="0" TRANS_Y="0" GRID_DIMENSION="0" SHOW="0" GRID3D_TRANS_X="0" SCALE="100" GRID3D_TRANS_Y="0" ROTATE="0" GRID3D_TRANS_Z="0"/>
+        </CALIBRATION>
+        <RECOGNITION>
+            <PERFORM METHOD="5" ENABLED="1" STEP="1"/>
+            <REGION_OF_INTEREST FIX="1" SHOW="1" WIDTH="2345" HEIGHT="1551" X="-148" Y="-141"/>
+            <MARKER BRIGHTNESS="50" IGNORE_WITHOUT="1"/>
+            <SIZE_COLOR Z="255" AUTO_WB="0" DEFAULT_HEIGHT="180" MODEL="0" SHOW="1" SYMBOL_SIZE="10" MAP_NUMBER="1" GREY_LEVEL="50" X="0" Y="1">
+                <MAP COLORED="1" FROM_SAT="53" TO_HUE="110" FROM_VAL="193" TO_SAT="255" WIDTH="50" TO_VAL="255" HEIGHT="202" MAP_HEIGHT="180" INV_HUE="0" X="60" Y="53" FROM_HUE="60"/>
+                <MAP COLORED="1" FROM_SAT="67" TO_HUE="182" FROM_VAL="160" TO_SAT="255" WIDTH="36" TO_VAL="255" HEIGHT="188" MAP_HEIGHT="180" INV_HUE="0" X="146" Y="67" FROM_HUE="146"/>
+            </SIZE_COLOR>
+        </RECOGNITION>
+        <TRACKING>
+            <ONLINE_CALCULATION ENABLED="1"/>
+            <REPEAT_BELOW ENABLED="1" QUALITY="50"/>
+            <EXTRAPOLATION ENABLED="1"/>
+            <MERGE ENABLED="0"/>
+            <ONLY_VISIBLE ENABLED="1"/>
+            <SEARCH_MISSING_FRAMES ENABLED="0"/>
+            <RECALCULATE_MEDIAN_HEIGHT ENABLED="0"/>
+            <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_SMOOTH ENABLED="0"/>
+            <EXPORT_VIEWING_DIRECTION ENABLED="0"/>
+            <EXPORT_ANGLE_OF_VIEW ENABLED="0"/>
+            <EXPORT_USE_METER ENABLED="0"/>
+            <EXPORT_COMMENT ENABLED="0"/>
+            <EXPORT_MARKERID ENABLED="0"/>
+            <TEST_EQUAL ENABLED="1"/>
+            <TEST_VELOCITY ENABLED="1"/>
+            <TEST_INSIDE ENABLED="1"/>
+            <TEST_LENGTH ENABLED="1"/>
+            <TRACK_FILE FILENAME="/Volumes/ExFAT2TB/day1_morning/gopro4_2/1.trc;1.trc"/>
+            <SEARCH_REGION LEVELS="2" SHOW="1" MAX_ERROR="0" SCALE="11"/>
+            <PATH GROUND_PATH_SIZE="1" SHOW_COLOR_MARKER="0" ONLY_PEOPLE_NR="1" NUMBER_SIZE="14" TRACK_GROUND_PATH_COLOR="#00ff00" SHOW_GROUND_POSITION="0" SHOW_GROUND_PATH="0" FIX="0" COLOR_MARKER_SIZE="14" TRACK_PATH_COLOR="#ff0000" NUMBER_BOLD="1" POINTS_COLORED="1" CURRENT_POINT_SIZE="60" ONLY_PEOPLE="0" SHOW_PATH="1" POINTS_SIZE="7" SHOW_CURRENT_POINT="1" SHOW="1" BEFORE="50" SHOW_NUMBER="0" SHOW_COLLECTIVE_COLOR="0" PATH_SIZE="2" GROUND_POSITION_SIZE="1" ONLY_VISIBLE="0" COLLECTIVE_COLOR_SIZE="11" HEAD_SIZE="1" AFTER="0" SHOW_POINTS="0"/>
+        </TRACKING>
+        <ANALYSIS>
+            <SEARCH_MISSING_FRAMES ENABLED="1"/>
+            <MARK_ACTUAL ENABLED="0"/>
+            <CALCULATION REVERSE="0" STEP_SIZE="25" CONSIDER_X="0" ABSOLUTE="0" CONSIDER_Y="1"/>
+        </ANALYSIS>
+    </CONTROL>
+    <STEREO>
+        <DISPARITY HIDE_INVALID="1" ALGO="0" COLOR="0" SHOW="0" OPACITY="100">
+            <VALUES MIN="0" MAX="100"/>
+            <MASK SIZE="7" EDGE_SIZE="5" USE_EDGE="0"/>
+            <USE RECO="0" HEIGHT_EVER="1" EXPORT="0" HEIGHT="0" CALIB_CENTER="1"/>
+        </DISPARITY>
+    </STEREO>
+    <COLOR_MARKER>
+        <MASK MASK="1" SHOW="0" OPACITY="100"/>
+        <FROM_COLOR SATURATION="0" VALUE="0" HUE="0"/>
+        <TO_COLOR SATURATION="255" VALUE="255" HUE="359"/>
+        <PARAM CLOSE_USED="1" INVERS_HUE="0" CLOSE_RADIUS="5" MIN_AREA="1000" MAX_RATIO="2" MAX_AREA="5000" OPEN_RADIUS="5" OPEN_USED="1"/>
+    </COLOR_MARKER>
+    <CODE_MARKER>
+        <DICTIONARY ID="16"/>
+        <PARAM CORNER_REFINEMENT="0" MIN_MARKER_DISTANCE="0.05" ADAPTIVE_THRESH_WIN_SIZE_STEP="10" ERROR_CORRECTION_RATE="0.6" CORNER_REFINEMENT_MAX_ITERATIONS="30" MARKER_BORDER_BITS="1" CORNER_REFINEMENT_MIN_ACCURACY="0.1" ADAPTIVE_THRESH_WIN_SIZE_MAX="23" MIN_DISTANCE_TO_BORDER="3" MIN_MARKER_PERIMETER="5" SHOW_DETECTED_CANDIDATES="0" PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL="0.13" PERSPECTIVE_REMOVE_PIXEL_PER_CELL="4" CORNER_REFINEMENT_WIN_SIZE="5" ADAPTIVE_THRESH_CONSTANT="7" MAX_RATIO_ERROR="0.03" MIN_CORNER_DISTANCE="0.05" MAX_MARKER_PERIMETER="15" ADAPTIVE_THRESH_WIN_SIZE_MIN="3" MAX_ERRONEOUS_BITS_IN_BORDER_RATE="0.35" MIN_OTSU_STD_DEV="5"/>
+    </CODE_MARKER>
+    <MULTI_COLOR_MARKER>
+        <BLACK_DOT USE="0" SIZE="5" RESTRICT_POSITION="0" IGNORE_WITHOUT="1" USE_COLOR="0"/>
+        <AUTO_CORRECT USE="1"/>
+        <MASK MASK="1" SHOW="0" OPACITY="60"/>
+        <PARAM CLOSE_USED="1" CLOSE_RADIUS="5" MIN_AREA="200" MAX_RATIO="2" MAX_AREA="800" OPEN_RADIUS="5" OPEN_USED="1" USE_HEAD_SIZE="0"/>
+    </MULTI_COLOR_MARKER>
+    <PLAYER SOURCE_FRAME_IN="19900" SOURCE_FRAME_OUT="25800" FPS="50" FRAME="20609"/>
+    <VIEW ANTIALIAS="0" TRANSFORMATION="241 0 853 380" HIDE_CONTROLS="0" SAVE_TRANSFORMED="0" OPENGL="0" CAMERA="2"/>
+    <AUTO_TRACK BACK_TRACK="1" OPTIMZE_COLOR="0"/>
+</PETRACK>
diff --git a/tests/regression_test/data/old_pet_files/2018.pet b/tests/regression_test/data/old_pet_files/2018.pet
new file mode 100644
index 000000000..67d8202de
--- /dev/null
+++ b/tests/regression_test/data/old_pet_files/2018.pet
@@ -0,0 +1,83 @@
+<?xml version="1.0" ?>
+<!DOCTYPE PETRACK>
+<PETRACK VERSION="0.8">
+    <MAIN SRC="P:/ped/experiments/2018.01.23_Wuppertal_Entrance/export/gp2/02_Mittwoch/110_c_12_h0.mp4;110_c_12_h0.mp4" STATUS_HEIGHT="176"/>
+    <CONTROL TAB="2">
+        <CALIBRATION>
+            <BRIGHTNESS ENABLED="0" VALUE="0"/>
+            <CONTRAST ENABLED="0" VALUE="0"/>
+            <BORDER COLOR="#000000" ENABLED="1" VALUE="50"/>
+            <SWAP VERTICALLY="0" HORIZONTALLY="0" ENABLED="0"/>
+            <BG_SUB UPDATE="0" SHOW="0" FILE="" DELETE_NUMBER="3" ENABLED="0" DELETE="1"/>
+            <PATTERN SQUARE_SIZE="4.6" BOARD_SIZE_X="6" BOARD_SIZE_Y="8"/>
+            <INTRINSIC_PARAMETERS TY="0.00057" CALIB_FILES="P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_04_18.Standbild002.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_05_02.Standbild001.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_07_23.Standbild003.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_08_12.Standbild004.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_12_14.Standbild006.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_14_23.Standbild005.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_19_06.Standbild007.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_19_21.Standbild008.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_22_09.Standbild009.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_24_17.Standbild010.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_25_17.Standbild011.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_27_17.Standbild012.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_28_00.Standbild013.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_28_11.Standbild014.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_31_12.Standbild015.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_32_16.Standbild016.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_39_00.Standbild017.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_45_15.Standbild018.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_51_24.Standbild019.png, P:/ped/cameras/gopro_4/calibration/1440p/6x8_4.6cm/gopro_4.2/calib_frames/GOPR3531.00_00_56_04.Standbild020.png" K5="0" QUAD_ASPECT_RATIO="0" FIX_CENTER="0" R4="0.070421" R2="-0.247671" ENABLED="1" TANG_DIST="1" K6="0" R6="-0.009357000000000001" CY="806.4" TX="0.000302" K4="0" FX="849.92" FY="850.16" CX="1063.04"/>
+            <EXTRINSIC_PARAMETERS COORD3D_TRANS_X="-3" ALTITUDE="535" COORD_DIMENSION="0" COORD3D_TRANS_Z="0" ROTATE="0" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" SCALE="100" TRANS_X="0" EXTR_ROT_1="2.064" SHOW="0" EXTR_ROT_3="-0.3" TRANS_Y="0" USE_INTRINSIC_CENTER="0" COORD3D_SWAP_Z="0" EXTR_ROT_2="-2.08" EXTERNAL_CALIB_FILE="P:/ped/experiments/2018.01.23_Wuppertal_Entrance/export/gp2/02_Mittwoch/extrinsic_calib_9p.3dc;extrinsic_calib_9p.3dc" SHOW_CALIB_POINTS="0" EXTR_TRANS_2="-50.46" EXTR_TRANS_3="-497.046" COORD3D_AXIS_LEN="200" UNIT="100" COORD3D_TRANS_Y="3" FIX="0" EXTR_TRANS_1="-0.943"/>
+            <ALIGNMENT_GRID SCALE="100" SHOW="0" ROTATE="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID3D_TRANS_X="-4" GRID_DIMENSION="0" GRID3D_RESOLUTION="100" FIX="1" TRANS_Y="0" TRANS_X="0"/>
+        </CALIBRATION>
+        <RECOGNITION>
+            <PERFORM METHOD="5" ENABLED="0" STEP="1"/>
+            <REGION_OF_INTEREST WIDTH="1313" X="219" HEIGHT="1328" SHOW="1" Y="38" FIX="1"/>
+            <MARKER IGNORE_WITHOUT="1" BRIGHTNESS="50"/>
+            <SIZE_COLOR X="0" MAP_NUMBER="0" SHOW="1" Y="1" AUTO_WB="0" MODEL="0" SYMBOL_SIZE="10" Z="255" DEFAULT_HEIGHT="176" GREY_LEVEL="50">
+                <MAP WIDTH="322" X="28" COLORED="1" FROM_SAT="125" HEIGHT="130" Y="125" TO_VAL="255" TO_SAT="255" MAP_HEIGHT="176" TO_HUE="28" INV_HUE="1" FROM_HUE="350" FROM_VAL="124"/>
+            </SIZE_COLOR>
+        </RECOGNITION>
+        <TRACKING>
+            <ONLINE_CALCULATION ENABLED="0"/>
+            <REPEAT_BELOW QUALITY="50" ENABLED="1"/>
+            <EXTRAPOLATION ENABLED="1"/>
+            <MERGE ENABLED="0"/>
+            <ONLY_VISIBLE ENABLED="1"/>
+            <REGION_OF_INTEREST WIDTH="1958" X="62" HEIGHT="1399" SHOW="1" Y="7" FIX="1"/>
+            <SEARCH_MISSING_FRAMES ENABLED="0"/>
+            <RECALCULATE_MEDIAN_HEIGHT ENABLED="0"/>
+            <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_SMOOTH ENABLED="0"/>
+            <EXPORT_VIEWING_DIRECTION ENABLED="0"/>
+            <EXPORT_ANGLE_OF_VIEW ENABLED="0"/>
+            <EXPORT_USE_METER ENABLED="1"/>
+            <EXPORT_COMMENT ENABLED="0"/>
+            <EXPORT_MARKERID ENABLED="0"/>
+            <TEST_EQUAL ENABLED="1"/>
+            <TEST_VELOCITY ENABLED="1"/>
+            <TEST_INSIDE ENABLED="1"/>
+            <TEST_LENGTH ENABLED="1"/>
+            <TRACK_FILE FILENAME="P:/ped/experiments/2018.01.23_Wuppertal_Entrance/export/gp2/02_Mittwoch/110_c_12_h0.trc;110_c_12_h0.trc"/>
+            <SEARCH_REGION SCALE="12" MAX_ERROR="0" SHOW="1" LEVELS="1"/>
+            <PATH GROUND_PATH_SIZE="1" NUMBER_BOLD="1" POINTS_SIZE="7" POINTS_COLORED="1" ONLY_PEOPLE_NR_LIST="1" NUMBER_SIZE="14" ONLY_VISIBLE="0" SHOW="1" COLLECTIVE_COLOR_SIZE="11" SHOW_GROUND_PATH="0" BEFORE="10" TRACK_PATH_COLOR="#ff0000" SHOW_NUMBER="1" SHOW_PATH="1" AFTER="10" CURRENT_POINT_SIZE="31" SHOW_POINTS="1" SHOW_GROUND_POSITION="0" ONLY_PEOPLE_LIST="0" SHOW_COLLECTIVE_COLOR="0" PATH_SIZE="2" HEAD_SIZE="1" TRACK_GROUND_PATH_COLOR="#00ff00" SHOW_COLOR_MARKER="0" ONLY_PEOPLE="0" ONLY_PEOPLE_NR="1" FIX="0" COLOR_MARKER_SIZE="14" SHOW_CURRENT_POINT="1" GROUND_POSITION_SIZE="1"/>
+        </TRACKING>
+        <ANALYSIS>
+            <SEARCH_MISSING_FRAMES ENABLED="1"/>
+            <MARK_ACTUAL ENABLED="0"/>
+            <CALCULATION STEP_SIZE="25" REVERSE="0" SHOW_VORONOI="0" ABSOLUTE="0" CONSIDER_X="0" CONSIDER_Y="1"/>
+        </ANALYSIS>
+    </CONTROL>
+    <STEREO>
+        <DISPARITY COLOR="0" SHOW="0" OPACITY="100" HIDE_INVALID="1" ALGO="0">
+            <VALUES MAX="100" MIN="0"/>
+            <MASK SIZE="7" EDGE_SIZE="5" USE_EDGE="0"/>
+            <USE HEIGHT="0" HEIGHT_EVER="1" CALIB_CENTER="1" EXPORT="0" RECO="0"/>
+        </DISPARITY>
+    </STEREO>
+    <COLOR_MARKER>
+        <MASK MASK="1" SHOW="0" OPACITY="100"/>
+        <FROM_COLOR HUE="0" SATURATION="0" VALUE="0"/>
+        <TO_COLOR HUE="359" SATURATION="255" VALUE="255"/>
+        <PARAM CLOSE_USED="1" INVERS_HUE="0" MAX_AREA="5000" CLOSE_RADIUS="5" OPEN_RADIUS="5" OPEN_USED="1" MIN_AREA="1000" MAX_RATIO="2"/>
+    </COLOR_MARKER>
+    <CODE_MARKER>
+        <DICTIONARY ID="16"/>
+        <PARAM ADAPTIVE_THRESH_WIN_SIZE_MIN="3" CORNER_REFINEMENT="0" ADAPTIVE_THRESH_WIN_SIZE_STEP="10" MIN_MARKER_DISTANCE="0.05" MIN_OTSU_STD_DEV="5" CORNER_REFINEMENT_MIN_ACCURACY="0.1" MIN_CORNER_DISTANCE="0.05" MARKER_BORDER_BITS="1" ADAPTIVE_THRESH_WIN_SIZE_MAX="23" CORNER_REFINEMENT_MAX_ITERATIONS="30" ERROR_CORRECTION_RATE="0.6" SHOW_DETECTED_CANDIDATES="0" MAX_ERRONEOUS_BITS_IN_BORDER_RATE="0.35" PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL="0.13" MIN_MARKER_PERIMETER="5" ADAPTIVE_THRESH_CONSTANT="7" CORNER_REFINEMENT_WIN_SIZE="5" PERSPECTIVE_REMOVE_PIXEL_PER_CELL="4" MAX_RATIO_ERROR="0.03" MIN_DISTANCE_TO_BORDER="3" MAX_MARKER_PERIMETER="15"/>
+    </CODE_MARKER>
+    <MULTI_COLOR_MARKER>
+        <BLACK_DOT IGNORE_WITHOUT="1" RESTRICT_POSITION="0" USE="0" SIZE="5" USE_COLOR="0"/>
+        <AUTO_CORRECT USE="1" ONLY_EXPORT="1"/>
+        <MASK MASK="1" SHOW="0" OPACITY="60"/>
+        <PARAM CLOSE_USED="1" MAX_AREA="4000" USE_HEAD_SIZE="0" CLOSE_RADIUS="3" OPEN_RADIUS="3" OPEN_USED="1" MIN_AREA="700" MAX_RATIO="1.8"/>
+    </MULTI_COLOR_MARKER>
+    <PLAYER SOURCE_FRAME_IN="0" FPS="25" SOURCE_FRAME_OUT="1326" FRAME="1326" PLAYER_SPEED_FIXED="0"/>
+    <VIEW OPENGL="0" SAVE_TRANSFORMED="0" CAMERA="2" HIDE_CONTROLS="0" TRANSFORMATION="241 0 305 80" ANTIALIAS="0"/>
+    <AUTO_TRACK OPTIMZE_COLOR="0" BACK_TRACK="1"/>
+</PETRACK>
diff --git a/tests/regression_test/data/old_pet_files/2019.pet b/tests/regression_test/data/old_pet_files/2019.pet
new file mode 100644
index 000000000..6f266a0ec
--- /dev/null
+++ b/tests/regression_test/data/old_pet_files/2019.pet
@@ -0,0 +1,83 @@
+<?xml version="1.0" ?>
+<!DOCTYPE PETRACK>
+<PETRACK VERSION="0.8">
+    <MAIN SRC="O:/experiments/2019.07.07_Juelich_TagDerNeugier/export/gp7_2/bottleneck/bn_060_013_h-_bag0.mp4;bn_060_013_h-_bag0.mp4" STATUS_HEIGHT="0"/>
+    <CONTROL TAB="2">
+        <CALIBRATION>
+            <BRIGHTNESS ENABLED="0" VALUE="0"/>
+            <CONTRAST ENABLED="0" VALUE="0"/>
+            <BORDER COLOR="#000000" ENABLED="1" VALUE="200"/>
+            <SWAP VERTICALLY="0" HORIZONTALLY="0" ENABLED="0"/>
+            <BG_SUB UPDATE="0" SHOW="0" FILE="" DELETE_NUMBER="3" ENABLED="0" DELETE="1"/>
+            <PATTERN SQUARE_SIZE="4.6" BOARD_SIZE_X="6" BOARD_SIZE_Y="8"/>
+            <INTRINSIC_PARAMETERS TY="0.000465" CALIB_FILES="O:/hardware/cameras/gopro_7_2/pattern/1.png, O:/hardware/cameras/gopro_7_2/pattern/2.png, O:/hardware/cameras/gopro_7_2/pattern/3.png, O:/hardware/cameras/gopro_7_2/pattern/4.png, O:/hardware/cameras/gopro_7_2/pattern/5.png, O:/hardware/cameras/gopro_7_2/pattern/6.png, O:/hardware/cameras/gopro_7_2/pattern/7.png, O:/hardware/cameras/gopro_7_2/pattern/8.png, O:/hardware/cameras/gopro_7_2/pattern/9.png, O:/hardware/cameras/gopro_7_2/pattern/10.png, O:/hardware/cameras/gopro_7_2/pattern/11.png, O:/hardware/cameras/gopro_7_2/pattern/12.png" K5="0" QUAD_ASPECT_RATIO="0" FIX_CENTER="0" R4="0.060733" R2="-0.231471" ENABLED="1" TANG_DIST="1" K6="0" R6="-0.007264" CY="1911.87" TX="0.000106" K4="0" FX="1716.13" FY="1716.62" CX="2380.06"/>
+            <EXTRINSIC_PARAMETERS COORD3D_TRANS_X="0" ALTITUDE="535" COORD_DIMENSION="0" COORD3D_TRANS_Z="0" ROTATE="0" COORD3D_SWAP_X="0" COORD3D_SWAP_Y="0" SCALE="100" TRANS_X="0" EXTR_ROT_1="3.122" SHOW="0" EXTR_ROT_3="0.051" TRANS_Y="0" USE_INTRINSIC_CENTER="0" COORD3D_SWAP_Z="0" EXTR_ROT_2="0.041" EXTERNAL_CALIB_FILE="O:/experiments/2019.07.07_Juelich_TagDerNeugier/export/gp7_2/ext_calib_raw.3dc;../ext_calib_raw.3dc" SHOW_CALIB_POINTS="0" EXTR_TRANS_2="6.544" EXTR_TRANS_3="-423.565" COORD3D_AXIS_LEN="200" UNIT="100" COORD3D_TRANS_Y="0" FIX="0" EXTR_TRANS_1="-1.297"/>
+            <ALIGNMENT_GRID SCALE="100" SHOW="0" ROTATE="0" GRID3D_TRANS_Y="0" GRID3D_TRANS_Z="0" GRID3D_TRANS_X="0" GRID_DIMENSION="0" GRID3D_RESOLUTION="100" FIX="0" TRANS_Y="0" TRANS_X="0"/>
+        </CALIBRATION>
+        <RECOGNITION>
+            <PERFORM METHOD="5" ENABLED="1" STEP="1"/>
+            <REGION_OF_INTEREST WIDTH="4074" X="-400" HEIGHT="2925" SHOW="1" Y="75" FIX="0"/>
+            <MARKER IGNORE_WITHOUT="1" BRIGHTNESS="50"/>
+            <SIZE_COLOR X="0" MAP_NUMBER="0" SHOW="1" Y="1" AUTO_WB="0" MODEL="0" SYMBOL_SIZE="10" Z="255" DEFAULT_HEIGHT="180" GREY_LEVEL="50">
+                <MAP WIDTH="7" X="5" COLORED="1" FROM_SAT="129" HEIGHT="126" Y="129" TO_VAL="254" TO_SAT="255" MAP_HEIGHT="180" TO_HUE="12" INV_HUE="0" FROM_HUE="5" FROM_VAL="154"/>
+            </SIZE_COLOR>
+        </RECOGNITION>
+        <TRACKING>
+            <ONLINE_CALCULATION ENABLED="1"/>
+            <REPEAT_BELOW QUALITY="50" ENABLED="1"/>
+            <EXTRAPOLATION ENABLED="1"/>
+            <MERGE ENABLED="0"/>
+            <ONLY_VISIBLE ENABLED="1"/>
+            <REGION_OF_INTEREST WIDTH="4000" X="0" HEIGHT="3000" SHOW="0" Y="0" FIX="0"/>
+            <SEARCH_MISSING_FRAMES ENABLED="0"/>
+            <RECALCULATE_MEDIAN_HEIGHT ENABLED="0"/>
+            <ALLOW_ALTERNATE_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRACKPOINT_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_ELIMINATE_TRAJECTORY_WITHOUT_HEIGHT ENABLED="0"/>
+            <EXPORT_SMOOTH ENABLED="0"/>
+            <EXPORT_VIEWING_DIRECTION ENABLED="1"/>
+            <EXPORT_ANGLE_OF_VIEW ENABLED="0"/>
+            <EXPORT_USE_METER ENABLED="1"/>
+            <EXPORT_COMMENT ENABLED="0"/>
+            <EXPORT_MARKERID ENABLED="1"/>
+            <TEST_EQUAL ENABLED="1"/>
+            <TEST_VELOCITY ENABLED="1"/>
+            <TEST_INSIDE ENABLED="1"/>
+            <TEST_LENGTH ENABLED="1"/>
+            <TRACK_FILE FILENAME=""/>
+            <SEARCH_REGION SCALE="16" MAX_ERROR="0" SHOW="0" LEVELS="3"/>
+            <PATH GROUND_PATH_SIZE="1" NUMBER_BOLD="1" POINTS_SIZE="7" POINTS_COLORED="1" ONLY_PEOPLE_NR_LIST="1" NUMBER_SIZE="14" ONLY_VISIBLE="0" SHOW="1" COLLECTIVE_COLOR_SIZE="11" SHOW_GROUND_PATH="0" BEFORE="15" TRACK_PATH_COLOR="#ff0000" SHOW_NUMBER="0" SHOW_PATH="1" AFTER="15" CURRENT_POINT_SIZE="60" SHOW_POINTS="0" SHOW_GROUND_POSITION="0" ONLY_PEOPLE_LIST="0" SHOW_COLLECTIVE_COLOR="0" PATH_SIZE="5" HEAD_SIZE="1" TRACK_GROUND_PATH_COLOR="#00ff00" SHOW_COLOR_MARKER="0" ONLY_PEOPLE="0" ONLY_PEOPLE_NR="1" FIX="0" COLOR_MARKER_SIZE="14" SHOW_CURRENT_POINT="1" GROUND_POSITION_SIZE="1"/>
+        </TRACKING>
+        <ANALYSIS>
+            <SEARCH_MISSING_FRAMES ENABLED="1"/>
+            <MARK_ACTUAL ENABLED="0"/>
+            <CALCULATION STEP_SIZE="25" REVERSE="0" SHOW_VORONOI="0" ABSOLUTE="0" CONSIDER_X="0" CONSIDER_Y="1"/>
+        </ANALYSIS>
+    </CONTROL>
+    <STEREO>
+        <DISPARITY COLOR="0" SHOW="0" OPACITY="100" HIDE_INVALID="1" ALGO="0">
+            <VALUES MAX="100" MIN="0"/>
+            <MASK SIZE="7" EDGE_SIZE="5" USE_EDGE="0"/>
+            <USE HEIGHT="0" HEIGHT_EVER="1" CALIB_CENTER="1" EXPORT="0" RECO="0"/>
+        </DISPARITY>
+    </STEREO>
+    <COLOR_MARKER>
+        <MASK MASK="1" SHOW="0" OPACITY="100"/>
+        <FROM_COLOR HUE="0" SATURATION="0" VALUE="0"/>
+        <TO_COLOR HUE="359" SATURATION="255" VALUE="255"/>
+        <PARAM CLOSE_USED="1" INVERS_HUE="0" MAX_AREA="5000" CLOSE_RADIUS="5" OPEN_RADIUS="5" OPEN_USED="1" MIN_AREA="1000" MAX_RATIO="2"/>
+    </COLOR_MARKER>
+    <CODE_MARKER>
+        <DICTIONARY ID="16"/>
+        <PARAM ADAPTIVE_THRESH_WIN_SIZE_MIN="3" CORNER_REFINEMENT="0" ADAPTIVE_THRESH_WIN_SIZE_STEP="10" MIN_MARKER_DISTANCE="0.05" MIN_OTSU_STD_DEV="5" CORNER_REFINEMENT_MIN_ACCURACY="0.1" MIN_CORNER_DISTANCE="0.05" MARKER_BORDER_BITS="1" ADAPTIVE_THRESH_WIN_SIZE_MAX="23" CORNER_REFINEMENT_MAX_ITERATIONS="30" ERROR_CORRECTION_RATE="0.6" SHOW_DETECTED_CANDIDATES="0" MAX_ERRONEOUS_BITS_IN_BORDER_RATE="0.35" PERSPECTIVE_REMOVE_IGNORED_MARGIN_PER_CELL="0.13" MIN_MARKER_PERIMETER="5" ADAPTIVE_THRESH_CONSTANT="7" CORNER_REFINEMENT_WIN_SIZE="5" PERSPECTIVE_REMOVE_PIXEL_PER_CELL="4" MAX_RATIO_ERROR="0.03" MIN_DISTANCE_TO_BORDER="3" MAX_MARKER_PERIMETER="15"/>
+    </CODE_MARKER>
+    <MULTI_COLOR_MARKER>
+        <BLACK_DOT IGNORE_WITHOUT="1" RESTRICT_POSITION="0" USE="0" SIZE="5" USE_COLOR="0"/>
+        <AUTO_CORRECT USE="0" ONLY_EXPORT="0"/>
+        <MASK MASK="1" SHOW="1" OPACITY="100"/>
+        <PARAM CLOSE_USED="1" MAX_AREA="28166" USE_HEAD_SIZE="1" CLOSE_RADIUS="5" OPEN_RADIUS="5" OPEN_USED="1" MIN_AREA="8450" MAX_RATIO="2"/>
+    </MULTI_COLOR_MARKER>
+    <PLAYER SOURCE_FRAME_IN="0" FPS="25" SOURCE_FRAME_OUT="692" FRAME="64" PLAYER_SPEED_FIXED="0"/>
+    <VIEW OPENGL="0" SAVE_TRANSFORMED="0" CAMERA="2" HIDE_CONTROLS="0" TRANSFORMATION="129 0 0 0" ANTIALIAS="0"/>
+    <AUTO_TRACK OPTIMZE_COLOR="0" BACK_TRACK="1"/>
+</PETRACK>
diff --git a/tests/regression_test/tests/test_oldPetFiles.py b/tests/regression_test/tests/test_oldPetFiles.py
new file mode 100644
index 000000000..a5e7bed33
--- /dev/null
+++ b/tests/regression_test/tests/test_oldPetFiles.py
@@ -0,0 +1,74 @@
+#
+# PeTrack - Software for tracking pedestrians movement in videos
+# Copyright (C) 2024 Forschungszentrum Jülich GmbH, IAS-7
+#
+# 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 <https://www.gnu.org/licenses/>.
+#
+import pytest
+import subprocess
+import xml.etree.ElementTree as ET
+from test_pet import compare_xml
+
+
+def pytest_addoption(parser):
+    parser.addoption("--path", action="store", default="../../../build/petrack.exe")
+
+
+@pytest.fixture(
+    params=[
+        "2006",
+        "2008",
+        "2009",
+        "2012",
+        "2013",
+        "2014",
+        "2015",
+        "2016",
+        "2017",
+        "2018",
+        "2019"
+    ],
+    scope="session",
+)
+def load_old_pet_files(request, pytestconfig):
+    petrack_path = pytestconfig.getoption("path")
+
+    """Does load old pet files and expects them not to crash."""
+
+    project = "../data/old_pet_files/" + request.param + ".pet"
+    output = "test_oldPet.pet"
+    empty_pet = "../../../demo/00_files/00_empty.pet"
+    subprocess.run(
+        [
+            petrack_path,
+            "-project",
+            project,
+            "-autosave",
+            output,
+            "-platform",
+            "offscreen",
+        ],
+        check=True,
+    )
+    yield output, empty_pet
+
+
+def test_old_pet_files(load_old_pet_files):
+    # TODO check if values are correct
+    test_pet = ET.parse(load_old_pet_files[0])
+    truth_pet = ET.parse(load_old_pet_files[1])
+
+    # comparing with empty pet file should fail when pet file is loaded correctly
+    with pytest.raises(AssertionError):
+        compare_xml(test_pet, truth_pet)
diff --git a/tests/unit_test/calibration/tst_extrCalibration.cpp b/tests/unit_test/calibration/tst_extrCalibration.cpp
index 44991fad7..e13a0868b 100644
--- a/tests/unit_test/calibration/tst_extrCalibration.cpp
+++ b/tests/unit_test/calibration/tst_extrCalibration.cpp
@@ -35,7 +35,7 @@ TEST_CASE("src/extrCalibration/camToWorldRotation", "[extrCalibration]")
     const QString testConfig{
         R"(<CONTROL>
                 <CALIBRATION>
-                    <EXTRINSIC_PARAMETERS EXTR_ROT_1="%1" EXTR_ROT_2="%2" EXTR_ROT_3="%3" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="0" />
+                    <EXTRINSIC_PARAMETERS COORD3D_SWAP_Y="0" COORD3D_SWAP_Z="0" EXTR_ROT_1="%1" EXTR_ROT_2="%2" EXTR_ROT_3="%3" EXTR_TRANS_1="0" EXTR_TRANS_2="0" EXTR_TRANS_3="0" />
                 </CALIBRATION>
             </CONTROL>)"};
 
diff --git a/tests/unit_test/ui/main-windows/tst_control.cpp b/tests/unit_test/ui/main-windows/tst_control.cpp
index e047d57c0..1819e211f 100644
--- a/tests/unit_test/ui/main-windows/tst_control.cpp
+++ b/tests/unit_test/ui/main-windows/tst_control.cpp
@@ -267,7 +267,7 @@ SCENARIO("Open PeTrack check defaults", "[ui][config]")
 
 TEST_CASE("Loading from and saving to XML node", "[config]")
 {
-    Petrack      pet{"0.9.1"};
+    Petrack      pet{"0.10.4"};
     Control     *control = pet.getControlWidget();
     QDomDocument doc;
     QDomElement  save = doc.createElement("CONTROL");
-- 
GitLab