diff --git a/test/flagger/test_backtrack.py b/test/flagger/test_backtrack.py
new file mode 100644
index 0000000000000000000000000000000000000000..9699b5d367fa32f0154a3009082393fed1943a2b
--- /dev/null
+++ b/test/flagger/test_backtrack.py
@@ -0,0 +1,87 @@
+#!/usr/bin/env python
+
+import pytest
+import numpy as np
+import pandas as pd
+from pandas.api.types import is_bool_dtype
+from test.common import TESTFLAGGER, initData
+from saqc.flagger.backtrack import Backtrack
+
+data = [
+
+    np.array([[]]),
+    np.zeros((1, 1)),
+    np.zeros((3, 4)),
+    np.ones((3, 4)),
+    np.ones((3, 4)) * np.nan,
+
+    np.array([
+        [0, 0, 0, 0],
+        [0, 1, 2, 3],
+        [0, 1, 2, 3],
+    ]),
+
+    np.array([
+        [0, 0, 0, 0],
+        [0, 1, np.nan, 3],
+        [0, 1, 2, 3],
+    ]),
+]
+
+
+def check_invariants(bt):
+    """
+    this can be called for **any** BT and
+    should never fail.
+    """
+    # basics
+    assert isinstance(bt, Backtrack)
+    assert isinstance(bt.bt, pd.DataFrame)
+    assert isinstance(bt.mask, pd.DataFrame)
+    assert all(bt.bt.dtypes == float)
+    assert all(bt.mask.dtypes == bool)
+    assert bt.bt.columns.equals(bt.mask.columns)
+    assert bt.columns is bt.bt.columns
+    assert bt.index is bt.bt.index
+    assert len(bt) == len(bt.columns)
+
+    # advanced
+    assert bt.columns.equals(pd.Index(range(len(bt))))
+    assert isinstance(bt.max(), pd.Series)
+
+
+@pytest.mark.parametrize('data', data + [None])
+def test_init(data: np.array):
+
+    df = pd.DataFrame(data, dtype=float)
+    bt = Backtrack(bt=df)
+
+    check_invariants(bt)
+
+    # shape would fail
+    if data is not None:
+        assert len(bt.index) == data.shape[0]
+        assert len(bt.columns) == data.shape[1]
+        assert bt.mask.all(axis=None)
+
+    # check fastpath
+    bt = Backtrack(bt=bt)
+    check_invariants(bt)
+
+
+@pytest.mark.parametrize('data', data + [None])
+def test_init_with_mask(data: np.array):
+
+    df = pd.DataFrame(data, dtype=float)
+
+    bt = Backtrack(bt=df)
+
+    check_invariants(bt)
+
+    if data is None:
+        return
+
+    assert len(bt.index) == data.shape[0]
+    assert len(bt.columns) == data.shape[1]
+    assert bt.mask.all(axis=None)
+