diff --git a/include/control.h b/include/control.h
index 0327b73e4b9178316644cff9b107114330680ad4..90d8cfcc828252ee3c79521655c9602ba98ebfad 100644
--- a/include/control.h
+++ b/include/control.h
@@ -35,7 +35,7 @@ class Control: public QWidget, public Ui::Control
     Q_OBJECT
 
 public:
-    Control(QWidget *parent = nullptr);
+    Control(QWidget& parent, reco::Recognizer& recognizer);
 
     void setScene(QGraphicsScene *sc);
 
@@ -219,11 +219,9 @@ public:
         return mMainWindow;
     }
 
-    inline reco::RecognitionMethod getRecoMethod() const
-    {
-        auto method = recoMethod->itemData(recoMethod->currentIndex());
-        return method.value<reco::RecognitionMethod>();
-    }
+private:
+    reco::RecognitionMethod getRecoMethod() const;
+
 
 private slots:
     void on_anaCalculate_clicked();
@@ -308,6 +306,8 @@ private slots:
     void on_trackShowBefore_valueChanged(int /*i*/) { if (!isLoading()) mScene->update(); }
     void on_trackShowAfter_valueChanged(int /*i*/) { if (!isLoading()) mScene->update(); }
 
+    void on_recoMethod_currentIndexChanged(int index);
+    void onRecoMethodChanged(reco::RecognitionMethod method);
     void on_performRecognition_stateChanged(int i);
     void on_markerBrightness_valueChanged(int i);
     void on_markerIgnoreWithout_stateChanged(int i);
@@ -414,6 +414,9 @@ private slots:
 
     void on_trackRoiFix_stateChanged(int arg1);
 
+signals:
+    void userChangedRecoMethod(reco::RecognitionMethod method);
+
 private:
     Petrack *mMainWindow;
     QGraphicsScene *mScene;
diff --git a/include/petrack.h b/include/petrack.h
index bc34d87ef1b852038364955fe96cf52ad356ad06..fe92c61e32ab747f65fdc039f581d182d0a94fec 100644
--- a/include/petrack.h
+++ b/include/petrack.h
@@ -39,6 +39,7 @@
 #include "autoCalib.h"
 #include "coordItem.h"
 #include "extrCalibration.h"
+#include "recognition.h"
 
 class CalibFilter;
 class Animation;
@@ -225,6 +226,10 @@ public:
     {
         return mControlWidget;
     }
+    inline reco::Recognizer& getRecognizer()
+    {
+        return mReco;
+    }
     inline StereoWidget* getStereoWidget()
     {
         return mStereoWidget;
@@ -567,6 +572,8 @@ private:
     bool mRecognitionChanged;
     bool mTrackChanged;
 
+    reco::Recognizer mReco;
+
     Tracker *mTracker;
     TrackerReal *mTrackerReal;
     double mHeadSize;
diff --git a/include/recognition.h b/include/recognition.h
index e3bd6b988889f2494cd7b5121d72603e86a121cd..629fe0a558aac14ec89511903900f62cc182f732 100644
--- a/include/recognition.h
+++ b/include/recognition.h
@@ -22,9 +22,11 @@
 #define RECOGNITION_H
 
 #include <QList>
-#include "vector.h"
+#include <QObject>
 #include <opencv2/aruco.hpp>
 
+#include "vector.h"
+
 class TrackPoint;
 class QRect;
 class BackgroundFilter;
@@ -48,13 +50,39 @@ namespace reco {
         Code = 6,
     };
 
+    class Recognizer : public QObject
+    {
+        Q_OBJECT
+
+    private:
+        // TODO add options for each marker type
+
+        // default multicolor marker (until 11/2016 hermes marker)
+        RecognitionMethod mRecoMethod = RecognitionMethod::MultiColor;
+    public:
+        QList<TrackPoint> getMarkerPos(cv::Mat &img, QRect &roi, Control *controlWidget, int borderSize, BackgroundFilter *bgFilter);
+
+        RecognitionMethod getRecoMethod() const {return mRecoMethod;}
+
+    public slots:
+        void userChangedRecoMethod(RecognitionMethod method)
+        {
+            if(method != mRecoMethod)
+            {
+                mRecoMethod = method;
+                emit recoMethodChanged(mRecoMethod);
+            }
+        }
+
+    signals:
+        void recoMethodChanged(RecognitionMethod method);
+    };
+
     // berechnet pixelverschiebung aufgrund von schraegsicht bei einem farbmarker
     // Maik Dissertation Seite 138
     // boxImageCentre ohne Border
     Vec2F autoCorrectColorMarker(Vec2F &boxImageCentre, Control *controlWidget);
 
-    //void getMarkerPos(IplImage *iplImg, QRect roi, QList<TrackPoint> *crossList, int markerBrightness, int borderSize, bool ignoreWithoutMarker, bool autoWB, BackgroundFilter *bgFilter, int recoMethod);
-    void getMarkerPos(cv::Mat &img, QRect &roi, QList<TrackPoint> *crossList, Control *controlWidget, int borderSize, BackgroundFilter *bgFilter);
 
     namespace detail {
         struct ColorBlob{
@@ -101,6 +129,7 @@ namespace reco {
             bool     ignoreWithoutMarker = true;    ///< should a blob without valid arucoMarker be ignored
             bool     autoCorrect         = false;   ///< should perspective correction be performed
             bool autoCorrectOnlyExport   = false;   ///< should perspective correction only be performed when exporting trajectories
+            RecognitionMethod method = RecognitionMethod::Code; ///< Used recognition method; could be called from findMulticolorMarker
         };
 
         std::vector<ColorBlob> findColorBlob(const ColorBlobDetectionParams &options);
@@ -109,7 +138,7 @@ namespace reco {
         void refineWithBlackDot(std::vector<ColorBlob>& blobs, const cv::Mat& img, QList<TrackPoint>& crossList, const BlackDotOptions& options);
         void refineWithAruco(std::vector<ColorBlob> &blobs, const cv::Mat& img, QList<TrackPoint> &crossList, ArucoOptions& options);
 
-        void findCodeMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *controlWidget, Vec2F offsetCropRect2Roi=Vec2F{0,0});
+        void findCodeMarker(cv::Mat &img, QList<TrackPoint> &crossList, Control *controlWidget, RecognitionMethod recoMethod, Vec2F offsetCropRect2Roi=Vec2F{0,0});
         cv::Ptr<cv::aruco::Dictionary> getDictMip36h12();
     }
 }
diff --git a/include/tracker.h b/include/tracker.h
index 3a264e703f7544d01d4582d9f449f5202db402ff..f93ffaa5e48a01a36e0b23409b203920bc579b8c 100644
--- a/include/tracker.h
+++ b/include/tracker.h
@@ -464,10 +464,10 @@ public:
     // true, if new traj is inserted with point p and initial frame frame
     // p in pixel coord
     // pers wird gesetzt, wenn existierender trackpoint einer person verschoben wird
-    bool addPoint(TrackPoint &p, int frame, const QSet<int>& onlyVisible, int *pers = nullptr);
+    bool addPoint(TrackPoint &p, int frame, const QSet<int>& onlyVisible, reco::RecognitionMethod method, int *pers = nullptr);
 
     // hier sollte direkt die farbe mit uebergeben werden
-    void addPoints(QList<TrackPoint> &pL, int frame);
+    void addPoints(QList<TrackPoint> &pL, int frame, reco::RecognitionMethod method);
 
     // calculate height of person
 
@@ -484,7 +484,7 @@ public:
     int insertFeaturePoints(int frame, size_t count, cv::Mat &img, int borderSize, float errorScale);
 
     // frame ist frame fuer naechsten prev frame
-    int track(cv::Mat &img,cv::Rect &rect, int frame, bool reTrack, int reQual, int borderSize, int level=3, QSet<int> onlyVisible = QSet<int>(), int errorScaleExponent=0);
+    int track(cv::Mat &img, cv::Rect &rect, int frame, bool reTrack, int reQual, int borderSize,  reco::RecognitionMethod recoMethod, int level=3, QSet<int> onlyVisible = QSet<int>(), int errorScaleExponent=0);
 
 
     void checkPlausibility(QList<int> &pers, QList<int> &frame,
diff --git a/src/control.cpp b/src/control.cpp
index d9acd240be5ccb64e0979ff62e63808f49665485..c3ba492a7e1d8fadac6eb1f11df76bc98fb2b9cb 100644
--- a/src/control.cpp
+++ b/src/control.cpp
@@ -44,11 +44,11 @@
 
 #define DEFAULT_HEIGHT 180.0
 
-Control::Control(QWidget *parent)
-    : QWidget(parent)
+Control::Control(QWidget& parent, reco::Recognizer& recognizer)
+    : QWidget(&parent)
 {
     setAccessibleName("Control");
-    mMainWindow = (class Petrack*) parent;
+    mMainWindow = (class Petrack*) &parent;
     mScene = nullptr;
     mLoading = false;
     //beim erzeugen von new colorplot absturz!!!!
@@ -164,8 +164,9 @@ Control::Control(QWidget *parent)
     recoMethod->addItem("multicolor marker", QVariant::fromValue(reco::RecognitionMethod::MultiColor));
     recoMethod->addItem("code marker", QVariant::fromValue(reco::RecognitionMethod::Code));
 
-    // default multicolor marker (until 11/2016 hermes marker)
-    recoMethod->setCurrentIndex(recoMethod->findData(QVariant::fromValue(reco::RecognitionMethod::MultiColor)));
+    connect(&recognizer, &reco::Recognizer::recoMethodChanged, this, &Control::onRecoMethodChanged);
+    connect(this, &Control::userChangedRecoMethod, &recognizer, &reco::Recognizer::userChangedRecoMethod);
+    recoMethod->setCurrentIndex(recoMethod->findData(QVariant::fromValue(recognizer.getRecoMethod())));
 
     scrollArea->setMinimumWidth(
         scrollAreaWidgetContents->sizeHint().width() +
@@ -1549,6 +1550,17 @@ void Control::on_performRecognition_stateChanged(int /*i*/)
         mMainWindow->updateImage();
 }
 
+void Control::on_recoMethod_currentIndexChanged(int /*index*/)
+{
+    auto method = recoMethod->itemData(recoMethod->currentIndex());
+    emit userChangedRecoMethod(method.value<reco::RecognitionMethod>());
+}
+
+void Control::onRecoMethodChanged(reco::RecognitionMethod method)
+{
+    recoMethod->setCurrentIndex(recoMethod->findData(QVariant::fromValue(method)));
+}
+
 void Control::on_markerBrightness_valueChanged(int /*i*/)
 {
     mMainWindow->setRecognitionChanged(true);// flag changes of recognition parameters
@@ -3376,6 +3388,12 @@ void Control::getXml(QDomElement &elem)
     mMainWindow->updateCoord();
 }
 
+reco::RecognitionMethod Control::getRecoMethod() const
+{
+    auto method = recoMethod->itemData(recoMethod->currentIndex());
+    return method.value<reco::RecognitionMethod>();
+}
+
 void Control::on_colorPickerButton_clicked(bool checked)
 {
     //true wenn neu gechecked, false wenn wieder abgewählt
@@ -3651,3 +3669,4 @@ void Control::expandRange(QColor& fromColor, QColor& toColor, const QColor& clic
 }
 
 #include "moc_control.cpp"
+
diff --git a/src/petrack.cpp b/src/petrack.cpp
index 6d1bfa09a67832fd9264b8a83faa9fe09762690c..885380eb652bb37dffe14bb0efadadd4b17fa197 100644
--- a/src/petrack.cpp
+++ b/src/petrack.cpp
@@ -44,7 +44,6 @@
 #include "player.h"
 #include "calibFilter.h"
 #include "autoCalib.h"
-#include "recognition.h"
 #include "trackerItem.h"
 #include "backgroundItem.h"
 #include "tracker.h"
@@ -107,7 +106,7 @@ Petrack::Petrack()
     mCalibFilter = new CalibFilter; // schoener waere erst zu erzeugen, wenn video geladen wird, da sonst bei stereo erst normealer und dann stereo objekt erzeugt wird
     mCalibFilter->disable();        // aber control widget greift schon bei erzeugung auf alle objekte zur einstellung zurueck
 
-    mControlWidget = new Control(this);
+    mControlWidget = new Control(*this, mReco);
     cw =  mControlWidget; // muss spaeter geloescht werden
 
     mStereoWidget = new StereoWidget(this);
@@ -2512,7 +2511,7 @@ void Petrack::testTracker()
 
 int Petrack::calculateRealTracker()
 {
-    bool autoCorrectOnlyExport = (mControlWidget->getRecoMethod() == reco::RecognitionMethod::MultiColor) && // multicolor
+    bool autoCorrectOnlyExport = (mReco.getRecoMethod() == reco::RecognitionMethod::MultiColor) && // multicolor
             mMultiColorMarkerWidget->autoCorrect->isChecked() &&
             mMultiColorMarkerWidget->autoCorrectOnlyExport->isChecked();
     int anz = mTrackerReal->calculate(mTracker, mImageItem, mControlWidget->getColorPlot(), getImageBorderSize(),
@@ -2555,7 +2554,7 @@ void Petrack::exportTracker(QString dest) //default = ""
         if (!dest.isEmpty())
         {
             QList<int> pers, frame;
-            bool autoCorrectOnlyExport = (mControlWidget->getRecoMethod() == reco::RecognitionMethod::MultiColor) && // multicolor
+            bool autoCorrectOnlyExport = (mReco.getRecoMethod() == reco::RecognitionMethod::MultiColor) && // multicolor
                     mMultiColorMarkerWidget->autoCorrect->isChecked() &&
                     mMultiColorMarkerWidget->autoCorrectOnlyExport->isChecked();
 
@@ -3135,7 +3134,8 @@ void Petrack::updateImage(bool imageChanged) // default = false (only true for n
             int anz = mTracker->track(mImgFiltered, rect, frameNum,
                                       mControlWidget->trackRepeat->isChecked(),
                                       mControlWidget->trackRepeatQual->value(), getImageBorderSize(),
-                                      mControlWidget->trackRegionLevels->value(), getOnlyVisible());
+                                      mReco.getRecoMethod(), mControlWidget->trackRegionLevels->value(),
+                                      getOnlyVisible());
 #ifdef TIME_MEASUREMENT
             debout << "nach track: " << getElapsedTime() <<endl;
 #endif
@@ -3166,7 +3166,7 @@ void Petrack::updateImage(bool imageChanged) // default = false (only true for n
                            myRound(mRecognitionRoiItem->rect().width()),
                            myRound(mRecognitionRoiItem->rect().height()));
                 QList<TrackPoint> persList;
-                auto recoMethod = mControlWidget->getRecoMethod();
+                auto recoMethod = mReco.getRecoMethod();
 #ifdef TIME_MEASUREMENT
                 //        "==========: "
                 debout << "vor   reco: " << getElapsedTime() <<endl;
@@ -3175,20 +3175,20 @@ void Petrack::updateImage(bool imageChanged) // default = false (only true for n
                 || (recoMethod == reco::RecognitionMethod::Color) || (recoMethod == reco::RecognitionMethod::Japan)
                 || (recoMethod == reco::RecognitionMethod::MultiColor) || (recoMethod == reco::RecognitionMethod::Code)) //else
                 {
-                    reco::getMarkerPos(mImgFiltered, rect, &persList, mControlWidget, getImageBorderSize(), getBackgroundFilter());
+                    persList = mReco.getMarkerPos(mImgFiltered, rect, mControlWidget, getImageBorderSize(), getBackgroundFilter());
                 }
 #ifndef STEREO_DISABLED
                 if (mStereoContext && mStereoWidget->stereoUseForReco->isChecked())
                 {
                     PersonList pl;
-                    pl.calcPersonPos(mImgFiltered, rect, persList, mStereoContext, getBackgroundFilter(), markerLess);
+                    pl.calcPersonPos(mImgFiltered, rect, &persList, mStereoContext, getBackgroundFilter(), markerLess);
                 }
 #endif
 #ifdef TIME_MEASUREMENT
                 //        "==========: "
                 debout << "nach  reco: " << getElapsedTime() <<endl;
 #endif
-                mTracker->addPoints(persList, frameNum);
+                mTracker->addPoints(persList, frameNum, mReco.getRecoMethod());
 
                 // folgendes lieber im Anschluss, ggf beim exportieren oder statt test direkt del:
                 if (mStereoContext && mStereoWidget->stereoUseForReco->isChecked())
@@ -3459,7 +3459,7 @@ int Petrack::addOrMoveManualTrackPoint(const QPointF& pos)
     int pers = -1;
     TrackPoint tP(Vec2F{pos}, 110); // 110 is higher than 100 (max. quality) and gets clamped to 100 after insertion
     // allows replacemet of every point (check for better quality always passes)
-    mTracker->addPoint(tP, mAnimation->getCurrentFrameNum(), getOnlyVisible(), &pers);
+    mTracker->addPoint(tP, mAnimation->getCurrentFrameNum(), getOnlyVisible(), mReco.getRecoMethod(), &pers);
     updateControlWidget();
     return pers;
 }
diff --git a/src/recognition.cpp b/src/recognition.cpp
index 0713905348fea0766cbc7ee7be940dfe8a8b8161..f439fe3223505603f8021917f50ef893a10bbbb5 100644
--- a/src/recognition.cpp
+++ b/src/recognition.cpp
@@ -579,7 +579,7 @@ void detail::refineWithAruco(std::vector<ColorBlob> &blobs, const cv::Mat& img,
 
         if (subImg.empty())
             continue;
-        findCodeMarker(subImg, &crossList, controlWidget, offsetCropRect2Roi);
+        findCodeMarker(subImg, crossList, controlWidget, options.method, offsetCropRect2Roi);
 
         // The next three statements each:
         // - set the offset of subImg with regards to ROI //(ROI to original image is archieved later in the code for all methods)
@@ -647,7 +647,7 @@ void detail::refineWithAruco(std::vector<ColorBlob> &blobs, const cv::Mat& img,
  * @param ignoreWithoutMarker (is ignored->overwritten by cmWidget->ignoreWithoutDot->isChecked())
  * @param offset
  */
-void findMultiColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *controlWidget, bool ignoreWithoutMarker, Vec2F &offset)
+void findMultiColorMarker(cv::Mat &img, QList<TrackPoint> &crossList, Control *controlWidget, bool ignoreWithoutMarker, Vec2F &offset, RecognitionMethod method)
 {
     Petrack *mainWindow = controlWidget->getMainWindow();
     MultiColorMarkerItem* cmItem = mainWindow->getMultiColorMarkerItem();
@@ -720,7 +720,7 @@ void findMultiColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *c
             options.imageItem = mainWindow->getImageItem();
 
             // adds to crosslist
-            refineWithBlackDot(blobs, img, *crossList, options);
+            refineWithBlackDot(blobs, img, crossList, options);
         }else if (useCodeMarker)
         {
             ArucoOptions options;
@@ -728,9 +728,10 @@ void findMultiColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *c
             options.autoCorrectOnlyExport = autoCorrectOnlyExport;
             options.ignoreWithoutMarker = ignoreWithoutMarker;
             options.controlWidget = controlWidget;
+            options.method = method;
 
             // adds to crosslist
-            refineWithAruco(blobs, img, *crossList, options);
+            refineWithAruco(blobs, img, crossList, options);
         }else
         {
             Vec2F moveDir;
@@ -740,11 +741,11 @@ void findMultiColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *c
                 {
                     moveDir = autoCorrectColorMarker(blob.imageCenter, controlWidget);
 
-                    crossList->append(TrackPoint(Vec2F(blob.box.center.x, blob.box.center.y)+moveDir, 100, Vec2F(blob.box.center.x, blob.box.center.y), blob.color)); // 100 beste qualitaet
+                    crossList.append(TrackPoint(Vec2F(blob.box.center.x, blob.box.center.y)+moveDir, 100, Vec2F(blob.box.center.x, blob.box.center.y), blob.color)); // 100 beste qualitaet
                 }
                 else
                 {
-                    crossList->append(TrackPoint(Vec2F(blob.box.center.x, blob.box.center.y), 100, Vec2F(blob.box.center.x, blob.box.center.y), blob.color)); // 100 beste qualitaet
+                    crossList.append(TrackPoint(Vec2F(blob.box.center.x, blob.box.center.y), 100, Vec2F(blob.box.center.x, blob.box.center.y), blob.color)); // 100 beste qualitaet
                 }
             }
         }
@@ -761,7 +762,7 @@ void findMultiColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *c
  * @param crossList
  * @param controlWidget
  */
-void findColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *controlWidget)
+void findColorMarker(cv::Mat &img, QList<TrackPoint> &crossList, Control *controlWidget)
 {
     ColorParameters	param;
     ColorMarkerItem*     cmItem = controlWidget->getMainWindow()->getColorMarkerItem();
@@ -840,7 +841,7 @@ void findColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *contro
         {
             // eine mittelung waere ggf sinnvoll, aber am rand aufpassen
             col.setRgb(getValue(img,myRound(box.center.x),myRound(box.center.y)).rgb());
-            crossList->append(TrackPoint(Vec2F(box.center.x, box.center.y), 100, Vec2F(box.center.x, box.center.y), col)); // 100 beste qualitaet
+            crossList.append(TrackPoint(Vec2F(box.center.x, box.center.y), 100, Vec2F(box.center.x, box.center.y), col)); // 100 beste qualitaet
         }
 
         // take the next contour
@@ -854,7 +855,7 @@ void findColorMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *contro
  * @param crossList[out] list of detected TrackPoints
  * @param controlWidget
  */
-void detail::findCodeMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control *controlWidget, Vec2F offsetCropRect2Roi /*=(0,0)*/)
+void detail::findCodeMarker(cv::Mat &img, QList<TrackPoint> &crossList, Control *controlWidget, RecognitionMethod recoMethod, Vec2F offsetCropRect2Roi /*=(0,0)*/)
 {
     CodeMarkerItem* codeMarkerItem = controlWidget->getMainWindow()->getCodeMarkerItem();
     CodeMarkerWidget* codeMarkerWidget = controlWidget->getMainWindow()->getCodeMarkerWidget();
@@ -873,7 +874,6 @@ void detail::findCodeMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control
     Petrack *mainWindow = controlWidget->getMainWindow();
 
     int bS = mainWindow->getImageBorderSize();
-    auto recoMethod = controlWidget->getRecoMethod();
 
     if (controlWidget->getCalibCoordDimension() == 0) // 3D
     {
@@ -895,9 +895,7 @@ void detail::findCodeMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control
 
             minMarkerPerimeterRate = (codeMarkerWidget->minMarkerPerimeter->value()*4./cmPerPixel_max)/std::max(rect.width(),rect.height());
             maxMarkerPerimeterRate = (codeMarkerWidget->maxMarkerPerimeter->value()*4./cmPerPixel_min)/std::max(rect.width(),rect.height());
-        }
-
-        if (recoMethod == RecognitionMethod::MultiColor)   // for usage of codemarker with MulticolorMarker
+        } else if (recoMethod == RecognitionMethod::MultiColor)   // for usage of codemarker with MulticolorMarker
         {
             QRect rect(0,0, img.rows, img.cols);
 
@@ -962,7 +960,7 @@ void detail::findCodeMarker(cv::Mat &img, QList<TrackPoint> *crossList, Control
         double x = (corners.at(i).at(0).x+corners.at(i).at(1).x+corners.at(i).at(2).x+corners.at(i).at(3).x)*0.25;
         double y = (corners.at(i).at(0).y+corners.at(i).at(1).y+corners.at(i).at(2).y+corners.at(i).at(3).y)*0.25;
 
-        crossList->append(TrackPoint(Vec2F(x,y), 100, ids.at(i))); // 100 beste qualitaet
+        crossList.append(TrackPoint(Vec2F(x,y), 100, ids.at(i))); // 100 beste qualitaet
     }
 }
 
@@ -1076,35 +1074,47 @@ void findContourMarker(cv::Mat &img, QList<TrackPoint> *crossList, int markerBri
  *
  * @param img
  * @param roi Region of interest for recognition
- * @param crossList[out] detected TrackPoints
  * @param controlWidget
  * @param borderSize
  * @param bgFilter
+ *
+ * @return List of detected TrackPoints
  */
-void getMarkerPos(cv::Mat &img, QRect &roi, QList<TrackPoint> *crossList, Control *controlWidget, int borderSize, BackgroundFilter *bgFilter)
+QList<TrackPoint> Recognizer::getMarkerPos(cv::Mat &img, QRect &roi, Control *controlWidget, int borderSize, BackgroundFilter *bgFilter)
 {
     int markerBrightness = controlWidget->markerBrightness->value();
     bool ignoreWithoutMarker = (controlWidget->markerIgnoreWithout->checkState() == Qt::Checked);
     bool autoWB = (controlWidget->recoAutoWB->checkState() == Qt::Checked);
-    auto recoMethod = controlWidget->getRecoMethod();
 
     cv::Mat tImg;
     cv::Rect rect;
-    tImg = getRoi(img, roi, rect, !((recoMethod == RecognitionMethod::Color) || (recoMethod == RecognitionMethod::MultiColor) || (recoMethod == RecognitionMethod::Code)));
+    tImg = getRoi(img, roi, rect, !((mRecoMethod == RecognitionMethod::Color) || (mRecoMethod == RecognitionMethod::MultiColor) || (mRecoMethod == RecognitionMethod::Code)));
 
     if (tImg.empty())
-        return;
+        return QList<TrackPoint>{};
 
+    QList<TrackPoint> crossList;
     // offset of rect
     Vec2F v(rect.x-borderSize, rect.y-borderSize);
-    if (recoMethod == RecognitionMethod::MultiColor)
-        findMultiColorMarker(tImg, crossList, controlWidget, ignoreWithoutMarker, v);
-    else if (recoMethod == RecognitionMethod::Color)
-        findColorMarker(tImg, crossList, controlWidget);
-    else if (recoMethod == RecognitionMethod::Code)
-        findCodeMarker(tImg, crossList, controlWidget);
-    else
-        findContourMarker(tImg, crossList, markerBrightness, ignoreWithoutMarker, autoWB, recoMethod, controlWidget->getMainWindow()->getHeadSize());
+
+    switch (mRecoMethod) {
+        case RecognitionMethod::MultiColor:
+            findMultiColorMarker(tImg, crossList, controlWidget, ignoreWithoutMarker, v, mRecoMethod);
+            break;
+        case RecognitionMethod::Color:
+            findColorMarker(tImg, crossList, controlWidget);
+            break;
+        case RecognitionMethod::Code:
+            findCodeMarker(tImg, crossList, controlWidget, mRecoMethod);
+            break;
+        case RecognitionMethod::Casern: [[fallthrough]];
+        case RecognitionMethod::Hermes: [[fallthrough]];
+        case RecognitionMethod::Japan:
+            findContourMarker(tImg, &crossList, markerBrightness, ignoreWithoutMarker, autoWB, mRecoMethod, controlWidget->getMainWindow()->getHeadSize());
+            break;
+        case RecognitionMethod::Stereo:
+            throw std::invalid_argument("Stereo marker are not handled in getMarkerPos, but in PersonList::calcPersonPos");
+    }
 
     // must be set because else hovermoveevent of recognitionRec moves also the colorMaskItem
     controlWidget->getMainWindow()->getColorMarkerItem()->setRect(v);
@@ -1112,24 +1122,23 @@ void getMarkerPos(cv::Mat &img, QRect &roi, QList<TrackPoint> *crossList, Contro
     controlWidget->getMainWindow()->getMultiColorMarkerItem()->setRect(v);
     // must be set because else hovermoveevent of recognitionRec moves also the colorMaskItem
     controlWidget->getMainWindow()->getCodeMarkerItem()->setRect(v);
+
     // set cross position relative to original image size
-    for (int i=0; i < crossList->size(); ++i)
-    {
-         (*crossList)[i] += v;
-         (*crossList)[i].setColPoint((*crossList)[i].colPoint() + v);
+    for (auto& point : crossList){
+        point += v;
+        point.setColPoint(point.colPoint() + v);
     }
 
     if (bgFilter->getEnabled()) // nur fuer den fall von bgSubtraction durchfuehren
     {
-        for (int i=0; i < crossList->size(); ++i)
-        {
-            if (! bgFilter->isForeground(crossList->at(i).x(), crossList->at(i).y()))
-            {
-                crossList->removeAt(i);
-                --i;
-            }
-        }
+        crossList.erase(
+            std::remove_if(crossList.begin(), crossList.end(), [bgFilter](TrackPoint& tp){
+                return !bgFilter->isForeground(tp.x(), tp.y());
+            }),
+            crossList.end());
     }
+
+    return crossList;
 }
 
 
diff --git a/src/tracker.cpp b/src/tracker.cpp
index 9da77f75765ae3609d750acb03f34f7d7a2a0942..cc2bd785034155d13f139dc6d0243bb6a4979631 100644
--- a/src/tracker.cpp
+++ b/src/tracker.cpp
@@ -949,7 +949,7 @@ int Tracker::calcPosition(int /*frame*/) {
  * @param[out] pers person the point was added to; undefined when new trajectory was created
  * @return true if new trajectory was created; false otherwise
  */
-bool Tracker::addPoint(TrackPoint &p, int frame, const QSet<int>& onlyVisible, int *pers)
+bool Tracker::addPoint(TrackPoint &p, int frame, const QSet<int>& onlyVisible, reco::RecognitionMethod method, int *pers)
 {
     bool found = false;
     int i, iNearest = 0.;
@@ -977,7 +977,7 @@ bool Tracker::addPoint(TrackPoint &p, int frame, const QSet<int>& onlyVisible, i
     // skalierungsfaktor fuer kopfgroesse
     // fuer multicolor marker groesser, da der schwarze punkt weit am rand liegen kann
     bool multiColorWithDot = false;
-    if (mMainWindow->getControlWidget()->getRecoMethod() == reco::RecognitionMethod::MultiColor && // multicolor marker
+    if (method == reco::RecognitionMethod::MultiColor && // multicolor marker
         mMainWindow->getMultiColorMarkerWidget()->useDot->isChecked() && // nutzung von black dot
         !mMainWindow->getMultiColorMarkerWidget()->ignoreWithoutDot->isChecked()) // muetzen ohne black dot werden auch akzeptiert
     {
@@ -1067,7 +1067,7 @@ bool Tracker::addPoint(TrackPoint &p, int frame, const QSet<int>& onlyVisible, i
 }
 
 // used from recognition
-void Tracker::addPoints(QList<TrackPoint> &pL, int frame)
+void Tracker::addPoints(QList<TrackPoint> &pL, int frame, reco::RecognitionMethod method)
 {
     int i;
 
@@ -1078,7 +1078,7 @@ void Tracker::addPoints(QList<TrackPoint> &pL, int frame)
     // ueberprufen ob identisch mit einem Punkt in liste
     for (i = 0; i < pL.size(); ++i) // ueber PointList
     {
-        addPoint(pL[i], frame, QSet<int>());
+        addPoint(pL[i], frame, QSet<int>(), method);
     }
 }
 
@@ -1377,7 +1377,7 @@ bool Tracker::tryMergeTrajectories(const TrackPoint& v, size_t i, int frame)
  * @param errorScaleExponent errorScale is 1.5^errorScaleExponent
  * @return Number of tracked points
  */
-int Tracker::track(cv::Mat &img, cv::Rect &rect, int frame, bool reTrack, int reQual, int borderSize, int level, QSet<int> onlyVisible, int errorScaleExponent)
+int Tracker::track(cv::Mat &img, cv::Rect &rect, int frame, bool reTrack, int reQual, int borderSize, reco::RecognitionMethod recoMethod, int level, QSet<int> onlyVisible, int errorScaleExponent)
 {
     QList<int> trjToDel;
     float errorScale = pow(1.5,errorScaleExponent); // 0 waere neutral
@@ -1436,7 +1436,6 @@ int Tracker::track(cv::Mat &img, cv::Rect &rect, int frame, bool reTrack, int re
 
         // (bei schlechten, aber noch ertraeglichem fehler in der naehe dunkelsten punkt suchen)
         // dieser ansatz kann dazu fuehren, dass bei starken helligkeitsunterschieden auf pappe zum schatten gewandert wird!!!
-        auto recoMethod = mMainWindow->getControlWidget()->getRecoMethod();
         if (!mMainWindow->getStereoWidget()->stereoUseForReco->isChecked() && ((recoMethod == reco::RecognitionMethod::Casern)|| (recoMethod == reco::RecognitionMethod::Hermes))) // nicht benutzen, wenn ueber disparity der kopf gesucht wird und somit kein marker vorhanden oder zumindest nicht am punkt lewigen muss
         {
             refineViaNearDarkPoint();
diff --git a/tests/unit_test/tst_control.cpp b/tests/unit_test/tst_control.cpp
index c5c82712133432ec66b25537a17ae4968a7fff53..9337288514fa4d1fabf02591f7dfd6ad7d36700f 100644
--- a/tests/unit_test/tst_control.cpp
+++ b/tests/unit_test/tst_control.cpp
@@ -240,5 +240,5 @@ SCENARIO("I open PeTrack with a red image", "[ui][config]")
 SCENARIO("Open PeTrack check defaults", "[ui][config]")
 {
     Petrack pet {};
-    REQUIRE(pet.getControlWidget()->getRecoMethod() == reco::RecognitionMethod::MultiColor);
+    REQUIRE(pet.getRecognizer().getRecoMethod() == reco::RecognitionMethod::MultiColor);
 }