diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index dfeafeac8f451d2c1bd484f98e363ac67406b1c7..e325877507f278d18a4d0d62c5d900aeac5e86c4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -16,7 +16,7 @@ stages:
   - deploy
 
 default:
-  image: python:3.8
+  image: python:3.10
   before_script:
     - pip install --upgrade pip
     - pip install -r requirements.txt
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9600623f84f60954d030e05444d45c543c3f993b..27e8e23a1b3a811fa6ff8ba347741b3755bece96 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,13 +7,23 @@ SPDX-License-Identifier: GPL-3.0-or-later
 # Changelog
 
 ## Unreleased
-[List of commits](https://git.ufz.de/rdm-software/saqc/-/compare/v2.2.0...develop)
+[List of commits](https://git.ufz.de/rdm-software/saqc/-/compare/v2.2.1...develop)
 ### Added
 ### Changed
 ### Removed
 ### Fixed
 
-## [2.2.0](https://git.ufz.de/rdm-software/saqc/-/tags/v2.0.1) - 2022-10-28
+## [2.2.1](https://git.ufz.de/rdm-software/saqc/-/tags/v2.2.1) - 2022-10-29
+[List of commits](https://git.ufz.de/rdm-software/saqc/-/compare/v2.2.0...v2.2.1)
+### Added
+- data label to `plot` legend
+### Changed
+- `dfilter` default value inference to respect the function default value of `plot`
+### Removed
+### Fixed
+- functions not handling `target` failed to overwrite existing variables
+
+## [2.2.0](https://git.ufz.de/rdm-software/saqc/-/tags/v2.2.0) - 2022-10-28
 [List of commits](https://git.ufz.de/rdm-software/saqc/-/compare/v2.1.0...v2.2.0)
 ### Added
 - translation of `dfilter`
@@ -36,7 +46,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
 - fixed bug in function parameter checking
 - fixed bug one-off bug in `flagJumps`
 
-## [2.1.0](https://git.ufz.de/rdm-software/saqc/-/tags/v2.0.1) - 2022-06-14
+## [2.1.0](https://git.ufz.de/rdm-software/saqc/-/tags/v2.1.0) - 2022-06-14
 [List of commits](https://git.ufz.de/rdm-software/saqc/-/compare/v2.0.1...v2.1.0)
 ### Added
 - documentation of global keywords
diff --git a/saqc/core/register.py b/saqc/core/register.py
index 148f37d8d3be7ed197745b62bfd1934ab944ab4b..2fc17c19f27d9ff52355972c4978819d1da9d566 100644
--- a/saqc/core/register.py
+++ b/saqc/core/register.py
@@ -104,14 +104,13 @@ def _getDfilter(
     """
     dfilter = kwargs.get("dfilter")
     if dfilter is None or isinstance(dfilter, OptionalNone):
-        # let's see, if the function has an default value
+        # let's see, if the function has a default value
         default = func_signature.parameters.get("dfilter")
-        if default:
+        if default is None or default.default == inspect.Signature.empty:
+            default = FILTER_ALL
+        else:
             default = default.default
-        if default == inspect.Signature.empty:
-            # function did not define a positional dfilter argument
-            default = None
-        dfilter = translation_scheme.DFILTER_DEFAULT or default
+        dfilter = max(translation_scheme.DFILTER_DEFAULT, default)
     else:
         # try to translate dfilter
         if dfilter not in {FILTER_ALL, FILTER_NONE, translation_scheme.DFILTER_DEFAULT}:
@@ -367,7 +366,7 @@ def register(
                 # initialize all target variables
                 for src, trg in zip(fields, targets):
                     if src != trg:
-                        out = out.copyField(field=src, target=trg)
+                        out = out.copyField(field=src, target=trg, overwrite=True)
 
             for src, trg in zip(fields, targets):
                 kwargs = {**kwargs, "field": src, "target": trg}
diff --git a/saqc/lib/plotting.py b/saqc/lib/plotting.py
index 109284b092e44d2c48b55f14ad7232dc8a5d11ea..edd2df9c2d6698ea3788ce966d7ddd2e16425444 100644
--- a/saqc/lib/plotting.py
+++ b/saqc/lib/plotting.py
@@ -191,7 +191,7 @@ def _plotVarWithFlags(
 ):
     scatter_kwargs = scatter_kwargs.copy()
     ax.set_title(datser.name)
-    ax.plot(datser, color="black", label=" ", **plot_kwargs)
+    ax.plot(datser, color="black", label="data", **plot_kwargs)
     ax.set(**ax_kwargs)
     shape_cycle = scatter_kwargs.get("marker", "o")
     shape_cycle = itertools.cycle(toSequence(shape_cycle))
diff --git a/saqc/version.py b/saqc/version.py
index 0afc143e5e75816121a8708f858dbc28ff518e08..18ae172f43661e20eb2b340ce6a849a5a821f30e 100644
--- a/saqc/version.py
+++ b/saqc/version.py
@@ -4,4 +4,4 @@
 #
 # SPDX-License-Identifier: GPL-3.0-or-later
 
-__version__ = "2.2.0"
+__version__ = "2.4.0"
diff --git a/setup.py b/setup.py
index 5aedd38f50e34f65488bdf965fca22be4791e086..f1b595bab94a4ae634348a4c9fe67b806ddfbdd8 100644
--- a/setup.py
+++ b/setup.py
@@ -28,16 +28,18 @@ setup(
     long_description_content_type="text/markdown",
     url="https://git.ufz.de/rdm-software/saqc",
     packages=find_packages(exclude=("tests", "docs")),
-    python_requires=">=3.7",
+    python_requires=">=3.8",
     install_requires=[
         "Click",
         "dtw",
+        "docstring_parser",
+        "fancy-collections",
         "matplotlib>=3.4",
         "numba",
         "numpy",
         "outlier-utils",
         "pyarrow",
-        "pandas>=1.2,<1.5",
+        "pandas",
         "scikit-learn",
         "scipy",
         "typing_extensions",