Repository: computationalgeography/lue (language: python)

Issue:
Add support for numpy 2.0
- https://pybind11.readthedocs.io/en/stable/upgrade.html#v2-12
- https://numpy.org/doc/stable/numpy_2_0_migration_guide.html


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/conda.yml b/.github/workflows/conda.yml
index d776c1f50..33aae8ab0 100644
--- a/.github/workflows/conda.yml
+++ b/.github/workflows/conda.yml
@@ -2,6 +2,7 @@ name: Conda packages
 
 on:
   pull_request:
+    types: [opened, reopened, synchronize, closed]
   push:
     branches-ignore:
       - "ghxyz"
diff --git a/.github/workflows/linux-consume.yml b/.github/workflows/linux-consume.yml
index 080ccfc2d..f165867be 100644
--- a/.github/workflows/linux-consume.yml
+++ b/.github/workflows/linux-consume.yml
@@ -2,6 +2,7 @@ name: Linux consume LUE
 
 on:
   pull_request:
+    types: [opened, reopened, synchronize]
     branches-ignore:
       - "*"
   push:
diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
index a06688384..70c443f44 100644
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -2,6 +2,7 @@ name: Linux CI
 
 on:
   pull_request:
+    types: [opened, reopened, synchronize, closed]
   push:
     branches-ignore:
       - "ghxyz"
@@ -144,6 +145,7 @@ jobs:
                       -S ${{ env.lue_source_directory }} \
                       -B ${{ env.lue_build_directory }} \
                       --preset conan-release \
+                      -D CMAKE_POLICY_DEFAULT_CMP0167=OLD \
                       -D CMAKE_CXX_COMPILER=${{ matrix.compiler.cxx }} \
                       -D LUE_BUILD_DOCUMENTATION=TRUE \
                       -D LUE_BUILD_QA=TRUE \
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
index c0c885f8d..406f4519d 100644
--- a/.github/workflows/macos.yml
+++ b/.github/workflows/macos.yml
@@ -2,6 +2,7 @@ name: macOS CI
 
 on:
   pull_request:
+    types: [opened, reopened, synchronize]
   push:
     branches-ignore:
       - "ghxyz"
@@ -143,6 +144,7 @@ jobs:
                       -B ${{ env.lue_build_directory }} \
                       --preset conan-release \
                       -D CMAKE_OSX_DEPLOYMENT_TARGET=${{ matrix.macos_version }}.0 \
+                      -D CMAKE_POLICY_DEFAULT_CMP0167=OLD \
                       -D LUE_BUILD_QA=TRUE \
                       -D LUE_QA_WITH_PYTHON_API=TRUE \
                       -D LUE_QA_WITH_TESTS=TRUE \
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
index 242aa8816..df8d0d10d 100644
--- a/.github/workflows/windows.yml
+++ b/.github/workflows/windows.yml
@@ -2,6 +2,7 @@ name: Windows CI
 
 on:
   pull_request:
+    types: [opened, reopened, synchronize]
   push:
     branches-ignore:
       - "ghxyz"
@@ -86,7 +87,8 @@ jobs:
                   conan \
                   conda-build \
                   docopt \
-                  gdal \
+                  libgdal \
+                  hdf5 \
                   jinja2 \
                   libhwloc \
                   matplotlib \
@@ -109,7 +111,15 @@ jobs:
             build_type: Release
             cmake_preset: hpx_release_windows_node_configuration
             cmake_preset_file: ${{ env.lue_source_directory }}/CMakeHPXPresets.json
-            cmake_flags: "-D Boost_ROOT=$CONDA_PREFIX/Library -D Hwloc_ROOT=$CONDA_PREFIX/Library -D Hwloc_LIBRARY=$CONDA_PREFIX/Library/lib/hwloc.lib"
+            # Passing path for Hwloc_ROOT to prevent:
+            #     HPXConfig.cmake:160 (set):
+            #     Syntax error in cmake code at
+            #       D:/a/lue/lue/hpx_install/lib/cmake/HPX/HPXConfig.cmake:160
+            #     when parsing string
+            #       C:\Users\runneradmin\miniconda3\envs\test/Library
+            #     Invalid character escape '\U'.
+            # HPX install logic needs to be updated, similar to how Boost_ROOT is handled
+            cmake_flags: "-D CMAKE_POLICY_DEFAULT_CMP0167=OLD -D CMAKE_POLICY_DEFAULT_CMP0169=OLD -D Boost_ROOT=$CONDA_PREFIX/Library -D Hwloc_ROOT=C:/Users/runneradmin/miniconda3/envs/test/Library -D Hwloc_LIBRARY=$CONDA_PREFIX/Library/lib/hwloc.lib"
             hpx_branch: ${{ env.hpx_branch }}
             source_directory: ${{ env.hpx_source_directory }}
             build_directory: ${{ env.hpx_build_directory }}
@@ -151,6 +161,8 @@ jobs:
                       -S ${{ env.lue_source_directory }} \
                       -B ${{ env.lue_build_directory }} \
                       --preset conan-release \
+                      -D CMAKE_POLICY_DEFAULT_CMP0167=OLD \
+                      -D CMAKE_POLICY_DEFAULT_CMP0169=OLD \
                       -D LUE_BUILD_QA=TRUE \
                       -D LUE_QA_WITH_PYTHON_API=TRUE \
                       -D LUE_QA_WITH_TESTS=TRUE \
diff --git a/CMakeHPXPresets.json b/CMakeHPXPresets.json
index 65d5acbfc..15670458e 100644
--- a/CMakeHPXPresets.json
+++ b/CMakeHPXPresets.json
@@ -52,6 +52,7 @@
             "hidden": true,
             "cacheVariables": {
                 "HPX_WITH_MALLOC": "mimalloc",
+                "HPX_WITH_FETCH_HWLOC": "TRUE",
                 "HPX_WITH_GOOGLE_PERFTOOLS": "FALSE"
             }
         },
diff --git a/environment/cmake/LueConfiguration.cmake b/environment/cmake/LueConfiguration.cmake
index fc2652385..ce8c4b390 100644
--- a/environment/cmake/LueConfiguration.cmake
+++ b/environment/cmake/LueConfiguration.cmake
@@ -336,12 +336,6 @@ if(LUE_PYBIND11_REQUIRED)
     )
     FetchContent_MakeAvailable(pybind11)
 
-    # Disable support for numpy 2.0 for now
-    # https://github.com/computationalgeography/lue/issues/664
-    target_compile_definitions(pybind11::module
-        INTERFACE
-            PYBIND11_NUMPY_1_ONLY)
-
     # Silence pybind11 for now
     # https://github.com/computationalgeography/lue/issues/484
     target_compile_definitions(pybind11::module
@@ -356,9 +350,8 @@ if(LUE_BOOST_REQUIRED)
         list(APPEND LUE_REQUIRED_BOOST_COMPONENTS regex)
     endif()
 
-    set(Boost_NO_BOOST_CMAKE TRUE)
-
-    find_package(Boost REQUIRED COMPONENTS ${LUE_REQUIRED_BOOST_COMPONENTS})
+    # Use Boost's own FindBoost module instead of the deprecated CMake version
+    find_package(Boost REQUIRED COMPONENTS ${LUE_REQUIRED_BOOST_COMPONENTS} CONFIG)
 
     if(Boost_VERSION VERSION_EQUAL "1.75")
         message(FATAL_ERROR
diff --git a/environment/cmake/LueMacro.cmake b/environment/cmake/LueMacro.cmake
index d69c2756b..f046b7d02 100644
--- a/environment/cmake/LueMacro.cmake
+++ b/environment/cmake/LueMacro.cmake
@@ -13,7 +13,7 @@ endfunction()
 function(add_unit_tests)
     set(prefix ARG)
     set(no_values "")
-    set(single_values SCOPE)
+    set(single_values SCOPE TARGETS)
     set(multi_values NAMES LIBRARIES)
 
     cmake_parse_arguments(PARSE_ARGV 0 ${prefix} "${no_values}" "${single_values}" "${multi_values}")
@@ -30,21 +30,20 @@ function(add_unit_tests)
 
         add_executable(${test_name} ${module_name}.cpp)
 
-        target_compile_definitions(${test_name}
-            PRIVATE
-                BOOST_TEST_DYN_LINK
-        )
-
         target_link_libraries(${test_name}
             PRIVATE
                 ${ARG_LIBRARIES}
-                Boost::unit_test_framework
+                Boost::headers
         )
 
         add_test(NAME ${test_name}
             COMMAND ${test_name}
         )
+
+        list(APPEND test_names ${test_name})
     endforeach()
+
+    set(${ARG_TARGETS} ${test_names} PARENT_SCOPE)
 endfunction()
 
 
diff --git a/environment/conda/bld.bat b/environment/conda/bld.bat
index e3134e199..9feeffada 100644
--- a/environment/conda/bld.bat
+++ b/environment/conda/bld.bat
@@ -6,6 +6,7 @@ if errorlevel 1 exit /b 1
 cmake -S . -B build %CMAKE_ARGS% ^
     --preset lue_release_windows_node ^
     -G Ninja ^
+    -D CMAKE_POLICY_DEFAULT_CMP0167=OLD ^
     -D CMAKE_INSTALL_LIBDIR=lib ^
     -D LUE_INSTALL_PYTHON_PACKAGE_DIR="%SP_DIR%/lue" ^
     -D LUE_DATA_MODEL_WITH_PYTHON_API=TRUE ^
diff --git a/environment/conda/build.sh b/environment/conda/build.sh
index 64e451cfd..b82872137 100644
--- a/environment/conda/build.sh
+++ b/environment/conda/build.sh
@@ -13,6 +13,7 @@ fi
 cmake -S . -B build $CMAKE_ARGS \
     --preset $lue_preset \
     -G Ninja \
+    -D CMAKE_POLICY_DEFAULT_CMP0167=OLD \
     -D LUE_INSTALL_PYTHON_PACKAGE_DIR="${SP_DIR}/lue" \
     -D LUE_DATA_MODEL_WITH_PYTHON_API=TRUE \
     -D LUE_DATA_MODEL_WITH_UTILITIES=TRUE \
diff --git a/environment/configuration/requirements-dev.txt b/environment/configuration/requirements-dev.txt
index 72b6ddf35..d653a82a7 100644
--- a/environment/configuration/requirements-dev.txt
+++ b/environment/configuration/requirements-dev.txt
@@ -4,7 +4,10 @@ docopt==0.6.2
 jinja2==3.1.4
 matplotlib==3.9.0
 mypy==1.10.1
-numpy==1.26.4
+
+# Build against numpy 2, while also supporting running against numpy 1
+numpy>=2.0
+
 pre-commit==3.7.1
 pybind11==2.12.0
 ruamel.yaml==0.18.6
diff --git a/source/data_model/gdal/src/compare_rasters.cpp b/source/data_model/gdal/src/compare_rasters.cpp
index 427b67139..73994404d 100644
--- a/source/data_model/gdal/src/compare_rasters.cpp
+++ b/source/data_model/gdal/src/compare_rasters.cpp
@@ -1,7 +1,7 @@
 #include "lue/gdal/compare_rasters.hpp"
 #include "lue/gdal/data_type.hpp"
 #include "lue/gdal/raster.hpp"
-#include <fmt/format.h>
+#include <fmt/ranges.h>
 #include <cassert>
 
 
diff --git a/source/framework/algorithm/include/lue/framework/algorithm/definition/clump.hpp b/source/framework/algorithm/include/lue/framework/algorithm/definition/clump.hpp
index f32cc6c04..d0650fe49 100644
--- a/source/framework/algorithm/include/lue/framework/algorithm/definition/clump.hpp
+++ b/source/framework/algorithm/include/lue/framework/algorithm/definition/clump.hpp
@@ -1015,6 +1015,8 @@ namespace lue {
             //   (partition_idxs, local_clump_id) record, if not there yet, and add a global clump ID to the
             //   collection.
 
+            using ClumpElement = ElementT<Partition>;
+
             auto const nr_cols = clump_data.shape()[1];
             auto const boundary_clump_id = clump_data[north_idx];
             lue_hpx_assert(clump_data[nr_cols + south_idx] == boundary_clump_id);
@@ -1026,7 +1028,7 @@ namespace lue {
             // already seen any of these (partition_idxs, local_clump_id) combinations.
             {
                 auto const [row_in_partitions, col_in_partitions] = north_partition_idxs;
-                auto key = std::make_tuple(row_in_partitions, col_in_partitions, Index{-1});
+                auto key = std::make_tuple(row_in_partitions, col_in_partitions, ClumpElement{});
 
                 for (Index idx = north_idx; idx < nr_cols; ++idx)
                 {
@@ -1053,7 +1055,7 @@ namespace lue {
             if (/* connectivity == Connectivity::diagonal && */ global_clump_ids_idx == -1)
             {
                 auto const [row_in_partitions, col_in_partitions] = south_partition_idxs;
-                auto key = std::make_tuple(row_in_partitions, col_in_partitions, Index{-1});
+                auto key = std::make_tuple(row_in_partitions, col_in_partitions, ClumpElement{});
 
                 for (Index idx = south_idx; idx < nr_cols; ++idx)
                 {
@@ -1094,7 +1096,7 @@ namespace lue {
                 // one.
 
                 auto const [row_in_partitions, col_in_partitions] = north_partition_idxs;
-                auto key = std::make_tuple(row_in_partitions, col_in_partitions, Index{-1});
+                auto key = std::make_tuple(row_in_partitions, col_in_partitions, ClumpElement{});
 
                 for (Index idx = north_idx; idx < nr_cols; ++idx)
                 {
@@ -1119,7 +1121,7 @@ namespace lue {
                 // Same thing, for the south row.
 
                 auto const [row_in_partitions, col_in_partitions] = south_partition_idxs;
-                auto key = std::make_tuple(row_in_partitions, col_in_partitions, Index{-1});
+                auto key = std::make_tuple(row_in_partitions, col_in_partitions, ClumpElement{});
 
                 for (Index idx = south_idx; idx < nr_cols; ++idx)
                 {
diff --git a/source/framework/core/src/debug.cpp b/source/framework/core/src/debug.cpp
index 0c69d515c..c62ef2efd 100644
--- a/source/framework/core/src/debug.cpp
+++ b/source/framework/core/src/debug.cpp
@@ -8,6 +8,7 @@
 #include "hpx/runtime_distributed/get_locality_name.hpp"
 #include <hpx/include/lcos.hpp>
 #include <hpx/parallel/algorithms/transform.hpp>
+#include <fmt/ranges.h>
 #include <algorithm>
 #include <sstream>
 
diff --git a/source/python/lue.py.in b/source/python/lue.py.in
index 7344121c3..2f659a818 100644
--- a/source/python/lue.py.in
+++ b/source/python/lue.py.in
@@ -3,35 +3,61 @@ import sys
 
 
 if sys.platform == "win32":
-    # We are about to import the lue_py Python extension. Iff this version of LUE is installed,
-    # we can help Python to find LUE DLLs the LUE Python package depends on. In all other cases
-    # we should do nothing.
-    package_directory_pathname = os.path.dirname(os.path.dirname(__file__))
+    # We are about to import the lue_py Python extension. Since Python 3.8, PATH is not searched anymore for
+    # locations from which to load shared libraries. Such locations need to be added using
+    # os.add_dll_directory. This needs to be done for those shared libraries that are not automatically found
+    # by Python, because they are located in non-standard locations.
+
 
-    if os.path.basename(package_directory_pathname) != "site_packages":
-        # LUE is installed outside of a Python installation. We need to tell Python where our
-        # DLLs are located.
-        # Normally, assumes the package is installed in a location like lib/python<x>.<y>/lue. In
-        # that case, the DLLs are located in bin.
+    def lue_is_installed(package_directory_pathname) -> bool:
         install_prefix = os.path.dirname(os.path.dirname(package_directory_pathname))
-        bin_directory_pathname = os.path.join(install_prefix, "bin")
-
-        if os.path.isdir(bin_directory_pathname):
-            # All seems to be as expected. LUE DLLs should be stored here.
-            os.add_dll_directory(bin_directory_pathname)
-
-        # This is somewhat a hack. Since Python 3.8, PATH is not searched anymore for locations
-        # from which to load dlls. Such locations need to be added using os.add_dll_directory.
-        # In one circumstance we want to add a special location before importing LUE. This
-        # is in our development environment, where HPX is built by ourselves and installed in a
-        # non-standard location. Here, we dectect whether this location has been added to the
-        # PATH, and if so, add this location to Python's search path. In 99.9% of the cases
-        # this is not needed.
-        # This tweak can be removed once we have access to a Conda development package of HPX,
-        # besides a runtime package.
+
+        return not os.path.exists(os.path.join(install_prefix, "CMakeCache.txt"))
+
+
+    package_directory_pathname = os.path.dirname(os.path.dirname(__file__))
+
+
+    if lue_is_installed(package_directory_pathname):
+        if os.path.basename(package_directory_pathname) == "site_packages":
+            # LUE is installed in a Python installation / virtual environment. All shared libraries should be
+            # found automatically.
+            pass
+        else:
+            # LUE is installed outside of a Python installation / virtual environment. We need to tell Python
+            # where our shared libraries are located.  The LUE Python package should be installed in a
+            # location like lib/python<x>.<y>/lue. Our shared libraries are located in bin. We assume shared
+            # libraries our shared libraries depend on are all located in standard locations and therefore
+            # will be found.
+            install_prefix = os.path.dirname(os.path.dirname(package_directory_pathname))
+            bin_directory_pathname = os.path.join(install_prefix, "bin")
+
+            if os.path.isdir(bin_directory_pathname):
+                # All seems to be as expected. LUE DLLs should be stored here.
+                os.add_dll_directory(bin_directory_pathname)
+
+            # In one circumstance we want to add a special location before importing LUE. This is in our
+            # development environment, where HPX is built by ourselves and installed in a non-standard
+            # location.  Here, we dectect whether this location has been added to the PATH, and if so, add
+            # this location to Python's search path. In 99.9% of the cases this is not needed.
+            # This tweak can be removed once we have access to a Conda development package of HPX, besides a
+            # runtime package. In that case, we don't have to build HPX ourselves anymore.
+            for path in os.environ["PATH"].split(";"):
+                if "hpx" in path:
+                    os.add_dll_directory(path)
+
+    else:
+        # LUE is not installed, but used from the build directory. Our own shared libraries and some shared
+        # libraries they depend on (not all unfortunately...) should have been copied already to the current
+        # directory by CMake logic. What remains are some paths to directories containing shared libraries our
+        # shared libraries depend on.
         for path in os.environ["PATH"].split(";"):
             if "hpx" in path:
                 os.add_dll_directory(path)
+            elif "release-1930" in path:
+                os.add_dll_directory(path)
+            elif "hwloc" in path:
+                os.add_dll_directory(path)
 
 
 from .lue_py import *


Test patch:
diff --git a/source/data_model/cxx/test/CMakeLists.txt b/source/data_model/cxx/test/CMakeLists.txt
index fab032b3c..dc419cb82 100644
--- a/source/data_model/cxx/test/CMakeLists.txt
+++ b/source/data_model/cxx/test/CMakeLists.txt
@@ -52,4 +52,17 @@ add_unit_tests(
     NAMES ${names}
     LIBRARIES
         lue::data_model_test
+    TARGETS
+        test_names
 )
+
+foreach(test_name ${test_names})
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:hdf5::hdf5>/../bin>
+    )
+endforeach()
diff --git a/source/data_model/cxx/test/array/different_shape/constant_shape/value_test.cpp b/source/data_model/cxx/test/array/different_shape/constant_shape/value_test.cpp
index 136b2ab37..f6ba0a3d4 100644
--- a/source/data_model/cxx/test/array/different_shape/constant_shape/value_test.cpp
+++ b/source/data_model/cxx/test/array/different_shape/constant_shape/value_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue array different_shape constant_shape value
 #include "lue/array/different_shape/constant_shape/value.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/array/different_shape/value_test.cpp b/source/data_model/cxx/test/array/different_shape/value_test.cpp
index 365ca41d0..eda4e83a9 100644
--- a/source/data_model/cxx/test/array/different_shape/value_test.cpp
+++ b/source/data_model/cxx/test/array/different_shape/value_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue array different_shape value
 #include "lue/array/different_shape/value.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/array/different_shape/variable_shape/value_test.cpp b/source/data_model/cxx/test/array/different_shape/variable_shape/value_test.cpp
index e2b7267a6..4201b9243 100644
--- a/source/data_model/cxx/test/array/different_shape/variable_shape/value_test.cpp
+++ b/source/data_model/cxx/test/array/different_shape/variable_shape/value_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue array different_shape variable_shape value
 #include "lue/array/different_shape/variable_shape/value.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/array/same_shape/constant_shape/value_test.cpp b/source/data_model/cxx/test/array/same_shape/constant_shape/value_test.cpp
index 90a381e1d..70895f91a 100644
--- a/source/data_model/cxx/test/array/same_shape/constant_shape/value_test.cpp
+++ b/source/data_model/cxx/test/array/same_shape/constant_shape/value_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue array same_shape constant_shape value
 #include "lue/array/same_shape/constant_shape/value.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/array/same_shape/value_test.cpp b/source/data_model/cxx/test/array/same_shape/value_test.cpp
index 390ac71f9..714e1a51d 100644
--- a/source/data_model/cxx/test/array/same_shape/value_test.cpp
+++ b/source/data_model/cxx/test/array/same_shape/value_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue array same_shape value
 #include "lue/array/same_shape/value.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/array/same_shape/variable_shape/value_test.cpp b/source/data_model/cxx/test/array/same_shape/variable_shape/value_test.cpp
index 61138d17a..91948cf09 100644
--- a/source/data_model/cxx/test/array/same_shape/variable_shape/value_test.cpp
+++ b/source/data_model/cxx/test/array/same_shape/variable_shape/value_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue array same_shape variable_shape value
 #include "lue/array/same_shape/variable_shape/value.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/core/time/clock_test.cpp b/source/data_model/cxx/test/core/time/clock_test.cpp
index a7735b7be..a0107e7eb 100644
--- a/source/data_model/cxx/test/core/time/clock_test.cpp
+++ b/source/data_model/cxx/test/core/time/clock_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue core time clock
 #include "lue/core/time.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(seconds)
diff --git a/source/data_model/cxx/test/core/time/duration_test.cpp b/source/data_model/cxx/test/core/time/duration_test.cpp
index c060b4800..2004ed377 100644
--- a/source/data_model/cxx/test/core/time/duration_test.cpp
+++ b/source/data_model/cxx/test/core/time/duration_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue core time duration
 #include "lue/core/time.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 namespace ldm = lue::data_model;
diff --git a/source/data_model/cxx/test/core/time/tick_period_test.cpp b/source/data_model/cxx/test/core/time/tick_period_test.cpp
index 1064378ac..2b247031d 100644
--- a/source/data_model/cxx/test/core/time/tick_period_test.cpp
+++ b/source/data_model/cxx/test/core/time/tick_period_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue core time tick_period
 #include "lue/core/time.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(seconds)
diff --git a/source/data_model/cxx/test/core/time/time_point_test.cpp b/source/data_model/cxx/test/core/time/time_point_test.cpp
index 7ca811655..7202afd72 100644
--- a/source/data_model/cxx/test/core/time/time_point_test.cpp
+++ b/source/data_model/cxx/test/core/time/time_point_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue core time point
 #include "lue/core/time.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(seconds)
diff --git a/source/data_model/cxx/test/info/identity/active_object_id_test.cpp b/source/data_model/cxx/test/info/identity/active_object_id_test.cpp
index 756b9ae29..0eebb7c81 100644
--- a/source/data_model/cxx/test/info/identity/active_object_id_test.cpp
+++ b/source/data_model/cxx/test/info/identity/active_object_id_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/core/tag.hpp"
 #include "lue/info/identity/active_object_id.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/identity/active_object_index_test.cpp b/source/data_model/cxx/test/info/identity/active_object_index_test.cpp
index 680ff2ac2..553e21a49 100644
--- a/source/data_model/cxx/test/info/identity/active_object_index_test.cpp
+++ b/source/data_model/cxx/test/info/identity/active_object_index_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/core/tag.hpp"
 #include "lue/info/identity/active_object_index.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/identity/active_set_index_test.cpp b/source/data_model/cxx/test/info/identity/active_set_index_test.cpp
index 61a47f88f..54d5fe86f 100644
--- a/source/data_model/cxx/test/info/identity/active_set_index_test.cpp
+++ b/source/data_model/cxx/test/info/identity/active_set_index_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/core/tag.hpp"
 #include "lue/info/identity/active_set_index.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/identity/object_id_test.cpp b/source/data_model/cxx/test/info/identity/object_id_test.cpp
index c67e088bf..8ba61e47c 100644
--- a/source/data_model/cxx/test/info/identity/object_id_test.cpp
+++ b/source/data_model/cxx/test/info/identity/object_id_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/core/tag.hpp"
 #include "lue/info/identity/object_id.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/property/different_shape/constant_shape/property_test.cpp b/source/data_model/cxx/test/info/property/different_shape/constant_shape/property_test.cpp
index 6092ebdf2..5a4be039d 100644
--- a/source/data_model/cxx/test/info/property/different_shape/constant_shape/property_test.cpp
+++ b/source/data_model/cxx/test/info/property/different_shape/constant_shape/property_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue info property different_shape constant_shape property
 #include "lue/info/property/different_shape/constant_shape/property.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/property/different_shape/property_test.cpp b/source/data_model/cxx/test/info/property/different_shape/property_test.cpp
index f602a5754..9cb62552c 100644
--- a/source/data_model/cxx/test/info/property/different_shape/property_test.cpp
+++ b/source/data_model/cxx/test/info/property/different_shape/property_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue info property different_shape property
 #include "lue/info/property/different_shape/property.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/property/different_shape/variable_shape/property_test.cpp b/source/data_model/cxx/test/info/property/different_shape/variable_shape/property_test.cpp
index e1ec7db8f..57a1f351f 100644
--- a/source/data_model/cxx/test/info/property/different_shape/variable_shape/property_test.cpp
+++ b/source/data_model/cxx/test/info/property/different_shape/variable_shape/property_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue info property different_shape variable_shape property
 #include "lue/info/property/different_shape/variable_shape/property.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/property/same_shape/constant_shape/property_test.cpp b/source/data_model/cxx/test/info/property/same_shape/constant_shape/property_test.cpp
index 857f5f1ce..e38078c6d 100644
--- a/source/data_model/cxx/test/info/property/same_shape/constant_shape/property_test.cpp
+++ b/source/data_model/cxx/test/info/property/same_shape/constant_shape/property_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue info property same_shape constant_shape property
 #include "lue/info/property/same_shape/constant_shape/property.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/property/same_shape/property_test.cpp b/source/data_model/cxx/test/info/property/same_shape/property_test.cpp
index 71bb36605..747b3d538 100644
--- a/source/data_model/cxx/test/info/property/same_shape/property_test.cpp
+++ b/source/data_model/cxx/test/info/property/same_shape/property_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue info property same_shape property
 #include "lue/info/property/same_shape/property.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/property/same_shape/variable_shape/property_test.cpp b/source/data_model/cxx/test/info/property/same_shape/variable_shape/property_test.cpp
index e05036173..b1be0281f 100644
--- a/source/data_model/cxx/test/info/property/same_shape/variable_shape/property_test.cpp
+++ b/source/data_model/cxx/test/info/property/same_shape/variable_shape/property_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue info property same_shape variable_shape property
 #include "lue/info/property/same_shape/variable_shape/property.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/space/mobile_space_box_test.cpp b/source/data_model/cxx/test/info/space/mobile_space_box_test.cpp
index 2d0836c6e..4b7e911ca 100644
--- a/source/data_model/cxx/test/info/space/mobile_space_box_test.cpp
+++ b/source/data_model/cxx/test/info/space/mobile_space_box_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/core/tag.hpp"
 #include "lue/info/space/mobile_space_box.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/space/mobile_space_point_test.cpp b/source/data_model/cxx/test/info/space/mobile_space_point_test.cpp
index 8f52fd978..857763b8e 100644
--- a/source/data_model/cxx/test/info/space/mobile_space_point_test.cpp
+++ b/source/data_model/cxx/test/info/space/mobile_space_point_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/core/tag.hpp"
 #include "lue/info/space/mobile_space_point.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/space/stationary_space_box_test.cpp b/source/data_model/cxx/test/info/space/stationary_space_box_test.cpp
index ec1588e06..53badadc5 100644
--- a/source/data_model/cxx/test/info/space/stationary_space_box_test.cpp
+++ b/source/data_model/cxx/test/info/space/stationary_space_box_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/core/tag.hpp"
 #include "lue/info/space/stationary_space_box.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/space/stationary_space_point_test.cpp b/source/data_model/cxx/test/info/space/stationary_space_point_test.cpp
index 16cee40c3..d2b3ca8bb 100644
--- a/source/data_model/cxx/test/info/space/stationary_space_point_test.cpp
+++ b/source/data_model/cxx/test/info/space/stationary_space_point_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/core/tag.hpp"
 #include "lue/info/space/stationary_space_point.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/time/time_box_test.cpp b/source/data_model/cxx/test/info/time/time_box_test.cpp
index 0b9b13989..fa5b0aa1d 100644
--- a/source/data_model/cxx/test/info/time/time_box_test.cpp
+++ b/source/data_model/cxx/test/info/time/time_box_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/core/tag.hpp"
 #include "lue/info/time/time_box.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/info/time/time_cell_test.cpp b/source/data_model/cxx/test/info/time/time_cell_test.cpp
index 42794d059..341ff9fb1 100644
--- a/source/data_model/cxx/test/info/time/time_cell_test.cpp
+++ b/source/data_model/cxx/test/info/time/time_cell_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/core/tag.hpp"
 #include "lue/info/time/time_cell.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 #include <iostream>
 
 
diff --git a/source/data_model/cxx/test/info/time/time_point_test.cpp b/source/data_model/cxx/test/info/time/time_point_test.cpp
index ee5c30aa6..5fd39f782 100644
--- a/source/data_model/cxx/test/info/time/time_point_test.cpp
+++ b/source/data_model/cxx/test/info/time/time_point_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/core/tag.hpp"
 #include "lue/info/time/time_point.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/object/dataset_test.cpp b/source/data_model/cxx/test/object/dataset_test.cpp
index 5ac8a4ebf..6f692f890 100644
--- a/source/data_model/cxx/test/object/dataset_test.cpp
+++ b/source/data_model/cxx/test/object/dataset_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue object dataset
 #include "lue/object/dataset.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(create_new_dataset)
diff --git a/source/data_model/cxx/test/object/presence_in_time_test.cpp b/source/data_model/cxx/test/object/presence_in_time_test.cpp
index f437a981c..07e3e60c6 100644
--- a/source/data_model/cxx/test/object/presence_in_time_test.cpp
+++ b/source/data_model/cxx/test/object/presence_in_time_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue object presence_in_time
 #include "lue/object/property/property_set.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_FIXTURE_TEST_CASE(omnipresent_in_time, lue::data_model::test::DatasetFixture)
diff --git a/source/data_model/cxx/test/object/property/properties_test.cpp b/source/data_model/cxx/test/object/property/properties_test.cpp
index a3942086b..e6c5b63ee 100644
--- a/source/data_model/cxx/test/object/property/properties_test.cpp
+++ b/source/data_model/cxx/test/object/property/properties_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue object property properties
 #include "lue/object/property/properties.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(meh)
diff --git a/source/data_model/cxx/test/object/property/property_set_test.cpp b/source/data_model/cxx/test/object/property/property_set_test.cpp
index 4e5225024..c3e719ae3 100644
--- a/source/data_model/cxx/test/object/property/property_set_test.cpp
+++ b/source/data_model/cxx/test/object/property/property_set_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue object property property_set
 #include "lue/object/property/property_set.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/object/space_domain_test.cpp b/source/data_model/cxx/test/object/space_domain_test.cpp
index 5ce45a420..973030e10 100644
--- a/source/data_model/cxx/test/object/space_domain_test.cpp
+++ b/source/data_model/cxx/test/object/space_domain_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue object space_domain
 #include "lue/object/space_domain.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/object/time_domain_test.cpp b/source/data_model/cxx/test/object/time_domain_test.cpp
index 618491523..c4009f28d 100644
--- a/source/data_model/cxx/test/object/time_domain_test.cpp
+++ b/source/data_model/cxx/test/object/time_domain_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue object time_domain
 #include "lue/object/time_domain.hpp"
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 class Fixture: public lue::data_model::test::FileFixture
diff --git a/source/data_model/cxx/test/raster_test.cpp b/source/data_model/cxx/test/raster_test.cpp
index a51d33b26..6a96deac5 100644
--- a/source/data_model/cxx/test/raster_test.cpp
+++ b/source/data_model/cxx/test/raster_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue raster
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_FIXTURE_TEST_CASE(create, lue::data_model::test::DatasetFixture)
diff --git a/source/data_model/cxx/test/scalar_test.cpp b/source/data_model/cxx/test/scalar_test.cpp
index 06efef100..55ce6cf6e 100644
--- a/source/data_model/cxx/test/scalar_test.cpp
+++ b/source/data_model/cxx/test/scalar_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue scalar
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_FIXTURE_TEST_CASE(create, lue::data_model::test::DatasetFixture)
diff --git a/source/data_model/cxx/test/time_series_1_test.cpp b/source/data_model/cxx/test/time_series_1_test.cpp
index 3d23a741f..ee1cd41a2 100644
--- a/source/data_model/cxx/test/time_series_1_test.cpp
+++ b/source/data_model/cxx/test/time_series_1_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue time_series 1
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_FIXTURE_TEST_CASE(create, lue::data_model::test::DatasetFixture)
diff --git a/source/data_model/cxx/test/time_series_2_test.cpp b/source/data_model/cxx/test/time_series_2_test.cpp
index a4c24035d..22810f322 100644
--- a/source/data_model/cxx/test/time_series_2_test.cpp
+++ b/source/data_model/cxx/test/time_series_2_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue time_series 2
 #include "lue/test.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_FIXTURE_TEST_CASE(create, lue::data_model::test::DatasetFixture)
diff --git a/source/data_model/gdal/test/CMakeLists.txt b/source/data_model/gdal/test/CMakeLists.txt
index 408dbe177..a189a31d5 100644
--- a/source/data_model/gdal/test/CMakeLists.txt
+++ b/source/data_model/gdal/test/CMakeLists.txt
@@ -7,10 +7,24 @@ set(names
     type_traits
     version
 )
+
 add_unit_tests(
     SCOPE lue_gdal
     NAMES ${names}
     LIBRARIES
         lue::gdal
         lue::shared
+    TARGETS
+        test_names
 )
+
+foreach(test_name ${test_names})
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:GDAL::GDAL>/../bin>
+    )
+endforeach()
diff --git a/source/data_model/gdal/test/blocks_test.cpp b/source/data_model/gdal/test/blocks_test.cpp
index 1086dd2f6..56c7a063a 100644
--- a/source/data_model/gdal/test/blocks_test.cpp
+++ b/source/data_model/gdal/test/blocks_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue gdal blocks_test
 #include "lue/gdal/blocks.hpp"
 #include "lue/stream.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(constructor)
diff --git a/source/data_model/gdal/test/dataset_test.cpp b/source/data_model/gdal/test/dataset_test.cpp
index 51c3b36fe..f273d04ff 100644
--- a/source/data_model/gdal/test/dataset_test.cpp
+++ b/source/data_model/gdal/test/dataset_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/gdal/dataset.hpp"
 #include "lue/gdal/driver.hpp"
 #include "lue/stream.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 #include <filesystem>
 
 
diff --git a/source/data_model/gdal/test/driver_test.cpp b/source/data_model/gdal/test/driver_test.cpp
index 4cd10c001..7264b6d36 100644
--- a/source/data_model/gdal/test/driver_test.cpp
+++ b/source/data_model/gdal/test/driver_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue gdal driver_test
 #include "lue/gdal/driver.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(driver)
diff --git a/source/data_model/gdal/test/raster_band_test.cpp b/source/data_model/gdal/test/raster_band_test.cpp
index 987f34080..87bed0525 100644
--- a/source/data_model/gdal/test/raster_band_test.cpp
+++ b/source/data_model/gdal/test/raster_band_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue gdal raster_band_test
 #include "lue/gdal/raster_band.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(raster_band)
diff --git a/source/data_model/gdal/test/raster_test.cpp b/source/data_model/gdal/test/raster_test.cpp
index 1d8aadbda..47c05084c 100644
--- a/source/data_model/gdal/test/raster_test.cpp
+++ b/source/data_model/gdal/test/raster_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue gdal raster_test
 #include "lue/gdal/raster.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(raster)
diff --git a/source/data_model/gdal/test/type_traits_test.cpp b/source/data_model/gdal/test/type_traits_test.cpp
index 8afc2b6df..437f08361 100644
--- a/source/data_model/gdal/test/type_traits_test.cpp
+++ b/source/data_model/gdal/test/type_traits_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue gdal driver_test
 #include "lue/gdal/type_traits.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(data_type_v)
diff --git a/source/data_model/gdal/test/version_test.cpp b/source/data_model/gdal/test/version_test.cpp
index 0f16a7621..1c274799a 100644
--- a/source/data_model/gdal/test/version_test.cpp
+++ b/source/data_model/gdal/test/version_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue gdal version_test
 #include "lue/gdal/version.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(version)
diff --git a/source/data_model/hdf5/test/CMakeLists.txt b/source/data_model/hdf5/test/CMakeLists.txt
index 251169f89..feae8dc36 100644
--- a/source/data_model/hdf5/test/CMakeLists.txt
+++ b/source/data_model/hdf5/test/CMakeLists.txt
@@ -15,4 +15,17 @@ add_unit_tests(
     NAMES ${names}
     LIBRARIES
         lue::hdf5
+    TARGETS
+        test_names
 )
+
+foreach(test_name ${test_names})
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:hdf5::hdf5>/../bin>
+    )
+endforeach()
diff --git a/source/data_model/hdf5/test/attribute_test.cpp b/source/data_model/hdf5/test/attribute_test.cpp
index 5c5a65cfc..11036295a 100644
--- a/source/data_model/hdf5/test/attribute_test.cpp
+++ b/source/data_model/hdf5/test/attribute_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue hdf5 attribute
 #include "lue/hdf5/attribute.hpp"
 #include "lue/hdf5/file.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 namespace {
diff --git a/source/data_model/hdf5/test/chunk_test.cpp b/source/data_model/hdf5/test/chunk_test.cpp
index 169112a9a..81cfdfbfa 100644
--- a/source/data_model/hdf5/test/chunk_test.cpp
+++ b/source/data_model/hdf5/test/chunk_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue hdf5 chunk
 #include "lue/hdf5/chunk.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 #include <cstdint>
 
 
diff --git a/source/data_model/hdf5/test/dataset_test.cpp b/source/data_model/hdf5/test/dataset_test.cpp
index fddf3561b..bd8a527bb 100644
--- a/source/data_model/hdf5/test/dataset_test.cpp
+++ b/source/data_model/hdf5/test/dataset_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/hdf5/dataset.hpp"
 #include "lue/hdf5/file.hpp"
 #include "lue/hdf5/vlen_memory.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 namespace lh5 = lue::hdf5;
diff --git a/source/data_model/hdf5/test/datatype_test.cpp b/source/data_model/hdf5/test/datatype_test.cpp
index 6ab00b8f9..7965a6a91 100644
--- a/source/data_model/hdf5/test/datatype_test.cpp
+++ b/source/data_model/hdf5/test/datatype_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue hdf5 datatype
 #include "lue/hdf5/datatype.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 #include <map>
 
 
diff --git a/source/data_model/hdf5/test/file_test.cpp b/source/data_model/hdf5/test/file_test.cpp
index 6fce89c5f..8b74a7a0b 100644
--- a/source/data_model/hdf5/test/file_test.cpp
+++ b/source/data_model/hdf5/test/file_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue hdf5 file
 #include "lue/hdf5/file.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 #include <filesystem>
 
 
diff --git a/source/data_model/hdf5/test/group_test.cpp b/source/data_model/hdf5/test/group_test.cpp
index efc0efbc6..ba80b8c8c 100644
--- a/source/data_model/hdf5/test/group_test.cpp
+++ b/source/data_model/hdf5/test/group_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue hdf5 group
 #include "lue/hdf5/file.hpp"
 #include "lue/hdf5/group.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 namespace {
diff --git a/source/data_model/hdf5/test/hyperslab_test.cpp b/source/data_model/hdf5/test/hyperslab_test.cpp
index 1a6321eef..73366b895 100644
--- a/source/data_model/hdf5/test/hyperslab_test.cpp
+++ b/source/data_model/hdf5/test/hyperslab_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue hdf5 hyperslab
 #include "lue/hdf5/hyperslab.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 namespace lh5 = lue::hdf5;
diff --git a/source/data_model/hdf5/test/identifier_test.cpp b/source/data_model/hdf5/test/identifier_test.cpp
index c07ca7adf..dbbe483f0 100644
--- a/source/data_model/hdf5/test/identifier_test.cpp
+++ b/source/data_model/hdf5/test/identifier_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue hdf5 identifier
 #include "lue/hdf5/file.hpp"
 #include "lue/hdf5/identifier.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 namespace lh5 = lue::hdf5;
diff --git a/source/data_model/hdf5/test/shape_test.cpp b/source/data_model/hdf5/test/shape_test.cpp
index fd7cbdda3..7f0ea733e 100644
--- a/source/data_model/hdf5/test/shape_test.cpp
+++ b/source/data_model/hdf5/test/shape_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue hdf5 shape
 #include "lue/hdf5/shape.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 namespace lh5 = lue::hdf5;
diff --git a/source/data_model/hl/test/CMakeLists.txt b/source/data_model/hl/test/CMakeLists.txt
index 1d36fa79b..9873edc4d 100644
--- a/source/data_model/hl/test/CMakeLists.txt
+++ b/source/data_model/hl/test/CMakeLists.txt
@@ -8,4 +8,17 @@ add_unit_tests(
     LIBRARIES
         lue::data_model_hl
         lue::data_model_test
+    TARGETS
+        test_names
 )
+
+foreach(test_name ${test_names})
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:hdf5::hdf5>/../bin>
+    )
+endforeach()
diff --git a/source/data_model/hl/test/raster_view_test.cpp b/source/data_model/hl/test/raster_view_test.cpp
index 44b0027fa..4419d0063 100644
--- a/source/data_model/hl/test/raster_view_test.cpp
+++ b/source/data_model/hl/test/raster_view_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/data_model/hl/raster_view.hpp"
 #include "lue/test/print.hpp"
 #include "lue/validate.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 namespace ldm = lue::data_model;
diff --git a/source/data_model/python/test/CMakeLists.txt b/source/data_model/python/test/CMakeLists.txt
index 6008eada3..11a051ed7 100644
--- a/source/data_model/python/test/CMakeLists.txt
+++ b/source/data_model/python/test/CMakeLists.txt
@@ -15,7 +15,11 @@ set_property(
         # Add the path to our Python modules to PYTHONPATH.
         ENVIRONMENT_MODIFICATION
             PYTHONPATH=path_list_prepend:$<TARGET_FILE_DIR:lue::py>/..
+            # This should not be necessary, but copying in all shared libs we depend on skips a few
+            PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:hdf5::hdf5>/../bin>
+            PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
 )
+
 set_property(
     TEST
         lue_py_data_model_python_test
diff --git a/source/data_model/python/test/python_test.cpp b/source/data_model/python/test/python_test.cpp
index 1b0b9d1a2..72315756c 100644
--- a/source/data_model/python/test/python_test.cpp
+++ b/source/data_model/python/test/python_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue py data_model
 #include <boost/algorithm/string.hpp>
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 #include <pybind11/pybind11.h>
 
 
diff --git a/source/data_model/translate/test/CMakeLists.txt b/source/data_model/translate/test/CMakeLists.txt
index 1c1802284..85f7284fb 100644
--- a/source/data_model/translate/test/CMakeLists.txt
+++ b/source/data_model/translate/test/CMakeLists.txt
@@ -9,4 +9,18 @@ add_unit_tests(
     LIBRARIES
         lue::translate
         lue::data_model_test
+    TARGETS
+        test_names
 )
+
+foreach(test_name ${test_names})
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:GDAL::GDAL>/../bin>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:hdf5::hdf5>/../bin>
+    )
+endforeach()
diff --git a/source/data_model/translate/test/import_test.cpp b/source/data_model/translate/test/import_test.cpp
index a0e924dbd..b81187581 100644
--- a/source/data_model/translate/test/import_test.cpp
+++ b/source/data_model/translate/test/import_test.cpp
@@ -3,7 +3,8 @@
 #include "lue/stream.hpp"
 #include "lue/translate/format.hpp"
 #include "lue/validate.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
+#include <fmt/ranges.h>
 #include <numeric>
 
 
diff --git a/source/data_model/translate/test/stack_name_test.cpp b/source/data_model/translate/test/stack_name_test.cpp
index 6f71f5f00..1c07b2958 100644
--- a/source/data_model/translate/test/stack_name_test.cpp
+++ b/source/data_model/translate/test/stack_name_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue translate stack_name
 #include "lue/translate/stack_name.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(use_case_1)
diff --git a/source/data_model/utility/test/CMakeLists.txt b/source/data_model/utility/test/CMakeLists.txt
index 95787c18b..3a92cbc87 100644
--- a/source/data_model/utility/test/CMakeLists.txt
+++ b/source/data_model/utility/test/CMakeLists.txt
@@ -1,4 +1,3 @@
-set(scope lue_utility)
 set(names
     environment
 )
@@ -8,4 +7,6 @@ add_unit_tests(
     NAMES ${names}
     LIBRARIES
         lue::utility
+    TARGETS
+        test_names
 )
diff --git a/source/data_model/utility/test/environment_test.cpp b/source/data_model/utility/test/environment_test.cpp
index 535b00cf9..abf8fe7b8 100644
--- a/source/data_model/utility/test/environment_test.cpp
+++ b/source/data_model/utility/test/environment_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue utility environment
 #include "lue/utility/environment.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(expand_environment_variables)
diff --git a/source/framework/algorithm/test/.logical_exclusive_or_test.cpp.swp b/source/framework/algorithm/test/.logical_exclusive_or_test.cpp.swp
deleted file mode 100644
index 54b90b89d..000000000
Binary files a/source/framework/algorithm/test/.logical_exclusive_or_test.cpp.swp and /dev/null differ
diff --git a/source/framework/algorithm/test/CMakeLists.txt b/source/framework/algorithm/test/CMakeLists.txt
index 7341fd72e..bbbf4fb7d 100644
--- a/source/framework/algorithm/test/CMakeLists.txt
+++ b/source/framework/algorithm/test/CMakeLists.txt
@@ -131,18 +131,13 @@ foreach(name ${names})
 
     add_executable(${test_name} ${module_name}.cpp)
 
-    target_compile_definitions(${test_name}
-        PRIVATE
-            BOOST_TEST_DYN_LINK
-    )
-
     target_link_libraries(${test_name}
         PRIVATE
             lue_framework_algorithm_test
             lue::framework_algorithm
             lue::framework_global_operation  # unique
             lue::framework_test
-            Boost::unit_test_framework
+            Boost::headers
     )
 
     add_test(NAME ${test_name}
@@ -155,23 +150,22 @@ foreach(name ${names})
                     "$<TARGET_FILE:${test_name}>"
     )
 
-    if(WIN32)
-        # Ensure required DLLs can be found at runtime
-        set_property(
-            TEST
-                ${test_name}
-            APPEND
-            PROPERTY
-                ENVIRONMENT_MODIFICATION
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:HPX::component_storage_component>
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:lue::framework_partitioned_array>
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:lue::framework_partitioned_route>
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:lue::framework_local_operation>
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:lue::framework_focal_operation>
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:lue::framework_routing_operation>
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:lue::framework_zonal_operation>
-        )
-    endif()
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:HPX::component_storage_component>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:lue::framework_partitioned_array>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:lue::framework_partitioned_route>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:lue::framework_local_operation>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:lue::framework_focal_operation>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:lue::framework_routing_operation>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:lue::framework_zonal_operation>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:hdf5::hdf5>/../bin>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
+    )
 endforeach()
 
 foreach(name ${local_operation_names})
@@ -212,38 +206,26 @@ set(names
     out_of_range
 )
 
-foreach(name ${names})
-    set(module_name ${name}_test)
-    string(REPLACE "/" "_" test_name ${scope}_${module_name})
-
-    add_executable(${test_name} ${module_name}.cpp)
-
-    target_compile_definitions(${test_name}
-        PRIVATE
-            BOOST_TEST_DYN_LINK
-    )
-
-    target_link_libraries(${test_name}
-        PRIVATE
-            lue_framework_algorithm_test
-            lue::framework_algorithm
-            lue::framework_test
-            Boost::unit_test_framework
-    )
+add_unit_tests(
+    SCOPE ${scope}
+    NAMES ${names}
+    LIBRARIES
+        lue_framework_algorithm_test
+        lue::framework_algorithm
+        lue::framework_test
+    TARGETS
+        test_names
+)
 
-    add_test(NAME ${test_name}
-        COMMAND ${test_name}
+foreach(test_name ${test_names})
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:hdf5::hdf5>/../bin>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:HPX::component_storage_component>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
     )
-
-    if(WIN32)
-        # Ensure required DLLs can be found at runtime
-        set_property(
-            TEST
-                ${test_name}
-            APPEND
-            PROPERTY
-                ENVIRONMENT_MODIFICATION
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:HPX::component_storage_component>
-        )
-    endif()
 endforeach()
diff --git a/source/framework/algorithm/test/abs_test.cpp b/source/framework/algorithm/test/abs_test.cpp
index a04926a9d..cf4c2b346 100644
--- a/source/framework/algorithm/test/abs_test.cpp
+++ b/source/framework/algorithm/test/abs_test.cpp
@@ -9,7 +9,6 @@
 #include "lue/framework/algorithm/value_policies/none.hpp"
 #include "lue/framework/algorithm/value_policies/valid.hpp"
 
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 #include <limits>
 
diff --git a/source/framework/algorithm/test/accu_fraction_test.cpp b/source/framework/algorithm/test/accu_fraction_test.cpp
index 763fdcc49..64c43675b 100644
--- a/source/framework/algorithm/test/accu_fraction_test.cpp
+++ b/source/framework/algorithm/test/accu_fraction_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm accu_fraction
 #include "flow_accumulation.hpp"
 #include "lue/framework/algorithm/definition/accu_fraction.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/accu_test.cpp b/source/framework/algorithm/test/accu_test.cpp
index 46f763ede..71547d0a0 100644
--- a/source/framework/algorithm/test/accu_test.cpp
+++ b/source/framework/algorithm/test/accu_test.cpp
@@ -3,8 +3,6 @@
 #include "lue/framework/algorithm/default_policies/accu3.hpp"
 #include "lue/framework/algorithm/definition/accu.hpp"
 #include "lue/framework/algorithm/value_policies/accu3.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/accu_threshold_test.cpp b/source/framework/algorithm/test/accu_threshold_test.cpp
index 271e07d4c..4b4105cb8 100644
--- a/source/framework/algorithm/test/accu_threshold_test.cpp
+++ b/source/framework/algorithm/test/accu_threshold_test.cpp
@@ -2,8 +2,6 @@
 #include "flow_accumulation.hpp"
 #include "lue/framework/algorithm/accu_threshold.hpp"
 #include "lue/framework/algorithm/value_policies/accu_threshold3.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/acos_test.cpp b/source/framework/algorithm/test/acos_test.cpp
index e99ba9b20..7fb728a6b 100644
--- a/source/framework/algorithm/test/acos_test.cpp
+++ b/source/framework/algorithm/test/acos_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/acos.hpp"
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/add_test.cpp b/source/framework/algorithm/test/add_test.cpp
index a51c03f03..b68bfa1a5 100644
--- a/source/framework/algorithm/test/add_test.cpp
+++ b/source/framework/algorithm/test/add_test.cpp
@@ -6,7 +6,6 @@
 #include "lue/framework/algorithm/value_policies/add.hpp"
 #include "lue/framework/algorithm/value_policies/none.hpp"
 #include "lue/framework/algorithm/value_policies/valid.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/all_test.cpp b/source/framework/algorithm/test/all_test.cpp
index 6044574b6..465a06e1b 100644
--- a/source/framework/algorithm/test/all_test.cpp
+++ b/source/framework/algorithm/test/all_test.cpp
@@ -1,7 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm all
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/default_policies/all.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/any_test.cpp b/source/framework/algorithm/test/any_test.cpp
index ba7a9493b..03fa29b00 100644
--- a/source/framework/algorithm/test/any_test.cpp
+++ b/source/framework/algorithm/test/any_test.cpp
@@ -1,7 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm any
 #include "lue/framework/algorithm/any.hpp"
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/array_like_test.cpp b/source/framework/algorithm/test/array_like_test.cpp
index d46c78b26..5e9bd5418 100644
--- a/source/framework/algorithm/test/array_like_test.cpp
+++ b/source/framework/algorithm/test/array_like_test.cpp
@@ -4,7 +4,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
 #include "lue/framework/algorithm/locality_id.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/array_partition_id_test.cpp b/source/framework/algorithm/test/array_partition_id_test.cpp
index 684311b60..f815868c1 100644
--- a/source/framework/algorithm/test/array_partition_id_test.cpp
+++ b/source/framework/algorithm/test/array_partition_id_test.cpp
@@ -3,9 +3,7 @@
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
-#include "lue/framework/test/stream.hpp"
 
 
 namespace detail {
diff --git a/source/framework/algorithm/test/array_partition_io_test.cpp b/source/framework/algorithm/test/array_partition_io_test.cpp
index 7f5aaeeee..6f01b43a7 100644
--- a/source/framework/algorithm/test/array_partition_io_test.cpp
+++ b/source/framework/algorithm/test/array_partition_io_test.cpp
@@ -1,7 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm array_partition_io
 #include "lue/framework/algorithm/detail/array_partition_io.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
-#include "lue/framework/test/stream.hpp"
 
 
 BOOST_AUTO_TEST_CASE(default_construct)
diff --git a/source/framework/algorithm/test/asin_test.cpp b/source/framework/algorithm/test/asin_test.cpp
index 240163b28..cfc498de2 100644
--- a/source/framework/algorithm/test/asin_test.cpp
+++ b/source/framework/algorithm/test/asin_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/asin.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/aspect_test.cpp b/source/framework/algorithm/test/aspect_test.cpp
index 52bb30262..3de1ed602 100644
--- a/source/framework/algorithm/test/aspect_test.cpp
+++ b/source/framework/algorithm/test/aspect_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm aspect
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/value_policies/aspect.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/atan2_test.cpp b/source/framework/algorithm/test/atan2_test.cpp
index da5ffc900..6a321c214 100644
--- a/source/framework/algorithm/test/atan2_test.cpp
+++ b/source/framework/algorithm/test/atan2_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/atan2.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/atan_test.cpp b/source/framework/algorithm/test/atan_test.cpp
index 59ec968ba..9c190c076 100644
--- a/source/framework/algorithm/test/atan_test.cpp
+++ b/source/framework/algorithm/test/atan_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/atan.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/cast_test.cpp b/source/framework/algorithm/test/cast_test.cpp
index f50508a4b..2ba9e8bf6 100644
--- a/source/framework/algorithm/test/cast_test.cpp
+++ b/source/framework/algorithm/test/cast_test.cpp
@@ -9,8 +9,6 @@
 #include "lue/framework/algorithm/value_policies/cast.hpp"
 #include "lue/framework/algorithm/value_policies/equal_to.hpp"
 #include "lue/framework/core/component.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 #include <limits>
 
diff --git a/source/framework/algorithm/test/ceil_test.cpp b/source/framework/algorithm/test/ceil_test.cpp
index 6c13485b2..ebc523d10 100644
--- a/source/framework/algorithm/test/ceil_test.cpp
+++ b/source/framework/algorithm/test/ceil_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm ceil
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/value_policies/ceil.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/cell_index_test.cpp b/source/framework/algorithm/test/cell_index_test.cpp
index 3f61148bf..7ffad8b51 100644
--- a/source/framework/algorithm/test/cell_index_test.cpp
+++ b/source/framework/algorithm/test/cell_index_test.cpp
@@ -1,7 +1,5 @@
 #define BOOST_TEST_MODULE lue framework algorithm cell_index
 #include "lue/framework/algorithm/value_policies/cell_index.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/close_to_test.cpp b/source/framework/algorithm/test/close_to_test.cpp
index 9e54b40e5..f79297349 100644
--- a/source/framework/algorithm/test/close_to_test.cpp
+++ b/source/framework/algorithm/test/close_to_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/close_to.hpp"
 #include "lue/framework/algorithm/default_policies/none.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/clump_test.cpp b/source/framework/algorithm/test/clump_test.cpp
index 3ff76aecd..18a1b8960 100644
--- a/source/framework/algorithm/test/clump_test.cpp
+++ b/source/framework/algorithm/test/clump_test.cpp
@@ -4,10 +4,7 @@
 #include "lue/framework/algorithm/value_policies/uniform.hpp"
 #include "lue/framework/algorithm/value_policies/unique.hpp"
 #include "lue/framework/algorithm/value_policies/where.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
-#include "lue/framework/test/stream.hpp"
 #include <random>
 
 
diff --git a/source/framework/algorithm/test/communicator_array_test.cpp b/source/framework/algorithm/test/communicator_array_test.cpp
index b156fb8b1..78856b480 100644
--- a/source/framework/algorithm/test/communicator_array_test.cpp
+++ b/source/framework/algorithm/test/communicator_array_test.cpp
@@ -2,7 +2,6 @@
 #include "flow_accumulation.hpp"
 #include "lue/framework/algorithm/detail/communicator.hpp"
 #include "lue/framework/algorithm/detail/communicator_array.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/convolve_test.cpp b/source/framework/algorithm/test/convolve_test.cpp
index a3be82177..21bc19ea7 100644
--- a/source/framework/algorithm/test/convolve_test.cpp
+++ b/source/framework/algorithm/test/convolve_test.cpp
@@ -3,8 +3,6 @@
 #include "lue/framework/algorithm/definition/convolve.hpp"
 #include "lue/framework/algorithm/kernel.hpp"
 #include "lue/framework/algorithm/serialize/kernel.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/copy_test.cpp b/source/framework/algorithm/test/copy_test.cpp
index b63df680f..569f37c38 100644
--- a/source/framework/algorithm/test/copy_test.cpp
+++ b/source/framework/algorithm/test/copy_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/cos_test.cpp b/source/framework/algorithm/test/cos_test.cpp
index 0d15554bd..995ea8d72 100644
--- a/source/framework/algorithm/test/cos_test.cpp
+++ b/source/framework/algorithm/test/cos_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/cos.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/create_partitioned_array_test.cpp b/source/framework/algorithm/test/create_partitioned_array_test.cpp
index 36a9d08f6..8fb5162c5 100644
--- a/source/framework/algorithm/test/create_partitioned_array_test.cpp
+++ b/source/framework/algorithm/test/create_partitioned_array_test.cpp
@@ -11,8 +11,6 @@
 #include "lue/framework/algorithm/value_policies/logical_not.hpp"
 #include "lue/framework/algorithm/value_policies/valid.hpp"
 #include "lue/framework/core/component.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/d8_flow_direction_test.cpp b/source/framework/algorithm/test/d8_flow_direction_test.cpp
index 79a0d18ef..5052f9b07 100644
--- a/source/framework/algorithm/test/d8_flow_direction_test.cpp
+++ b/source/framework/algorithm/test/d8_flow_direction_test.cpp
@@ -1,7 +1,5 @@
 #define BOOST_TEST_MODULE lue framework algorithm d8_flow_direction
 #include "lue/framework/algorithm/definition/d8_flow_direction.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/decreasing_order_test.cpp b/source/framework/algorithm/test/decreasing_order_test.cpp
index 2b542135f..a81653a15 100644
--- a/source/framework/algorithm/test/decreasing_order_test.cpp
+++ b/source/framework/algorithm/test/decreasing_order_test.cpp
@@ -4,9 +4,7 @@
 #include "lue/framework/algorithm/value_policies/greater_than.hpp"
 #include "lue/framework/algorithm/value_policies/uniform.hpp"
 #include "lue/framework/algorithm/value_policies/where.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
-#include "lue/stream.hpp"
 #include <random>
 
 
diff --git a/source/framework/algorithm/test/divide_test.cpp b/source/framework/algorithm/test/divide_test.cpp
index f21b2d86f..1d63b19d2 100644
--- a/source/framework/algorithm/test/divide_test.cpp
+++ b/source/framework/algorithm/test/divide_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/divide.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/downstream_distance_test.cpp b/source/framework/algorithm/test/downstream_distance_test.cpp
index 406c9c862..98a028faa 100644
--- a/source/framework/algorithm/test/downstream_distance_test.cpp
+++ b/source/framework/algorithm/test/downstream_distance_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm downstream_distance
 #include "flow_accumulation.hpp"
 #include "lue/framework/algorithm/definition/downstream_distance.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/downstream_test.cpp b/source/framework/algorithm/test/downstream_test.cpp
index 0e7ab0641..29b8c535f 100644
--- a/source/framework/algorithm/test/downstream_test.cpp
+++ b/source/framework/algorithm/test/downstream_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm downstream
 #include "flow_accumulation.hpp"
 #include "lue/framework/algorithm/definition/downstream.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/equal_to_test.cpp b/source/framework/algorithm/test/equal_to_test.cpp
index c1ea2c715..db44412d9 100644
--- a/source/framework/algorithm/test/equal_to_test.cpp
+++ b/source/framework/algorithm/test/equal_to_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
 #include "lue/framework/algorithm/default_policies/none.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/exp_test.cpp b/source/framework/algorithm/test/exp_test.cpp
index d91dff110..e08cd68f7 100644
--- a/source/framework/algorithm/test/exp_test.cpp
+++ b/source/framework/algorithm/test/exp_test.cpp
@@ -6,7 +6,6 @@
 #include "lue/framework/algorithm/value_policies/exp.hpp"
 #include "lue/framework/algorithm/value_policies/none.hpp"
 #include "lue/framework/algorithm/value_policies/valid.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/fill_test.cpp b/source/framework/algorithm/test/fill_test.cpp
index 15baae3ba..69487911d 100644
--- a/source/framework/algorithm/test/fill_test.cpp
+++ b/source/framework/algorithm/test/fill_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
 #include "lue/framework/algorithm/fill.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/first_n_test.cpp b/source/framework/algorithm/test/first_n_test.cpp
index fd01fe936..a46be847d 100644
--- a/source/framework/algorithm/test/first_n_test.cpp
+++ b/source/framework/algorithm/test/first_n_test.cpp
@@ -6,9 +6,7 @@
 #include "lue/framework/algorithm/value_policies/uniform.hpp"
 #include "lue/framework/algorithm/value_policies/where.hpp"
 #include "lue/framework/core/component.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
-#include "lue/stream.hpp"
 #include <random>
 
 
diff --git a/source/framework/algorithm/test/floor_test.cpp b/source/framework/algorithm/test/floor_test.cpp
index 3d2d99b0e..1a599c8c9 100644
--- a/source/framework/algorithm/test/floor_test.cpp
+++ b/source/framework/algorithm/test/floor_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm floor
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/value_policies/floor.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/focal_diversity_test.cpp b/source/framework/algorithm/test/focal_diversity_test.cpp
index 6d36873db..6261751db 100644
--- a/source/framework/algorithm/test/focal_diversity_test.cpp
+++ b/source/framework/algorithm/test/focal_diversity_test.cpp
@@ -3,8 +3,6 @@
 #include "lue/framework/algorithm/kernel.hpp"
 #include "lue/framework/algorithm/range.hpp"
 #include "lue/framework/algorithm/value_policies/focal_diversity.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/focal_high_pass_test.cpp b/source/framework/algorithm/test/focal_high_pass_test.cpp
index 6b8350e3b..78b10ac9f 100644
--- a/source/framework/algorithm/test/focal_high_pass_test.cpp
+++ b/source/framework/algorithm/test/focal_high_pass_test.cpp
@@ -4,8 +4,6 @@
 #include "lue/framework/algorithm/range.hpp"
 #include "lue/framework/algorithm/serialize/kernel.hpp"
 #include "lue/framework/algorithm/value_policies/focal_high_pass.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/focal_majority_test.cpp b/source/framework/algorithm/test/focal_majority_test.cpp
index d21544f10..71541d950 100644
--- a/source/framework/algorithm/test/focal_majority_test.cpp
+++ b/source/framework/algorithm/test/focal_majority_test.cpp
@@ -4,8 +4,6 @@
 #include "lue/framework/algorithm/range.hpp"
 #include "lue/framework/algorithm/serialize/kernel.hpp"
 #include "lue/framework/algorithm/value_policies/focal_majority.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/focal_maximum_test.cpp b/source/framework/algorithm/test/focal_maximum_test.cpp
index c9d1c8eaf..77428fa22 100644
--- a/source/framework/algorithm/test/focal_maximum_test.cpp
+++ b/source/framework/algorithm/test/focal_maximum_test.cpp
@@ -4,8 +4,6 @@
 #include "lue/framework/algorithm/range.hpp"
 #include "lue/framework/algorithm/serialize/kernel.hpp"
 #include "lue/framework/algorithm/value_policies/focal_maximum.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/focal_mean_test.cpp b/source/framework/algorithm/test/focal_mean_test.cpp
index 953a1bb23..54a84d969 100644
--- a/source/framework/algorithm/test/focal_mean_test.cpp
+++ b/source/framework/algorithm/test/focal_mean_test.cpp
@@ -4,8 +4,6 @@
 #include "lue/framework/algorithm/range.hpp"
 #include "lue/framework/algorithm/serialize/kernel.hpp"
 #include "lue/framework/algorithm/value_policies/focal_mean.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/focal_minimum_test.cpp b/source/framework/algorithm/test/focal_minimum_test.cpp
index 81622d66e..e51da9626 100644
--- a/source/framework/algorithm/test/focal_minimum_test.cpp
+++ b/source/framework/algorithm/test/focal_minimum_test.cpp
@@ -4,8 +4,6 @@
 #include "lue/framework/algorithm/range.hpp"
 #include "lue/framework/algorithm/serialize/kernel.hpp"
 #include "lue/framework/algorithm/value_policies/focal_minimum.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/focal_operation_test.cpp b/source/framework/algorithm/test/focal_operation_test.cpp
index 1cc374a3b..abc041b50 100644
--- a/source/framework/algorithm/test/focal_operation_test.cpp
+++ b/source/framework/algorithm/test/focal_operation_test.cpp
@@ -4,8 +4,6 @@
 #include "lue/framework/algorithm/kernel.hpp"
 #include "lue/framework/algorithm/policy/default_policies.hpp"
 #include "lue/framework/algorithm/serialize/kernel.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/focal_sum_test.cpp b/source/framework/algorithm/test/focal_sum_test.cpp
index 7daa56c19..a37521030 100644
--- a/source/framework/algorithm/test/focal_sum_test.cpp
+++ b/source/framework/algorithm/test/focal_sum_test.cpp
@@ -3,8 +3,6 @@
 #include "lue/framework/algorithm/kernel.hpp"
 #include "lue/framework/algorithm/range.hpp"
 #include "lue/framework/algorithm/value_policies/focal_sum.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/greater_than_equal_to_test.cpp b/source/framework/algorithm/test/greater_than_equal_to_test.cpp
index a4d95a125..cebf608d7 100644
--- a/source/framework/algorithm/test/greater_than_equal_to_test.cpp
+++ b/source/framework/algorithm/test/greater_than_equal_to_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/greater_than_equal_to.hpp"
 #include "lue/framework/algorithm/default_policies/none.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/greater_than_test.cpp b/source/framework/algorithm/test/greater_than_test.cpp
index 4d332ef23..2df516d1c 100644
--- a/source/framework/algorithm/test/greater_than_test.cpp
+++ b/source/framework/algorithm/test/greater_than_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/greater_than.hpp"
 #include "lue/framework/algorithm/default_policies/none.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/inflow_count_test.cpp b/source/framework/algorithm/test/inflow_count_test.cpp
index c233b4393..018fdab38 100644
--- a/source/framework/algorithm/test/inflow_count_test.cpp
+++ b/source/framework/algorithm/test/inflow_count_test.cpp
@@ -3,8 +3,6 @@
 #include "lue/framework/algorithm/definition/inflow_count3.hpp"
 #include "lue/framework/algorithm/inflow_count.hpp"
 #include "lue/framework/algorithm/policy.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/inter_partition_stream_test.cpp b/source/framework/algorithm/test/inter_partition_stream_test.cpp
index 64b3eaa0d..bd81d61cb 100644
--- a/source/framework/algorithm/test/inter_partition_stream_test.cpp
+++ b/source/framework/algorithm/test/inter_partition_stream_test.cpp
@@ -1,10 +1,7 @@
 #define BOOST_TEST_MODULE lue framework algorithm inter_partition_stream
 #include "flow_accumulation.hpp"
-#include "stream.hpp"
 #include "lue/framework/algorithm/inter_partition_stream.hpp"
 #include "lue/framework/algorithm/policy.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/hpx_unit_test.hpp"
 
 
 namespace {
@@ -19,6 +16,22 @@ namespace {
 }  // Anonymous namespace
 
 
+// Forward declare check_component_is_equal ...
+namespace lue::test {
+
+    template<typename Index, Rank rank>
+    void check_component_is_equal(
+        ::ArrayPartitionIO<Index, rank> const& array_partition_io_we_have,
+        ::ArrayPartitionIO<Index, rank> const& array_partition_io_we_want);
+
+}  // namespace lue::test
+
+
+// ... and only now include compare.hpp which uses check_component_is_equal
+#include "lue/framework/test/hpx_unit_test.hpp"
+#include "stream.hpp"
+
+
 namespace lue::test {
 
     template<typename Index, Rank rank>
@@ -104,8 +117,8 @@ namespace lue::test {
 }  // namespace lue::test
 
 
-// Only now include this header. void check_component_is_equal must have been seen first.
-#include "lue/framework/test/compare.hpp"
+// // Only now include this header. void check_component_is_equal must have been seen first.
+// #include "lue/framework/test/compare.hpp"
 
 
 namespace {
diff --git a/source/framework/algorithm/test/iterate_per_element_test.cpp b/source/framework/algorithm/test/iterate_per_element_test.cpp
index 4a1bcca97..48d71bc22 100644
--- a/source/framework/algorithm/test/iterate_per_element_test.cpp
+++ b/source/framework/algorithm/test/iterate_per_element_test.cpp
@@ -4,7 +4,6 @@
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
 #include "lue/framework/algorithm/default_policies/uniform.hpp"
 #include "lue/framework/algorithm/iterate_per_element.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/kernel_test.cpp b/source/framework/algorithm/test/kernel_test.cpp
index f40e1f7ca..8f5dcb561 100644
--- a/source/framework/algorithm/test/kernel_test.cpp
+++ b/source/framework/algorithm/test/kernel_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/framework/algorithm/kernel.hpp"
 #include "lue/framework/test/stream.hpp"
 #include <hpx/config.hpp>
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(kernel_bool_1d)
diff --git a/source/framework/algorithm/test/kinematic_wave_test.cpp b/source/framework/algorithm/test/kinematic_wave_test.cpp
index bbdd7052c..71c3dd4fc 100644
--- a/source/framework/algorithm/test/kinematic_wave_test.cpp
+++ b/source/framework/algorithm/test/kinematic_wave_test.cpp
@@ -3,8 +3,6 @@
 #include "lue/framework/algorithm/value_policies/all.hpp"
 #include "lue/framework/algorithm/value_policies/greater_than.hpp"
 #include "lue/framework/algorithm/value_policies/kinematic_wave.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/less_than_equal_to_test.cpp b/source/framework/algorithm/test/less_than_equal_to_test.cpp
index 8fdeda363..7463c80f5 100644
--- a/source/framework/algorithm/test/less_than_equal_to_test.cpp
+++ b/source/framework/algorithm/test/less_than_equal_to_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/less_than_equal_to.hpp"
 #include "lue/framework/algorithm/default_policies/none.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/less_than_test.cpp b/source/framework/algorithm/test/less_than_test.cpp
index 104d0befc..c65ebf9c5 100644
--- a/source/framework/algorithm/test/less_than_test.cpp
+++ b/source/framework/algorithm/test/less_than_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/less_than.hpp"
 #include "lue/framework/algorithm/default_policies/none.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/locality_id_test.cpp b/source/framework/algorithm/test/locality_id_test.cpp
index 877fd6aa2..88cc0d5ae 100644
--- a/source/framework/algorithm/test/locality_id_test.cpp
+++ b/source/framework/algorithm/test/locality_id_test.cpp
@@ -1,9 +1,7 @@
 #define BOOST_TEST_MODULE lue framework algorithm locality_id
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/locality_id.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
-#include "lue/framework/test/stream.hpp"
 
 
 namespace detail {
diff --git a/source/framework/algorithm/test/log10_test.cpp b/source/framework/algorithm/test/log10_test.cpp
index e9cdb7b88..1c81d8690 100644
--- a/source/framework/algorithm/test/log10_test.cpp
+++ b/source/framework/algorithm/test/log10_test.cpp
@@ -4,8 +4,6 @@
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
 #include "lue/framework/algorithm/default_policies/log10.hpp"
 #include "lue/framework/algorithm/value_policies/log10.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/log_test.cpp b/source/framework/algorithm/test/log_test.cpp
index dc4e017ad..f0d1ea5be 100644
--- a/source/framework/algorithm/test/log_test.cpp
+++ b/source/framework/algorithm/test/log_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
 #include "lue/framework/algorithm/default_policies/log.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/logical_and_test.cpp b/source/framework/algorithm/test/logical_and_test.cpp
index 0f0b9fdd1..70a139a99 100644
--- a/source/framework/algorithm/test/logical_and_test.cpp
+++ b/source/framework/algorithm/test/logical_and_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/logical_and.hpp"
 #include "lue/framework/algorithm/default_policies/none.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/logical_exclusive_or_test.cpp b/source/framework/algorithm/test/logical_exclusive_or_test.cpp
index 94b40347a..bd3a2577d 100644
--- a/source/framework/algorithm/test/logical_exclusive_or_test.cpp
+++ b/source/framework/algorithm/test/logical_exclusive_or_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/logical_exclusive_or.hpp"
 #include "lue/framework/algorithm/default_policies/none.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/logical_inclusive_or_test.cpp b/source/framework/algorithm/test/logical_inclusive_or_test.cpp
index 7548f5f75..6708449ab 100644
--- a/source/framework/algorithm/test/logical_inclusive_or_test.cpp
+++ b/source/framework/algorithm/test/logical_inclusive_or_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/logical_inclusive_or.hpp"
 #include "lue/framework/algorithm/default_policies/none.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/logical_not_test.cpp b/source/framework/algorithm/test/logical_not_test.cpp
index b1ea9e7a8..5669a7407 100644
--- a/source/framework/algorithm/test/logical_not_test.cpp
+++ b/source/framework/algorithm/test/logical_not_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/logical_not.hpp"
 #include "lue/framework/algorithm/default_policies/none.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/maximum_test.cpp b/source/framework/algorithm/test/maximum_test.cpp
index 048faf72c..873e64d1e 100644
--- a/source/framework/algorithm/test/maximum_test.cpp
+++ b/source/framework/algorithm/test/maximum_test.cpp
@@ -2,7 +2,6 @@
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/default_policies/maximum.hpp"
 #include "lue/framework/algorithm/range.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/mesh_grid_test.cpp b/source/framework/algorithm/test/mesh_grid_test.cpp
index 34b7b46fc..937e80317 100644
--- a/source/framework/algorithm/test/mesh_grid_test.cpp
+++ b/source/framework/algorithm/test/mesh_grid_test.cpp
@@ -2,9 +2,7 @@
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/mesh_grid.hpp"
 #include "lue/framework/core/component.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
-#include "lue/framework/test/stream.hpp"
 
 
 BOOST_AUTO_TEST_CASE(use_case_1)
diff --git a/source/framework/algorithm/test/minimum_test.cpp b/source/framework/algorithm/test/minimum_test.cpp
index 4ca3e059d..74cad278a 100644
--- a/source/framework/algorithm/test/minimum_test.cpp
+++ b/source/framework/algorithm/test/minimum_test.cpp
@@ -2,7 +2,6 @@
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/default_policies/minimum.hpp"
 #include "lue/framework/algorithm/range.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/multiply_test.cpp b/source/framework/algorithm/test/multiply_test.cpp
index f81e907ea..87f0da89d 100644
--- a/source/framework/algorithm/test/multiply_test.cpp
+++ b/source/framework/algorithm/test/multiply_test.cpp
@@ -6,7 +6,6 @@
 #include "lue/framework/algorithm/value_policies/multiply.hpp"
 #include "lue/framework/algorithm/value_policies/none.hpp"
 #include "lue/framework/algorithm/value_policies/valid.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/negate_test.cpp b/source/framework/algorithm/test/negate_test.cpp
index 0818017a9..b5f9915eb 100644
--- a/source/framework/algorithm/test/negate_test.cpp
+++ b/source/framework/algorithm/test/negate_test.cpp
@@ -3,13 +3,10 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
 #include "lue/framework/algorithm/default_policies/negate.hpp"
-
 #include "lue/framework/algorithm/value_policies/all.hpp"
 #include "lue/framework/algorithm/value_policies/negate.hpp"
 #include "lue/framework/algorithm/value_policies/none.hpp"
 #include "lue/framework/algorithm/value_policies/valid.hpp"
-
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 #include <limits>
 
diff --git a/source/framework/algorithm/test/none_test.cpp b/source/framework/algorithm/test/none_test.cpp
index f09f1ab8e..90aa5cf5d 100644
--- a/source/framework/algorithm/test/none_test.cpp
+++ b/source/framework/algorithm/test/none_test.cpp
@@ -1,11 +1,8 @@
 #define BOOST_TEST_MODULE lue framework algorithm none
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/default_policies/none.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
-#include "lue/framework/test/stream.hpp"
-
 
 namespace detail {
 
diff --git a/source/framework/algorithm/test/normal_test.cpp b/source/framework/algorithm/test/normal_test.cpp
index d0a252a42..014df89f2 100644
--- a/source/framework/algorithm/test/normal_test.cpp
+++ b/source/framework/algorithm/test/normal_test.cpp
@@ -4,7 +4,6 @@
 #include "lue/framework/algorithm/default_policies/comparison.hpp"
 #include "lue/framework/algorithm/default_policies/logical_and.hpp"
 #include "lue/framework/algorithm/default_policies/normal.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/not_equal_to_test.cpp b/source/framework/algorithm/test/not_equal_to_test.cpp
index 3145d1cc2..ee45c6193 100644
--- a/source/framework/algorithm/test/not_equal_to_test.cpp
+++ b/source/framework/algorithm/test/not_equal_to_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/none.hpp"
 #include "lue/framework/algorithm/default_policies/not_equal_to.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/out_of_range_test.cpp b/source/framework/algorithm/test/out_of_range_test.cpp
index 5b53872c5..98c663de6 100644
--- a/source/framework/algorithm/test/out_of_range_test.cpp
+++ b/source/framework/algorithm/test/out_of_range_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm out_of_range
 #include "lue/framework/algorithm/out_of_range.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 namespace {
diff --git a/source/framework/algorithm/test/partition_count_unique_test.cpp b/source/framework/algorithm/test/partition_count_unique_test.cpp
index 7c97f0545..fe3b84213 100644
--- a/source/framework/algorithm/test/partition_count_unique_test.cpp
+++ b/source/framework/algorithm/test/partition_count_unique_test.cpp
@@ -2,8 +2,6 @@
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/partition_count_unique.hpp"
 #include "lue/framework/algorithm/range.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/pow_test.cpp b/source/framework/algorithm/test/pow_test.cpp
index d9ae0880f..ddd0d4fd4 100644
--- a/source/framework/algorithm/test/pow_test.cpp
+++ b/source/framework/algorithm/test/pow_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
 #include "lue/framework/algorithm/definition/pow.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/range_test.cpp b/source/framework/algorithm/test/range_test.cpp
index b3ff10614..9adc7f716 100644
--- a/source/framework/algorithm/test/range_test.cpp
+++ b/source/framework/algorithm/test/range_test.cpp
@@ -1,11 +1,7 @@
 #define BOOST_TEST_MODULE lue framework algorithm range
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/range.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
-#include <boost/test/tools/old/interface.hpp>
-#include <fmt/format.h>
 
 
 BOOST_AUTO_TEST_CASE(range_2d_int32)
diff --git a/source/framework/algorithm/test/round_test.cpp b/source/framework/algorithm/test/round_test.cpp
index 289badd2d..1eb9c0f68 100644
--- a/source/framework/algorithm/test/round_test.cpp
+++ b/source/framework/algorithm/test/round_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm round
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/value_policies/round.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/sin_test.cpp b/source/framework/algorithm/test/sin_test.cpp
index 60614ad93..76a177e28 100644
--- a/source/framework/algorithm/test/sin_test.cpp
+++ b/source/framework/algorithm/test/sin_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
 #include "lue/framework/algorithm/default_policies/sin.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/slope_test.cpp b/source/framework/algorithm/test/slope_test.cpp
index 16d6de99b..0edd02c84 100644
--- a/source/framework/algorithm/test/slope_test.cpp
+++ b/source/framework/algorithm/test/slope_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm slope
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/value_policies/slope.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 #include "lue/define.hpp"  // LUE_UNUSED
 
diff --git a/source/framework/algorithm/test/sqrt_test.cpp b/source/framework/algorithm/test/sqrt_test.cpp
index bc92eb810..988f76f38 100644
--- a/source/framework/algorithm/test/sqrt_test.cpp
+++ b/source/framework/algorithm/test/sqrt_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
 #include "lue/framework/algorithm/default_policies/sqrt.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/subtract_test.cpp b/source/framework/algorithm/test/subtract_test.cpp
index 4ec468ffd..2429fa9e3 100644
--- a/source/framework/algorithm/test/subtract_test.cpp
+++ b/source/framework/algorithm/test/subtract_test.cpp
@@ -6,7 +6,6 @@
 #include "lue/framework/algorithm/value_policies/none.hpp"
 #include "lue/framework/algorithm/value_policies/subtract.hpp"
 #include "lue/framework/algorithm/value_policies/valid.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/sum_test.cpp b/source/framework/algorithm/test/sum_test.cpp
index ca7ab005e..10e25942f 100644
--- a/source/framework/algorithm/test/sum_test.cpp
+++ b/source/framework/algorithm/test/sum_test.cpp
@@ -1,7 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm sum
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/value_policies/sum.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/tan_test.cpp b/source/framework/algorithm/test/tan_test.cpp
index f387ae886..26f565d08 100644
--- a/source/framework/algorithm/test/tan_test.cpp
+++ b/source/framework/algorithm/test/tan_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/all.hpp"
 #include "lue/framework/algorithm/default_policies/equal_to.hpp"
 #include "lue/framework/algorithm/default_policies/tan.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/timestamp_test.cpp b/source/framework/algorithm/test/timestamp_test.cpp
index 206682b36..b1f4a5c1e 100644
--- a/source/framework/algorithm/test/timestamp_test.cpp
+++ b/source/framework/algorithm/test/timestamp_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm timestamp
 #include "lue/framework/algorithm/default_policies/uniform.hpp"
 #include "lue/framework/algorithm/timestamp.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/uniform_test.cpp b/source/framework/algorithm/test/uniform_test.cpp
index ec255eafa..8cf3da51b 100644
--- a/source/framework/algorithm/test/uniform_test.cpp
+++ b/source/framework/algorithm/test/uniform_test.cpp
@@ -4,7 +4,6 @@
 #include "lue/framework/algorithm/default_policies/comparison.hpp"
 #include "lue/framework/algorithm/default_policies/logical_and.hpp"
 #include "lue/framework/algorithm/default_policies/uniform.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/unique_id_test.cpp b/source/framework/algorithm/test/unique_id_test.cpp
index c876dd999..96d1cc001 100644
--- a/source/framework/algorithm/test/unique_id_test.cpp
+++ b/source/framework/algorithm/test/unique_id_test.cpp
@@ -2,9 +2,7 @@
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/default_policies/unique.hpp"
 #include "lue/framework/algorithm/default_policies/unique_id.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
-#include "lue/framework/test/stream.hpp"
 
 
 namespace detail {
diff --git a/source/framework/algorithm/test/unique_test.cpp b/source/framework/algorithm/test/unique_test.cpp
index 97f486f4d..579673d59 100644
--- a/source/framework/algorithm/test/unique_test.cpp
+++ b/source/framework/algorithm/test/unique_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/value_policies/unique.hpp"
 #include "lue/framework/algorithm/value_policies/unique_id.hpp"
 #include "lue/framework/algorithm/value_policies/valid.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/upstream_test.cpp b/source/framework/algorithm/test/upstream_test.cpp
index 8fb47ac17..8d8091553 100644
--- a/source/framework/algorithm/test/upstream_test.cpp
+++ b/source/framework/algorithm/test/upstream_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm upstream
 #include "flow_accumulation.hpp"
 #include "lue/framework/algorithm/definition/upstream.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/valid_test.cpp b/source/framework/algorithm/test/valid_test.cpp
index 19acd4296..beb7de6b2 100644
--- a/source/framework/algorithm/test/valid_test.cpp
+++ b/source/framework/algorithm/test/valid_test.cpp
@@ -10,7 +10,6 @@
 #include "lue/framework/algorithm/value_policies/not_equal_to.hpp"
 #include "lue/framework/algorithm/value_policies/valid.hpp"
 #include "lue/framework/algorithm/value_policies/where.hpp"
-#include "lue/framework/test/array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/where_test.cpp b/source/framework/algorithm/test/where_test.cpp
index 0ba83c900..458034c7b 100644
--- a/source/framework/algorithm/test/where_test.cpp
+++ b/source/framework/algorithm/test/where_test.cpp
@@ -2,7 +2,6 @@
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/default_policies/where.hpp"
 #include "lue/framework/algorithm/value_policies/where.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/zonal_area_test.cpp b/source/framework/algorithm/test/zonal_area_test.cpp
index a169c6aba..1b9cbbf96 100644
--- a/source/framework/algorithm/test/zonal_area_test.cpp
+++ b/source/framework/algorithm/test/zonal_area_test.cpp
@@ -2,8 +2,6 @@
 #include "lue/framework/algorithm/array_partition_id.hpp"
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/value_policies/zonal_area.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/zonal_diversity_test.cpp b/source/framework/algorithm/test/zonal_diversity_test.cpp
index 5a3f8742c..7b296e04e 100644
--- a/source/framework/algorithm/test/zonal_diversity_test.cpp
+++ b/source/framework/algorithm/test/zonal_diversity_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm zonal_diversity
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/value_policies/zonal_diversity.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/zonal_majority_test.cpp b/source/framework/algorithm/test/zonal_majority_test.cpp
index c6773e520..42329b06a 100644
--- a/source/framework/algorithm/test/zonal_majority_test.cpp
+++ b/source/framework/algorithm/test/zonal_majority_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm zonal_majority
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/value_policies/zonal_majority.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/zonal_maximum_test.cpp b/source/framework/algorithm/test/zonal_maximum_test.cpp
index 45394e859..63907bed1 100644
--- a/source/framework/algorithm/test/zonal_maximum_test.cpp
+++ b/source/framework/algorithm/test/zonal_maximum_test.cpp
@@ -2,8 +2,6 @@
 #include "lue/framework/algorithm/array_partition_id.hpp"
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/value_policies/zonal_maximum.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/zonal_mean_test.cpp b/source/framework/algorithm/test/zonal_mean_test.cpp
index 8dbcd3bad..e1969fa99 100644
--- a/source/framework/algorithm/test/zonal_mean_test.cpp
+++ b/source/framework/algorithm/test/zonal_mean_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework algorithm zonal_mean
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/value_policies/zonal_mean.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/zonal_minimum_test.cpp b/source/framework/algorithm/test/zonal_minimum_test.cpp
index 1b5c4e8cb..cb6e87ae0 100644
--- a/source/framework/algorithm/test/zonal_minimum_test.cpp
+++ b/source/framework/algorithm/test/zonal_minimum_test.cpp
@@ -2,8 +2,6 @@
 #include "lue/framework/algorithm/array_partition_id.hpp"
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/value_policies/zonal_minimum.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/zonal_normal_test.cpp b/source/framework/algorithm/test/zonal_normal_test.cpp
index 1eef04855..9f9a3ce5f 100644
--- a/source/framework/algorithm/test/zonal_normal_test.cpp
+++ b/source/framework/algorithm/test/zonal_normal_test.cpp
@@ -4,8 +4,6 @@
 #include "lue/framework/algorithm/value_policies/all.hpp"
 #include "lue/framework/algorithm/value_policies/comparison.hpp"
 #include "lue/framework/algorithm/value_policies/zonal_normal.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/zonal_sum_test.cpp b/source/framework/algorithm/test/zonal_sum_test.cpp
index 327dee995..37c28d663 100644
--- a/source/framework/algorithm/test/zonal_sum_test.cpp
+++ b/source/framework/algorithm/test/zonal_sum_test.cpp
@@ -3,8 +3,6 @@
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/algorithm/range.hpp"
 #include "lue/framework/algorithm/value_policies/zonal_sum.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/algorithm/test/zonal_uniform_test.cpp b/source/framework/algorithm/test/zonal_uniform_test.cpp
index ef22ba835..0e1627b5d 100644
--- a/source/framework/algorithm/test/zonal_uniform_test.cpp
+++ b/source/framework/algorithm/test/zonal_uniform_test.cpp
@@ -4,8 +4,6 @@
 #include "lue/framework/algorithm/value_policies/all.hpp"
 #include "lue/framework/algorithm/value_policies/comparison.hpp"
 #include "lue/framework/algorithm/value_policies/zonal_uniform.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/core/test/CMakeLists.txt b/source/framework/core/test/CMakeLists.txt
index 96ae8c39d..3c6d75d62 100644
--- a/source/framework/core/test/CMakeLists.txt
+++ b/source/framework/core/test/CMakeLists.txt
@@ -1,4 +1,3 @@
-set(scope lue_framework_core)
 set(names
     array
     array_visitor
@@ -12,36 +11,24 @@ set(names
     span
 )
 
-foreach(name ${names})
-    set(module_name ${name}_test)
-    string(REPLACE "/" "_" test_name ${scope}_${module_name})
-
-    add_executable(${test_name} ${module_name}.cpp)
-
-    target_compile_definitions(${test_name}
-        PRIVATE
-            BOOST_TEST_DYN_LINK
-    )
-
-    target_link_libraries(${test_name}
-        PRIVATE
-            lue::framework_test
-            Boost::unit_test_framework
-    )
+add_unit_tests(
+    SCOPE lue_framework_core
+    NAMES ${names}
+    LIBRARIES
+        lue::framework_test
+    TARGETS
+        test_names
+)
 
-    add_test(NAME ${test_name}
-        COMMAND ${test_name}
+foreach(test_name ${test_names})
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:hdf5::hdf5>/../bin>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:HPX::component_storage_component>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
     )
-
-    if(WIN32)
-        # Ensure required DLLs can be found at runtime
-        set_property(
-            TEST
-                ${test_name}
-            APPEND
-            PROPERTY
-                ENVIRONMENT_MODIFICATION
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:HPX::component_storage_component>
-        )
-    endif()
 endforeach()
diff --git a/source/framework/core/test/array_test.cpp b/source/framework/core/test/array_test.cpp
index a270e302d..a4ad5bdf3 100644
--- a/source/framework/core/test/array_test.cpp
+++ b/source/framework/core/test/array_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/framework/core/array.hpp"
 #include "lue/framework/test/stream.hpp"
 #include <hpx/config.hpp>
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(rank)
diff --git a/source/framework/core/test/array_visitor_test.cpp b/source/framework/core/test/array_visitor_test.cpp
index 63633f4bd..5c057d7de 100644
--- a/source/framework/core/test/array_visitor_test.cpp
+++ b/source/framework/core/test/array_visitor_test.cpp
@@ -3,7 +3,7 @@
 #include "lue/framework/core/shape.hpp"
 #include "lue/framework/test/stream.hpp"
 #include <hpx/config.hpp>
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 namespace {
diff --git a/source/framework/core/test/configuration_entry_test.cpp b/source/framework/core/test/configuration_entry_test.cpp
index 1731df89e..b80f3f2f3 100644
--- a/source/framework/core/test/configuration_entry_test.cpp
+++ b/source/framework/core/test/configuration_entry_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue framework core configuration_entry
 #include "lue/framework/core/configuration_entry.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(cast_vector_uint64)
diff --git a/source/framework/core/test/domain_decomposition_test.cpp b/source/framework/core/test/domain_decomposition_test.cpp
index 73a280e66..af064cdfd 100644
--- a/source/framework/core/test/domain_decomposition_test.cpp
+++ b/source/framework/core/test/domain_decomposition_test.cpp
@@ -3,7 +3,7 @@
 #include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/stream.hpp"
 #include <hpx/config.hpp>
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(nr_2d_partitions)
diff --git a/source/framework/core/test/hilbert_curve_test.cpp b/source/framework/core/test/hilbert_curve_test.cpp
index 4def2cd88..dbe02c2cf 100644
--- a/source/framework/core/test/hilbert_curve_test.cpp
+++ b/source/framework/core/test/hilbert_curve_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/framework/core/hilbert_curve.hpp"
 #include "lue/framework/test/stream.hpp"
 #include <hpx/config.hpp>
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 #include <tuple>
 #include <vector>
 
diff --git a/source/framework/core/test/index_util_test.cpp b/source/framework/core/test/index_util_test.cpp
index b138b573f..d616c8aaf 100644
--- a/source/framework/core/test/index_util_test.cpp
+++ b/source/framework/core/test/index_util_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue framework core index_util
 #include "lue/framework/core/index_util.hpp"
 #include <hpx/config.hpp>
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(d2)
diff --git a/source/framework/core/test/linear_curve_test.cpp b/source/framework/core/test/linear_curve_test.cpp
index 3449fa3f5..d55f51697 100644
--- a/source/framework/core/test/linear_curve_test.cpp
+++ b/source/framework/core/test/linear_curve_test.cpp
@@ -2,7 +2,7 @@
 #include "lue/framework/core/linear_curve.hpp"
 #include "lue/framework/test/stream.hpp"
 #include <hpx/config.hpp>
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 #include <tuple>
 #include <vector>
 
diff --git a/source/framework/core/test/math_test.cpp b/source/framework/core/test/math_test.cpp
index dcc505aba..8ccfdd116 100644
--- a/source/framework/core/test/math_test.cpp
+++ b/source/framework/core/test/math_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue framework core math
 #include "lue/framework/core/math.hpp"
 #include <hpx/config.hpp>
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 namespace detail {
diff --git a/source/framework/core/test/shape_test.cpp b/source/framework/core/test/shape_test.cpp
index 66a89c69f..d86139273 100644
--- a/source/framework/core/test/shape_test.cpp
+++ b/source/framework/core/test/shape_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue framework core shape
 #include "lue/framework/core/shape.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 namespace {
diff --git a/source/framework/core/test/span_test.cpp b/source/framework/core/test/span_test.cpp
index 3f788f4a6..a9a42e480 100644
--- a/source/framework/core/test/span_test.cpp
+++ b/source/framework/core/test/span_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue framework core span
 #include "lue/framework/core/span.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(dynamic_span_test)
diff --git a/source/framework/image_land/test/CMakeLists.txt b/source/framework/image_land/test/CMakeLists.txt
index 2a36b1d6f..57037e660 100644
--- a/source/framework/image_land/test/CMakeLists.txt
+++ b/source/framework/image_land/test/CMakeLists.txt
@@ -11,17 +11,12 @@ foreach(name ${names})
 
     add_executable(${test_name} ${module_name}.cpp)
 
-    target_compile_definitions(${test_name}
-        PRIVATE
-            BOOST_TEST_DYN_LINK
-    )
-
     target_link_libraries(${test_name}
         PRIVATE
             lue::image_land
             lue_framework_algorithm_test
             lue::framework_test
-            Boost::unit_test_framework
+            Boost::headers
     )
 
     add_test(NAME ${test_name}
diff --git a/source/framework/image_land/test/integrate_and_allocate_test.cpp b/source/framework/image_land/test/integrate_and_allocate_test.cpp
index 4c4485afa..5dd821ef4 100644
--- a/source/framework/image_land/test/integrate_and_allocate_test.cpp
+++ b/source/framework/image_land/test/integrate_and_allocate_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework image_land integrate_and_allocate
 #include "lue/framework/algorithm/value_policies/decreasing_order.hpp"
 #include "lue/framework/algorithm/value_policies/integrate_and_allocate.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/image_land/test/integrate_test.cpp b/source/framework/image_land/test/integrate_test.cpp
index 0f9ff96b9..115714285 100644
--- a/source/framework/image_land/test/integrate_test.cpp
+++ b/source/framework/image_land/test/integrate_test.cpp
@@ -1,8 +1,6 @@
 #define BOOST_TEST_MODULE lue framework image_land integrate
 #include "lue/framework/algorithm/value_policies/decreasing_order.hpp"
 #include "lue/framework/algorithm/value_policies/integrate.hpp"
-#include "lue/framework/test/array.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 
 
diff --git a/source/framework/io/test/CMakeLists.txt b/source/framework/io/test/CMakeLists.txt
index e889ab1ed..6f4c567e0 100644
--- a/source/framework/io/test/CMakeLists.txt
+++ b/source/framework/io/test/CMakeLists.txt
@@ -10,17 +10,12 @@ foreach(name ${names})
 
     add_executable(${test_name} ${module_name}.cpp)
 
-    target_compile_definitions(${test_name}
-        PRIVATE
-            BOOST_TEST_DYN_LINK
-    )
-
     target_link_libraries(${test_name}
         PRIVATE
             lue::framework_io
             lue::framework_test
             lue::data_model_hl
-            Boost::unit_test_framework
+            Boost::headers
     )
 
     add_test(NAME ${test_name}
@@ -33,16 +28,15 @@ foreach(name ${names})
                     "$<TARGET_FILE:${test_name}>"
     )
 
-    if(WIN32)
-        # Ensure required DLLs can be found at runtime
-        set_property(
-            TEST
-                ${test_name}
-            APPEND
-            PROPERTY
-                ENVIRONMENT_MODIFICATION
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:HPX::component_storage_component>
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:lue::framework_partitioned_array>
-        )
-    endif()
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:lue::framework_partitioned_array>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:HPX::component_storage_component>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:GDAL::GDAL>/../bin>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
+    )
 endforeach()
diff --git a/source/framework/io/test/raster_test.cpp b/source/framework/io/test/raster_test.cpp
index 28500c2e4..0bf871a21 100644
--- a/source/framework/io/test/raster_test.cpp
+++ b/source/framework/io/test/raster_test.cpp
@@ -1,7 +1,6 @@
 #define BOOST_TEST_MODULE lue framework io raster
 #include "lue/framework/algorithm/create_partitioned_array.hpp"
 #include "lue/framework/io/raster.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 #include "lue/gdal.hpp"
 #include <hpx/config.hpp>
diff --git a/source/framework/io/test/write_test.cpp b/source/framework/io/test/write_test.cpp
index cf2c83ec6..dc4b00076 100644
--- a/source/framework/io/test/write_test.cpp
+++ b/source/framework/io/test/write_test.cpp
@@ -3,7 +3,6 @@
 #include "lue/framework/algorithm/default_policies/uniform.hpp"
 #include "lue/framework/io/read_into.hpp"
 #include "lue/framework/io/write_into.hpp"
-#include "lue/framework/test/compare.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
 #include "lue/data_model/hl/raster_view.hpp"
 #include <hpx/config.hpp>
diff --git a/source/framework/model/test/CMakeLists.txt b/source/framework/model/test/CMakeLists.txt
index 5163c69a7..953ae7781 100644
--- a/source/framework/model/test/CMakeLists.txt
+++ b/source/framework/model/test/CMakeLists.txt
@@ -3,38 +3,26 @@ set(names
     model
 )
 
-foreach(name ${names})
-    set(module_name ${name}_test)
-    string(REPLACE "/" "_" test_name ${scope}_${module_name})
-
-    add_executable(${test_name} ${module_name}.cpp)
-
-    target_compile_definitions(${test_name}
-        PRIVATE
-            BOOST_TEST_DYN_LINK
-    )
-
-    target_link_libraries(${test_name}
-        PRIVATE
-            lue::framework_model
-            Boost::unit_test_framework
-    )
+add_unit_tests(
+    SCOPE ${scope}
+    NAMES ${names}
+    LIBRARIES
+        lue::framework_model
+    TARGETS
+        test_names
+)
 
-    add_test(NAME ${test_name}
-        COMMAND ${test_name}
+foreach(test_name ${test_names})
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:HPX::component_storage_component>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:GDAL::GDAL>/../bin>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
     )
-
-    if(WIN32)
-        # Ensure required DLLs can be found at runtime
-        set_property(
-            TEST
-                ${test_name}
-            APPEND
-            PROPERTY
-                ENVIRONMENT_MODIFICATION
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:HPX::component_storage_component>
-        )
-    endif()
 endforeach()
 
 set(names
@@ -56,7 +44,7 @@ foreach(name ${names})
         PRIVATE
             lue::framework_model
             lue::framework_test
-            Boost::unit_test_framework
+            Boost::headers
     )
 
     add_test(NAME ${test_name}
@@ -69,16 +57,15 @@ foreach(name ${names})
                     "$<TARGET_FILE:${test_name}>"
     )
 
-    if(WIN32)
-        # Ensure required DLLs can be found at runtime
-        set_property(
-            TEST
-                ${test_name}
-            APPEND
-            PROPERTY
-                ENVIRONMENT_MODIFICATION
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:HPX::component_storage_component>
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:lue::framework_partitioned_array>
-        )
-    endif()
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:lue::framework_partitioned_array>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:HPX::component_storage_component>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:GDAL::GDAL>/../bin>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
+    )
 endforeach()
diff --git a/source/framework/model/test/model_test.cpp b/source/framework/model/test/model_test.cpp
index e462bb2c4..586a34a87 100644
--- a/source/framework/model/test/model_test.cpp
+++ b/source/framework/model/test/model_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue framework model model
 #include "lue/framework/model/model.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(default_construct)
diff --git a/source/framework/partitioned_array/test/CMakeLists.txt b/source/framework/partitioned_array/test/CMakeLists.txt
index 32229a2f6..808495c71 100644
--- a/source/framework/partitioned_array/test/CMakeLists.txt
+++ b/source/framework/partitioned_array/test/CMakeLists.txt
@@ -4,38 +4,25 @@ set(names
     shared_buffer
 )
 
-foreach(name ${names})
-    set(module_name ${name}_test)
-    string(REPLACE "/" "_" test_name ${scope}_${module_name})
-
-    add_executable(${test_name} ${module_name}.cpp)
-
-    target_compile_definitions(${test_name}
-        PRIVATE
-            BOOST_TEST_DYN_LINK
-    )
-
-    target_link_libraries(${test_name}
-        PRIVATE
-            lue::framework_test
-            Boost::unit_test_framework
-    )
+add_unit_tests(
+    SCOPE ${scope}
+    NAMES ${names}
+    LIBRARIES
+        lue::framework_test
+    TARGETS
+        test_names
+)
 
-    add_test(NAME ${test_name}
-        COMMAND ${test_name}
+foreach(test_name ${test_names})
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:HPX::component_storage_component>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
     )
-
-    if(WIN32)
-        # Ensure required DLLs can be found at runtime
-        set_property(
-            TEST
-                ${test_name}
-            APPEND
-            PROPERTY
-                ENVIRONMENT_MODIFICATION
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:HPX::component_storage_component>
-        )
-    endif()
 endforeach()
 
 set(names
@@ -49,16 +36,11 @@ foreach(name ${names})
 
     add_executable(${test_name} ${module_name}.cpp)
 
-    target_compile_definitions(${test_name}
-        PRIVATE
-            BOOST_TEST_DYN_LINK
-    )
-
     target_link_libraries(${test_name}
         PRIVATE
             lue::framework_partitioned_array
             lue::framework_test
-            Boost::unit_test_framework
+            Boost::headers
     )
 
     add_test(NAME ${test_name}
@@ -71,16 +53,15 @@ foreach(name ${names})
                     "$<TARGET_FILE:${test_name}>"
     )
 
-    if(WIN32)
-        # Ensure required DLLs can be found at runtime
-        set_property(
-            TEST
-                ${test_name}
-            APPEND
-            PROPERTY
-                ENVIRONMENT_MODIFICATION
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:HPX::component_storage_component>
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:lue::framework_partitioned_array>
-        )
-    endif()
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:lue::framework_partitioned_array>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:HPX::component_storage_component>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:GDAL::GDAL>/../bin>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
+    )
 endforeach()
diff --git a/source/framework/partitioned_array/test/array_partition_data_test.cpp b/source/framework/partitioned_array/test/array_partition_data_test.cpp
index e179a2616..19bd23367 100644
--- a/source/framework/partitioned_array/test/array_partition_data_test.cpp
+++ b/source/framework/partitioned_array/test/array_partition_data_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue framework partitioned_array array_partition_data
 #include "lue/framework/partitioned_array/array_partition_data.hpp"
 #include "lue/framework/test/stream.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 #include <algorithm>
 
 
diff --git a/source/framework/partitioned_array/test/array_partition_test.cpp b/source/framework/partitioned_array/test/array_partition_test.cpp
index bb7820f86..259f52372 100644
--- a/source/framework/partitioned_array/test/array_partition_test.cpp
+++ b/source/framework/partitioned_array/test/array_partition_test.cpp
@@ -2,7 +2,6 @@
 #include "lue/framework/partitioned_array/array_partition.hpp"
 #include "lue/framework/partitioned_array/array_partition_data.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
-#include "lue/framework/test/stream.hpp"
 
 
 namespace {
diff --git a/source/framework/partitioned_array/test/partitioned_array_test.cpp b/source/framework/partitioned_array/test/partitioned_array_test.cpp
index 7b3e3e43e..46c71c08f 100644
--- a/source/framework/partitioned_array/test/partitioned_array_test.cpp
+++ b/source/framework/partitioned_array/test/partitioned_array_test.cpp
@@ -2,7 +2,6 @@
 #include "lue/framework/core/component.hpp"
 #include "lue/framework/partitioned_array.hpp"
 #include "lue/framework/test/hpx_unit_test.hpp"
-#include "lue/framework/test/stream.hpp"
 
 
 namespace {
diff --git a/source/framework/partitioned_array/test/shared_buffer_test.cpp b/source/framework/partitioned_array/test/shared_buffer_test.cpp
index fafa6c936..a04bb5fa2 100644
--- a/source/framework/partitioned_array/test/shared_buffer_test.cpp
+++ b/source/framework/partitioned_array/test/shared_buffer_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue framework partitioned_array shared_buffer
 #include "lue/framework/partitioned_array/shared_buffer.hpp"
 #include <hpx/config.hpp>
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 #include <numeric>
 
 
diff --git a/source/framework/partitioned_route/test/CMakeLists.txt b/source/framework/partitioned_route/test/CMakeLists.txt
index b9ab2a496..66df478ee 100644
--- a/source/framework/partitioned_route/test/CMakeLists.txt
+++ b/source/framework/partitioned_route/test/CMakeLists.txt
@@ -3,39 +3,26 @@ set(names
     serial_route_fragment
 )
 
-foreach(name ${names})
-    set(module_name ${name}_test)
-    string(REPLACE "/" "_" test_name ${scope}_${module_name})
-
-    add_executable(${test_name} ${module_name}.cpp)
-
-    target_compile_definitions(${test_name}
-        PRIVATE
-            BOOST_TEST_DYN_LINK
-    )
-
-    target_link_libraries(${test_name}
-        PRIVATE
-            lue::framework_partitioned_route
-            lue::framework_test
-            Boost::unit_test_framework
-    )
+add_unit_tests(
+    SCOPE ${scope}
+    NAMES ${names}
+    LIBRARIES
+        lue::framework_test
+        lue::framework_partitioned_route
+    TARGETS
+        test_names
+)
 
-    add_test(NAME ${test_name}
-        COMMAND ${test_name}
+foreach(test_name ${test_names})
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:HPX::component_storage_component>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
     )
-
-    if(WIN32)
-        # Ensure required DLLs can be found at runtime
-        set_property(
-            TEST
-                ${test_name}
-            APPEND
-            PROPERTY
-                ENVIRONMENT_MODIFICATION
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:HPX::component_storage_component>
-        )
-    endif()
 endforeach()
 
 set(names
@@ -49,16 +36,11 @@ foreach(name ${names})
 
     add_executable(${test_name} ${module_name}.cpp)
 
-    target_compile_definitions(${test_name}
-        PRIVATE
-            BOOST_TEST_DYN_LINK
-    )
-
     target_link_libraries(${test_name}
         PRIVATE
             lue::framework_partitioned_route
             lue::framework_test
-            Boost::unit_test_framework
+            Boost::headers
     )
 
     add_test(NAME ${test_name}
@@ -71,16 +53,15 @@ foreach(name ${names})
                     "$<TARGET_FILE:${test_name}>"
     )
 
-    if(WIN32)
-        # Ensure required DLLs can be found at runtime
-        set_property(
-            TEST
-                ${test_name}
-            APPEND
-            PROPERTY
-                ENVIRONMENT_MODIFICATION
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:HPX::component_storage_component>
-                    PATH=path_list_prepend:$<TARGET_FILE_DIR:lue::framework_partitioned_route>
-        )
-    endif()
+    set_property(
+        TEST
+            ${test_name}
+        APPEND
+        PROPERTY
+            ENVIRONMENT_MODIFICATION
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:lue::framework_partitioned_route>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:HPX::component_storage_component>>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:GDAL::GDAL>/../bin>
+                PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
+    )
 endforeach()
diff --git a/source/framework/partitioned_route/test/serial_route_fragment_test.cpp b/source/framework/partitioned_route/test/serial_route_fragment_test.cpp
index abe167d65..39ae41228 100644
--- a/source/framework/partitioned_route/test/serial_route_fragment_test.cpp
+++ b/source/framework/partitioned_route/test/serial_route_fragment_test.cpp
@@ -1,7 +1,7 @@
 #define BOOST_TEST_MODULE lue framework partitioned_route serial_route_fragment
 #include "lue/framework/partitioned_route/serial_route_fragment.hpp"
 #include "lue/stream.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 BOOST_AUTO_TEST_CASE(default_construct)
diff --git a/source/framework/python/test/CMakeLists.txt b/source/framework/python/test/CMakeLists.txt
index 437c53951..35df27a5a 100644
--- a/source/framework/python/test/CMakeLists.txt
+++ b/source/framework/python/test/CMakeLists.txt
@@ -22,6 +22,7 @@ set_property(
         ENVIRONMENT
             $<$<AND:$<NOT:$<PLATFORM_ID:Windows>>,$<STREQUAL:${HPX_WITH_MALLOC},tcmalloc>>:$<IF:$<PLATFORM_ID:Darwin>,DYLD_INSERT_LIBRARIES,LD_PRELOAD>=${TCMALLOC_LIBRARY}>
 )
+
 set_property(
     TEST
         lue_py_framework_python_test
@@ -30,8 +31,13 @@ set_property(
         # Add the path to our Python modules to PYTHONPATH.
         ENVIRONMENT_MODIFICATION
             PYTHONPATH=path_list_prepend:$<TARGET_FILE_DIR:lue::py>/..
-            PYTHONPATH=path_list_prepend:${CMAKE_CURRENT_SOURCE_DIR}
+            PYTHONPATH=path_list_prepend:${CMAKE_CURRENT_SOURCE_DIR}  # lue_unit_test.py
+
+            # This should not be necessary, but copying in all shared libs we depend on skips a few
+            PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:$<TARGET_FILE_DIR:hdf5::hdf5>/../bin>
+            PATH=path_list_prepend:$<$<PLATFORM_ID:Windows>:${HWLOC_ROOT}/bin>
 )
+
 set_property(
     TEST
         lue_py_framework_python_test
diff --git a/source/framework/python/test/python_test.cpp b/source/framework/python/test/python_test.cpp
index 1f338f81f..23680e7d9 100644
--- a/source/framework/python/test/python_test.cpp
+++ b/source/framework/python/test/python_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue py framework
 #include <boost/algorithm/string.hpp>
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 #include <pybind11/pybind11.h>
 
 
diff --git a/source/framework/test/CMakeLists.txt b/source/framework/test/CMakeLists.txt
index 8fc01cffd..7a29e773e 100644
--- a/source/framework/test/CMakeLists.txt
+++ b/source/framework/test/CMakeLists.txt
@@ -11,6 +11,6 @@ target_include_directories(lue_framework_test
 
 target_link_libraries(lue_framework_test
     INTERFACE
-        lue::framework_partitioned_array
+        lue::framework_algorithm  # create_partitioned_array
         lue::gdal
 )
diff --git a/source/framework/test/include/lue/framework/test/compare.hpp b/source/framework/test/include/lue/framework/test/compare.hpp
index 6865da4c8..69b53a676 100644
--- a/source/framework/test/include/lue/framework/test/compare.hpp
+++ b/source/framework/test/include/lue/framework/test/compare.hpp
@@ -2,7 +2,7 @@
 #include "lue/framework/core/component/component_array.hpp"
 #include "lue/framework/test/stream.hpp"
 #include <boost/range/irange.hpp>
-#include <boost/test/test_tools.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 namespace utf = boost::unit_test;
diff --git a/source/framework/test/include/lue/framework/test/hpx_unit_test.hpp b/source/framework/test/include/lue/framework/test/hpx_unit_test.hpp
index 0ed0cf4b9..ac0df610b 100644
--- a/source/framework/test/include/lue/framework/test/hpx_unit_test.hpp
+++ b/source/framework/test/include/lue/framework/test/hpx_unit_test.hpp
@@ -2,10 +2,12 @@
 #define BOOST_TEST_NO_MAIN
 #define BOOST_TEST_ALTERNATIVE_INIT_API
 #include "lue/gdal.hpp"
+#include "lue/framework/test/array.hpp"
+#include "lue/framework/test/compare.hpp"
 #include <hpx/config.hpp>
 #include <hpx/hpx_init.hpp>
 #include <boost/cstdlib.hpp>
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 
 
 // https://stellar-group.github.io/hpx/docs/html/hpx.html#hpx.manual.applications
diff --git a/source/shared/test/CMakeLists.txt b/source/shared/test/CMakeLists.txt
index c0747cd54..74cdd6b30 100644
--- a/source/shared/test/CMakeLists.txt
+++ b/source/shared/test/CMakeLists.txt
@@ -1,26 +1,12 @@
-set(scope lue_shared)
 set(names
     no_data
 )
 
-foreach(name ${names})
-    set(module_name ${name}_test)
-    string(REPLACE "/" "_" test_name ${scope}_${module_name})
-
-    add_executable(${test_name} ${module_name}.cpp)
-
-    target_compile_definitions(${test_name}
-        PRIVATE
-            BOOST_TEST_DYN_LINK
-    )
-
-    target_link_libraries(${test_name}
-        PRIVATE
-            lue::shared
-            Boost::unit_test_framework
-    )
-
-    add_test(NAME ${test_name}
-        COMMAND ${test_name}
-    )
-endforeach()
+add_unit_tests(
+    SCOPE lue_shared
+    NAMES ${names}
+    LIBRARIES
+        lue::shared
+    TARGETS
+        test_names
+)
diff --git a/source/shared/test/no_data_test.cpp b/source/shared/test/no_data_test.cpp
index 663c5ad35..49ea8cbd2 100644
--- a/source/shared/test/no_data_test.cpp
+++ b/source/shared/test/no_data_test.cpp
@@ -1,6 +1,6 @@
 #define BOOST_TEST_MODULE lue shared no_data
 #include "lue/no_data.hpp"
-#include <boost/test/unit_test.hpp>
+#include <boost/test/included/unit_test.hpp>
 #include <cstdint>