diff --git a/pythonbindings/pyfluids-stubs/__init__.pyi b/pythonbindings/pyfluids-stubs/__init__.pyi
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a8f52226fb55cd1d53281820a62b58315df56c41 100644
--- a/pythonbindings/pyfluids-stubs/__init__.pyi
+++ b/pythonbindings/pyfluids-stubs/__init__.pyi
@@ -0,0 +1 @@
+from . import bindings
\ No newline at end of file
diff --git a/pythonbindings/pyfluids-stubs/bindings/__init__.pyi b/pythonbindings/pyfluids-stubs/bindings/__init__.pyi
index 4e7f353eab97cc536f8f18e72319af1cd7a1916a..b0a9b3c57375576f06793a4f1d1911a72d5f0570 100644
--- a/pythonbindings/pyfluids-stubs/bindings/__init__.pyi
+++ b/pythonbindings/pyfluids-stubs/bindings/__init__.pyi
@@ -32,6 +32,8 @@ r"""
 ! \author Henry Korb
 =======================================================================================
 """
+from . import basics as basics, gpu as gpu, lbm as lbm, logger as logger
+
 class ostream_redirect:
     def __init__(self, stdout: bool = ..., stderr: bool = ...) -> None: ...
     def __enter__(self) -> None: ...
diff --git a/pythonbindings/pyfluids-stubs/bindings/basics/__init__.pyi b/pythonbindings/pyfluids-stubs/bindings/basics/__init__.pyi
index a41b7934ca706dc0db5bd6188fee3150456e0cd9..2a1de0b47e39562a8120472ee53300fc57514ee4 100644
--- a/pythonbindings/pyfluids-stubs/bindings/basics/__init__.pyi
+++ b/pythonbindings/pyfluids-stubs/bindings/basics/__init__.pyi
@@ -32,9 +32,11 @@ r"""
 ! \author Henry Korb
 =======================================================================================
 """
-from typing import ClassVar
+from __future__ import annotations
 
-from typing import overload
+from typing import ClassVar, overload
+
+from . import logger as logger
 
 class ConfigurationFile:
     def __init__(self) -> None: ...
diff --git a/pythonbindings/pyfluids-stubs/bindings/basics/logger.pyi b/pythonbindings/pyfluids-stubs/bindings/basics/logger.pyi
index 43938ff7646efd3c596ae29971cce39fed865fa6..876c7037b74f5d467ad6686db89b8d6529068609 100644
--- a/pythonbindings/pyfluids-stubs/bindings/basics/logger.pyi
+++ b/pythonbindings/pyfluids-stubs/bindings/basics/logger.pyi
@@ -32,7 +32,9 @@ r"""
 ! \author Henry Korb
 =======================================================================================
 """
-from typing import Any, ClassVar
+from __future__ import annotations
+
+from typing import ClassVar
 
 log: None
 
@@ -62,7 +64,7 @@ class Logger:
     @staticmethod
     def enable_printed_rank_numbers(print: bool) -> None: ...
     @staticmethod
-    def set_debug_level(level: int) -> None: ...
+    def set_debug_level(level: Level) -> None: ...
     @staticmethod
     def time_stamp(time_stemp: TimeStamp) -> None: ...
 
diff --git a/pythonbindings/pyfluids-stubs/bindings/gpu/__init__.pyi b/pythonbindings/pyfluids-stubs/bindings/gpu/__init__.pyi
index 36c2fea76713e980bb95eb6726d778de8c9a6583..cd93dfe38d4a2e36aca96b95344959a5fea9e452 100644
--- a/pythonbindings/pyfluids-stubs/bindings/gpu/__init__.pyi
+++ b/pythonbindings/pyfluids-stubs/bindings/gpu/__init__.pyi
@@ -37,7 +37,7 @@ from typing import Any, Callable, ClassVar, List, Optional
 from typing import overload
 import numpy
 import pyfluids.bindings.basics
-import pyfluids.bindings.gpu.grid_generator as grid_generator
+from . import grid_generator as grid_generator, probes as probes
 
 class ActuatorFarm(PreCollisionInteractor):
     def __init__(self, number_of_blades_per_turbine: int, density: float, number_of_nodes_per_blade: int, epsilon: float, level: int, delta_t: float, delta_x: float, use_host_arrays: bool) -> None: ...
diff --git a/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi b/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi
index 514dc5053e9574b452d80f61eb3d4e1ebb0f4396..ccdfc1b936e81086b86591b0c3039253b7db1a65 100644
--- a/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi
+++ b/pythonbindings/pyfluids-stubs/bindings/gpu/grid_generator.pyi
@@ -32,7 +32,10 @@ r"""
 ! \author Henry Korb
 =======================================================================================
 """
-from typing import Any, List
+
+from __future__ import annotations
+
+from typing import List
 
 from typing import overload
 import pyfluids.bindings.basics
@@ -41,6 +44,9 @@ import pyfluids.bindings.gpu
 class BoundingBox:
     def __init__(self, min_x: float, max_x: float, min_y: float, max_y: float, min_z: float, max_z: float) -> None: ...
 
+class Object:
+    def __init__(self, *args, **kwargs) -> None: ...
+
 class Conglomerate(Object):
     def __init__(self, *args, **kwargs) -> None: ...
     def add(self, object: Object) -> None: ...
@@ -86,9 +92,6 @@ class MultipleGridBuilder(LevelGridBuilder):
     @staticmethod
     def make_shared(grid_factory: GridFactory) -> MultipleGridBuilder: ...
 
-class Object:
-    def __init__(self, *args, **kwargs) -> None: ...
-
 class Sphere(Object):
     def __init__(self, *args, **kwargs) -> None: ...
     @staticmethod
diff --git a/pythonbindings/pyfluids-stubs/bindings/gpu/probes.pyi b/pythonbindings/pyfluids-stubs/bindings/gpu/probes.pyi
index 1454ed53832fbbe3051f77c84526b5df7999c76d..702e3fbce25a77d6238e31907477aa5f239196c1 100644
--- a/pythonbindings/pyfluids-stubs/bindings/gpu/probes.pyi
+++ b/pythonbindings/pyfluids-stubs/bindings/gpu/probes.pyi
@@ -32,28 +32,11 @@ r"""
 ! \author Henry Korb
 =======================================================================================
 """
+from __future__ import annotations
 from typing import ClassVar, List
 
 import pyfluids.bindings.gpu
 
-class PlanarAverageProbe(Probe):
-    def __init__(self, probe_name: str, output_path: str, t_start_avg: int, t_start_tmp_avg: int, t_avg: int, t_start_out: int, t_out: int, plane_normal: str) -> None: ...
-
-class PlaneProbe(Probe):
-    def __init__(self, probe_name: str, output_path: str, t_start_avg: int, t_avg: int, t_start_out: int, t_out: int) -> None: ...
-    def set_probe_plane(self, pos_x: float, pos_y: float, pos_z: float, delta_x: float, delta_y: float, delta_z: float) -> None: ...
-
-class PointProbe(Probe):
-    def __init__(self, probe_name: str, output_path: str, t_start_avg: int, t_avg: int, t_start_out: int, t_out: int, output_timeseries: bool) -> None: ...
-    def add_probe_point(self, point_coord_x: float, point_coord_y: float, point_coord_z: float) -> None: ...
-    def add_probe_points_from_list(self, point_coords_x: List[float], point_coords_y: List[float], point_coords_z: List[float]) -> None: ...
-    def add_probe_points_from_x_normal_plane(self, pos_x: float, pos0_y: float, pos0_z: float, pos1_y: float, pos1_z: float, n_y: int, n_z: int) -> None: ...
-
-class Probe(pyfluids.bindings.gpu.PreCollisionInteractor):
-    def __init__(self, *args, **kwargs) -> None: ...
-    def add_all_available_statistics(self) -> None: ...
-    def add_statistic(self, variable: Statistic) -> None: ...
-    def set_file_name_to_n_out(self) -> None: ...
 
 class Statistic:
     __members__: ClassVar[dict] = ...  # read-only
@@ -80,6 +63,30 @@ class Statistic:
     @property
     def name(self) -> str: ...
 
+
+class Probe(pyfluids.bindings.gpu.PreCollisionInteractor):
+    def __init__(self, *args, **kwargs) -> None: ...
+    def add_all_available_statistics(self) -> None: ...
+    def add_statistic(self, variable: Statistic) -> None: ...
+    def set_file_name_to_n_out(self) -> None: ...
+
+
+class PlanarAverageProbe(Probe):
+    def __init__(self, probe_name: str, output_path: str, t_start_avg: int, t_start_tmp_avg: int, t_avg: int, t_start_out: int, t_out: int, plane_normal: str) -> None: ...
+
+
+class PlaneProbe(Probe):
+    def __init__(self, probe_name: str, output_path: str, t_start_avg: int, t_avg: int, t_start_out: int, t_out: int) -> None: ...
+    def set_probe_plane(self, pos_x: float, pos_y: float, pos_z: float, delta_x: float, delta_y: float, delta_z: float) -> None: ...
+
+
+class PointProbe(Probe):
+    def __init__(self, probe_name: str, output_path: str, t_start_avg: int, t_avg: int, t_start_out: int, t_out: int, output_timeseries: bool) -> None: ...
+    def add_probe_point(self, point_coord_x: float, point_coord_y: float, point_coord_z: float) -> None: ...
+    def add_probe_points_from_list(self, point_coords_x: List[float], point_coords_y: List[float], point_coords_z: List[float]) -> None: ...
+    def add_probe_points_from_x_normal_plane(self, pos_x: float, pos0_y: float, pos0_z: float, pos1_y: float, pos1_z: float, n_y: int, n_z: int) -> None: ...
+
+
 class WallModelProbe(Probe):
     def __init__(self, probe_name: str, output_path: str, t_start_avg: int, t_start_tmp_avg: int, t_avg: int, t_start_out: int, t_out: int) -> None: ...
     def set_evaluate_pressure_gradient(self, eval_press_grad: bool) -> None: ...
diff --git a/pythonbindings/pyfluids-stubs/bindings/logger.pyi b/pythonbindings/pyfluids-stubs/bindings/logger.pyi
index fe84eeb18f3245ef72ed023b2de9db7b9131d144..ce1afc013ebac5b24fb3690b2aaa405cef466a42 100644
--- a/pythonbindings/pyfluids-stubs/bindings/logger.pyi
+++ b/pythonbindings/pyfluids-stubs/bindings/logger.pyi
@@ -32,6 +32,8 @@ r"""
 ! \author Henry Korb
 =======================================================================================
 """
+from __future__ import annotations
+
 class Logger:
     @staticmethod
     def change_log_path(path: str) -> None: ...
diff --git a/setup.py b/setup.py
index 530431b3775970b5222bc87d32bfb407363f95d6..12628591a06b3700aac79d70c4e604bea37396bf 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
 import sys
 from pathlib import Path
-from typing import List
 
+from setuptools import find_namespace_packages
 import skbuild
 
 """
@@ -25,26 +25,7 @@ or install via pip:
 package_name = "pyfluids"
 target = "python_bindings"
 src_dir = "pythonbindings"
-stub_package = package_name+"-stubs"
 
-stub_dir = Path(src_dir)/stub_package
-
-
-def add_subfiles(dir_path: Path, suffix: str, root_dir: Path) -> List[str]:
-    files = []
-    for f in dir_path.iterdir():
-        if f.is_dir():
-            files.extend(add_subfiles(f, suffix, root_dir))
-        if f.is_file():
-            if f.suffix != suffix:
-                continue
-            files.append(str(f.relative_to(root_dir)))
-    return files
-
-def add_directory(dir_path: Path, suffix: str):
-    return add_subfiles(dir_path, suffix, dir_path)
-
-stub_files = add_directory(stub_dir, ".pyi")
 
 # hack to get config-args for installation with pip>21
 cmake_args = []
@@ -62,11 +43,10 @@ cmake_args += [
 
 skbuild.setup(
     name=package_name,
-    packages=[package_name, "pymuparser", "pyfluids-stubs"],
+    packages=find_namespace_packages(src_dir),
     package_dir={"": src_dir},
     cmake_args=cmake_args,
     cmake_install_target=target,
-    package_data={  "pyfluids": ["py.typed"],
-                    "pyfluids-stubs": stub_files},
+    package_data={package_name: ["py.typed"]},
     include_package_data=True,
 )