diff --git a/include/autoCalib.h b/include/autoCalib.h
index baeb5a48a5ac373e5530f999d1d9411df4399e30..46092b2a9a68e5e9bf20cd888170ff39b96f161d 100644
--- a/include/autoCalib.h
+++ b/include/autoCalib.h
@@ -27,7 +27,6 @@
 #include <optional>
 
 class Petrack;
-class Control;
 
 /**
  * @brief Class for intrinsic calibration
@@ -96,7 +95,6 @@ private:
         double                               *reproj_errs);
 
     Petrack    *mMainWindow;
-    Control    *mControlWidget;
     QStringList mCalibFiles;
     int         mBoardSizeX, mBoardSizeY;
     float       mSquareSize;
diff --git a/include/backgroundItem.h b/include/backgroundItem.h
index c12c3e3ce3cdc4b3be053273145a68add7ecf79e..04f513bea1ee12b27bab09c84ffbf206d5f40512 100644
--- a/include/backgroundItem.h
+++ b/include/backgroundItem.h
@@ -23,6 +23,7 @@
 
 class Petrack;
 class Control;
+class FilterBeforeBox;
 class Tracker;
 
 class BackgroundItem : public QGraphicsItem
@@ -32,7 +33,7 @@ private:
     QImage  *mImage;
 
 public:
-    BackgroundItem(QWidget *wParent, QGraphicsItem *parent = nullptr);
+    BackgroundItem(QWidget *wParent, QGraphicsItem *parent, FilterBeforeBox &filterBefore);
     QRectF boundingRect() const;
     void   paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
 };
diff --git a/include/control.h b/include/control.h
index 0ae21e7b4bf8a5fe76e98296ce45f873bc55a3ca..01078b60a318fda41eac3bd88074762eb03ede16 100644
--- a/include/control.h
+++ b/include/control.h
@@ -31,6 +31,7 @@
 class QGraphicsScene;
 class QDomElement;
 class IntrinsicBox;
+class FilterBeforeBox;
 namespace Ui
 {
 class Control;
@@ -47,7 +48,8 @@ public:
         reco::Recognizer &recognizer,
         RoiItem          &trackRoiItem,
         RoiItem          &recoRoiItem,
-        MissingFrames    &missingFrames);
+        MissingFrames    &missingFrames,
+        FilterBeforeBox  *filterBefore);
     Control(
         QWidget          &parent,
         QGraphicsScene   &scene,
@@ -55,7 +57,8 @@ public:
         RoiItem          &trackRoiItem,
         RoiItem          &recoRoiItem,
         Ui::Control      *ui,
-        MissingFrames    &missingFrames);
+        MissingFrames    &missingFrames,
+        FilterBeforeBox  *filterBefore);
 
     void setScene(QGraphicsScene *sc);
 
@@ -547,25 +550,8 @@ private slots:
     void on_roiShow_stateChanged(int i);
     void on_roiFix_stateChanged(int i);
 
-    void on_filterBrightContrast_stateChanged(int i);
-    void on_filterContrastParam_valueChanged(int i);
-    void on_filterBrightParam_valueChanged(int i);
-    void on_filterBorder_stateChanged(int i);
-    void on_filterBorderParamSize_valueChanged(int i);
-    void on_filterBorderParamCol_clicked();
-    void on_filterBg_stateChanged(int i);
-    void on_filterBgShow_stateChanged(int i);
-    void on_filterBgUpdate_stateChanged(int i);
-    void on_filterBgReset_clicked();
-    void on_filterBgSave_clicked();
-    void on_filterBgLoad_clicked();
-    void on_filterSwap_stateChanged(int i);
-    void on_filterSwapH_stateChanged(int i);
-    void on_filterSwapV_stateChanged(int i);
-
     void on_intrinsicParamsChanged(IntrinsicCameraParams params);
 
-
     void on_coordShow_stateChanged(int i);
     void on_coordFix_stateChanged(int i);
     void on_coordRotate_valueChanged(int i);
@@ -645,11 +631,12 @@ signals:
     void userChangedRecoMethod(reco::RecognitionMethod method);
 
 private:
-    Petrack        *mMainWindow;
-    Ui::Control    *mUi;
-    IntrinsicBox   *mIntr;
-    QGraphicsScene *mScene;
-    bool            mColorChanging;
+    Petrack         *mMainWindow;
+    Ui::Control     *mUi;
+    IntrinsicBox    *mIntr;
+    FilterBeforeBox *mFilterBefore;
+    QGraphicsScene  *mScene;
+    bool             mColorChanging;
     bool mIndexChanging; // shows, if the index of the color model is really changing; nor while constructor (initialer
                          // durchlauf) and may be while loading xml file
     bool mLoading;       // shows, if new project is just loading
diff --git a/include/filterBeforeBox.h b/include/filterBeforeBox.h
index 12fa50f88ae17e44de82704c07d0b9cb411e279d..384d849eda428cc111f5412f435c8dc6855dfed5 100644
--- a/include/filterBeforeBox.h
+++ b/include/filterBeforeBox.h
@@ -26,6 +26,11 @@ namespace Ui
 class FilterBeforeBox;
 }
 class QDomElement;
+class BackgroundFilter;
+class BrightContrastFilter;
+class BorderFilter;
+class SwapFilter;
+class BackgroundItem;
 
 struct FilterSettings
 {
@@ -42,13 +47,21 @@ class FilterBeforeBox : public QGroupBox
     Q_OBJECT
 
 public:
-    explicit FilterBeforeBox(QWidget *parent);
+    explicit FilterBeforeBox(
+        QWidget              *parent,
+        BackgroundFilter     &bgFilter,
+        BrightContrastFilter &brightContrastFilter,
+        BorderFilter         &borderFilter,
+        SwapFilter           &swapFilter,
+        std::function<void()> updateImageCallback);
     FilterBeforeBox(const FilterBeforeBox &)            = delete;
     FilterBeforeBox(FilterBeforeBox &&)                 = delete;
     FilterBeforeBox &operator=(const FilterBeforeBox &) = delete;
     FilterBeforeBox &operator=(FilterBeforeBox &&)      = delete;
     ~FilterBeforeBox() override;
 
+    void setBackgroundItem(BackgroundItem *item);
+
     int  getFilterBorderSize() const;
     void setFilterBorderSizeMin(int i);
     void setFilterBorderSizeMax(int i);
@@ -63,9 +76,32 @@ public:
     bool getXmlSub(QDomElement &subSubElem);
     void setXml(QDomElement &subElem, QColor bgColor, const QString &bgFilename) const;
 
+private slots:
+    void on_filterBrightContrast_stateChanged(int i);
+    void on_filterContrastParam_valueChanged(int i);
+    void on_filterBrightParam_valueChanged(int i);
+    void on_filterBorder_stateChanged(int i);
+    void on_filterBorderParamSize_valueChanged(int i);
+    void on_filterBorderParamCol_clicked();
+    void on_filterBg_stateChanged(int i);
+    void on_filterBgShow_stateChanged(int i);
+    void on_filterBgUpdate_stateChanged(int i);
+    void on_filterBgReset_clicked();
+    void on_filterBgSave_clicked();
+    void on_filterBgLoad_clicked();
+    void on_filterSwap_stateChanged(int i);
+    void on_filterSwapH_stateChanged(int i);
+    void on_filterSwapV_stateChanged(int i);
+
 private:
-    Ui::FilterBeforeBox *mUi;
-    bool                 mShowBackgroundCache;
+    Ui::FilterBeforeBox  *mUi;
+    bool                  mShowBackgroundCache;
+    std::function<void()> mUpdateImageCallback;
+    BackgroundFilter     &mBgFilter;
+    BrightContrastFilter &mBrightContrastFilter;
+    BorderFilter         &mBorderFilter;
+    SwapFilter           &mSwapFilter;
+    BackgroundItem       *mBgItem;
 };
 
 #endif // FILTERBEFOREBOX_H
diff --git a/src/autoCalib.cpp b/src/autoCalib.cpp
index e113b6e56899ef6232600f89606495fbd66a2888..6acfd674fbbc36285411b5381e8b8db221f02ecd 100644
--- a/src/autoCalib.cpp
+++ b/src/autoCalib.cpp
@@ -18,7 +18,6 @@
 
 #include "autoCalib.h"
 
-#include "control.h"
 #include "logger.h"
 #include "pMessageBox.h"
 #include "petrack.h"
@@ -35,8 +34,7 @@
 
 AutoCalib::AutoCalib()
 {
-    mMainWindow    = nullptr;
-    mControlWidget = nullptr;
+    mMainWindow = nullptr;
 
     // 6x8 und 4.6cm passen zu dem Schachbrettmuster auf der Eisenplatte mit Griff
     mBoardSizeX = 6;
@@ -48,8 +46,7 @@ AutoCalib::~AutoCalib() {}
 
 void AutoCalib::setMainWindow(Petrack *mw)
 {
-    mMainWindow    = mw;
-    mControlWidget = mw->getControlWidget();
+    mMainWindow = mw;
 }
 
 bool AutoCalib::isEmptyCalibFiles()
diff --git a/src/backgroundItem.cpp b/src/backgroundItem.cpp
index 7cd55d983f127397579d802f7ddf8e574cf59a72..e2eda03bada152181b3d9115e069127cc7d5e9d3 100644
--- a/src/backgroundItem.cpp
+++ b/src/backgroundItem.cpp
@@ -18,6 +18,7 @@
 
 #include "backgroundItem.h"
 
+#include "filterBeforeBox.h"
 #include "petrack.h"
 #include "view.h"
 
@@ -26,10 +27,12 @@
 // in x und y gleichermassen skaliertes koordinatensystem,
 // da von einer vorherigen intrinsischen kamerakalibrierung ausgegenagen wird,
 // so dass pixel quadratisch
-BackgroundItem::BackgroundItem(QWidget *wParent, QGraphicsItem *parent) : QGraphicsItem(parent)
+BackgroundItem::BackgroundItem(QWidget *wParent, QGraphicsItem *parent, FilterBeforeBox &filterBefore) :
+    QGraphicsItem(parent)
 {
     mMainWindow = (class Petrack *) wParent;
     mImage      = nullptr;
+    filterBefore.setBackgroundItem(this);
     //    setEnabled(false); // all mouse events cannot access this item, but it will be seen
     // einzig move koennte interessant sein, um grid zu verschieben?!
 }
diff --git a/src/control.cpp b/src/control.cpp
index e735be855eac3e9ce15b0273f0fb3766ac729cc4..8c0061d7034ef80034461a9153ba808f0462e9a5 100644
--- a/src/control.cpp
+++ b/src/control.cpp
@@ -26,6 +26,7 @@
 #include "colorMarkerWidget.h"
 #include "colorPlot.h"
 #include "colorRangeWidget.h"
+#include "filterBeforeBox.h"
 #include "imageItem.h"
 #include "intrinsicBox.h"
 #include "logger.h"
@@ -51,8 +52,9 @@ Control::Control(
     reco::Recognizer &recognizer,
     RoiItem          &trackRoiItem,
     RoiItem          &recoRoiItem,
-    MissingFrames    &missingFrames) :
-    Control(parent, scene, recognizer, trackRoiItem, recoRoiItem, new Ui::Control(), missingFrames)
+    MissingFrames    &missingFrames,
+    FilterBeforeBox  *filterBefore) :
+    Control(parent, scene, recognizer, trackRoiItem, recoRoiItem, new Ui::Control(), missingFrames, filterBefore)
 {
 }
 
@@ -63,8 +65,9 @@ Control::Control(
     RoiItem          &trackRoiItem,
     RoiItem          &recoRoiItem,
     Ui::Control      *ui,
-    MissingFrames    &missingFrames) :
-    QWidget(&parent), mUi(ui)
+    MissingFrames    &missingFrames,
+    FilterBeforeBox  *filterBefore) :
+    QWidget(&parent), mUi(ui), mFilterBefore(filterBefore)
 {
     setAccessibleName("Control");
     mMainWindow = (class Petrack *) &parent;
@@ -90,20 +93,17 @@ Control::Control(
     QObject::connect(
         &missingFrames, &MissingFrames::executeChanged, mUi->missingFramesCalculated, &QCheckBox::setChecked);
 
-    mIntr = new IntrinsicBox(
-        this,
-        *mMainWindow->getAutoCalib(),
-        *mMainWindow->getCalibFilter(),
-        [this]()
+    auto updateImageCallback = [this]()
+    {
+        if(!mMainWindow->isLoading())
         {
-            if(!mMainWindow->isLoading())
-            {
-                mMainWindow->updateImage();
-            }
-        });
-    mIntr->setObjectName(QString::fromUtf8("intr"));
+            mMainWindow->updateImage();
+        }
+    };
 
-    ui->verticalLayout_13->insertWidget(1, mIntr);
+    // layout reparents widget
+    ui->verticalLayout_13->insertWidget(0, mFilterBefore);
+    mFilterBefore->setObjectName("filterBeforeBox");
 
     FilterSettings filterSettings;
     filterSettings.useBrightContrast = mMainWindow->getBrightContrastFilter()->getEnabled();
@@ -113,7 +113,17 @@ Control::Control(
     filterSettings.useSwap  = mMainWindow->getSwapFilter()->getEnabled();
     filterSettings.useSwapH = mMainWindow->getSwapFilter()->getSwapHorizontally().getValue();
     filterSettings.useSwapV = mMainWindow->getSwapFilter()->getSwapVertically().getValue();
-    mUi->filterBeforeBox->setFilterSettings(filterSettings);
+    mFilterBefore->setFilterSettings(filterSettings);
+
+    mIntr = new IntrinsicBox(this, *mMainWindow->getAutoCalib(), *mMainWindow->getCalibFilter(), updateImageCallback);
+    mIntr->setObjectName(QString::fromUtf8("intr"));
+
+    ui->verticalLayout_13->insertWidget(1, mIntr);
+
+    // integrate new widgets in tabbing order
+    ui->calib->setFocusProxy(ui->rot1);
+    QWidget::setTabOrder(mFilterBefore, mIntr);
+    QWidget::setTabOrder(mIntr, ui->calib);
 
     connect(mIntr, &IntrinsicBox::paramsChanged, this, &Control::on_intrinsicParamsChanged);
 
@@ -611,30 +621,30 @@ bool Control::getAdaptiveLevel() const
 
 int Control::getFilterBorderSize() const
 {
-    return mUi->filterBeforeBox->getFilterBorderSize();
+    return mFilterBefore->getFilterBorderSize();
 }
 void Control::setFilterBorderSizeMin(int i)
 {
-    mUi->filterBeforeBox->setFilterBorderSizeMin(i);
+    mFilterBefore->setFilterBorderSizeMin(i);
 }
 void Control::setFilterBorderSizeMax(int i)
 {
-    mUi->filterBeforeBox->setFilterBorderSizeMax(i);
+    mFilterBefore->setFilterBorderSizeMax(i);
 }
 
 bool Control::isFilterBgChecked() const
 {
-    return mUi->filterBeforeBox->isFilterBgChecked();
+    return mFilterBefore->isFilterBgChecked();
 }
 
 bool Control::isFilterBgDeleteTrjChecked() const
 {
-    return mUi->filterBeforeBox->isFilterBgDeleteTrjChecked();
+    return mFilterBefore->isFilterBgDeleteTrjChecked();
 }
 
 int Control::getFilterBgDeleteNumber() const
 {
-    return mUi->filterBeforeBox->getFilterBgDeleteNumber();
+    return mFilterBefore->getFilterBgDeleteNumber();
 }
 
 void Control::imageSizeChanged(int width, int height, int borderDiff)
@@ -1903,173 +1913,6 @@ void Control::on_trackRoiFix_stateChanged(int i)
 }
 
 //---------------------- calibration
-void Control::on_filterBrightContrast_stateChanged(int i)
-{
-    if(i == Qt::Checked)
-    {
-        mMainWindow->getBrightContrastFilter()->enable();
-    }
-    else if(i == Qt::Unchecked)
-    {
-        mMainWindow->getBrightContrastFilter()->disable();
-    }
-    if(!mMainWindow->isLoading())
-    {
-        mMainWindow->updateImage();
-    }
-}
-
-void Control::on_filterContrastParam_valueChanged(int i)
-{
-    mMainWindow->getBrightContrastFilter()->getContrast().setValue(i);
-    if(!mMainWindow->isLoading())
-    {
-        mMainWindow->updateImage();
-    }
-}
-
-void Control::on_filterBrightParam_valueChanged(int i)
-{
-    mMainWindow->getBrightContrastFilter()->getBrightness().setValue(i);
-    if(!mMainWindow->isLoading())
-    {
-        mMainWindow->updateImage();
-    }
-}
-
-void Control::on_filterBorder_stateChanged(int i)
-{
-    if(i == Qt::Checked)
-    {
-        mMainWindow->getBorderFilter()->enable();
-    }
-    else if(i == Qt::Unchecked)
-    {
-        mMainWindow->getBorderFilter()->disable();
-    }
-    if(!mMainWindow->isLoading())
-    {
-        mMainWindow->updateImage();
-    }
-}
-
-void Control::on_filterBorderParamSize_valueChanged(int i)
-{
-    mMainWindow->setImageBorderSize(2 * i); // 2* because undistored has problem with sizes not dividable  of 4
-    if(!mMainWindow->isLoading())
-    {
-        mMainWindow->updateImage();
-    }
-}
-
-void Control::on_filterBorderParamCol_clicked()
-{
-    BorderFilter *bf    = mMainWindow->getBorderFilter();
-    QColor        color = QColorDialog::getColor(
-        QColor(bf->getBorderColR().getValue(), bf->getBorderColG().getValue(), bf->getBorderColB().getValue()), this);
-    bf->getBorderColR().setValue(color.red());
-    bf->getBorderColG().setValue(color.green());
-    bf->getBorderColB().setValue(color.blue());
-    if(!mMainWindow->isLoading())
-    {
-        mMainWindow->updateImage();
-    }
-}
-
-void Control::on_filterSwap_stateChanged(int i)
-{
-    if(i == Qt::Checked)
-    {
-        mMainWindow->getSwapFilter()->enable();
-    }
-    else if(i == Qt::Unchecked)
-    {
-        mMainWindow->getSwapFilter()->disable();
-    }
-    if(!mMainWindow->isLoading())
-    {
-        mMainWindow->updateImage();
-    }
-}
-
-void Control::on_filterSwapH_stateChanged(int i)
-{
-    mMainWindow->getSwapFilter()->getSwapHorizontally().setValue(i == Qt::Checked);
-
-    if(!mMainWindow->isLoading())
-    {
-        mMainWindow->updateImage();
-    }
-}
-
-void Control::on_filterSwapV_stateChanged(int i)
-{
-    mMainWindow->getSwapFilter()->getSwapVertically().setValue(i == Qt::Checked);
-
-    if(!mMainWindow->isLoading())
-    {
-        mMainWindow->updateImage();
-    }
-}
-
-void Control::on_filterBg_stateChanged(int i)
-{
-    mUi->filterBeforeBox->toggleBackgroundUi(static_cast<Qt::CheckState>(i));
-    if(i == Qt::Checked)
-    {
-        mMainWindow->getBackgroundFilter()->enable();
-    }
-    else
-    {
-        mMainWindow->getBackgroundFilter()->disable();
-    }
-    if(!mMainWindow->isLoading())
-    {
-        mMainWindow->updateImage(
-            true); // true, da auch bei stehendem bild neue berechnungen durchgefuehrt werden sollen
-    }
-}
-
-void Control::on_filterBgUpdate_stateChanged(int i)
-{
-    if(i == Qt::Checked)
-    {
-        mMainWindow->getBackgroundFilter()->setUpdate(true); //  enable();
-    }
-    else if(i == Qt::Unchecked)
-    {
-        mMainWindow->getBackgroundFilter()->setUpdate(false); //->disable();
-    }
-}
-
-void Control::on_filterBgReset_clicked()
-{
-    mMainWindow->getBackgroundFilter()->reset();
-    if(!mMainWindow->isLoading())
-    {
-        mMainWindow->updateImage();
-    }
-}
-
-void Control::on_filterBgShow_stateChanged(int i)
-{
-    mMainWindow->getBackgroundItem()->setVisible(i);
-    mScene->update();
-}
-
-void Control::on_filterBgSave_clicked()
-{
-    mMainWindow->getBackgroundFilter()->save();
-}
-
-void Control::on_filterBgLoad_clicked()
-{
-    mMainWindow->getBackgroundFilter()->load();
-    if(!mMainWindow->isLoading())
-    {
-        mMainWindow->updateImage();
-    }
-}
 
 
 void Control::on_intrinsicParamsChanged(IntrinsicCameraParams params)
@@ -2530,7 +2373,7 @@ void Control::setXml(QDomElement &elem)
     {
         fn = getFileList(fn, mMainWindow->getProFileName());
     }
-    mUi->filterBeforeBox->setXml(subElem, col, fn);
+    mFilterBefore->setXml(subElem, col, fn);
 
     // PATTERN and INTRINSIC_PARAMETERS elements
     mIntr->setXml(subElem);
@@ -2860,7 +2703,7 @@ void Control::getXml(QDomElement &elem)
             for(subSubElem = subElem.firstChildElement(); !subSubElem.isNull();
                 subSubElem = subSubElem.nextSiblingElement())
             {
-                if(mUi->filterBeforeBox->getXmlSub(subSubElem))
+                if(mFilterBefore->getXmlSub(subSubElem))
                 {
                     // intentionally left blank
                 }
diff --git a/src/filterBeforeBox.cpp b/src/filterBeforeBox.cpp
index 231b8b2b112d133c623868e6b513e572d192a007..052218418487f59760a5081e7203458bf14b7be4 100644
--- a/src/filterBeforeBox.cpp
+++ b/src/filterBeforeBox.cpp
@@ -18,17 +18,39 @@
 
 #include "filterBeforeBox.h"
 
+#include "backgroundFilter.h"
+#include "backgroundItem.h"
+#include "borderFilter.h"
+#include "brightContrastFilter.h"
 #include "helper.h"
 #include "pMessageBox.h"
+#include "swapFilter.h"
 #include "ui_filterBeforeBox.h"
 
+#include <QColorDialog>
 #include <QDomElement>
 
-FilterBeforeBox::FilterBeforeBox(QWidget *parent) : QGroupBox(parent), mUi(new Ui::FilterBeforeBox)
+FilterBeforeBox::FilterBeforeBox(
+    QWidget              *parent,
+    BackgroundFilter     &bgFilter,
+    BrightContrastFilter &brightContrastFilter,
+    BorderFilter         &borderFilter,
+    SwapFilter           &swapFilter,
+    std::function<void()> updateImageCallback) :
+    QGroupBox(parent),
+    mUi(new Ui::FilterBeforeBox),
+    mUpdateImageCallback(std::move(updateImageCallback)),
+    mBgFilter(bgFilter),
+    mBrightContrastFilter(brightContrastFilter),
+    mBorderFilter(borderFilter),
+    mSwapFilter(swapFilter)
 {
     mUi->setupUi(this);
     mShowBackgroundCache = mUi->filterBgShow->checkState();
     toggleBackgroundUi(mUi->filterBg->checkState());
+
+    // FocusPolicy: TabFocus and first ui-element as proxy are needed for tab order
+    setFocusProxy(mUi->filterBrightContrast);
 }
 
 FilterBeforeBox::~FilterBeforeBox()
@@ -36,6 +58,14 @@ FilterBeforeBox::~FilterBeforeBox()
     delete mUi;
 }
 
+/// BackgroundItem is created after Control, but some Items need Control to work
+/// Since we do not want to separate the initializations too much, we use a non-owning
+/// pointer and setter approach
+void FilterBeforeBox::setBackgroundItem(BackgroundItem *item)
+{
+    mBgItem = item;
+}
+
 void FilterBeforeBox::setFilterSettings(const FilterSettings &settings)
 {
     mUi->filterBrightContrast->setChecked(settings.useBrightContrast);
@@ -240,3 +270,141 @@ void FilterBeforeBox::toggleBackgroundUi(Qt::CheckState state)
         mUi->label_65->setEnabled(false);
     }
 }
+
+void FilterBeforeBox::on_filterBrightContrast_stateChanged(int i)
+{
+    if(i == Qt::Checked)
+    {
+        mBrightContrastFilter.enable();
+    }
+    else if(i == Qt::Unchecked)
+    {
+        mBrightContrastFilter.disable();
+    }
+    mUpdateImageCallback();
+}
+
+void FilterBeforeBox::on_filterContrastParam_valueChanged(int i)
+{
+    mBrightContrastFilter.getContrast().setValue(i);
+    mUpdateImageCallback();
+}
+
+void FilterBeforeBox::on_filterBrightParam_valueChanged(int i)
+{
+    mBrightContrastFilter.getBrightness().setValue(i);
+    mUpdateImageCallback();
+}
+
+void FilterBeforeBox::on_filterBorder_stateChanged(int i)
+{
+    if(i == Qt::Checked)
+    {
+        mBorderFilter.enable();
+    }
+    else if(i == Qt::Unchecked)
+    {
+        mBorderFilter.disable();
+    }
+    mUpdateImageCallback();
+}
+
+void FilterBeforeBox::on_filterBorderParamSize_valueChanged(int i)
+{
+    // 2* because undistored has problem with sizes not dividable  of 4
+    mBorderFilter.getBorderSize().setValue(2 * i);
+    mUpdateImageCallback();
+}
+
+void FilterBeforeBox::on_filterBorderParamCol_clicked()
+{
+    QColor color = QColorDialog::getColor(
+        QColor(
+            mBorderFilter.getBorderColR().getValue(),
+            mBorderFilter.getBorderColG().getValue(),
+            mBorderFilter.getBorderColB().getValue()),
+        this);
+    mBorderFilter.getBorderColR().setValue(color.red());
+    mBorderFilter.getBorderColG().setValue(color.green());
+    mBorderFilter.getBorderColB().setValue(color.blue());
+    mUpdateImageCallback();
+}
+
+void FilterBeforeBox::on_filterSwap_stateChanged(int i)
+{
+    if(i == Qt::Checked)
+    {
+        mSwapFilter.enable();
+    }
+    else if(i == Qt::Unchecked)
+    {
+        mSwapFilter.disable();
+    }
+    mUpdateImageCallback();
+}
+
+void FilterBeforeBox::on_filterSwapH_stateChanged(int i)
+{
+    mSwapFilter.getSwapHorizontally().setValue(i == Qt::Checked);
+
+    mUpdateImageCallback();
+}
+
+void FilterBeforeBox::on_filterSwapV_stateChanged(int i)
+{
+    mSwapFilter.getSwapVertically().setValue(i == Qt::Checked);
+
+    mUpdateImageCallback();
+}
+
+void FilterBeforeBox::on_filterBg_stateChanged(int i)
+{
+    toggleBackgroundUi(static_cast<Qt::CheckState>(i));
+    if(i == Qt::Checked)
+    {
+        mBgFilter.enable();
+    }
+    else
+    {
+        mBgFilter.disable();
+    }
+    mUpdateImageCallback();
+}
+
+void FilterBeforeBox::on_filterBgUpdate_stateChanged(int i)
+{
+    if(i == Qt::Checked)
+    {
+        mBgFilter.setUpdate(true);
+    }
+    else if(i == Qt::Unchecked)
+    {
+        mBgFilter.setUpdate(false);
+    }
+}
+
+void FilterBeforeBox::on_filterBgReset_clicked()
+{
+    mBgFilter.reset();
+    mUpdateImageCallback();
+}
+
+void FilterBeforeBox::on_filterBgShow_stateChanged(int i)
+{
+    if(mBgItem)
+    {
+        mBgItem->setVisible(i);
+        mUpdateImageCallback();
+    }
+}
+
+void FilterBeforeBox::on_filterBgSave_clicked()
+{
+    mBgFilter.save();
+}
+
+void FilterBeforeBox::on_filterBgLoad_clicked()
+{
+    mBgFilter.load();
+    mUpdateImageCallback();
+}
diff --git a/src/intrinsicBox.cpp b/src/intrinsicBox.cpp
index b7c523bffd4a9eb27b07ccc0f2c14afa1a073a4c..f3faaa8e093915d2ef30a7b4a5de1b42b73e8528 100644
--- a/src/intrinsicBox.cpp
+++ b/src/intrinsicBox.cpp
@@ -55,6 +55,9 @@ IntrinsicBox::IntrinsicBox(
     mUi->apply->setCheckState(mCalibFilter.getEnabled() ? Qt::Checked : Qt::Unchecked);
 
     setIntrinsicCameraParams(mCalibFilter.getCamParams().getValue());
+
+    // FocusPolicy: TabFocus and first ui-element as proxy are needed for tab order
+    setFocusProxy(mUi->apply);
 }
 
 IntrinsicBox::~IntrinsicBox()
diff --git a/src/petrack.cpp b/src/petrack.cpp
index 8dc88f8d72b543954a1d7e823c84402ff1d87f9b..c71e5c01dbcb483c9a926a4aa4fecedda98bc6e5 100644
--- a/src/petrack.cpp
+++ b/src/petrack.cpp
@@ -32,6 +32,7 @@
 #include "colorMarkerWidget.h"
 #include "colorRangeWidget.h"
 #include "control.h"
+#include "filterBeforeBox.h"
 #include "gridItem.h"
 #include "helper.h"
 #include "imageItem.h"
@@ -110,7 +111,29 @@ Petrack::Petrack(QString petrackVersion) :
     connect(mRecognitionRoiItem, &RoiItem::changed, this, [=]() { this->setRecognitionChanged(true); });
     mRecognitionRoiItem->setZValue(5); // groesser heisst weiter oben
 
-    mControlWidget = new Control(*this, *mScene, mReco, *mTrackingRoiItem, *mRecognitionRoiItem, mMissingFrames);
+
+    // setup control
+
+    auto updateImageCallback = [this]()
+    {
+        if(!isLoading())
+        {
+            updateImage();
+        }
+    };
+
+    auto *filterBeforeBox = new FilterBeforeBox(
+        nullptr, // reparented when added to layout
+        *getBackgroundFilter(),
+        *getBrightContrastFilter(),
+        *getBorderFilter(),
+        *getSwapFilter(),
+        updateImageCallback);
+
+    mControlWidget =
+        new Control(*this, *mScene, mReco, *mTrackingRoiItem, *mRecognitionRoiItem, mMissingFrames, filterBeforeBox);
+
+    // end setup control
 
     mStereoWidget = new StereoWidget(this);
     mStereoWidget->setWindowFlags(Qt::Window);
@@ -210,7 +233,7 @@ Petrack::Petrack(QString petrackVersion) :
 
     //---------------------------
 
-    mBackgroundItem = new BackgroundItem(this);
+    mBackgroundItem = new BackgroundItem(this, nullptr, *filterBeforeBox);
     mBackgroundItem->setZValue(2.2); // um so groesser um so hoeher um so eher zu sehen
     mBackgroundItem->setVisible(false);
 
diff --git a/ui/control.ui b/ui/control.ui
index f6bfb84ebf2b64a87ce78ee4cd1be036d9e41129..a502857e4dd62d228b84dd14ef37e0597d3b9d57 100644
--- a/ui/control.ui
+++ b/ui/control.ui
@@ -89,6 +89,9 @@
         <verstretch>0</verstretch>
        </sizepolicy>
       </property>
+      <property name="focusPolicy">
+       <enum>Qt::TabFocus</enum>
+      </property>
       <attribute name="title">
        <string>calibration</string>
       </attribute>
@@ -137,7 +140,7 @@
             <x>0</x>
             <y>0</y>
             <width>477</width>
-            <height>641</height>
+            <height>619</height>
            </rect>
           </property>
           <property name="sizePolicy">
@@ -147,13 +150,6 @@
            </sizepolicy>
           </property>
           <layout class="QVBoxLayout" name="verticalLayout_13">
-           <item>
-            <widget class="FilterBeforeBox" name="filterBeforeBox">
-             <property name="title">
-              <string>filter before</string>
-             </property>
-            </widget>
-           </item>
            <item>
             <widget class="QGroupBox" name="extr">
              <property name="sizePolicy">
@@ -6446,16 +6442,9 @@
  </widget>
  <customwidgets>
   <customwidget>
-   <class>AnalysePlot</class>
-   <extends>QFrame</extends>
-   <header>analysePlot.h</header>
-   <container>1</container>
-  </customwidget>
-  <customwidget>
-   <class>ColorPlot</class>
-   <extends>QFrame</extends>
-   <header>colorPlot.h</header>
-   <container>1</container>
+   <class>PSpinBox</class>
+   <extends>QSpinBox</extends>
+   <header>pspinbox.h</header>
   </customwidget>
   <customwidget>
    <class>PDoubleSpinBox</class>
@@ -6463,14 +6452,15 @@
    <header>pdoublespinbox.h</header>
   </customwidget>
   <customwidget>
-   <class>PSpinBox</class>
-   <extends>QSpinBox</extends>
-   <header>pspinbox.h</header>
+   <class>AnalysePlot</class>
+   <extends>QFrame</extends>
+   <header>analysePlot.h</header>
+   <container>1</container>
   </customwidget>
   <customwidget>
-   <class>FilterBeforeBox</class>
-   <extends>QGroupBox</extends>
-   <header>filterBeforeBox.h</header>
+   <class>ColorPlot</class>
+   <extends>QFrame</extends>
+   <header>colorPlot.h</header>
    <container>1</container>
   </customwidget>
  </customwidgets>
diff --git a/ui/filterBeforeBox.ui b/ui/filterBeforeBox.ui
index fb59fae5c602715f6652cca5e2746429d0423f06..dcea60d0b22c3a8da51d3fddb84753f187d08e41 100644
--- a/ui/filterBeforeBox.ui
+++ b/ui/filterBeforeBox.ui
@@ -28,6 +28,9 @@
     <height>16777215</height>
    </size>
   </property>
+  <property name="focusPolicy">
+   <enum>Qt::TabFocus</enum>
+  </property>
   <property name="windowTitle">
    <string>GroupBox</string>
   </property>
@@ -399,6 +402,16 @@
     </widget>
    </item>
   </layout>
+  <zorder>filterBorder</zorder>
+  <zorder>line_2</zorder>
+  <zorder>filterBg</zorder>
+  <zorder>filterBrightParam</zorder>
+  <zorder>line</zorder>
+  <zorder>filterSwap</zorder>
+  <zorder>filterContrastParam</zorder>
+  <zorder>label_20</zorder>
+  <zorder>line_3</zorder>
+  <zorder>filterBrightContrast</zorder>
  </widget>
  <customwidgets>
   <customwidget>
@@ -407,6 +420,23 @@
    <header>pspinbox.h</header>
   </customwidget>
  </customwidgets>
+ <tabstops>
+  <tabstop>filterBrightContrast</tabstop>
+  <tabstop>filterBorder</tabstop>
+  <tabstop>filterBorderParamSize_spin</tabstop>
+  <tabstop>filterBorderParamCol</tabstop>
+  <tabstop>filterBg</tabstop>
+  <tabstop>filterBgShow</tabstop>
+  <tabstop>filterBgUpdate</tabstop>
+  <tabstop>filterBgReset</tabstop>
+  <tabstop>filterBgLoad</tabstop>
+  <tabstop>filterBgSave</tabstop>
+  <tabstop>filterBgDeleteTrj</tabstop>
+  <tabstop>filterBgDeleteNumber</tabstop>
+  <tabstop>filterSwap</tabstop>
+  <tabstop>filterSwapH</tabstop>
+  <tabstop>filterSwapV</tabstop>
+ </tabstops>
  <resources/>
  <connections>
   <connection>
diff --git a/ui/intrinsicBox.ui b/ui/intrinsicBox.ui
index 3f0dbff8c39970d56857af34ffd2beb06d1993f8..326720641640fe308a2c88bdd24b0d670be879be 100644
--- a/ui/intrinsicBox.ui
+++ b/ui/intrinsicBox.ui
@@ -28,6 +28,9 @@
     <height>16777215</height>
    </size>
   </property>
+  <property name="focusPolicy">
+   <enum>Qt::TabFocus</enum>
+  </property>
   <property name="windowTitle">
    <string>GroupBox</string>
   </property>
@@ -797,17 +800,47 @@
   </layout>
  </widget>
  <customwidgets>
-  <customwidget>
-   <class>PDoubleSpinBox</class>
-   <extends>QDoubleSpinBox</extends>
-   <header>pdoublespinbox.h</header>
-  </customwidget>
   <customwidget>
    <class>PSpinBox</class>
    <extends>QSpinBox</extends>
    <header>pspinbox.h</header>
   </customwidget>
+  <customwidget>
+   <class>PDoubleSpinBox</class>
+   <extends>QDoubleSpinBox</extends>
+   <header>pdoublespinbox.h</header>
+  </customwidget>
  </customwidgets>
+ <tabstops>
+  <tabstop>apply</tabstop>
+  <tabstop>fx</tabstop>
+  <tabstop>fy</tabstop>
+  <tabstop>cx</tabstop>
+  <tabstop>cy</tabstop>
+  <tabstop>r2</tabstop>
+  <tabstop>r4</tabstop>
+  <tabstop>r6</tabstop>
+  <tabstop>tx</tabstop>
+  <tabstop>ty</tabstop>
+  <tabstop>k4</tabstop>
+  <tabstop>k5</tabstop>
+  <tabstop>k6</tabstop>
+  <tabstop>s1</tabstop>
+  <tabstop>s2</tabstop>
+  <tabstop>s3</tabstop>
+  <tabstop>s4</tabstop>
+  <tabstop>taux</tabstop>
+  <tabstop>tauy</tabstop>
+  <tabstop>quadAspectRatio</tabstop>
+  <tabstop>fixCenter</tabstop>
+  <tabstop>tangDist</tabstop>
+  <tabstop>extModelCheckBox</tabstop>
+  <tabstop>boardSizeX</tabstop>
+  <tabstop>boardSizeY</tabstop>
+  <tabstop>squareSize</tabstop>
+  <tabstop>autoCalib</tabstop>
+  <tabstop>calibFiles</tabstop>
+ </tabstops>
  <resources/>
  <connections/>
 </ui>