diff --git a/bin/setup-dunepy.py b/bin/setup-dunepy.py
index 96e2997ca0e7c07f918b7e9eda152800ab672554..34471da91f4d8f978a2dca5b163f0b9ccf2ed15c 100755
--- a/bin/setup-dunepy.py
+++ b/bin/setup-dunepy.py
@@ -10,7 +10,7 @@ import logging
 logger = logging.getLogger(__name__)
 
 try:
-    from dune.common.module import build_dune_py_module, get_dune_py_dir, make_dune_py_module, select_modules, resolve_dependencies
+    from dune.common.module import build_dune_py_module, get_dune_py_dir, make_dune_py_module, select_modules, resolve_dependencies, resolve_order
 except ImportError:
     import os
     here = os.path.dirname(os.path.abspath(__file__))
@@ -19,7 +19,7 @@ except ImportError:
     sys.path.append(modsB)
     sys.path.append(modsA)
     if os.path.exists(os.path.join(modsB, "module.py")):
-        from module import build_dune_py_module, get_dune_py_dir, make_dune_py_module, select_modules, resolve_dependencies
+        from module import build_dune_py_module, get_dune_py_dir, make_dune_py_module, select_modules, resolve_dependencies, resolve_order
     else:
         raise
 
@@ -94,10 +94,12 @@ def main(argv):
     # use mod and all its dependencies only. Otherwise use all found modules
     # as dependencies.
     if masterModule is None:
-        deps = [m[0] for m in duneModules[0].items()]
+        deps = resolve_order(duneModules[0])
     else:
-        deps = resolve_dependencies(duneModules[0], masterModule)
-        deps.add(masterModule)
+        depsList = resolve_dependencies(duneModules[0], masterModule)
+        deps = {k:v for k,v in duneModules[0].items() if k in depsList}
+        deps = resolve_order(deps)
+        deps += [masterModule]
 
     foundModule = make_dune_py_module(dunepy, deps)
 
diff --git a/dune/python/test/CMakeLists.txt b/dune/python/test/CMakeLists.txt
index ed2e0850d82023870af1a260ceac862a84ef60ce..04909a324206ca223fb2d0b209903dfbfb1886fd 100644
--- a/dune/python/test/CMakeLists.txt
+++ b/dune/python/test/CMakeLists.txt
@@ -9,4 +9,5 @@ dune_add_test(SOURCES test_embed1.cc
               )
 
 add_executable(test_embed2 EXCLUDE_FROM_ALL test_embed2.cc)
-target_link_libraries(test_embed2 PUBLIC ${DUNE_LIBS} ${Python3_LIBRARIES})
+# target_link_libraries(test_embed2 PUBLIC ${DUNE_LIBS} ${Python3_LIBRARIES})
+target_link_libraries(test_embed2 PRIVATE Python3::Python)
diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
index bf6f08c0410bb4c3fcac06cfadfb8be2eeb46376..37e296add504ef3de4649dabef4bfab72c42ed0c 100644
--- a/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -1,3 +1,4 @@
 add_subdirectory(dune)
 
 configure_file(setup.py.in setup.py)
+configure_file(pyproject.toml.in pyproject.toml)
diff --git a/python/dune/common/module.py b/python/dune/common/module.py
index 21deb7df04997be776d5576f2376504b24b9fa2d..bac0a0afc4cf491399e786b3a6153a70a283e6be 100644
--- a/python/dune/common/module.py
+++ b/python/dune/common/module.py
@@ -113,7 +113,7 @@ def resolve_order(deps):
 
     def resolve(m):
         if m not in order:
-            for d in deps[m]:
+            for d, r in deps[m].depends:
                 if d not in order:
                     resolve(d)
             order.append(m)
diff --git a/python/pyproject.toml.in b/python/pyproject.toml.in
new file mode 100644
index 0000000000000000000000000000000000000000..d1e6ae6e5647cc467708bad904532e585270867c
--- /dev/null
+++ b/python/pyproject.toml.in
@@ -0,0 +1,2 @@
+[build-system]
+requires = ["setuptools", "wheel"]