diff --git a/requirements.txt b/requirements.txt
index 7f085863763e0dd61d53ddb6ca6b817d2544df0e..101eda485c87478dbe293196512baffc3d2b67c6 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -32,4 +32,5 @@ wcwidth==0.2.5
 scipy==1.6.0
 scikit-learn==0.23.2
 six==1.15.0
+typing_extensions==3.7.4.3
 astor==0.8.1
diff --git a/saqc/funcs/residues.py b/saqc/funcs/residues.py
index 864c5c9554b6122f938a54e58305bd766f6f7c00..7dee7eeea85c1fc288dc2e8308f3b4126c3a9687 100644
--- a/saqc/funcs/residues.py
+++ b/saqc/funcs/residues.py
@@ -1,15 +1,27 @@
 #! /usr/bin/env python
 # -*- coding: utf-8 -*-
+
+from typing import Tuple, Union, Optional, Callable
+from typing_extensions import Literal
+
 import numpy as np
 
+from dios import DictOfSeries
+
 from saqc.core.register import register
+from saqc.flagger.baseflagger import BaseFlagger
 from saqc.funcs.rolling import roll
 from saqc.funcs.curvefit import fitPolynomial
 
 
 @register(masking='field')
-def calculatePolynomialResidues(data, field, flagger, winsz, polydeg, numba="auto", eval_flags=True, min_periods=0,
-                                **kwargs):
+def calculatePolynomialResidues(
+        data: DictOfSeries, field: str, flagger: BaseFlagger,
+        winsz: Union[str, int], polydeg: int,
+        numba: Literal[True, False, "auto"]="auto",
+        eval_flags: bool=True,
+        min_periods: Optional[int]=0,
+        **kwargs) -> Tuple[DictOfSeries, BaseFlagger]:
     """
     Function fits a polynomial model to the data and returns the residues.
 
@@ -67,7 +79,7 @@ def calculatePolynomialResidues(data, field, flagger, winsz, polydeg, numba="aut
     eval_flags : bool, default True
         Wheather or not to assign new flags to the calculated residuals. If True, a residual gets assigned the worst
         flag present in the interval, the data for its calculation was obtained from.
-    min_periods : {int, np.nan}, default 0
+    min_periods : {int, None}, default 0
         The minimum number of periods, that has to be available in every values fitting surrounding for the polynomial
         fit to be performed. If there are not enough values, np.nan gets assigned. Default (0) results in fitting
         regardless of the number of values present (results in overfitting for too sparse intervals). To automatically
@@ -84,16 +96,22 @@ def calculatePolynomialResidues(data, field, flagger, winsz, polydeg, numba="aut
 
     """
     data, flagger = fitPolynomial(data, field, flagger, winsz, polydeg, numba=numba, eval_flags=eval_flags,
-                                  min_periods=min_periods, _return_residues=True, **kwargs)
+                                  min_periods=min_periods, return_residues=True, **kwargs)
 
     return data, flagger
 
 
 @register(masking='field')
-def calculateRollingResidues(data, field, flagger, winsz, func=np.mean, eval_flags=True, min_periods=0, center=True,
-                             **kwargs):
+def calculateRollingResidues(
+        data: DictOfSeries, field: str, flagger: BaseFlagger,
+        winsz: Union[str, int],
+        func: Callable[[np.array], np.array]=np.mean,
+        eval_flags: bool=True,
+        min_periods: Optional[int]=0,
+        center: bool=True,
+        **kwargs) -> Tuple[DictOfSeries, BaseFlagger]:
 
     data, flagger = roll(data, field, flagger, winsz, func=func, eval_flags=eval_flags,
                          min_periods=min_periods, center=center, _return_residues=True, **kwargs)
 
-    return data, flagger
\ No newline at end of file
+    return data, flagger