diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 1df5176d..aaabaa71 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -391,15 +391,22 @@ jobs:
             [ -d "$cmake_test_folder" ] || cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_subdir_test"
             cd "$cmake_test_folder"
             mkdir __build_cmake_subdir_test__ && cd __build_cmake_subdir_test__
-            cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=OFF -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} ..
+            extra_args=""
+            # On Windows DLLs need to be either in PATH or in the same folder as the executable, so put all binaries into the same folder
+            if [[ "$RUNNER_OS" == "Windows" ]] && [[ "${{matrix.build_shared}}" == "ON" ]]; then
+                extra_args="-DCMAKE_RUNTIME_OUTPUT_DIRECTORY='$(pwd)/bin'"
+            fi
+            cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=OFF -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} $extra_args ..
             cmake --build . --config ${{matrix.build_type}} -j$B2_JOBS
             ctest --output-on-failure --build-config ${{matrix.build_type}}
 
       - name: Install Library
         run: |
+            BCM_INSTALL_PATH=/tmp/boost_install
+            echo "BCM_INSTALL_PATH=$BCM_INSTALL_PATH" >> $GITHUB_ENV
             cd "$BOOST_ROOT"
             mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__
-            cmake -G "${{matrix.generator}}" -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_INSTALL_PREFIX=~/.local -DBoost_VERBOSE=ON -DBoost_DEBUG=ON ..
+            cmake -G "${{matrix.generator}}" -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBOOST_INCLUDE_LIBRARIES=$SELF -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_INSTALL_PREFIX="$BCM_INSTALL_PATH" -DBoost_VERBOSE=ON -DBoost_DEBUG=ON ..
             cmake --build . --target install --config ${{matrix.build_type}} -j$B2_JOBS
       - name: Run CMake install tests
         run: |
@@ -407,6 +414,14 @@ jobs:
             [ -d "$cmake_test_folder" ] || cmake_test_folder="$BOOST_ROOT/libs/$SELF/test/cmake_install_test"
             cd "$cmake_test_folder"
             mkdir __build_cmake_install_test__ && cd __build_cmake_install_test__
-            cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=ON -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_PREFIX_PATH=~/.local ..
+            cmake -G "${{matrix.generator}}" -DBOOST_CI_INSTALL_TEST=ON -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DBUILD_SHARED_LIBS=${{matrix.build_shared}} -DCMAKE_PREFIX_PATH="$BCM_INSTALL_PATH" ..
             cmake --build . --config ${{matrix.build_type}} -j$B2_JOBS
+            if [[ "${{matrix.build_shared}}" == "ON" ]]; then
+                # Make sure shared libs can be found at runtime
+                if [ "$RUNNER_OS" == "Windows" ]; then
+                    export PATH="$BCM_INSTALL_PATH/bin:$PATH"
+                else
+                    export LD_LIBRARY_PATH="$BCM_INSTALL_PATH/lib:$LD_LIBRARY_PATH"
+                fi
+            fi
             ctest --output-on-failure --build-config ${{matrix.build_type}}
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2c1630d4..09f5ec45 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,16 +7,22 @@ cmake_minimum_required(VERSION 3.5...3.16)
 
 project(boost_ci VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
 
-add_library(boost_boost_ci INTERFACE)
+add_library(boost_boost_ci src/boost_ci.cpp)
 add_library(Boost::boost_ci ALIAS boost_boost_ci)
 
-target_include_directories(boost_boost_ci INTERFACE include)
+target_include_directories(boost_boost_ci PUBLIC include)
 
 target_link_libraries(boost_boost_ci
-  INTERFACE
+  PUBLIC
     Boost::config
+  PRIVATE
+    Boost::atomic
 )
 
+if(BUILD_SHARED_LIBS)
+  target_compile_definitions(boost_boost_ci PUBLIC BOOST_BOOST_CI_DYN_LINK)
+endif()
+
 if(BUILD_TESTING)
   add_subdirectory(test)
 endif()
diff --git a/build/Jamfile.v2 b/build/Jamfile.v2
new file mode 100644
index 00000000..40239514
--- /dev/null
+++ b/build/Jamfile.v2
@@ -0,0 +1,25 @@
+# Boost CI Test Build Jamfile
+
+# Copyright (c) 2022 Alexander Grund
+# 
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE or www.boost.org/LICENSE_1_0.txt)
+
+import configure ;
+
+local requirements =
+  <link>shared:<define>BOOST_BOOST_CI_DYN_LINK=1
+  <library>/boost/atomic//boost_atomic
+  ;
+
+project boost/ci
+  : source-location ../src
+  : requirements $(requirements)
+  : usage-requirements $(requirements)
+  ;
+
+lib boost_ci
+  : boost_ci.cpp
+  ;
+
+boost-install boost_ci ;
diff --git a/include/boost/boost-ci/boost_ci.hpp b/include/boost/boost-ci/boost_ci.hpp
index b2d5f407..b5817fbb 100644
--- a/include/boost/boost-ci/boost_ci.hpp
+++ b/include/boost/boost-ci/boost_ci.hpp
@@ -11,6 +11,17 @@
 #include <memory>
 #endif
 
+// This define is usually set in boost/<libname>/config.hpp
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_BOOST_CI_DYN_LINK)
+#ifdef BOOST_BOOST_CI_SOURCE
+#define BOOST_BOOST_CI_DECL BOOST_SYMBOL_EXPORT
+#else
+#define BOOST_BOOST_CI_DECL BOOST_SYMBOL_IMPORT
+#endif
+#else
+#define BOOST_BOOST_CI_DECL
+#endif
+
 namespace boost
 {
   namespace boost_ci
@@ -21,25 +32,7 @@ namespace boost
 #define MSVC_VALUE false
 #endif
 
-    // Some function to test
-    BOOST_NOINLINE int get_answer(const bool isMsvc = MSVC_VALUE)
-    {
-      int answer;
-      // Specifically crafted condition to check for coverage from MSVC and non MSVC builds
-      if(isMsvc)
-      {
-        answer = 21;
-      } else
-      {
-        answer = 42;
-      }
-#ifdef BOOST_NO_CXX11_SMART_PTR
-      return answer;
-#else
-      // Just use some stdlib feature combined with a Boost.Config feature as demonstration
-      auto ptr = std::unique_ptr<int>(new int(answer));
-      return *ptr;
-#endif
-    }
+    // Some function to test. Returns 41 for true, 42 otherwise
+    BOOST_BOOST_CI_DECL int get_answer(bool isMsvc = MSVC_VALUE);
   }
 }
diff --git a/src/boost_ci.cpp b/src/boost_ci.cpp
new file mode 100644
index 00000000..1c3a43cf
--- /dev/null
+++ b/src/boost_ci.cpp
@@ -0,0 +1,47 @@
+//
+// Copyright (c) 2022 Alexander Grund
+//
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#define BOOST_BOOST_CI_SOURCE
+
+#include <boost/boost-ci/boost_ci.hpp>
+// Just some dependency on another Boost library
+#include <boost/atomic/atomic.hpp>
+
+// Some simple struct big enough so that the atomic is forced to use a lock
+// forcing it to call into the library
+struct X
+{
+  double x, y, z;
+  explicit X(int value = 0): x(value), y(value), z(value) {}
+};
+
+namespace boost
+{
+  namespace boost_ci
+  {
+    // Some function to test
+    int get_answer(const bool isMsvc)
+    {
+      boost::atomic<X> answer;
+      // Specifically crafted condition to check for coverage from MSVC and non MSVC builds
+      if(isMsvc)
+      {
+        answer = X(21);
+      } else
+      {
+        answer = X(42);
+      }
+#ifdef BOOST_NO_CXX11_SMART_PTR
+      return answer.load().x;
+#else
+      // Just use some stdlib feature combined with a Boost.Config feature as demonstration
+      auto ptr = std::unique_ptr<int>(new int(answer.load().x));
+      return *ptr;
+#endif
+    }
+  }
+}
diff --git a/test/Jamfile b/test/Jamfile
index fdbbeaba..db979644 100644
--- a/test/Jamfile
+++ b/test/Jamfile
@@ -8,9 +8,8 @@
 import os ;
 import testing ;
 
-project boost/ci/test
-    : requirements
-      <include>.
+project : requirements
+      <library>/boost/ci//boost_ci
     ;
 
 local B2_ADDRESS_MODEL = [ os.environ B2_ADDRESS_MODEL ] ;
diff --git a/test/cmake_test/CMakeLists.txt b/test/cmake_test/CMakeLists.txt
index 01efe823..429ada16 100644
--- a/test/cmake_test/CMakeLists.txt
+++ b/test/cmake_test/CMakeLists.txt
@@ -11,8 +11,27 @@ project(cmake_subdir_test LANGUAGES CXX)
 if(BOOST_CI_INSTALL_TEST)
     find_package(boost_boost_ci REQUIRED)
 else()
-    add_subdirectory(../.. boostorg/ci)
-    add_subdirectory(../../../config boostorg/config)
+    add_subdirectory(../.. boostorg/boost-ci)
+
+    set(deps
+      # Primary dependencies
+      atomic
+      config
+      core
+      # Secondary dependencies
+      align
+      assert
+      predef
+      preprocessor
+      static_assert
+      throw_exception
+      type_traits
+      winapi
+    )
+
+    foreach(dep IN LISTS deps)
+      add_subdirectory(../../../${dep} boostorg/${dep})
+    endforeach()
 endif()
 
 add_executable(main main.cpp)