diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b101b99971aa343db35ea4eab0d514c1027aaaf8..b8bd61cca7f80f763d7d61b77f84ac911de96e52 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -134,12 +134,39 @@ doctest:
 # Building stage
 # ===========================================================
 # check if we are able to build a wheel
-wheel:
+# and if the import works
+wheel38:
   stage: build
+  image: python:3.8
+  script:
+    - pip install wheel
+    - pip wheel .
+    - pip install .
+    - python -c 'import saqc; print(f"{saqc.__version__=}")'
+wheel39:
+  stage: build
+  image: python:3.9
+  script:
+    - pip install wheel
+    - pip wheel .
+    - pip install .
+    - python -c 'import saqc; print(f"{saqc.__version__=}")'
+wheel310:
+  stage: build
+  image: python:3.10
+  script:
+    - pip install wheel
+    - pip wheel .
+    - pip install .
+    - python -c 'import saqc; print(f"{saqc.__version__=}")'
+wheel311:
+  stage: build
+  image: python:3.11
   script:
     - pip install wheel
     - pip wheel .
     - pip install .
+    - python -c 'import saqc; print(f"{saqc.__version__=}")'
 
 docs:
   stage: build
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b4110f179f50546e98829f9072de55140a804e17..2e6d0b03269300f5f92f93cb5e78701c66d135e5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,7 +11,9 @@ SPDX-License-Identifier: GPL-3.0-or-later
 ### Added
 ### Changed
 ### Removed
+- removed deprecated `DictOfSeries.to_df` 
 ### Fixed
+### Deprecated
 
 ## [2.4.0](https://git.ufz.de/rdm-software/saqc/-/tags/v2.4.0) - 2023-04-25
 [List of commits](https://git.ufz.de/rdm-software/saqc/-/compare/v2.3.0...v2.4.0)
@@ -21,11 +23,8 @@ SPDX-License-Identifier: GPL-3.0-or-later
 - Expose the `History` via `SaQC._history`
 - Config function `cv` (coefficient of variation)
 ### Changed
-- Deprecate `interpolate`, `linear` and `shift` in favor of `align`
-- Deprecate `roll` in favor of `rolling`
 - Rename `interplateInvalid` to `interpolate`
 - Rename `interpolateIndex` to `align`
-- Deprecate `flagMVScore` parameters: `partition` in favor of `window`, `partition_min` in favor of `min_periods`, `min_periods` in favor of `min_periods_r`
 - Rewrite of `dios.DictOfSeries`
 ### Removed
 - Parameter `limit` from `align`
@@ -36,6 +35,11 @@ SPDX-License-Identifier: GPL-3.0-or-later
 - `reample` was not writing meta entries
 - `flagByStatLowPass` was overwriting existing flags
 - `flagUniLOF` and `flagLOF` were overwriting existing flags
+### Deprecated
+- Deprecate `flagMVScore` parameters: `partition` in favor of `window`, `partition_min` in favor of `min_periods`, `min_periods` in favor of `min_periods_r`
+- Deprecate `interpolate`, `linear` and `shift` in favor of `align`
+- Deprecate `roll` in favor of `rolling`
+- Deprecate `DictOfSeries.to_df` in favor of `DictOfSeries.to_pandas`
 
 ## [2.3.0](https://git.ufz.de/rdm-software/saqc/-/tags/v2.3.0) - 2023-01-17
 [List of commits](https://git.ufz.de/rdm-software/saqc/-/compare/v2.2.1...v2.3.0)
diff --git a/docs/cookbooks/ResidualOutlierDetection.rst b/docs/cookbooks/ResidualOutlierDetection.rst
index e5a581fe1f363f77341cc69ae8aa526c3506343c..d022ad7a5fd4c22b4b491979add2e8b0f434ea8b 100644
--- a/docs/cookbooks/ResidualOutlierDetection.rst
+++ b/docs/cookbooks/ResidualOutlierDetection.rst
@@ -272,7 +272,7 @@ To see all the results obtained so far, plotted in one figure window, we make us
 
 .. doctest:: exampleOD
 
-   >>> data.to_df().plot()
+   >>> data.to_pandas().plot()
    <Axes...>
 
 .. plot::
@@ -281,7 +281,7 @@ To see all the results obtained so far, plotted in one figure window, we make us
    :width: 80 %
    :class: center
 
-   data.to_df().plot()
+   data.to_pandas().plot()
 
 
 Residuals and Scores
diff --git a/saqc/core/frame.py b/saqc/core/frame.py
index 312277a4815b4eb8748ab88f5de5e9fa31ec7478..5544cbe7df045a272e26751208e708e7cd2e830f 100644
--- a/saqc/core/frame.py
+++ b/saqc/core/frame.py
@@ -4,10 +4,8 @@
 # -*- coding: utf-8 -*-
 from __future__ import annotations
 
-import warnings
 from typing import Any, Hashable, Mapping
 
-import numpy as np
 import pandas as pd
 from fancy_collections import DictOfPandas
 
@@ -37,19 +35,6 @@ class DictOfSeries(DictOfPandas):
     def attrs(self, value: Mapping[Hashable, Any]) -> None:
         self._attrs = dict(value)
 
-    def to_df(self, how="outer") -> pd.DataFrame:
-        """
-        Transform DictOfSeries to a pandas.DataFrame.
-
-        .. deprecated:: 2.4
-           use `DictOfSeries.to_pandas()` instead.
-        """
-        warnings.warn(
-            f"`to_df()` is deprecated use `to_pandas()` instead.",
-            category=DeprecationWarning,
-        )
-        return self.to_pandas(how)
-
     def flatten(self, promote_index: bool = False) -> DictOfSeries:
         """
         Return a copy.
@@ -57,16 +42,6 @@ class DictOfSeries(DictOfPandas):
         """
         return self.copy()
 
-    def to_pandas(self, how="outer"):
-        # This is a future feature from fancy_collections.DictOfPandas
-        # wich probably will come in the next version 0.1.4.
-        # We adopt this early, to prevent a second refactoring.
-        # The docstring will be different, so we keep the
-        # dynamic docstring allocation, down below.
-        # If the feature is present we just need to delete the
-        # entire method here.
-        return self.to_dataframe(how)
-
     def index_of(self, method="union") -> pd.Index:
         """Return an index with indices from all columns.
 
@@ -194,8 +169,3 @@ or is dropped if `how='inner'`
       a     b     c
 1  11.0  22.0  33.0
 """
-
-
-DictOfSeries.to_dataframe.__doc__ = DictOfSeries.to_pandas.__doc__.replace(
-    "to_pandas", "to_dataframe"
-)
diff --git a/saqc/funcs/tools.py b/saqc/funcs/tools.py
index 858c09a72172190e8936350af68fe8cb8a8a0a4a..11aac29f0fb3130ca91277cb5e80b2a6247f96b6 100644
--- a/saqc/funcs/tools.py
+++ b/saqc/funcs/tools.py
@@ -212,7 +212,7 @@ class ToolsMixin:
         """
         Plot data and flags or store plot to file.
 
-        There are two modes, 'interactive' and 'store', which are determind through the
+        There are two modes, 'interactive' and 'store', which are determined through the
         ``save_path`` keyword. In interactive mode (default) the plot is shown at runtime
         and the program execution stops until the plot window is closed manually. In
         store mode the generated plot is stored to disk and no manually interaction is
diff --git a/setup.py b/setup.py
index f1b595bab94a4ae634348a4c9fe67b806ddfbdd8..1d92394d04e22cb9e44bd12aa05f20d5a8554741 100644
--- a/setup.py
+++ b/setup.py
@@ -39,7 +39,7 @@ setup(
         "numpy",
         "outlier-utils",
         "pyarrow",
-        "pandas",
+        "pandas>=2.0.0",
         "scikit-learn",
         "scipy",
         "typing_extensions",
diff --git a/tests/misc/__init__.py b/tests/misc/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..5bbe63b8aa9d12cb278f6fdb7903c16cdfb2a9a6
--- /dev/null
+++ b/tests/misc/__init__.py
@@ -0,0 +1,3 @@
+#!/usr/bin/env python
+# SPDX-FileCopyrightText: 2021 Helmholtz-Zentrum für Umweltforschung GmbH - UFZ
+# SPDX-License-Identifier: GPL-3.0-or-later
diff --git a/tests/misc/test_pickle.py b/tests/misc/test_pickle.py
new file mode 100644
index 0000000000000000000000000000000000000000..226cdcbfb5b1beb2b8f01c4e00611fcb32d7f6d9
--- /dev/null
+++ b/tests/misc/test_pickle.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+# SPDX-FileCopyrightText: 2021 Helmholtz-Zentrum für Umweltforschung GmbH - UFZ
+# SPDX-License-Identifier: GPL-3.0-or-later
+from __future__ import annotations
+
+import pickle
+
+import pytest
+
+from saqc import SaQC
+from tests.common import checkInvariants, initData
+
+
+@pytest.mark.parametrize("ncols", [4, 0])
+def test_pickling(ncols):
+    """Ensure that saqc and all its parts are pickleable"""
+    qc = SaQC(data=initData(ncols))
+    result = pickle.loads(pickle.dumps(qc))
+    assert isinstance(result, SaQC)
+    for k in qc.data.keys():
+        checkInvariants(qc._data, qc._flags, k)
diff --git a/tests/requirements.txt b/tests/requirements.txt
index 54cb45f04fd7b043e0bd48efe0e2e0225d6c6c93..49831ba32e0c63bbdeef44ddaf13ec6c509453a2 100644
--- a/tests/requirements.txt
+++ b/tests/requirements.txt
@@ -3,7 +3,7 @@
 # SPDX-License-Identifier: GPL-3.0-or-later
 
 beautifulsoup4==4.12.2
-hypothesis==6.72.2
+hypothesis==6.75.1
 Markdown==3.4.3
 pytest==7.3.1
 pytest-lazy-fixture==0.6.3