diff --git a/include/sdbusplus/async/execution.hpp b/include/sdbusplus/async/execution.hpp
index 6120627..a7f02e7 100644
--- a/include/sdbusplus/async/execution.hpp
+++ b/include/sdbusplus/async/execution.hpp
@@ -14,5 +14,5 @@
 // reference to any parts of it we use internally.
 namespace sdbusplus::async
 {
-namespace execution = std::execution;
+namespace execution = stdexec;
 }
diff --git a/include/sdbusplus/async/stdexec/__detail/__config.hpp b/include/sdbusplus/async/stdexec/__detail/__config.hpp
index 99e4b4b..142bf16 100644
--- a/include/sdbusplus/async/stdexec/__detail/__config.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__config.hpp
@@ -15,6 +15,12 @@
  */
 #pragma once
 
+#if __cplusplus < 202002L
+#error This library requires the use of C++20.
+#endif
+
+#include <cassert>
+
 #define STDEXEC_CAT_(X, ...) X##__VA_ARGS__
 #define STDEXEC_CAT(X, ...) STDEXEC_CAT_(X, __VA_ARGS__)
 
@@ -60,3 +66,19 @@
 #ifndef STDEXEC_MSVC
 #define STDEXEC_MSVC() 0
 #endif
+
+#ifdef STDEXEC_ASSERT
+#error                                                                         \
+    "Redefinition of STDEXEC_ASSERT is not permitted. Define STDEXEC_ASSERT_FN instead."
+#endif
+
+#define STDEXEC_ASSERT(_X)                                                     \
+    do                                                                         \
+    {                                                                          \
+        static_assert(noexcept(_X));                                           \
+        STDEXEC_ASSERT_FN(_X);                                                 \
+    } while (false)
+
+#ifndef STDEXEC_ASSERT_FN
+#define STDEXEC_ASSERT_FN assert
+#endif
diff --git a/include/sdbusplus/async/stdexec/__detail/__intrusive_ptr.hpp b/include/sdbusplus/async/stdexec/__detail/__intrusive_ptr.hpp
index e045354..a79a353 100644
--- a/include/sdbusplus/async/stdexec/__detail/__intrusive_ptr.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__intrusive_ptr.hpp
@@ -15,8 +15,8 @@
  */
 #pragma once
 
-#include <sdbusplus/async/stdexec/__detail/__meta.hpp>
-#include <sdbusplus/async/stdexec/concepts.hpp>
+#include "../concepts.hpp"
+#include "__meta.hpp"
 
 #include <atomic>
 #include <memory>
diff --git a/include/sdbusplus/async/stdexec/__detail/__intrusive_queue.hpp b/include/sdbusplus/async/stdexec/__detail/__intrusive_queue.hpp
index 43751f4..1693cdc 100644
--- a/include/sdbusplus/async/stdexec/__detail/__intrusive_queue.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__intrusive_queue.hpp
@@ -16,6 +16,8 @@
  */
 #pragma once
 
+#include "__config.hpp"
+
 #include <cassert>
 #include <tuple>
 #include <utility>
@@ -47,7 +49,7 @@
 
     ~__intrusive_queue()
     {
-        assert(empty());
+        STDEXEC_ASSERT(empty());
     }
 
     static __intrusive_queue make_reversed(_Item* __list) noexcept
@@ -75,7 +77,7 @@
 
     [[nodiscard]] _Item* pop_front() noexcept
     {
-        assert(!empty());
+        STDEXEC_ASSERT(!empty());
         _Item* __item = std::exchange(__head_, __head_->*_Next);
         if (__head_ == nullptr)
         {
@@ -86,7 +88,7 @@
 
     void push_front(_Item* __item) noexcept
     {
-        assert(__item != nullptr);
+        STDEXEC_ASSERT(__item != nullptr);
         __item->*_Next = __head_;
         __head_ = __item;
         if (__tail_ == nullptr)
@@ -97,7 +99,7 @@
 
     void push_back(_Item* __item) noexcept
     {
-        assert(__item != nullptr);
+        STDEXEC_ASSERT(__item != nullptr);
         __item->*_Next = nullptr;
         if (__tail_ == nullptr)
         {
diff --git a/include/sdbusplus/async/stdexec/__detail/__meta.hpp b/include/sdbusplus/async/stdexec/__detail/__meta.hpp
index 61a939d..903e1b8 100644
--- a/include/sdbusplus/async/stdexec/__detail/__meta.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__meta.hpp
@@ -15,39 +15,16 @@
  */
 #pragma once
 
-#include <sdbusplus/async/stdexec/__detail/__config.hpp>
+#include "__config.hpp"
 
+#include <cassert>
 #include <exception>
 #include <type_traits>
 #include <utility>
 
-#ifdef STDEXEC_ASSERT
-#error                                                                         \
-    "Redefinition of STDEXEC_ASSERT is not permitted. Define STDEXEC_ASSERT_FN instead."
-#endif
-
-#define STDEXEC_ASSERT(_X)                                                     \
-    do                                                                         \
-    {                                                                          \
-        static_assert(noexcept(_X));                                           \
-        STDEXEC_ASSERT_FN(_X);                                                 \
-    } while (false)
-
-#ifndef STDEXEC_ASSERT_FN
-#define STDEXEC_ASSERT_FN stdexec::__stdexec_assert
-#endif
-
 namespace stdexec
 {
 
-inline constexpr void __stdexec_assert(bool valid)
-{
-    if (!valid)
-    {
-        std::terminate();
-    }
-}
-
 struct __
 {};
 
@@ -134,20 +111,39 @@
     using __f = _Fn<_Args...>;
 };
 
-template <template <class> class _Fn>
+template <template <class...> class _Fn>
 struct __q1
 {
     template <class _Arg>
     using __f = _Fn<_Arg>;
 };
 
-template <template <class, class> class _Fn>
+template <template <class...> class _Fn>
 struct __q2
 {
     template <class _First, class _Second>
     using __f = _Fn<_First, _Second>;
 };
 
+template <template <class...> class _Fn>
+struct __q3
+{
+    template <class _First, class _Second, class _Third>
+    using __f = _Fn<_First, _Second, _Third>;
+};
+
+template <template <class...> class _T, std::size_t _Count>
+struct __qN;
+template <template <class...> class _T>
+struct __qN<_T, 1u> : __q1<_T>
+{};
+template <template <class...> class _T>
+struct __qN<_T, 2u> : __q2<_T>
+{};
+template <template <class...> class _T>
+struct __qN<_T, 3u> : __q3<_T>
+{};
+
 template <template <class...> class _Fn, class... _Front>
 struct __mbind_front_q
 {
@@ -228,13 +224,6 @@
 template <class _Fn, class... _Back>
 using __mbind_back3 = __mbind_back_q3<_Fn::template __f, _Back...>;
 
-template <template <class, class, class> class _Fn>
-struct __q3
-{
-    template <class _First, class _Second, class _Third>
-    using __f = _Fn<_First, _Second, _Third>;
-};
-
 template <class _Fn, class... _Args>
 using __minvoke = typename _Fn::template __f<_Args...>;
 
@@ -272,6 +261,17 @@
 template <class _Fn, class _First, class _Second, class _Third>
 concept __minvocable3 = __valid3<_Fn::template __f, _First, _Second, _Third>;
 
+template <bool>
+struct __make_dependent_
+{
+    template <class _Ty>
+    using __f = _Ty;
+};
+template <class _NonDependent, class _Dependent>
+using __make_dependent_on =
+    __minvoke<__make_dependent_<sizeof(__types<_Dependent>*) == 0>,
+              _NonDependent>;
+
 template <class _Fn, class _Default, class... _Args>
 struct __with_default_
 {
@@ -291,49 +291,11 @@
     using __f = __t<__with_default_<_Fn, _Default, _Args...>>;
 };
 
-template <template <class...> class _T, class... _Args>
-    requires __valid<_T, _Args...>
-struct __defer_
-{
-    using __t = _T<_Args...>;
-};
-template <template <class...> class _T, class _A>
-    requires requires { typename _T<_A>; }
-struct __defer_<_T, _A>
-{
-    using __t = _T<_A>;
-};
-template <template <class...> class _T, class _A, class _B>
-    requires requires { typename _T<_A, _B>; }
-struct __defer_<_T, _A, _B>
-{
-    using __t = _T<_A, _B>;
-};
-template <template <class...> class _T, class _A, class _B, class _C>
-    requires requires { typename _T<_A, _B, _C>; }
-struct __defer_<_T, _A, _B, _C>
-{
-    using __t = _T<_A, _B, _C>;
-};
-template <template <class...> class _T, class _A, class _B, class _C, class _D>
-    requires requires { typename _T<_A, _B, _C, _D>; }
-struct __defer_<_T, _A, _B, _C, _D>
-{
-    using __t = _T<_A, _B, _C, _D>;
-};
-template <template <class...> class _T, class _A, class _B, class _C, class _D,
-          class _E>
-    requires requires { typename _T<_A, _B, _C, _D, _E>; }
-struct __defer_<_T, _A, _B, _C, _D, _E>
-{
-    using __t = _T<_A, _B, _C, _D, _E>;
-};
-
 template <template <class...> class _T>
-struct __defer
+struct __mdefer
 {
     template <class... _Args>
-    using __f = __t<__defer_<_T, _Args...>>;
+    using __f = __minvoke<__qN<_T, sizeof...(_Args)>, _Args...>;
 };
 
 template <class _T>
@@ -445,10 +407,20 @@
     using __f = __minvoke<_Fn, _Ts...>;
 };
 
+template <class _Fn, class _T>
+struct __uncurry_;
+template <class _Fn, template <class...> class _A, class... _As>
+    requires __minvocable<_Fn, _As...>
+struct __uncurry_<_Fn, _A<_As...>>
+{
+    using __t = __minvoke<_Fn, _As...>;
+};
 template <class _Fn>
-struct __uncurry : __concat<_Fn>
-{};
-
+struct __uncurry
+{
+    template <class _T>
+    using __f = __t<__uncurry_<_Fn, _T>>;
+};
 template <class _Fn, class _List>
 using __mapply = __minvoke<__uncurry<_Fn>, _List>;
 
@@ -563,22 +535,24 @@
     decltype((__declval<_Self>().*__memptr<_Member>(__declval<_Self>())));
 
 template <class... _As>
-    requires(sizeof...(_As) != 0)
-struct __front;
+struct __front_;
 template <class _A, class... _As>
-struct __front<_A, _As...>
+struct __front_<_A, _As...>
 {
     using __t = _A;
 };
 template <class... _As>
+    requires(sizeof...(_As) != 0)
+using __front = __t<__front_<_As...>>;
+template <class... _As>
     requires(sizeof...(_As) == 1)
-using __single_t = __t<__front<_As...>>;
+using __single = __front<_As...>;
 template <class _Ty>
 struct __single_or
 {
     template <class... _As>
         requires(sizeof...(_As) <= 1)
-    using __f = __t<__front<_As..., _Ty>>;
+    using __f = __front<_As..., _Ty>;
 };
 
 template <class _Fun, class... _As>
@@ -657,8 +631,133 @@
 template <class... _Ts>
 using __mindex_sequence_for = __mmake_index_sequence<sizeof...(_Ts)>;
 
+template <class _Fn, class _Continuation, class... _Args>
+struct __mfind_if_
+{
+    using __t = __minvoke<_Continuation, _Args...>;
+};
+template <class _Fn, class _Continuation, class _Head, class... _Tail>
+struct __mfind_if_<_Fn, _Continuation, _Head, _Tail...> :
+    __mfind_if_<_Fn, _Continuation, _Tail...>
+{};
+template <class _Fn, class _Continuation, class _Head, class... _Tail>
+    requires __v<__minvoke1<_Fn, _Head>>
+struct __mfind_if_<_Fn, _Continuation, _Head, _Tail...>
+{
+    using __t = __minvoke<_Continuation, _Head, _Tail...>;
+};
+template <class _Fn, class _Continuation = __q<__types>>
+struct __mfind_if
+{
+    template <class... _Args>
+    using __f = __t<__mfind_if_<_Fn, _Continuation, _Args...>>;
+};
+
+template <class _Fn>
+struct __mfind_if_i
+{
+    template <class... _Args>
+    using __f = __index<(sizeof...(_Args) -
+                         __v<__minvoke<__mfind_if<_Fn, __mcount>, _Args...>>)>;
+};
+
 template <class... _Bools>
 using __mand = __bool<(__v<_Bools> && ...)>;
 template <class... _Bools>
 using __mor = __bool<(__v<_Bools> || ...)>;
+template <class _Bool>
+using __mnot = __bool<!__v<_Bool>>;
+
+template <class _Fn>
+struct __mall_of
+{
+    template <class... _Args>
+    using __f = __mand<__minvoke1<_Fn, _Args>...>;
+};
+template <class _Fn>
+struct __mnone_of
+{
+    template <class... _Args>
+    using __f = __mand<__mnot<__minvoke1<_Fn, _Args>>...>;
+};
+template <class _Fn>
+struct __many_of
+{
+    template <class... _Args>
+    using __f = __mor<__minvoke1<_Fn, _Args>...>;
+};
+
+template <class _Ty>
+struct __mtypeof__
+{
+    using __t = _Ty;
+};
+template <class _Ty>
+using __mtypeof__t = __t<__mtypeof__<_Ty>>;
+template <class _Ret, class... _Args>
+    requires __callable<_Ret, __mtypeof__t<_Args>...>
+struct __mtypeof__<_Ret (*)(_Args...)>
+{
+    using __t = __call_result_t<_Ret, __mtypeof__t<_Args>...>;
+};
+template <class _Ty>
+struct __mtypeof_
+{};
+template <class _Ret, class... _Args>
+    requires __callable<_Ret, __mtypeof__t<_Args>...>
+struct __mtypeof_<_Ret(_Args...)>
+{
+    using __t = __call_result_t<_Ret, __mtypeof__t<_Args>...>;
+};
+template <class _Ty>
+using __mtypeof = __t<__mtypeof_<_Ty>>;
+
+template <class _Ty>
+using __mrequires = __bool<__valid1<__mtypeof, _Ty>>;
+template <class _Ty>
+concept __mrequires_v = __valid1<__mtypeof, _Ty>;
+
+template <class _Ty>
+inline constexpr bool __mnoexcept__ = true;
+template <class _Ret, class... _Args>
+    requires __callable<_Ret, __mtypeof__t<_Args>...>
+inline constexpr bool __mnoexcept__<_Ret (*)(_Args...)> =
+    (__mnoexcept__<_Args> && ...) &&
+    __nothrow_callable<_Ret, __mtypeof__t<_Args>...>;
+template <class _Ty>
+inline constexpr bool __mnoexcept_v = false;
+template <class _Ret, class... _Args>
+    requires __callable<_Ret, __mtypeof__t<_Args>...>
+inline constexpr bool __mnoexcept_v<_Ret(_Args...)> =
+    (__mnoexcept__<_Args> && ...) &&
+    __nothrow_callable<_Ret, __mtypeof__t<_Args>...>;
+template <class _Ty>
+using __mnoexcept = __bool<__mnoexcept_v<_Ty>>;
+
+template <class... _Sigs>
+struct __msignatures
+{
+    template <class _Continuation, class... _Extra>
+    using __f = __minvoke<_Continuation, _Sigs..., _Extra...>;
+};
+template <class _Signatures>
+using __many_well_formed =
+    __minvoke1<_Signatures, __many_of<__q1<__mrequires>>>;
+template <class _Signatures, class... _Extra>
+using __mwhich_t =
+    __minvoke<_Signatures, __mfind_if<__q1<__mrequires>, __q<__front>>,
+              _Extra...>;
+template <class _Signatures, class... _Extra>
+using __mwhich_i =
+    __index<(__v<__minvoke<_Signatures, __mcount, _Extra...>> -
+             __v<__minvoke<_Signatures, __mfind_if<__q1<__mrequires>, __mcount>,
+                           _Extra...>>)>;
+template <class _Ty, bool _Noexcept = true>
+struct __mconstruct
+{
+    template <class... _As>
+    auto operator()(_As&&... __as) const
+        noexcept(_Noexcept&& noexcept(_Ty((_As &&) __as...)))
+            -> decltype(_Ty((_As &&) __as...));
+};
 } // namespace stdexec
diff --git a/include/sdbusplus/async/stdexec/__detail/__p2300.hpp b/include/sdbusplus/async/stdexec/__detail/__p2300.hpp
index 7f4837d..b76f2ba 100644
--- a/include/sdbusplus/async/stdexec/__detail/__p2300.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__p2300.hpp
@@ -17,209 +17,365 @@
 
 // Internal header, do not include directly
 
+#ifdef STDEXEC_DISABLE_STD_DEPRECATIONS
+#define STDEXEC_STD_DEPRECATED
+#else
+#define STDEXEC_STD_DEPRECATED                                                 \
+    [[deprecated(                                                              \
+        "Please access this entity in the ::stdexec:: namespace. Define STDEXEC_DISABLE_STD_DEPRECATIONS to silence this warning.")]]
+#endif
+
 namespace std
 {
+//////////////////////////////////////////////////////////////////////////////
 // <functional>
-using stdexec::nothrow_tag_invocable;
-using stdexec::tag_invocable;
-using stdexec::tag_invoke;
-using stdexec::tag_invoke_result;
-using stdexec::tag_invoke_result_t;
-using stdexec::tag_t;
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::tag_invoke_t tag_invoke{};
 
+template <class _Tag, class... _Ts>
+using tag_invoke_result STDEXEC_STD_DEPRECATED =
+    stdexec::tag_invoke_result<_Tag, _Ts...>;
+
+template <class _Tag, class... _Ts>
+using tag_invoke_result_t STDEXEC_STD_DEPRECATED =
+    stdexec::tag_invoke_result_t<_Tag, _Ts...>;
+
+template <class _Tag, class... _Ts>
+concept tag_invocable /*STDEXEC_STD_DEPRECATED*/ =
+    stdexec::tag_invocable<_Tag, _Ts...>;
+
+template <class _Tag, class... _Ts>
+concept nothrow_tag_invocable /*STDEXEC_STD_DEPRECATED*/ =
+    stdexec::nothrow_tag_invocable<_Tag, _Ts...>;
+
+template <auto& _Tag>
+using tag_t STDEXEC_STD_DEPRECATED = stdexec::tag_t<_Tag>;
+
+//////////////////////////////////////////////////////////////////////////////
 // <stop_token>
-using stdexec::in_place_stop_callback;
-using stdexec::in_place_stop_source;
-using stdexec::in_place_stop_token;
-using stdexec::never_stop_token;
-using stdexec::stoppable_token;
-using stdexec::stoppable_token_for;
-using stdexec::unstoppable_token;
+template <class _Token>
+concept stoppable_token /*STDEXEC_STD_DEPRECATED*/ =
+    stdexec::stoppable_token<_Token>;
 
+template <class _Token, typename _Callback, typename _Initializer = _Callback>
+concept stoppable_token_for /*STDEXEC_STD_DEPRECATED*/ =
+    stdexec::stoppable_token_for<_Token, _Callback, _Initializer>;
+
+template <class _Token>
+concept unstoppable_token /*STDEXEC_STD_DEPRECATED*/ =
+    stdexec::unstoppable_token<_Token>;
+
+using never_stop_token STDEXEC_STD_DEPRECATED = stdexec::never_stop_token;
+using in_place_stop_token STDEXEC_STD_DEPRECATED = stdexec::in_place_stop_token;
+using in_place_stop_source STDEXEC_STD_DEPRECATED =
+    stdexec::in_place_stop_source;
+
+template <class _Callback>
+using in_place_stop_callback STDEXEC_STD_DEPRECATED =
+    stdexec::in_place_stop_callback<_Callback>;
+
+//////////////////////////////////////////////////////////////////////////////
+// <execution>
 namespace execution
 {
 // [exec.queries], general queries
-using stdexec::get_allocator;
-using stdexec::get_allocator_t;
-using stdexec::get_delegatee_scheduler;
-using stdexec::get_delegatee_scheduler_t;
-using stdexec::get_scheduler;
-using stdexec::get_scheduler_t;
-using stdexec::get_stop_token;
-using stdexec::get_stop_token_t;
+using get_scheduler_t STDEXEC_STD_DEPRECATED = stdexec::get_scheduler_t;
+using get_delegatee_scheduler_t STDEXEC_STD_DEPRECATED =
+    stdexec::get_delegatee_scheduler_t;
+using get_allocator_t STDEXEC_STD_DEPRECATED = stdexec::get_allocator_t;
+using get_stop_token_t STDEXEC_STD_DEPRECATED = stdexec::get_stop_token_t;
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::get_scheduler_t get_scheduler{};
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::get_delegatee_scheduler_t get_delegatee_scheduler{};
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::get_allocator_t get_allocator{};
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::get_stop_token_t get_stop_token{};
 
-using stdexec::stop_token_of_t;
+template <class _StopTokenProvider>
+using stop_token_of_t STDEXEC_STD_DEPRECATED =
+    stdexec::stop_token_of_t<_StopTokenProvider>;
 
 // [exec.env], execution environments
-using stdexec::get_env_t;
-using stdexec::no_env;
-// using stdexec::forwarding_env_query_t; // BUGBUG
-using stdexec::get_env;
-// using stdexec::forwarding_env_query; // BUGBUG
+using no_env STDEXEC_STD_DEPRECATED = stdexec::no_env;
+using get_env_t STDEXEC_STD_DEPRECATED = stdexec::get_env_t;
+// using forwarding_env_query_t STDEXEC_STD_DEPRECATED =
+// stdexec::forwarding_env_query_t; // BUGBUG
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::get_env_t get_env{};
+// inline constexpr stdexec::forwarding_env_query_t forwarding_env_query{}; //
+// BUGBUG
 
-using stdexec::env_of_t;
+template <class _EnvProvider>
+using env_of_t STDEXEC_STD_DEPRECATED = stdexec::env_of_t<_EnvProvider>;
 
 // [exec.sched], schedulers
-using stdexec::scheduler;
+template <class _Scheduler>
+concept scheduler /*STDEXEC_STD_DEPRECATED*/ = stdexec::scheduler<_Scheduler>;
 
 // [exec.sched_queries], scheduler queries
-using stdexec::forward_progress_guarantee;
-using stdexec::forwarding_scheduler_query;
-using stdexec::forwarding_scheduler_query_t;
-using stdexec::get_forward_progress_guarantee;
-using stdexec::get_forward_progress_guarantee_t;
+using forward_progress_guarantee STDEXEC_STD_DEPRECATED =
+    stdexec::forward_progress_guarantee;
+using forwarding_scheduler_query_t STDEXEC_STD_DEPRECATED =
+    stdexec::forwarding_scheduler_query_t;
+using get_forward_progress_guarantee_t STDEXEC_STD_DEPRECATED =
+    stdexec::get_forward_progress_guarantee_t;
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::forwarding_scheduler_query_t
+    forwarding_scheduler_query{};
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::get_forward_progress_guarantee_t
+    get_forward_progress_guarantee{};
 
 // [exec.recv], receivers
-using stdexec::receiver;
+template <class _Receiver>
+concept receiver /*STDEXEC_STD_DEPRECATED*/ = stdexec::receiver<_Receiver>;
 
-using stdexec::receiver_of;
+template <class _Receiver, class _Completions>
+concept receiver_of /*STDEXEC_STD_DEPRECATED*/ =
+    stdexec::receiver_of<_Receiver, _Completions>;
 
-using stdexec::set_error;
-using stdexec::set_error_t;
-using stdexec::set_stopped;
-using stdexec::set_stopped_t;
-using stdexec::set_value;
-using stdexec::set_value_t;
+using set_value_t STDEXEC_STD_DEPRECATED = stdexec::set_value_t;
+using set_error_t STDEXEC_STD_DEPRECATED = stdexec::set_error_t;
+using set_stopped_t STDEXEC_STD_DEPRECATED = stdexec::set_stopped_t;
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::set_value_t set_value{};
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::set_error_t set_error{};
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::set_stopped_t set_stopped{};
 
 // [exec.recv_queries], receiver queries
 // using stdexec::forwarding_receiver_query_t; // BUGBUG
 // using stdexec::forwarding_receiver_query; // BUGBUG
 
 // [exec.op_state], operation states
-using stdexec::operation_state;
+template <class _OpState>
+concept operation_state /*STDEXEC_STD_DEPRECATED*/ =
+    stdexec::operation_state<_OpState>;
 
-using stdexec::start;
-using stdexec::start_t;
+using start_t STDEXEC_STD_DEPRECATED = stdexec::start_t;
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::start_t start{};
 
 // [exec.snd], senders
-using stdexec::sender;
-using stdexec::sender_of;
-using stdexec::sender_to;
+template <class _Sender, class _Env = stdexec::no_env>
+concept sender /*STDEXEC_STD_DEPRECATED*/ = stdexec::sender<_Sender, _Env>;
+
+template <class _Sender, class _Receiver>
+concept sender_to /*STDEXEC_STD_DEPRECATED*/ =
+    stdexec::sender_to<_Sender, _Receiver>;
+
+template <class _Sender, class _SetSig, class _Env = stdexec::no_env>
+concept sender_of /*STDEXEC_STD_DEPRECATED*/ =
+    stdexec::sender_of<_Sender, _SetSig, _Env>;
 
 // [exec.sndtraits], completion signatures
-using stdexec::completion_signatures_of_t;
-using stdexec::get_completion_signatures;
-using stdexec::get_completion_signatures_t;
+using get_completion_signatures_t STDEXEC_STD_DEPRECATED =
+    stdexec::get_completion_signatures_t;
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::get_completion_signatures_t
+    get_completion_signatures{};
 
-using stdexec::dependent_completion_signatures;
+template <class _Sender, class _Env = stdexec::no_env>
+using completion_signatures_of_t STDEXEC_STD_DEPRECATED =
+    stdexec::completion_signatures_of_t<_Sender, _Env>;
 
-using stdexec::error_types_of_t;
-using stdexec::sends_stopped;
-using stdexec::value_types_of_t;
+template <class _Env>
+using dependent_completion_signatures STDEXEC_STD_DEPRECATED =
+    stdexec::dependent_completion_signatures<_Env>;
+
+template <class _Sender, class _Env = stdexec::no_env,
+          template <class...> class _Tuple = stdexec::__decayed_tuple,
+          template <class...> class _Variant = stdexec::__variant>
+using value_types_of_t STDEXEC_STD_DEPRECATED =
+    stdexec::value_types_of_t<_Sender, _Env, _Tuple, _Variant>;
+
+template <class _Sender, class _Env = stdexec::no_env,
+          template <class...> class _Variant = stdexec::__variant>
+using error_types_of_t STDEXEC_STD_DEPRECATED =
+    stdexec::error_types_of_t<_Sender, _Env, _Variant>;
+
+template <class _Sender, class _Env = stdexec::no_env>
+STDEXEC_STD_DEPRECATED inline constexpr bool sends_stopped =
+    stdexec::sends_stopped<_Sender, _Env>;
 
 // [exec.connect], the connect sender algorithm
-using stdexec::connect;
-using stdexec::connect_t;
+using connect_t STDEXEC_STD_DEPRECATED = stdexec::connect_t;
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::connect_t connect{};
 
-using stdexec::connect_result_t;
+template <class _Sender, class _Receiver>
+using connect_result_t STDEXEC_STD_DEPRECATED =
+    stdexec::connect_result_t<_Sender, _Receiver>;
 
 // [exec.snd_queries], sender queries
-using stdexec::forwarding_sender_query;
-using stdexec::forwarding_sender_query_t;
-using stdexec::get_completion_scheduler_t;
+using forwarding_sender_query_t STDEXEC_STD_DEPRECATED =
+    stdexec::forwarding_sender_query_t;
+template <class _Tag>
+using get_completion_scheduler_t STDEXEC_STD_DEPRECATED =
+    stdexec::get_completion_scheduler_t<_Tag>;
+STDEXEC_STD_DEPRECATED
+inline constexpr stdexec::forwarding_sender_query_t forwarding_sender_query{};
 
-using stdexec::get_completion_scheduler;
+template <class _Tag>
+STDEXEC_STD_DEPRECATED inline constexpr stdexec::get_completion_scheduler_t<
+    _Tag>
+    get_completion_scheduler{};
 
 // [exec.factories], sender factories
-using stdexec::just;
-using stdexec::just_error;
-using stdexec::just_stopped;
-using stdexec::read;
-using stdexec::schedule;
-using stdexec::schedule_t;
-using stdexec::transfer_just;
-using stdexec::transfer_just_t;
+using schedule_t STDEXEC_STD_DEPRECATED = stdexec::schedule_t;
+using transfer_just_t STDEXEC_STD_DEPRECATED = stdexec::transfer_just_t;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto just = stdexec::just;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto just_error = stdexec::just_error;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto just_stopped = stdexec::just_stopped;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto schedule = stdexec::schedule;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto transfer_just = stdexec::transfer_just;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto read = stdexec::read;
 
-using stdexec::schedule_result_t;
+template <class _Scheduler>
+using schedule_result_t STDEXEC_STD_DEPRECATED =
+    stdexec::schedule_result_t<_Scheduler>;
 
 // [exec.adapt], sender adaptors
-using stdexec::sender_adaptor_closure;
+template <class _Closure>
+using sender_adaptor_closure STDEXEC_STD_DEPRECATED =
+    stdexec::sender_adaptor_closure<_Closure>;
 
-using stdexec::bulk_t;
-using stdexec::ensure_started_t;
-using stdexec::into_variant_t;
-using stdexec::let_error_t;
-using stdexec::let_stopped_t;
-using stdexec::let_value_t;
-using stdexec::on_t;
-using stdexec::schedule_from_t;
-using stdexec::split_t;
-using stdexec::stopped_as_error_t;
-using stdexec::stopped_as_optional_t;
-using stdexec::then_t;
-using stdexec::transfer_t;
-using stdexec::transfer_when_all_t;
-using stdexec::transfer_when_all_with_variant_t;
-using stdexec::upon_error_t;
-using stdexec::upon_stopped_t;
-using stdexec::when_all_t;
-using stdexec::when_all_with_variant_t;
+using on_t STDEXEC_STD_DEPRECATED = stdexec::on_t;
+using transfer_t STDEXEC_STD_DEPRECATED = stdexec::transfer_t;
+using schedule_from_t STDEXEC_STD_DEPRECATED = stdexec::schedule_from_t;
+using then_t STDEXEC_STD_DEPRECATED = stdexec::then_t;
+using upon_error_t STDEXEC_STD_DEPRECATED = stdexec::upon_error_t;
+using upon_stopped_t STDEXEC_STD_DEPRECATED = stdexec::upon_stopped_t;
+using let_value_t STDEXEC_STD_DEPRECATED = stdexec::let_value_t;
+using let_error_t STDEXEC_STD_DEPRECATED = stdexec::let_error_t;
+using let_stopped_t STDEXEC_STD_DEPRECATED = stdexec::let_stopped_t;
+using bulk_t STDEXEC_STD_DEPRECATED = stdexec::bulk_t;
+using split_t STDEXEC_STD_DEPRECATED = stdexec::split_t;
+using when_all_t STDEXEC_STD_DEPRECATED = stdexec::when_all_t;
+using when_all_with_variant_t STDEXEC_STD_DEPRECATED =
+    stdexec::when_all_with_variant_t;
+using transfer_when_all_t STDEXEC_STD_DEPRECATED = stdexec::transfer_when_all_t;
+using transfer_when_all_with_variant_t STDEXEC_STD_DEPRECATED =
+    stdexec::transfer_when_all_with_variant_t;
+using into_variant_t STDEXEC_STD_DEPRECATED = stdexec::into_variant_t;
+using stopped_as_optional_t STDEXEC_STD_DEPRECATED =
+    stdexec::stopped_as_optional_t;
+using stopped_as_error_t STDEXEC_STD_DEPRECATED = stdexec::stopped_as_error_t;
+using ensure_started_t STDEXEC_STD_DEPRECATED = stdexec::ensure_started_t;
 
-using stdexec::on;
-using stdexec::schedule_from;
-using stdexec::transfer;
-
-using stdexec::then;
-using stdexec::upon_error;
-using stdexec::upon_stopped;
-
-using stdexec::let_error;
-using stdexec::let_stopped;
-using stdexec::let_value;
-
-using stdexec::bulk;
-
-using stdexec::split;
-using stdexec::transfer_when_all;
-using stdexec::transfer_when_all_with_variant;
-using stdexec::when_all;
-using stdexec::when_all_with_variant;
-
-using stdexec::into_variant;
-
-using stdexec::stopped_as_error;
-using stdexec::stopped_as_optional;
-
-using stdexec::ensure_started;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto on = stdexec::on;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto transfer = stdexec::transfer;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto schedule_from = stdexec::schedule_from;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto then = stdexec::then;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto upon_error = stdexec::upon_error;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto upon_stopped = stdexec::upon_stopped;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto let_value = stdexec::let_value;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto let_error = stdexec::let_error;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto let_stopped = stdexec::let_stopped;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto bulk = stdexec::bulk;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto split = stdexec::split;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto when_all = stdexec::when_all;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto when_all_with_variant = stdexec::when_all_with_variant;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto transfer_when_all = stdexec::transfer_when_all;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto transfer_when_all_with_variant =
+    stdexec::transfer_when_all_with_variant;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto into_variant = stdexec::into_variant;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto stopped_as_optional = stdexec::stopped_as_optional;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto stopped_as_error = stdexec::stopped_as_error;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto ensure_started = stdexec::ensure_started;
 
 // [exec.consumers], sender consumers
-using stdexec::start_detached;
-using stdexec::start_detached_t;
+using start_detached_t STDEXEC_STD_DEPRECATED = stdexec::start_detached_t;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto start_detached = stdexec::start_detached;
 
 // [exec.utils], sender and receiver utilities
 // [exec.utils.rcvr_adptr]
-using stdexec::receiver_adaptor;
+template <class _Derived, class _Base = stdexec::__adaptors::__not_a_receiver>
+using receiver_adaptor STDEXEC_STD_DEPRECATED =
+    stdexec::receiver_adaptor<_Derived, _Base>;
 
 // [exec.utils.cmplsigs]
-using stdexec::completion_signatures;
+template <class... _Sigs>
+using completion_signatures STDEXEC_STD_DEPRECATED =
+    stdexec::completion_signatures<_Sigs...>;
 
 // [exec.utils.mkcmplsigs]
-using stdexec::make_completion_signatures;
+template <class _Sender, class _Env = stdexec::no_env,
+          class _Sigs = stdexec::completion_signatures<>,
+          template <class...>
+          class _SetValue = stdexec::__compl_sigs::__default_set_value,
+          template <class>
+          class _SetError = stdexec::__compl_sigs::__default_set_error,
+          class _SetStopped =
+              stdexec::completion_signatures<stdexec::set_stopped_t()>>
+using make_completion_signatures STDEXEC_STD_DEPRECATED =
+    stdexec::make_completion_signatures<_Sender, _Env, _Sigs, _SetValue,
+                                        _SetError, _SetStopped>;
 
 // [exec.ctx], execution contexts
-using stdexec::run_loop;
+using run_loop STDEXEC_STD_DEPRECATED = stdexec::run_loop;
 
 // [exec.execute], execute
-using stdexec::execute;
-using stdexec::execute_t;
+using execute_t STDEXEC_STD_DEPRECATED = stdexec::execute_t;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto execute = stdexec::execute;
 
 #if !_STD_NO_COROUTINES_
 // [exec.as_awaitable]
-using stdexec::as_awaitable;
-using stdexec::as_awaitable_t;
+using as_awaitable_t STDEXEC_STD_DEPRECATED = stdexec::as_awaitable_t;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto as_awaitable = stdexec::as_awaitable;
 
 // [exec.with_awaitable_senders]
-using stdexec::with_awaitable_senders;
+template <class _Promise>
+using with_awaitable_senders STDEXEC_STD_DEPRECATED =
+    stdexec::with_awaitable_senders<_Promise>;
 #endif // !_STD_NO_COROUTINES_
 } // namespace execution
 
 namespace this_thread
 {
-using stdexec::execute_may_block_caller;
-using stdexec::execute_may_block_caller_t;
-using stdexec::sync_wait;
-using stdexec::sync_wait_t;
-using stdexec::sync_wait_with_variant;
-using stdexec::sync_wait_with_variant_t;
+using execute_may_block_caller_t STDEXEC_STD_DEPRECATED =
+    stdexec::execute_may_block_caller_t;
+using sync_wait_t STDEXEC_STD_DEPRECATED = stdexec::sync_wait_t;
+using sync_wait_with_variant_t STDEXEC_STD_DEPRECATED =
+    stdexec::sync_wait_with_variant_t;
+
+STDEXEC_STD_DEPRECATED
+inline constexpr auto execute_may_block_caller =
+    stdexec::execute_may_block_caller;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto sync_wait = stdexec::sync_wait;
+STDEXEC_STD_DEPRECATED
+inline constexpr auto sync_wait_with_variant = stdexec::sync_wait_with_variant;
 } // namespace this_thread
 } // namespace std
diff --git a/include/sdbusplus/async/stdexec/commit.info b/include/sdbusplus/async/stdexec/commit.info
index 0baa11a..e75984e 100644
--- a/include/sdbusplus/async/stdexec/commit.info
+++ b/include/sdbusplus/async/stdexec/commit.info
@@ -1 +1 @@
-17f84aa460c22edea45e7cd467c842d9358cba02
+c3d8aa9ed3a059f6575cbf0b9684ed0b4a6429de
diff --git a/include/sdbusplus/async/stdexec/concepts.hpp b/include/sdbusplus/async/stdexec/concepts.hpp
index db54df4..f2ef2c2 100644
--- a/include/sdbusplus/async/stdexec/concepts.hpp
+++ b/include/sdbusplus/async/stdexec/concepts.hpp
@@ -15,8 +15,13 @@
  */
 #pragma once
 
+#if __cpp_concepts < 201907L
+#error This library requires support for C++20 concepts
+#endif
+
 #include <version>
 
+// Perhaps the stdlib lacks support for concepts though:
 #if __has_include(<concepts>) && __cpp_lib_concepts	>= 202002
 #include <concepts>
 namespace __std_concepts_polyfill
diff --git a/include/sdbusplus/async/stdexec/coroutine.hpp b/include/sdbusplus/async/stdexec/coroutine.hpp
index c7fe9bf..52840af 100644
--- a/include/sdbusplus/async/stdexec/coroutine.hpp
+++ b/include/sdbusplus/async/stdexec/coroutine.hpp
@@ -15,7 +15,7 @@
  */
 #pragma once
 
-#include <sdbusplus/async/stdexec/concepts.hpp>
+#include "concepts.hpp"
 
 #include <version>
 #if __cpp_impl_coroutine >= 201902 && __cpp_lib_coroutine >= 201902
@@ -103,7 +103,7 @@
 concept __awaitable =
     requires(_Awaitable&& __await, _Promise* __promise) {
         {
-            (__get_awaiter)((_Awaitable &&) __await, __promise)
+            stdexec::__get_awaiter((_Awaitable &&) __await, __promise)
             } -> __awaiter<_Promise>;
     };
 
@@ -113,8 +113,9 @@
 template <class _Awaitable, class _Promise = void>
     requires __awaitable<_Awaitable, _Promise>
 using __await_result_t =
-    decltype((__as_lvalue)((__get_awaiter)(std::declval<_Awaitable>(),
-                                           (_Promise*)nullptr))
+    decltype(stdexec::__as_lvalue(
+                 stdexec::__get_awaiter(std::declval<_Awaitable>(),
+                                        (_Promise*)nullptr))
                  .await_resume());
 
 #else
diff --git a/include/sdbusplus/async/stdexec/execution.hpp b/include/sdbusplus/async/stdexec/execution.hpp
index 75c219a..c44d60c 100644
--- a/include/sdbusplus/async/stdexec/execution.hpp
+++ b/include/sdbusplus/async/stdexec/execution.hpp
@@ -15,12 +15,12 @@
  */
 #pragma once
 
-#include <sdbusplus/async/stdexec/__detail/__intrusive_ptr.hpp>
-#include <sdbusplus/async/stdexec/__detail/__meta.hpp>
-#include <sdbusplus/async/stdexec/concepts.hpp>
-#include <sdbusplus/async/stdexec/coroutine.hpp>
-#include <sdbusplus/async/stdexec/functional.hpp>
-#include <sdbusplus/async/stdexec/stop_token.hpp>
+#include "__detail/__intrusive_ptr.hpp"
+#include "__detail/__meta.hpp"
+#include "concepts.hpp"
+#include "coroutine.hpp"
+#include "functional.hpp"
+#include "stop_token.hpp"
 
 #include <atomic>
 #include <cassert>
@@ -45,22 +45,6 @@
 #define _PRAGMA_IGNORE(__arg)
 #endif
 
-#if STDEXEC_NVHPC()
-#define _NVCXX_CAPTURE_PACK(_Xs) , class _NVCxxList = stdexec::__types<_Xs...>
-#define _NVCXX_EXPAND_PACK(_Xs, __xs, ...)                                     \
-    [&]<class... _Xs>(stdexec::__types<_Xs...>*,                               \
-                      auto*... __ptrs) -> decltype(auto) {                     \
-        return [&]<class... _Xs>(_Xs&&... __xs) -> decltype(auto) {            \
-            __VA_ARGS__                                                        \
-        }(((_Xs &&) * (std::add_pointer_t<_Xs>)__ptrs)...);                    \
-    }((_NVCxxList*)nullptr, &__xs...);
-#define _NVCXX_EXPAND_PACK_RETURN return _NVCXX_EXPAND_PACK
-#else
-#define _NVCXX_CAPTURE_PACK(_Xs)
-#define _NVCXX_EXPAND_PACK(_Xs, __xs, ...) __VA_ARGS__
-#define _NVCXX_EXPAND_PACK_RETURN(_Xs, __xs, ...) __VA_ARGS__
-#endif
-
 #if STDEXEC_NVHPC() || STDEXEC_GCC()
 #define STDEXEC_NON_LEXICAL_FRIENDSHIP 1
 #endif
@@ -89,7 +73,7 @@
 template <class _Ty>
 const _Ty& __cref_fn(const _Ty&);
 template <class _Ty>
-using __cref_t = decltype((__cref_fn)(__declval<_Ty>()));
+using __cref_t = decltype(__scheduler_queries::__cref_fn(__declval<_Ty>()));
 
 struct execute_may_block_caller_t
 {
@@ -134,7 +118,8 @@
 {};
 struct no_env
 {
-    friend void tag_invoke(auto, same_as<no_env> auto, auto&&...) = delete;
+    template <class _Tag, same_as<no_env> _Self, class... _Ts>
+    friend void tag_invoke(_Tag, _Self, _Ts&&...) = delete;
 };
 
 template <__class _Tag, class _Value>
@@ -147,13 +132,11 @@
         using __value_t = _Value;
         [[no_unique_address]] std::unwrap_reference_t<_Value> __value_;
 
-        template <class... _Ts>
-        friend auto tag_invoke(same_as<_Tag> auto, const __t& __self, _Ts&&...)
-#if !STDEXEC_NVHPC()
-            noexcept(std::is_nothrow_copy_constructible_v<
-                     std::unwrap_reference_t<_Value>>)
-#endif
-                -> std::unwrap_reference_t<_Value>
+        template <same_as<_Tag> _T, class... _Ts>
+        friend auto tag_invoke(_T, const __t& __self, _Ts&&...) noexcept(
+            std::is_nothrow_copy_constructible_v<
+                std::unwrap_reference_t<_Value>>)
+            -> std::unwrap_reference_t<_Value>
         {
             return __self.__value_;
         }
@@ -167,9 +150,8 @@
         using __tag_t = _Tag;
         using __value_t = __none_such;
 
-        template <class... _Ts>
-        friend void tag_invoke(same_as<_Tag> auto, const __t&,
-                               _Ts&&...) = delete;
+        template <same_as<_Tag> _T, class... _Ts>
+        friend void tag_invoke(_T, const __t&, _Ts&&...) = delete;
     };
 };
 template <class _With>
@@ -201,16 +183,14 @@
     template <
         __none_of<typename _Withs::__tag_t..., get_completion_signatures_t>
             _Tag,
-        same_as<__env_> _Self, class... _As _NVCXX_CAPTURE_PACK(_As)>
+        same_as<__env_> _Self, class... _As>
         requires __callable<_Tag, const typename _Self::__base_env_t&, _As...>
     friend auto tag_invoke(_Tag __tag, const _Self& __self,
                            _As&&... __as) noexcept
         -> __call_result_if_t<same_as<_Self, __env_>, _Tag,
                               const typename _Self::__base_env_t&, _As...>
     {
-        _NVCXX_EXPAND_PACK_RETURN(
-            _As, __as,
-            return ((_Tag &&) __tag)(__self.__base_env_, (_As &&) __as...);)
+        return ((_Tag &&) __tag)(__self.__base_env_, (_As &&) __as...);
     }
 };
 template <class _BaseEnv, class... _Withs>
@@ -450,10 +430,18 @@
     __t<__concat_completion_signatures<_Completions...>>;
 
 template <class _Traits, class _Env>
+inline constexpr bool __valid_completion_signatures_ = false;
+template <class... _Sigs, class _Env>
+inline constexpr bool
+    __valid_completion_signatures_<completion_signatures<_Sigs...>, _Env> =
+        true;
+template <>
+inline constexpr bool __valid_completion_signatures_<
+    dependent_completion_signatures<no_env>, no_env> = true;
+
+template <class _Traits, class _Env>
 concept __valid_completion_signatures =
-    __is_instance_of<_Traits, completion_signatures> ||
-    (same_as<_Traits, dependent_completion_signatures<no_env>> &&
-     same_as<_Env, no_env>);
+    __valid_completion_signatures_<_Traits, _Env>;
 
 /////////////////////////////////////////////////////////////////////////////
 // [execution.receivers]
@@ -545,14 +533,12 @@
         {
             using _Completions =
                 tag_invoke_result_t<get_completion_signatures_t, _Sender, _Env>;
-            static_assert(__valid_completion_signatures<_Completions, _Env>);
             return _Completions{};
         }
         else if constexpr (__with_member_alias<_Sender>)
         {
             using _Completions =
                 typename remove_cvref_t<_Sender>::completion_signatures;
-            static_assert(__valid_completion_signatures<_Completions, _Env>);
             return _Completions{};
         }
         else
@@ -580,27 +566,27 @@
 inline constexpr get_completion_signatures_t get_completion_signatures{};
 
 /////////////////////////////////////////////////////////////////////////////
-// [execution.senders]
-// NOT TO SPEC (YET)
-template <class _Sender, class _Env>
-concept __sender =
-    requires(_Sender&& __sndr, _Env&& __env) {
-        {
-            get_completion_signatures((_Sender &&) __sndr, (_Env &&) __env)
-            } -> __valid_completion_signatures<_Env>;
-    };
-
-template <class _Sender, class _Env = no_env>
-concept sender = __sender<_Sender, _Env> && __sender<_Sender, no_env> &&
-                 move_constructible<remove_cvref_t<_Sender>> &&
-                 constructible_from<remove_cvref_t<_Sender>, _Sender>;
-
-/////////////////////////////////////////////////////////////////////////////
 // [execution.senders.traits]
 template <class _Sender, class _Env>
 using __completion_signatures_of_t =
     __call_result_t<get_completion_signatures_t, _Sender, _Env>;
 
+/////////////////////////////////////////////////////////////////////////////
+// [execution.senders]
+// NOT TO SPEC (YET)
+template <class _Sender, class _Env = no_env>
+concept sender =
+    requires(_Sender&& __sndr, _Env&& __env) {
+        get_completion_signatures((_Sender &&) __sndr, no_env{});
+        get_completion_signatures((_Sender &&) __sndr, (_Env &&) __env);
+    } &&
+    __valid_completion_signatures<__completion_signatures_of_t<_Sender, no_env>,
+                                  no_env> &&
+    __valid_completion_signatures<__completion_signatures_of_t<_Sender, _Env>,
+                                  _Env> &&
+    move_constructible<remove_cvref_t<_Sender>> &&
+    constructible_from<remove_cvref_t<_Sender>, _Sender>;
+
 // __checked_completion_signatures is for catching logic bugs in a typed
 // sender's metadata. If sender<S> and sender<S, Ctx> are both true, then they
 // had better report the same metadata. This completion signatures wrapper
@@ -635,7 +621,7 @@
               _Ts...>;
 
 using __nullable_variant_t =
-    __munique<__mbind_front<__q<std::variant>, std::monostate>>;
+    __munique<__mbind_front_q<std::variant, std::monostate>>;
 
 template <class... _Ts>
 using __decayed_tuple = std::tuple<decay_t<_Ts>...>;
@@ -683,11 +669,11 @@
 
 template <class _Sender, class _Env = no_env>
 using __single_sender_value_t =
-    __value_types_of_t<_Sender, _Env, __single_or<void>, __q<__single_t>>;
+    __value_types_of_t<_Sender, _Env, __single_or<void>, __q<__single>>;
 
 template <class _Sender, class _Env = no_env>
 using __single_value_variant_sender_t =
-    value_types_of_t<_Sender, _Env, __types, __single_t>;
+    value_types_of_t<_Sender, _Env, __types, __single>;
 
 template <class _Sender, class _Env = no_env>
 concept __single_typed_sender = sender<_Sender, _Env> &&
@@ -891,7 +877,7 @@
 template <class _Ty>
 const _Ty& __cref_fn(const _Ty&);
 template <class _Ty>
-using __cref_t = decltype((__cref_fn)(__declval<_Ty>()));
+using __cref_t = decltype(__scheduler_queries::__cref_fn(__declval<_Ty>()));
 
 struct get_forward_progress_guarantee_t
 {
@@ -904,13 +890,39 @@
         return tag_invoke(get_forward_progress_guarantee_t{},
                           std::as_const(__t));
     }
-    constexpr execution::forward_progress_guarantee
+    constexpr stdexec::forward_progress_guarantee
         operator()(auto&&) const noexcept
     {
-        return execution::forward_progress_guarantee::weakly_parallel;
+        return stdexec::forward_progress_guarantee::weakly_parallel;
+    }
+};
+
+struct __has_algorithm_customizations_t
+{
+    template <class _T>
+    using __result_t =
+        tag_invoke_result_t<__has_algorithm_customizations_t, __cref_t<_T>>;
+    template <class _T>
+        requires tag_invocable<__has_algorithm_customizations_t, __cref_t<_T>>
+    constexpr __result_t<_T> operator()(_T&& __t) const
+        noexcept(noexcept(__result_t<_T>{}))
+    {
+        using _Bool =
+            tag_invoke_result_t<__has_algorithm_customizations_t, __cref_t<_T>>;
+        static_assert(
+            _Bool{} ? true : true); // must be contextually convertible to bool
+        return _Bool{};
+    }
+    constexpr std::false_type operator()(auto&&) const noexcept
+    {
+        return {};
     }
 };
 } // namespace __scheduler_queries
+using __scheduler_queries::__has_algorithm_customizations_t;
+inline constexpr __has_algorithm_customizations_t
+    __has_algorithm_customizations{};
+
 using __scheduler_queries::get_forward_progress_guarantee_t;
 inline constexpr get_forward_progress_guarantee_t
     get_forward_progress_guarantee{};
@@ -920,23 +932,31 @@
 template <__one_of<set_value_t, set_error_t, set_stopped_t> _CPO>
 struct get_completion_scheduler_t;
 }
+using __sender_queries::get_completion_scheduler_t;
 
 /////////////////////////////////////////////////////////////////////////////
 // [execution.schedulers]
 template <class _Scheduler>
-concept scheduler =
-    requires(
-        _Scheduler&& __sched,
-        const __sender_queries::get_completion_scheduler_t<set_value_t> __tag) {
+concept __has_schedule = requires(_Scheduler&& __sched) {
+                             {
+                                 schedule((_Scheduler &&) __sched)
+                                 } -> sender;
+                         };
+
+template <class _Scheduler>
+concept __sender_has_completion_scheduler =
+    requires(_Scheduler&& __sched,
+             const get_completion_scheduler_t<set_value_t>&& __tag) {
         {
-            schedule((_Scheduler &&) __sched)
-            } -> sender;
-        {
-            tag_invoke(__tag, schedule((_Scheduler &&) __sched))
+            tag_invoke(std::move(__tag), schedule((_Scheduler &&) __sched))
             } -> same_as<remove_cvref_t<_Scheduler>>;
-    } &&
-    equality_comparable<remove_cvref_t<_Scheduler>> &&
-    copy_constructible<remove_cvref_t<_Scheduler>>;
+    };
+
+template <class _Scheduler>
+concept scheduler = __has_schedule<_Scheduler> &&
+                    __sender_has_completion_scheduler<_Scheduler> &&
+                    equality_comparable<remove_cvref_t<_Scheduler>> &&
+                    copy_constructible<remove_cvref_t<_Scheduler>>;
 
 // NOT TO SPEC
 template <scheduler _Scheduler>
@@ -953,12 +973,12 @@
 struct get_scheduler_t
 {
     template <__none_of<no_env> _Env>
-        requires nothrow_tag_invocable<get_scheduler_t, const _Env&> &&
+        requires tag_invocable<get_scheduler_t, const _Env&> &&
                  scheduler<tag_invoke_result_t<get_scheduler_t, const _Env&>>
-                 auto operator()(const _Env& __env) const
-                 noexcept(nothrow_tag_invocable<get_scheduler_t, const _Env&>)
-                     -> tag_invoke_result_t<get_scheduler_t, const _Env&>
+                 auto operator()(const _Env& __env) const noexcept
+                 -> tag_invoke_result_t<get_scheduler_t, const _Env&>
     {
+        static_assert(nothrow_tag_invocable<get_scheduler_t, const _Env&>);
         return tag_invoke(get_scheduler_t{}, __env);
     }
     auto operator()() const noexcept;
@@ -1399,7 +1419,7 @@
             static_assert(
                 operation_state<
                     tag_invoke_result_t<connect_t, _Sender, _Receiver>>,
-                "execution::connect(sender, receiver) must return a type that "
+                "stdexec::connect(sender, receiver) must return a type that "
                 "satisfies the operation_state concept");
             return tag_invoke(connect_t{}, (_Sender &&) __sndr,
                               (_Receiver &&) __rcvr);
@@ -1523,7 +1543,7 @@
 template <class _Tag, class... _Args>
 _Tag __tag_of_sig_(_Tag (*)(_Args...));
 template <class _Sig>
-using __tag_of_sig_t = decltype((__tag_of_sig_)((_Sig*)nullptr));
+using __tag_of_sig_t = decltype(stdexec::__tag_of_sig_((_Sig*)nullptr));
 
 template <class _Sender, class _SetSig, class _Env = no_env>
 concept sender_of =
@@ -1583,7 +1603,7 @@
 
 #if !_STD_NO_COROUTINES_
 /////////////////////////////////////////////////////////////////////////////
-// execution::as_awaitable [execution.coro_utils.as_awaitable]
+// stdexec::as_awaitable [execution.coro_utils.as_awaitable]
 namespace __as_awaitable
 {
 namespace __impl
@@ -1669,7 +1689,7 @@
         switch (__result_.index())
         {
             case 0: // receiver contract not satisfied
-                assert(!"_Should never get here");
+                STDEXEC_ASSERT(!"_Should never get here");
                 break;
             case 1: // set_value
                 if constexpr (!std::is_void_v<_Value>)
@@ -1872,17 +1892,16 @@
         __operation* __op_state_;
         // Forward all the receiver ops, and delete the operation state.
         template <__one_of<set_value_t, set_error_t, set_stopped_t> _Tag,
-                  class... _As _NVCXX_CAPTURE_PACK(_As)>
+                  class... _As>
             requires __callable<_Tag, _Receiver, _As...>
         friend void tag_invoke(
             _Tag __tag, __receiver&& __self,
             _As&&... __as) noexcept(__nothrow_callable<_Tag, _Receiver, _As...>)
         {
             // Delete the state as cleanup:
-            _NVCXX_EXPAND_PACK_RETURN(
-                _As, __as, std::unique_ptr<__operation> __g{__self.__op_state_};
-                return __tag((_Receiver &&) __self.__op_state_->__rcvr_,
-                             (_As &&) __as...);)
+            std::unique_ptr<__operation> __g{__self.__op_state_};
+            return __tag((_Receiver &&) __self.__op_state_->__rcvr_,
+                         (_As &&) __as...);
         }
         // Forward all receiever queries.
         friend auto tag_invoke(get_env_t, const __receiver& __self)
@@ -1893,8 +1912,9 @@
     };
     _Receiver __rcvr_;
     connect_result_t<_Sender, __receiver> __op_state_;
-    __operation(_Sender&& __sndr, __decays_to<_Receiver> auto&& __rcvr) :
-        __rcvr_((decltype(__rcvr)&&)__rcvr),
+    template <__decays_to<_Receiver> _CvrefReceiver>
+    __operation(_Sender&& __sndr, _CvrefReceiver&& __rcvr) :
+        __rcvr_((_CvrefReceiver &&) __rcvr),
         __op_state_(connect((_Sender &&) __sndr, __receiver{this}))
     {}
 };
@@ -1914,46 +1934,139 @@
 using __submit_::__submit_t;
 inline constexpr __submit_t __submit{};
 
+namespace __inln
+{
+struct __scheduler
+{
+    template <class _Receiver>
+    struct __op : __immovable
+    {
+        _Receiver __recv_;
+        friend void tag_invoke(start_t, __op& __self) noexcept
+        {
+            set_value((_Receiver &&) __self.__recv_);
+        }
+    };
+
+    struct __sender
+    {
+        using completion_signatures =
+            stdexec::completion_signatures<set_value_t()>;
+
+        template <typename _Receiver>
+        friend __op<_Receiver> tag_invoke(connect_t, __sender,
+                                          _Receiver&& __rcvr)
+        {
+            return {{}, (_Receiver &&) __rcvr};
+        }
+
+        template <class CPO>
+        friend __scheduler tag_invoke(get_completion_scheduler_t<CPO>,
+                                      __sender) noexcept
+        {
+            return {};
+        }
+    };
+
+    friend __sender tag_invoke(schedule_t, __scheduler)
+    {
+        return {};
+    }
+
+    bool operator==(const __scheduler&) const noexcept = default;
+};
+} // namespace __inln
+
 /////////////////////////////////////////////////////////////////////////////
 // [execution.senders.consumer.start_detached]
 namespace __start_detached
 {
-namespace __impl
-{
+template <class _EnvId>
 struct __detached_receiver
 {
+    using _Env = __t<_EnvId>;
+    [[no_unique_address]] _Env __env_;
+    template <class... _As>
     friend void tag_invoke(set_value_t, __detached_receiver&&,
-                           auto&&...) noexcept
+                           _As&&...) noexcept
     {}
+    template <class _Error>
     [[noreturn]] friend void tag_invoke(set_error_t, __detached_receiver&&,
-                                        auto&&) noexcept
+                                        _Error&&) noexcept
     {
         std::terminate();
     }
     friend void tag_invoke(set_stopped_t, __detached_receiver&&) noexcept {}
-    friend __empty_env tag_invoke(get_env_t,
-                                  const __detached_receiver&) noexcept
+    friend const _Env& tag_invoke(get_env_t,
+                                  const __detached_receiver& __self) noexcept
     {
-        return {};
+        // BUGBUG NOT TO SPEC
+        return __self.__env_;
     }
 };
-} // namespace __impl
+template <class _Env>
+__detached_receiver(_Env) -> __detached_receiver<__x<_Env>>;
+
+struct start_detached_t;
+
+// When looking for user-defined customizations of start_detached, these
+// are the signatures to test against, in order:
+template <class _Sender, class _Env>
+using __cust_sigs = __msignatures<
+    tag_invoke_t(start_detached_t, _Sender),
+    tag_invoke_t(start_detached_t, _Sender, _Env),
+    tag_invoke_t(start_detached_t, get_scheduler_t(_Env&), _Sender),
+    tag_invoke_t(start_detached_t, get_scheduler_t(_Env&), _Sender, _Env)>;
+
+template <class _Sender, class _Env>
+inline constexpr bool __is_start_detached_customized =
+    __v<__many_well_formed<__cust_sigs<_Sender, _Env>>>;
+
+template <class _Sender, class _Env>
+using __which_t =
+    __mwhich_t<__cust_sigs<_Sender, _Env>, __mconstruct<void, false>()>;
+
+template <class _Sender, class _Env>
+using __which_i =
+    __mwhich_i<__cust_sigs<_Sender, _Env>, __mconstruct<void, false>()>;
 
 struct start_detached_t
 {
-    template <sender _Sender>
-        requires tag_invocable<start_detached_t, _Sender>
-    void operator()(_Sender&& __sndr) const
-        noexcept(nothrow_tag_invocable<start_detached_t, _Sender>)
+    template <sender _Sender, class _Env = __empty_env>
+        requires sender_to<_Sender,
+                           __detached_receiver<__x<remove_cvref_t<_Env>>>> ||
+                 __is_start_detached_customized<_Sender, _Env>
+    void operator()(_Sender&& __sndr, _Env&& __env = _Env{}) const
+        noexcept(__mnoexcept_v<__which_t<_Sender, _Env>>)
     {
-        (void)tag_invoke(start_detached_t{}, (_Sender &&) __sndr);
-    }
-    template <sender _Sender>
-        requires(!tag_invocable<start_detached_t, _Sender>) &&
-                sender_to<_Sender, __impl::__detached_receiver>
-    void operator()(_Sender&& __sndr) const noexcept(false)
-    {
-        __submit((_Sender &&) __sndr, __impl::__detached_receiver{});
+        // The selected customization should return void
+        static_assert(same_as<void, __mtypeof<__which_t<_Sender, _Env>>>);
+        constexpr auto __idx = __v<__which_i<_Sender, _Env>>;
+        // Dispatch to the correct implementation:
+        if constexpr (__idx == 0)
+        {
+            tag_invoke(start_detached_t{}, (_Sender &&) __sndr);
+        }
+        else if constexpr (__idx == 1)
+        {
+            tag_invoke(start_detached_t{}, (_Sender &&) __sndr,
+                       (_Env &&) __env);
+        }
+        else if constexpr (__idx == 2)
+        {
+            tag_invoke(start_detached_t{}, get_scheduler(__env),
+                       (_Sender &&) __sndr);
+        }
+        else if constexpr (__idx == 3)
+        {
+            auto __sched = get_scheduler(__env);
+            tag_invoke(start_detached_t{}, std::move(__sched),
+                       (_Sender &&) __sndr, (_Env &&) __env);
+        }
+        else
+        {
+            __submit((_Sender &&) __sndr, __detached_receiver{(_Env &&) __env});
+        }
     }
 };
 } // namespace __start_detached
@@ -1984,7 +2097,6 @@
 
         friend void tag_invoke(start_t, __operation& __op_state) noexcept
         {
-            static_assert(__nothrow_callable<_CPO, _Receiver, _Ts...>);
             std::apply(
                 [&__op_state](_Ts&... __ts) {
                     _CPO{}((_Receiver &&) __op_state.__rcvr_, (_Ts &&) __ts...);
@@ -2329,12 +2441,11 @@
                          -> connect_result_t<__member_t<_Self, _Base>,
                                              _Receiver>
         {
-            return execution::connect(((__t &&) __self).base(),
-                                      (_Receiver &&) __rcvr);
+            return stdexec::connect(((__t &&) __self).base(),
+                                    (_Receiver &&) __rcvr);
         }
 
-        template <tag_category<forwarding_sender_query> _Tag,
-                  class... _As _NVCXX_CAPTURE_PACK(_As)>
+        template <tag_category<forwarding_sender_query> _Tag, class... _As>
             requires __callable<_Tag, const _Base&, _As...>
         friend auto tag_invoke(
             _Tag __tag, const _Derived& __self,
@@ -2343,9 +2454,7 @@
             -> __call_result_if_t<tag_category<_Tag, forwarding_sender_query>,
                                   _Tag, const _Base&, _As...>
         {
-            _NVCXX_EXPAND_PACK_RETURN(
-                _As, __as,
-                return ((_Tag &&) __tag)(__self.base(), (_As &&) __as...);)
+            return ((_Tag &&) __tag)(__self.base(), (_As &&) __as...);
         }
 
       protected:
@@ -2374,8 +2483,8 @@
         using __base_from_derived_t = decltype(__declval<_D>().base());
 
         using __get_base_t =
-            __if<__bool<__has_base>, __mbind_back<__defer<__member_t>, _Base>,
-                 __q1<__base_from_derived_t>>;
+            __if_c<__has_base, __mbind_back_q1<__member_t, _Base>,
+                   __q1<__base_from_derived_t>>;
 
         template <class _D>
         using __base_t = __minvoke1<__get_base_t, _D&&>;
@@ -2393,31 +2502,25 @@
             }
         }
 
-        template <same_as<set_value_t> _SetValue,
-                  class... _As _NVCXX_CAPTURE_PACK(_As)>
+        template <same_as<set_value_t> _SetValue, class... _As>
         friend auto tag_invoke(_SetValue, _Derived&& __self,
                                _As&&... __as) noexcept
             -> decltype(_CALL_MEMBER(set_value, (_Derived &&) __self,
                                      (_As &&) __as...))
         {
-            _NVCXX_EXPAND_PACK(
-                _As, __as,
-                static_assert(noexcept(_CALL_MEMBER(
-                    set_value, (_Derived &&) __self, (_As &&) __as...)));
-                _CALL_MEMBER(set_value, (_Derived &&) __self,
-                             (_As &&) __as...);)
+            static_assert(noexcept(_CALL_MEMBER(set_value, (_Derived &&) __self,
+                                                (_As &&) __as...)));
+            _CALL_MEMBER(set_value, (_Derived &&) __self, (_As &&) __as...);
         }
 
         template <same_as<set_value_t> _SetValue, class _D = _Derived,
-                  class... _As _NVCXX_CAPTURE_PACK(_As)>
+                  class... _As>
             requires _MISSING_MEMBER(_D, set_value) &&
                      tag_invocable<set_value_t, __base_t<_D>, _As...>
         friend void tag_invoke(_SetValue, _Derived&& __self,
                                _As&&... __as) noexcept
         {
-            _NVCXX_EXPAND_PACK(_As, __as,
-                               execution::set_value(__get_base((_D &&) __self),
-                                                    (_As &&) __as...);)
+            stdexec::set_value(__get_base((_D &&) __self), (_As &&) __as...);
         }
 
         template <same_as<set_error_t> _SetError, class _Error>
@@ -2438,8 +2541,8 @@
         friend void tag_invoke(_SetError, _Derived&& __self,
                                _Error&& __err) noexcept
         {
-            execution::set_error(__get_base((_Derived &&) __self),
-                                 (_Error &&) __err);
+            stdexec::set_error(__get_base((_Derived &&) __self),
+                               (_Error &&) __err);
         }
 
         template <same_as<set_stopped_t> _SetStopped, class _D = _Derived>
@@ -2456,7 +2559,7 @@
                      tag_invocable<set_stopped_t, __base_t<_D>>
         friend void tag_invoke(_SetStopped, _Derived&& __self) noexcept
         {
-            execution::set_stopped(__get_base((_Derived &&) __self));
+            stdexec::set_stopped(__get_base((_Derived &&) __self));
         }
 
         // Pass through the get_env receiver query
@@ -2472,7 +2575,7 @@
         friend auto tag_invoke(_GetEnv, const _Derived& __self)
             -> __call_result_t<get_env_t, __base_t<const _D&>>
         {
-            return execution::get_env(__get_base(__self));
+            return stdexec::get_env(__get_base(__self));
         }
 
       public:
@@ -2500,11 +2603,10 @@
             requires _MISSING_MEMBER(_D, start)
         friend void tag_invoke(_Start, _Derived& __self) noexcept
         {
-            execution::start(__c_cast<__t>(__self).base());
+            stdexec::start(__c_cast<__t>(__self).base());
         }
 
-        template <__none_of<start_t> _Tag,
-                  class... _As _NVCXX_CAPTURE_PACK(_As)>
+        template <__none_of<start_t> _Tag, class... _As>
             requires __callable<_Tag, const _Base&, _As...>
         friend auto tag_invoke(
             _Tag __tag, const _Derived& __self,
@@ -2513,10 +2615,8 @@
             -> __call_result_if_t<__none_of<_Tag, start_t>, _Tag, const _Base&,
                                   _As...>
         {
-            _NVCXX_EXPAND_PACK_RETURN(
-                _As, __as,
-                return ((_Tag &&) __tag)(__c_cast<__t>(__self).base(),
-                                         (_As &&) __as...);)
+            return ((_Tag &&) __tag)(__c_cast<__t>(__self).base(),
+                                     (_As &&) __as...);
         }
 
       protected:
@@ -2547,16 +2647,15 @@
             requires _MISSING_MEMBER(decay_t<_Self>, schedule) &&
                      scheduler<__member_t<_Self, _Base>>
                      friend auto tag_invoke(_Schedule, _Self&& __self) noexcept(
-                         noexcept(execution::schedule(
+                         noexcept(stdexec::schedule(
                              __declval<__member_t<_Self, _Base>>())))
                          -> schedule_result_t<_Self>
         {
-            return execution::schedule(__c_cast<__t>((_Self &&) __self).base());
+            return stdexec::schedule(__c_cast<__t>((_Self &&) __self).base());
         }
 
         template <tag_category<forwarding_scheduler_query> _Tag,
-                  same_as<_Derived> _Self,
-                  class... _As _NVCXX_CAPTURE_PACK(_As)>
+                  same_as<_Derived> _Self, class... _As>
             requires __callable<_Tag, const _Base&, _As...>
         friend auto
             tag_invoke(_Tag __tag, const _Self& __self, _As&&... __as) noexcept(
@@ -2565,10 +2664,8 @@
                     tag_category<_Tag, forwarding_scheduler_query>, _Tag,
                     const _Base&, _As...>
         {
-            _NVCXX_EXPAND_PACK_RETURN(
-                _As, __as,
-                return ((_Tag &&) __tag)(__c_cast<__t>(__self).base(),
-                                         (_As &&) __as...);)
+            return ((_Tag &&) __tag)(__c_cast<__t>(__self).base(),
+                                     (_As &&) __as...);
         }
 
       protected:
@@ -2633,15 +2730,15 @@
 {
     if constexpr (__nothrow_invocable<_Fun, _As...>)
     {
-        (__set_value_invoke_)((_Receiver &&) __rcvr, (_Fun &&) __fun,
-                              (_As &&) __as...);
+        stdexec::__set_value_invoke_((_Receiver &&) __rcvr, (_Fun &&) __fun,
+                                     (_As &&) __as...);
     }
     else
     {
         try
         {
-            (__set_value_invoke_)((_Receiver &&) __rcvr, (_Fun &&) __fun,
-                                  (_As &&) __as...);
+            stdexec::__set_value_invoke_((_Receiver &&) __rcvr, (_Fun &&) __fun,
+                                         (_As &&) __as...);
         }
         catch (...)
         {
@@ -2689,8 +2786,8 @@
                  __receiver_of_invoke_result<_Receiver, _Fun, _As...>
     void set_value(_As&&... __as) && noexcept
     {
-        (__set_value_invoke)(((__receiver &&) * this).base(), (_Fun &&) __f_,
-                             (_As &&) __as...);
+        stdexec::__set_value_invoke(((__receiver &&) * this).base(),
+                                    (_Fun &&) __f_, (_As &&) __as...);
     }
 
   public:
@@ -2728,7 +2825,7 @@
         // BUGBUG
         -> connect_result_t<__member_t<_Self, _Sender>, __receiver<_Receiver>>
     {
-        return execution::connect(
+        return stdexec::connect(
             ((_Self &&) __self).__sndr_,
             __receiver<_Receiver>{(_Receiver &&) __rcvr,
                                   ((_Self &&) __self).__fun_});
@@ -2822,8 +2919,8 @@
                  __receiver_of_invoke_result<_Receiver, _Fun, _Error>
     void set_error(_Error&& __err) && noexcept
     {
-        (__set_value_invoke)(((__receiver &&) * this).base(), (_Fun &&) __f_,
-                             (_Error &&) __err);
+        stdexec::__set_value_invoke(((__receiver &&) * this).base(),
+                                    (_Fun &&) __f_, (_Error &&) __err);
     }
 
   public:
@@ -2861,7 +2958,7 @@
                                                    __receiver<_Receiver>>)
         -> connect_result_t<__member_t<_Self, _Sender>, __receiver<_Receiver>>
     {
-        return execution::connect(
+        return stdexec::connect(
             ((_Self &&) __self).__sndr_,
             __receiver<_Receiver>{(_Receiver &&) __rcvr,
                                   ((_Self &&) __self).__fun_});
@@ -2950,7 +3047,8 @@
     // to the base class
     void set_stopped() && noexcept
     {
-        (__set_value_invoke)(((__receiver &&) * this).base(), (_Fun &&) __f_);
+        stdexec::__set_value_invoke(((__receiver &&) * this).base(),
+                                    (_Fun &&) __f_);
     }
 
   public:
@@ -2991,7 +3089,7 @@
                      -> connect_result_t<__member_t<_Self, _Sender>,
                                          __receiver<_Receiver>>
     {
-        return execution::connect(
+        return stdexec::connect(
             ((_Self &&) __self).__sndr_,
             __receiver<_Receiver>{(_Receiver &&) __rcvr,
                                   ((_Self &&) __self).__fun_});
@@ -3087,7 +3185,7 @@
         {
             __f_(__i, __as...);
         }
-        execution::set_value(std::move(this->base()), (_As &&) __as...);
+        stdexec::set_value(std::move(this->base()), (_As &&) __as...);
     }
 
     template <class... _As>
@@ -3100,12 +3198,12 @@
             {
                 __f_(__i, __as...);
             }
-            execution::set_value(std::move(this->base()), (_As &&) __as...);
+            stdexec::set_value(std::move(this->base()), (_As &&) __as...);
         }
         catch (...)
         {
-            execution::set_error(std::move(this->base()),
-                                 std::current_exception());
+            stdexec::set_error(std::move(this->base()),
+                               std::current_exception());
         }
     }
 
@@ -3150,7 +3248,7 @@
                                                    __receiver<_Receiver>>)
         -> connect_result_t<__member_t<_Self, _Sender>, __receiver<_Receiver>>
     {
-        return execution::connect(
+        return stdexec::connect(
             ((_Self &&) __self).__sndr_,
             __receiver<_Receiver>{(_Receiver &&) __rcvr, __self.__shape_,
                                   ((_Self &&) __self).__fun_});
@@ -3230,42 +3328,50 @@
 // [execution.senders.adaptors.split]
 namespace __split
 {
-template <class _SharedState>
+template <class _BaseEnv>
+using __env_t = __make_env_t<_BaseEnv, // BUGBUG NOT TO SPEC
+                             __with_t<get_stop_token_t, in_place_stop_token>>;
+
+template <class _SenderId, class _EnvId>
+struct __sh_state;
+
+template <class _SenderId, class _EnvId>
 class __receiver
 {
-    _SharedState& __sh_state_;
+    using _Sender = __t<_SenderId>;
+    using _Env = __t<_EnvId>;
+    __sh_state<_SenderId, _EnvId>& __sh_state_;
 
   public:
     template <__one_of<set_value_t, set_error_t, set_stopped_t> _Tag,
-              class... _As _NVCXX_CAPTURE_PACK(_As)>
+              class... _As>
     friend void tag_invoke(_Tag __tag, __receiver&& __self,
                            _As&&... __as) noexcept
     {
-        _SharedState& __state = __self.__sh_state_;
+        __sh_state<_SenderId, _EnvId>& __state = __self.__sh_state_;
 
-        _NVCXX_EXPAND_PACK(
-            _As, __as,
-            try {
-                using __tuple_t = __decayed_tuple<_Tag, _As...>;
-                __state.__data_.template emplace<__tuple_t>(__tag,
-                                                            (_As &&) __as...);
-            } catch (...) {
-                using __tuple_t =
-                    __decayed_tuple<set_error_t, std::exception_ptr>;
-                __state.__data_.template emplace<__tuple_t>(
-                    set_error, std::current_exception());
-            })
+        try
+        {
+            using __tuple_t = __decayed_tuple<_Tag, _As...>;
+            __state.__data_.template emplace<__tuple_t>(__tag,
+                                                        (_As &&) __as...);
+        }
+        catch (...)
+        {
+            using __tuple_t = __decayed_tuple<set_error_t, std::exception_ptr>;
+            __state.__data_.template emplace<__tuple_t>(
+                set_error, std::current_exception());
+        }
         __state.__notify();
     }
 
-    friend auto tag_invoke(get_env_t, const __receiver& __self)
-        -> __make_env_t<__with_t<get_stop_token_t, in_place_stop_token>>
+    friend const __env_t<_Env>& tag_invoke(get_env_t,
+                                           const __receiver& __self) noexcept
     {
-        return __make_env(__with(
-            get_stop_token, __self.__sh_state_.__stop_source_.get_token()));
+        return __self.__sh_state_.__env_;
     }
 
-    explicit __receiver(_SharedState& __sh_state) noexcept :
+    explicit __receiver(__sh_state<_SenderId, _EnvId>& __sh_state) noexcept :
         __sh_state_(__sh_state)
     {}
 };
@@ -3278,10 +3384,11 @@
     __notify_fn* __notify_{};
 };
 
-template <class _SenderId>
+template <class _SenderId, class _EnvId>
 struct __sh_state
 {
     using _Sender = __t<_SenderId>;
+    using _Env = __t<_EnvId>;
 
     template <class... _Ts>
     using __bind_tuples =
@@ -3290,24 +3397,28 @@
                                                    // variant is set_stopped
                         std::tuple<set_error_t, std::exception_ptr>, _Ts...>;
 
-    using __bound_values_t = __value_types_of_t<
-        _Sender, __make_env_t<__with_t<get_stop_token_t, in_place_stop_token>>,
-        __mbind_front_q<__decayed_tuple, set_value_t>, __q<__bind_tuples>>;
+    using __bound_values_t =
+        __value_types_of_t<_Sender, __env_t<_Env>,
+                           __mbind_front_q<__decayed_tuple, set_value_t>,
+                           __q<__bind_tuples>>;
 
     using __variant_t = __error_types_of_t<
-        _Sender, __make_env_t<__with_t<get_stop_token_t, in_place_stop_token>>,
+        _Sender, __env_t<_Env>,
         __transform<__mbind_front_q<__decayed_tuple, set_error_t>,
                     __bound_values_t>>;
 
-    using __receiver_ = __receiver<__sh_state>;
+    using __receiver_ = __receiver<_SenderId, _EnvId>;
 
     in_place_stop_source __stop_source_{};
     __variant_t __data_;
     std::atomic<void*> __head_{nullptr};
-    connect_result_t<_Sender, __receiver_> __op_state2_;
+    __env_t<_Env> __env_;
+    connect_result_t<_Sender&, __receiver_> __op_state2_;
 
-    explicit __sh_state(_Sender& __sndr) :
-        __op_state2_(connect((_Sender &&) __sndr, __receiver_{*this}))
+    explicit __sh_state(_Sender& __sndr, _Env __env) :
+        __env_(__make_env((_Env &&) __env,
+                          __with(get_stop_token, __stop_source_.get_token()))),
+        __op_state2_(connect(__sndr, __receiver_{*this}))
     {}
 
     void __notify() noexcept
@@ -3326,10 +3437,11 @@
     }
 };
 
-template <class _SenderId, class _ReceiverId>
+template <class _SenderId, class _EnvId, class _ReceiverId>
 class __operation : public __operation_base
 {
     using _Sender = __t<_SenderId>;
+    using _Env = __t<_EnvId>;
     using _Receiver = __t<_ReceiverId>;
 
     struct __on_stop_requested
@@ -3345,17 +3457,18 @@
 
     _Receiver __recvr_;
     __on_stop __on_stop_{};
-    std::shared_ptr<__sh_state<_SenderId>> __shared_state_;
+    std::shared_ptr<__sh_state<_SenderId, _EnvId>> __shared_state_;
 
   public:
     __operation(
         _Receiver&& __rcvr,
-        std::shared_ptr<__sh_state<_SenderId>>
+        std::shared_ptr<__sh_state<_SenderId, _EnvId>>
             __shared_state) noexcept(std::
                                          is_nothrow_move_constructible_v<
                                              _Receiver>) :
         __operation_base{nullptr, __notify},
-        __recvr_((_Receiver &&) __rcvr), __shared_state_(move(__shared_state))
+        __recvr_((_Receiver &&) __rcvr),
+        __shared_state_(std::move(__shared_state))
     {}
     STDEXEC_IMMOVABLE(__operation);
 
@@ -3377,7 +3490,8 @@
 
     friend void tag_invoke(start_t, __operation& __self) noexcept
     {
-        __sh_state<_SenderId>* __shared_state = __self.__shared_state_.get();
+        __sh_state<_SenderId, _EnvId>* __shared_state =
+            __self.__shared_state_.get();
         std::atomic<void*>& __head = __shared_state->__head_;
         void* const __completion_state = static_cast<void*>(__shared_state);
         void* __old = __head.load(std::memory_order_acquire);
@@ -3419,21 +3533,37 @@
     }
 };
 
-template <class _SenderId>
+template <class _SenderId, class _EnvId>
 class __sender
 {
     using _Sender = __t<_SenderId>;
-    using __sh_state_ = __sh_state<_SenderId>;
+    using _Env = __t<_EnvId>;
+    using __sh_state_ = __sh_state<_SenderId, _EnvId>;
     template <class _Receiver>
-    using __operation = __operation<_SenderId, __x<remove_cvref_t<_Receiver>>>;
+    using __operation =
+        __operation<_SenderId, _EnvId, __x<remove_cvref_t<_Receiver>>>;
+
+    template <class... _Tys>
+    using __set_value_t =
+        completion_signatures<set_value_t(const decay_t<_Tys>&...)>;
+
+    template <class _Ty>
+    using __set_error_t =
+        completion_signatures<set_error_t(const decay_t<_Ty>&)>;
+
+    template <class _Self>
+    using __completions_t = make_completion_signatures<
+        _Sender&, __env_t<__make_dependent_on<_Env, _Self>>,
+        completion_signatures<set_error_t(const std::exception_ptr&),
+                              set_stopped_t()>, // NOT TO SPEC
+        __set_value_t, __set_error_t>;
 
     _Sender __sndr_;
     std::shared_ptr<__sh_state_> __shared_state_;
 
   public:
-    template <__decays_to<__sender> _Self, receiver _Receiver>
-        requires receiver_of<_Receiver,
-                             completion_signatures_of_t<_Self, __empty_env>>
+    template <__decays_to<__sender> _Self,
+              receiver_of<__completions_t<_Self>> _Receiver>
     friend auto
         tag_invoke(connect_t, _Self&& __self, _Receiver&& __recvr) noexcept(
             std::is_nothrow_constructible_v<decay_t<_Receiver>, _Receiver>)
@@ -3443,8 +3573,7 @@
                                       __self.__shared_state_};
     }
 
-    template <tag_category<forwarding_sender_query> _Tag,
-              class... _As _NVCXX_CAPTURE_PACK(_As)>
+    template <tag_category<forwarding_sender_query> _Tag, class... _As>
         requires(!__is_instance_of<_Tag, get_completion_scheduler_t>) &&
                 __callable<_Tag, const _Sender&, _As...>
                 friend auto tag_invoke(
@@ -3456,65 +3585,107 @@
                         tag_category<_Tag, forwarding_sender_query>, _Tag,
                         const _Sender&, _As...>
     {
-        _NVCXX_EXPAND_PACK_RETURN(
-            _As, __as,
-            return ((_Tag &&) __tag)(__self.__sndr_, (_As &&) __as...);)
+        return ((_Tag &&) __tag)(__self.__sndr_, (_As &&) __as...);
     }
 
-    template <class... _Tys>
-    using __set_value_t =
-        completion_signatures<set_value_t(const decay_t<_Tys>&...)>;
+    template <__decays_to<__sender> _Self, class _OtherEnv>
+    friend auto tag_invoke(get_completion_signatures_t, _Self&&, _OtherEnv)
+        -> __completions_t<_Self>;
 
-    template <class _Ty>
-    using __set_error_t =
-        completion_signatures<set_error_t(const decay_t<_Ty>&)>;
-
-    template <__decays_to<__sender> _Self, class _Env>
-    friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
-        -> make_completion_signatures<
-            _Sender,
-            __make_env_t<__with_t<get_stop_token_t, in_place_stop_token>>,
-            completion_signatures<set_error_t(const std::exception_ptr&)>,
-            __set_value_t, __set_error_t>;
-
-    explicit __sender(_Sender __sndr) :
+    explicit __sender(_Sender __sndr, _Env __env) :
         __sndr_((_Sender &&) __sndr),
-        __shared_state_{std::make_shared<__sh_state_>(__sndr_)}
+        __shared_state_{std::make_shared<__sh_state_>(__sndr_, (_Env &&) __env)}
     {}
 };
 
+struct split_t;
+
+// When looking for user-defined customizations of split, these
+// are the signatures to test against, in order:
+template <class _Sender, class _Env>
+using __cust_sigs = __msignatures<
+    tag_invoke_t(split_t, get_completion_scheduler_t<set_value_t>(_Sender&),
+                 _Sender),
+    tag_invoke_t(split_t, get_completion_scheduler_t<set_value_t>(_Sender&),
+                 _Sender, _Env),
+    tag_invoke_t(split_t, get_scheduler_t(_Env&), _Sender),
+    tag_invoke_t(split_t, get_scheduler_t(_Env&), _Sender, _Env),
+    tag_invoke_t(split_t, _Sender), tag_invoke_t(split_t, _Sender, _Env)>;
+
+template <class _Sender, class _Env>
+inline constexpr bool __is_split_customized =
+    __v<__many_well_formed<__cust_sigs<_Sender, _Env>>>;
+
+template <class _Sender, class _Env>
+using __sender_t =
+    __sender<__x<remove_cvref_t<_Sender>>, __x<remove_cvref_t<_Env>>>;
+
+template <class _Sender, class _Env>
+using __receiver_t =
+    __receiver<__x<remove_cvref_t<_Sender>>, __x<remove_cvref_t<_Env>>>;
+
+template <class _Sender, class _Env>
+using __construct_sender = __mconstruct<__sender_t<_Sender, _Env>>(_Sender,
+                                                                   _Env);
+
+template <class _Sender, class _Env>
+using __which_t =
+    __mwhich_t<__cust_sigs<_Sender, _Env>, __construct_sender<_Sender, _Env>>;
+
+template <class _Sender, class _Env>
+using __which_i =
+    __mwhich_i<__cust_sigs<_Sender, _Env>, __construct_sender<_Sender, _Env>>;
+
 struct split_t
 {
-    template <class _Sender>
-    using __sender = __sender<__x<remove_cvref_t<_Sender>>>;
+    template <sender _Sender, class _Env = __empty_env>
+        requires(copy_constructible<remove_cvref_t<_Sender>> &&
+                 sender_to<_Sender&, __receiver_t<_Sender, _Env>>) ||
+                __is_split_customized<_Sender, _Env>
+                auto operator()(_Sender&& __sndr, _Env&& __env = _Env{}) const
+                noexcept(__mnoexcept_v<__which_t<_Sender, _Env>>)
+                    -> __mtypeof<__which_t<_Sender, _Env>>
+    {
+        constexpr auto __idx = __v<__which_i<_Sender, _Env>>;
+        // Dispatch to the correct implementation:
+        if constexpr (__idx == 0)
+        {
+            auto __sched = get_completion_scheduler<set_value_t>(__sndr);
+            return tag_invoke(split_t{}, std::move(__sched),
+                              (_Sender &&) __sndr);
+        }
+        else if constexpr (__idx == 1)
+        {
+            auto __sched = get_completion_scheduler<set_value_t>(__sndr);
+            return tag_invoke(split_t{}, std::move(__sched),
+                              (_Sender &&) __sndr, (_Env &&) __env);
+        }
+        else if constexpr (__idx == 2)
+        {
+            return tag_invoke(split_t{}, get_scheduler(__env),
+                              (_Sender &&) __sndr);
+        }
+        else if constexpr (__idx == 3)
+        {
+            auto __sched = get_scheduler(__env);
+            return tag_invoke(split_t{}, std::move(__sched),
+                              (_Sender &&) __sndr, (_Env &&) __env);
+        }
+        else if constexpr (__idx == 4)
+        {
+            return tag_invoke(split_t{}, (_Sender &&) __sndr);
+        }
+        else if constexpr (__idx == 5)
+        {
+            return tag_invoke(split_t{}, (_Sender &&) __sndr, (_Env &&) __env);
+        }
+        else
+        {
+            return __sender_t<_Sender, _Env>{(_Sender &&) __sndr,
+                                             (_Env &&) __env};
+        }
+    }
 
-    template <sender _Sender>
-        requires __tag_invocable_with_completion_scheduler<split_t, set_value_t,
-                                                           _Sender>
-    sender auto operator()(_Sender&& __sndr) const noexcept(
-        nothrow_tag_invocable<
-            split_t, __completion_scheduler_for<_Sender, set_value_t>, _Sender>)
-    {
-        auto __sched = get_completion_scheduler<set_value_t>(__sndr);
-        return tag_invoke(split_t{}, std::move(__sched), (_Sender &&) __sndr);
-    }
-    template <sender _Sender>
-        requires(!__tag_invocable_with_completion_scheduler<
-                    split_t, set_value_t, _Sender>) &&
-                tag_invocable<split_t, _Sender>
-    sender auto operator()(_Sender&& __sndr) const
-        noexcept(nothrow_tag_invocable<split_t, _Sender>)
-    {
-        return tag_invoke(split_t{}, (_Sender &&) __sndr);
-    }
-    template <sender _Sender>
-        requires(!__tag_invocable_with_completion_scheduler<
-                    split_t, set_value_t, _Sender>) &&
-                (!tag_invocable<split_t, _Sender>)
-    __sender<_Sender> operator()(_Sender&& __sndr) const
-    {
-        return __sender<_Sender>{(_Sender &&) __sndr};
-    }
     __binder_back<split_t> operator()() const
     {
         return {{}, {}, {}};
@@ -3528,31 +3699,38 @@
 // [execution.senders.adaptors.ensure_started]
 namespace __ensure_started
 {
-using __env = __make_env_t<__with_t<get_stop_token_t, in_place_stop_token>>;
+template <class _BaseEnv>
+using __env_t = __make_env_t<_BaseEnv, // NOT TO SPEC
+                             __with_t<get_stop_token_t, in_place_stop_token>>;
 
-template <class _SharedState>
+template <class _SenderId, class _EnvId>
+struct __sh_state;
+
+template <class _SenderId, class _EnvId>
 class __receiver
 {
-    __intrusive_ptr<_SharedState> __shared_state_;
+    using _Sender = __t<_SenderId>;
+    using _Env = __t<_EnvId>;
+    __intrusive_ptr<__sh_state<_SenderId, _EnvId>> __shared_state_;
 
   public:
-    explicit __receiver(_SharedState& __shared_state) noexcept :
+    explicit __receiver(__sh_state<_SenderId, _EnvId>& __shared_state) noexcept
+        :
         __shared_state_(__shared_state.__intrusive_from_this())
     {}
 
     template <__one_of<set_value_t, set_error_t, set_stopped_t> _Tag,
-              class... _As _NVCXX_CAPTURE_PACK(_As)>
+              class... _As>
     friend void tag_invoke(_Tag __tag, __receiver&& __self,
                            _As&&... __as) noexcept
     {
-        _SharedState& __state = *__self.__shared_state_;
+        __sh_state<_SenderId, _EnvId>& __state = *__self.__shared_state_;
 
         try
         {
-            _NVCXX_EXPAND_PACK(
-                _As, __as, using __tuple_t = __decayed_tuple<_Tag, _As...>;
-                __state.__data_.template emplace<__tuple_t>(__tag,
-                                                            (_As &&) __as...);)
+            using __tuple_t = __decayed_tuple<_Tag, _As...>;
+            __state.__data_.template emplace<__tuple_t>(__tag,
+                                                        (_As &&) __as...);
         }
         catch (...)
         {
@@ -3565,10 +3743,9 @@
         __self.__shared_state_.reset();
     }
 
-    friend __env tag_invoke(get_env_t, const __receiver& __self)
+    friend const __env_t<_Env>& tag_invoke(get_env_t, const __receiver& __self)
     {
-        auto __stok = __self.__shared_state_->__stop_source_.get_token();
-        return __make_env(__with(get_stop_token, std::move(__stok)));
+        return __self.__shared_state_->__env_;
     }
 };
 
@@ -3578,10 +3755,11 @@
     __notify_fn* __notify_{};
 };
 
-template <class _SenderId>
-struct __sh_state : __enable_intrusive_from_this<__sh_state<_SenderId>>
+template <class _SenderId, class _EnvId>
+struct __sh_state : __enable_intrusive_from_this<__sh_state<_SenderId, _EnvId>>
 {
     using _Sender = __t<_SenderId>;
+    using _Env = __t<_EnvId>;
 
     template <class... _Ts>
     using __bind_tuples =
@@ -3591,26 +3769,28 @@
                         std::tuple<set_error_t, std::exception_ptr>, _Ts...>;
 
     using __bound_values_t =
-        __value_types_of_t<_Sender, __env,
+        __value_types_of_t<_Sender, __env_t<_Env>,
                            __mbind_front_q<__decayed_tuple, set_value_t>,
                            __q<__bind_tuples>>;
 
     using __variant_t = __error_types_of_t<
-        _Sender, __env,
+        _Sender, __env_t<_Env>,
         __transform<__mbind_front_q<__decayed_tuple, set_error_t>,
                     __bound_values_t>>;
 
-    using __receiver_t = __receiver<__sh_state>;
+    using __receiver_t = __receiver<_SenderId, _EnvId>;
 
     __variant_t __data_;
     in_place_stop_source __stop_source_{};
 
-    std::atomic<void*> __op_state1_;
-    connect_result_t<_Sender, __receiver_t> __op_state2_;
+    std::atomic<void*> __op_state1_{nullptr};
+    __env_t<_Env> __env_;
+    connect_result_t<_Sender&, __receiver_t> __op_state2_;
 
-    explicit __sh_state(_Sender& __sndr) :
-        __op_state1_{nullptr},
-        __op_state2_(connect((_Sender &&) __sndr, __receiver_t{*this}))
+    explicit __sh_state(_Sender& __sndr, _Env __env) :
+        __env_(__make_env((_Env &&) __env,
+                          __with(get_stop_token, __stop_source_.get_token()))),
+        __op_state2_(connect(__sndr, __receiver_t{*this}))
     {
         start(__op_state2_);
     }
@@ -3633,10 +3813,11 @@
     }
 };
 
-template <class _SenderId, class _ReceiverId>
+template <class _SenderId, class _EnvId, class _ReceiverId>
 class __operation : public __operation_base
 {
     using _Sender = __t<_SenderId>;
+    using _Env = __t<_EnvId>;
     using _Receiver = __t<_ReceiverId>;
 
     struct __on_stop_requested
@@ -3652,12 +3833,12 @@
 
     _Receiver __rcvr_;
     __on_stop __on_stop_{};
-    __intrusive_ptr<__sh_state<_SenderId>> __shared_state_;
+    __intrusive_ptr<__sh_state<_SenderId, _EnvId>> __shared_state_;
 
   public:
     __operation(
         _Receiver __rcvr,
-        __intrusive_ptr<__sh_state<_SenderId>>
+        __intrusive_ptr<__sh_state<_SenderId, _EnvId>>
             __shared_state) noexcept(std::
                                          is_nothrow_move_constructible_v<
                                              _Receiver>) :
@@ -3696,7 +3877,8 @@
 
     friend void tag_invoke(start_t, __operation& __self) noexcept
     {
-        __sh_state<_SenderId>* __shared_state = __self.__shared_state_.get();
+        __sh_state<_SenderId, _EnvId>* __shared_state =
+            __self.__shared_state_.get();
         std::atomic<void*>& __op_state1 = __shared_state->__op_state1_;
         void* const __completion_state = static_cast<void*>(__shared_state);
         void* const __old = __op_state1.load(std::memory_order_acquire);
@@ -3715,7 +3897,7 @@
             {
                 // Stop has already been requested. Don't bother starting
                 // the child operations.
-                execution::set_stopped((_Receiver &&) __self.__rcvr_);
+                stdexec::set_stopped((_Receiver &&) __self.__rcvr_);
             }
             else
             {
@@ -3728,7 +3910,7 @@
                 {
                     // We get here when the task completed during the execution
                     // of this function. Complete the operation synchronously.
-                    assert(__old == __completion_state);
+                    STDEXEC_ASSERT(__old == __completion_state);
                     __self.__notify(&__self);
                 }
             }
@@ -3736,20 +3918,35 @@
     }
 };
 
-template <class _SenderId>
+template <class _SenderId, class _EnvId>
 class __sender
 {
     using _Sender = __t<_SenderId>;
-    using __sh_state_ = __sh_state<_SenderId>;
+    using _Env = __t<_EnvId>;
+    using __sh_state_ = __sh_state<_SenderId, _EnvId>;
     template <class _Receiver>
-    using __operation = __operation<_SenderId, __x<remove_cvref_t<_Receiver>>>;
+    using __operation =
+        __operation<_SenderId, _EnvId, __x<remove_cvref_t<_Receiver>>>;
+
+    template <class... _Tys>
+    using __set_value_t =
+        completion_signatures<set_value_t(decay_t<_Tys>&&...)>;
+
+    template <class _Ty>
+    using __set_error_t = completion_signatures<set_error_t(decay_t<_Ty>&&)>;
+
+    template <class _Self>
+    using __completions_t = make_completion_signatures<
+        _Sender&, __env_t<__make_dependent_on<_Env, _Self>>,
+        completion_signatures<set_error_t(std::exception_ptr&&),
+                              set_stopped_t()>, // BUGBUG NOT TO SPEC
+        __set_value_t, __set_error_t>;
 
     _Sender __sndr_;
     __intrusive_ptr<__sh_state_> __shared_state_;
 
-    template <same_as<__sender> _Self, receiver _Receiver>
-        requires receiver_of<_Receiver,
-                             completion_signatures_of_t<_Self, __empty_env>>
+    template <same_as<__sender> _Self,
+              receiver_of<__completions_t<_Self>> _Receiver>
     friend auto
         tag_invoke(connect_t, _Self&& __self, _Receiver&& __rcvr) noexcept(
             std::is_nothrow_constructible_v<decay_t<_Receiver>, _Receiver>)
@@ -3774,25 +3971,14 @@
         return ((_Tag &&) __tag)(__self.__sndr_, (_As &&) __as...);
     }
 
-    template <class... _Tys>
-    using __set_value_t =
-        completion_signatures<set_value_t(decay_t<_Tys>&&...)>;
-
-    template <class _Ty>
-    using __set_error_t = completion_signatures<set_error_t(decay_t<_Ty>&&)>;
-
-    template <same_as<__sender> _Self, class _Env>
-    friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
-        -> make_completion_signatures<
-            _Sender, __env,
-            completion_signatures<set_error_t(std::exception_ptr&&),
-                                  set_stopped_t()>, // BUGBUG NOT TO SPEC
-            __set_value_t, __set_error_t>;
+    template <same_as<__sender> _Self, class _OtherEnv>
+    friend auto tag_invoke(get_completion_signatures_t, _Self&&, _OtherEnv)
+        -> __completions_t<_Self>;
 
   public:
-    explicit __sender(_Sender __sndr) :
+    explicit __sender(_Sender __sndr, _Env __env) :
         __sndr_((_Sender &&) __sndr),
-        __shared_state_{__make_intrusive<__sh_state_>(__sndr_)}
+        __shared_state_{__make_intrusive<__sh_state_>(__sndr_, (_Env &&) __env)}
     {}
     ~__sender()
     {
@@ -3807,48 +3993,103 @@
     __sender(__sender&&) = default;
 };
 
+struct ensure_started_t;
+
+// When looking for user-defined customizations of split, these
+// are the signatures to test against, in order:
+template <class _Sender, class _Env>
+using __cust_sigs = __msignatures<
+    tag_invoke_t(ensure_started_t,
+                 get_completion_scheduler_t<set_value_t>(_Sender&), _Sender),
+    tag_invoke_t(ensure_started_t,
+                 get_completion_scheduler_t<set_value_t>(_Sender&), _Sender,
+                 _Env),
+    tag_invoke_t(ensure_started_t, get_scheduler_t(_Env&), _Sender),
+    tag_invoke_t(ensure_started_t, get_scheduler_t(_Env&), _Sender, _Env),
+    tag_invoke_t(ensure_started_t, _Sender),
+    tag_invoke_t(ensure_started_t, _Sender, _Env)>;
+
+template <class _Sender, class _Env>
+inline constexpr bool __is_ensure_started_customized =
+    __v<__many_well_formed<__cust_sigs<_Sender, _Env>>>;
+
+template <class _Sender, class _Env>
+using __sender_t =
+    __sender<__x<remove_cvref_t<_Sender>>, __x<remove_cvref_t<_Env>>>;
+
+template <class _Sender, class _Env>
+using __receiver_t =
+    __receiver<__x<remove_cvref_t<_Sender>>, __x<remove_cvref_t<_Env>>>;
+
+template <class _Sender, class _Env>
+using __construct_sender = __mconstruct<__sender_t<_Sender, _Env>>(_Sender,
+                                                                   _Env);
+
+template <class _Sender, class _Env>
+using __which_t =
+    __mwhich_t<__cust_sigs<_Sender, _Env>, __construct_sender<_Sender, _Env>>;
+
+template <class _Sender, class _Env>
+using __which_i =
+    __mwhich_i<__cust_sigs<_Sender, _Env>, __construct_sender<_Sender, _Env>>;
+
 struct ensure_started_t
 {
-    template <class _Sender>
-    using __sender = __sender<__x<remove_cvref_t<_Sender>>>;
+    template <sender _Sender, class _Env = __empty_env>
+        requires(copy_constructible<remove_cvref_t<_Sender>> &&
+                 sender_to<_Sender&, __receiver_t<_Sender, _Env>>) ||
+                __is_ensure_started_customized<_Sender, _Env>
+    auto operator()(_Sender&& __sndr, _Env&& __env = _Env{}) const
+        noexcept(__mnoexcept_v<__which_t<_Sender, _Env>>)
+    { //-> __mtypeof<__which_t<_Sender, _Env>> {
+        constexpr auto __idx = __v<__which_i<_Sender, _Env>>;
+        // Dispatch to the correct implementation:
+        if constexpr (__idx == 0)
+        {
+            auto __sched = get_completion_scheduler<set_value_t>(__sndr);
+            return tag_invoke(ensure_started_t{}, std::move(__sched),
+                              (_Sender &&) __sndr);
+        }
+        else if constexpr (__idx == 1)
+        {
+            auto __sched = get_completion_scheduler<set_value_t>(__sndr);
+            return tag_invoke(ensure_started_t{}, std::move(__sched),
+                              (_Sender &&) __sndr, (_Env &&) __env);
+        }
+        else if constexpr (__idx == 2)
+        {
+            return tag_invoke(ensure_started_t{}, get_scheduler(__env),
+                              (_Sender &&) __sndr);
+        }
+        else if constexpr (__idx == 3)
+        {
+            auto __sched = get_scheduler(__env);
+            return tag_invoke(ensure_started_t{}, std::move(__sched),
+                              (_Sender &&) __sndr, (_Env &&) __env);
+        }
+        else if constexpr (__idx == 4)
+        {
+            return tag_invoke(ensure_started_t{}, (_Sender &&) __sndr);
+        }
+        else if constexpr (__idx == 5)
+        {
+            return tag_invoke(ensure_started_t{}, (_Sender &&) __sndr,
+                              (_Env &&) __env);
+        }
+        else
+        {
+            return __sender_t<_Sender, _Env>{(_Sender &&) __sndr,
+                                             (_Env &&) __env};
+        }
+    }
 
-    template <sender _Sender>
-        requires __tag_invocable_with_completion_scheduler<ensure_started_t,
-                                                           set_value_t, _Sender>
-    sender auto operator()(_Sender&& __sndr) const
-        noexcept(nothrow_tag_invocable<
-                 ensure_started_t,
-                 __completion_scheduler_for<_Sender, set_value_t>, _Sender>)
+    template <class _SenderId, class _EnvId>
+    __sender<_SenderId, _EnvId>
+        operator()(__sender<_SenderId, _EnvId> __sndr) const
     {
-        auto __sched = get_completion_scheduler<set_value_t>(__sndr);
-        return tag_invoke(ensure_started_t{}, std::move(__sched),
-                          (_Sender &&) __sndr);
+        return std::move(__sndr);
     }
-    template <sender _Sender>
-        requires(!__tag_invocable_with_completion_scheduler<
-                    ensure_started_t, set_value_t, _Sender>) &&
-                tag_invocable<ensure_started_t, _Sender>
-    sender auto operator()(_Sender&& __sndr) const
-        noexcept(nothrow_tag_invocable<ensure_started_t, _Sender>)
-    {
-        return tag_invoke(ensure_started_t{}, (_Sender &&) __sndr);
-    }
-    template <sender _Sender>
-        requires(!__tag_invocable_with_completion_scheduler<
-                    ensure_started_t, set_value_t, _Sender>) &&
-                (!tag_invocable<ensure_started_t, _Sender>)
-    __sender<_Sender> operator()(_Sender&& __sndr) const
-    {
-        return __sender<_Sender>{(_Sender &&) __sndr};
-    }
-    template <sender _Sender>
-        requires(!__tag_invocable_with_completion_scheduler<
-                    ensure_started_t, set_value_t, __sender<_Sender>>) &&
-                (!tag_invocable<ensure_started_t, __sender<_Sender>>)
-    __sender<_Sender> operator()(__sender<_Sender> __sndr) const
-    {
-        return __sndr;
-    }
+
     __binder_back<ensure_started_t> operator()() const
     {
         return {{}, {}, {}};
@@ -3864,236 +4105,123 @@
 // [execution.senders.adaptors.let_stopped]
 namespace __let
 {
-namespace __impl
-{
-template <class... _Ts>
-struct __as_tuple
-{
-    __decayed_tuple<_Ts...> operator()(_Ts...) const;
-};
-
-template <class _SenderId, class _ReceiverId, class _FunId, class _Let>
-struct __receiver;
-
-template <class... _Ts>
-struct __which_tuple_ : _Ts...
-{
-    using _Ts::operator()...;
-};
-
-struct __which_tuple_base
-{
-    template <class... _Ts>
-    __decayed_tuple<_Ts...> operator()(_Ts&&...) const;
-};
-
-template <sender, class, class>
-struct __which_tuple : __which_tuple_base
-{};
-
-template <class _Sender, class _Env>
-    requires sender<_Sender, _Env>
-struct __which_tuple<_Sender, _Env, set_value_t> :
-    value_types_of_t<_Sender, _Env, __as_tuple, __which_tuple_>
-{};
-
-template <class _Sender, class _Env>
-    requires sender<_Sender, _Env>
-struct __which_tuple<_Sender, _Env, set_error_t> :
-    __error_types_of_t<_Sender, _Env,
-                       __transform<__q<__as_tuple>, __q<__which_tuple_>>>
-{};
-
-template <class _Fun>
-struct __applyable_fn
-{
-    template <class... _As>
-    __ operator()(_As&&...) const;
-    template <class... _As>
-        requires invocable<_Fun, _As...>
-    std::invoke_result_t<_Fun, _As...> operator()(_As&&...) const
-    {
-        std::terminate(); // this is never called; but we need a body
-    }
-};
-
-template <class _Fun, class _Tuple>
-concept __applyable = requires(__applyable_fn<_Fun> __fun, _Tuple&& __tupl) {
-                          {
-                              std::apply(__fun, (_Tuple &&) __tupl)
-                              } -> __none_of<__>;
-                      };
-template <class _Fun, class _Tuple>
-    requires __applyable<_Fun, _Tuple>
-using __apply_result_t =
-    decltype(std::apply(__applyable_fn<_Fun>{}, __declval<_Tuple>()));
-
 template <class _T>
 using __decay_ref = decay_t<_T>&;
 
-template <class _Fun, class... _As>
-using __result_sender_t = __call_result_t<_Fun, __decay_ref<_As>...>;
+template <class _Fun>
+using __result_sender =
+    __transform<__q1<__decay_ref>, __mbind_front_q<__call_result_t, _Fun>>;
 
-template <class _Sender, class _Receiver, class _Fun, class _SetTag>
-    requires sender<_Sender, env_of_t<_Receiver>>
-struct __storage
-{
-#if STDEXEC_NVHPC()
-    template <class... _As>
-    using __op_state_for_t =
-        __minvoke2<__q2<connect_result_t>, __result_sender_t<_Fun, _As...>,
-                   _Receiver>;
-#else
-    template <class... _As>
-    using __op_state_for_t =
-        connect_result_t<__result_sender_t<_Fun, _As...>, _Receiver>;
-#endif
+template <class _Receiver, class _Fun>
+using __op_state_for = __mcompose<__mbind_back_q1<connect_result_t, _Receiver>,
+                                  __result_sender<_Fun>>;
 
-    // Compute a variant of tuples to hold all the values of the input
-    // sender:
-    using __args_t =
-        __gather_sigs_t<_SetTag, _Sender, env_of_t<_Receiver>,
-                        __q<__decayed_tuple>, __nullable_variant_t>;
-    __args_t __args_;
-
-    // Compute a variant of operation states:
-    using __op_state3_t =
-        __gather_sigs_t<_SetTag, _Sender, env_of_t<_Receiver>,
-                        __q<__op_state_for_t>, __nullable_variant_t>;
-    __op_state3_t __op_state3_;
-};
-
-template <class _Env, class _Fun, class _Set, class _Sig>
+template <class _Set, class _Sig>
 struct __tfx_signal_
-{};
-
-template <class _Env, class _Fun, class _Set, class _Ret, class... _Args>
-    requires(!same_as<_Set, _Ret>)
-struct __tfx_signal_<_Env, _Fun, _Set, _Ret(_Args...)>
 {
-    using __t = completion_signatures<_Ret(_Args...)>;
+    template <class, class>
+    using __f = completion_signatures<_Sig>;
 };
 
-template <class _Env, class _Fun, class _Set, class... _Args>
-    requires invocable<_Fun, __decay_ref<_Args>...> &&
-             sender<std::invoke_result_t<_Fun, __decay_ref<_Args>...>, _Env>
-struct __tfx_signal_<_Env, _Fun, _Set, _Set(_Args...)>
+template <class _Set, class... _Args>
+struct __tfx_signal_<_Set, _Set(_Args...)>
 {
-    using __t = make_completion_signatures<
-        __result_sender_t<_Fun, _Args...>, _Env,
+    template <class _Env, class _Fun>
+    using __f = make_completion_signatures<
+        __minvoke<__result_sender<_Fun>, _Args...>, _Env,
         // because we don't know if connect-ing the result sender will throw:
         completion_signatures<set_error_t(std::exception_ptr)>>;
 };
 
-template <class _Env, class _Fun, class _Set>
-struct __tfx_signal
+template <class _Env, class _Fun, class _Set, class _Sig>
+using __tfx_signal_t = __minvoke2<__tfx_signal_<_Set, _Sig>, _Env, _Fun>;
+
+template <class _ReceiverId, class _FunId, class _Let, class... _Tuples>
+struct __operation_base_ : __immovable
 {
-    template <class _Sig>
-    using __f = __t<__tfx_signal_<_Env, _Fun, _Set, _Sig>>;
+    using _Receiver = __t<_ReceiverId>;
+    using _Fun = __t<_FunId>;
+
+    using __results_variant_t = std::variant<std::monostate, _Tuples...>;
+    using __op_state_variant_t =
+        __minvoke<__transform<__uncurry<__op_state_for<_Receiver, _Fun>>,
+                              __nullable_variant_t>,
+                  _Tuples...>;
+
+    _Receiver __rcvr_;
+    _Fun __fun_;
+    __results_variant_t __args_;
+    __op_state_variant_t __op_state3_;
 };
 
-template <class _SenderId, class _ReceiverId, class _FunId, class _Let>
-struct __operation;
-
-template <class _SenderId, class _ReceiverId, class _FunId, class _Let>
-struct __receiver
+template <class _ReceiverId, class _FunId, class _Let, class... _Tuples>
+struct __receiver_
 {
-    using _Sender = __t<_SenderId>;
     using _Receiver = __t<_ReceiverId>;
     using _Fun = __t<_FunId>;
     using _Env = env_of_t<_Receiver>;
-    _Receiver&& base() && noexcept
-    {
-        return (_Receiver &&) __op_state_->__rcvr_;
-    }
-    const _Receiver& base() const& noexcept
-    {
-        return __op_state_->__rcvr_;
-    }
 
-    template <class... _As>
-    using __which_tuple_t =
-        __call_result_t<__which_tuple<_Sender, _Env, _Let>, _As...>;
-
-#if STDEXEC_NVHPC()
-    template <class... _As>
-    using __op_state_for_t =
-        __minvoke2<__q2<connect_result_t>, __result_sender_t<_Fun, _As...>,
-                   _Receiver>;
-#else
-    template <class... _As>
-    using __op_state_for_t =
-        connect_result_t<__result_sender_t<_Fun, _As...>, _Receiver>;
-#endif
-
-    // handle the case when let_error is used with an input sender that
-    // never completes with set_error(exception_ptr)
-    template <__decays_to<std::exception_ptr> _Error>
-        requires same_as<_Let, set_error_t> &&
-                 (!__v<__error_types_of_t<
-                      _Sender, _Env,
-                      __transform<__q1<decay_t>,
-                                  __contains<std::exception_ptr>>>>)
-    friend void tag_invoke(set_error_t, __receiver&& __self,
-                           _Error&& __err) noexcept
-    {
-        set_error(std::move(__self).base(), (_Error &&) __err);
-    }
-
-    template <__one_of<_Let> _Tag, class... _As _NVCXX_CAPTURE_PACK(_As)>
-        requires __applyable<_Fun, __which_tuple_t<_As...>&> &&
-                 sender_to<__apply_result_t<_Fun, __which_tuple_t<_As...>&>,
-                           _Receiver>
-    friend void tag_invoke(_Tag, __receiver&& __self, _As&&... __as) noexcept
+    template <__one_of<_Let> _Tag, class... _As>
+        requires __minvocable<__result_sender<_Fun>, _As...> &&
+                 sender_to<__minvoke<__result_sender<_Fun>, _As...>, _Receiver>
+    friend void tag_invoke(_Tag, __receiver_&& __self, _As&&... __as) noexcept
     try
     {
-        _NVCXX_EXPAND_PACK(
-            _As, __as, using __tuple_t = __which_tuple_t<_As...>;
-            using __op_state_t = __mapply<__q<__op_state_for_t>, __tuple_t>;
-            auto& __args = __self.__op_state_->__storage_.__args_
-                               .template emplace<__tuple_t>((_As &&) __as...);
-            auto& __op =
-                __self.__op_state_->__storage_.__op_state3_
-                    .template emplace<__op_state_t>(__conv{[&] {
-                        return connect(
-                            std::apply(std::move(__self.__op_state_->__fun_),
-                                       __args),
-                            std::move(__self).base());
-                    }});
-            start(__op);)
+        using __tuple_t = __decayed_tuple<_As...>;
+        using __op_state_t = __minvoke<__op_state_for<_Receiver, _Fun>, _As...>;
+        auto& __args = __self.__op_state_->__args_.template emplace<__tuple_t>(
+            (_As &&) __as...);
+        auto& __op =
+            __self.__op_state_->__op_state3_.template emplace<__op_state_t>(
+                __conv{[&] {
+                    return connect(
+                        std::apply(std::move(__self.__op_state_->__fun_),
+                                   __args),
+                        std::move(__self.__op_state_->__rcvr_));
+                }});
+        start(__op);
     }
     catch (...)
     {
-        set_error(std::move(__self).base(), std::current_exception());
+        set_error(std::move(__self.__op_state_->__rcvr_),
+                  std::current_exception());
     }
 
     template <__one_of<set_value_t, set_error_t, set_stopped_t> _Tag,
-              class... _As _NVCXX_CAPTURE_PACK(_As)>
+              class... _As>
         requires __none_of<_Tag, _Let> && __callable<_Tag, _Receiver, _As...>
-    friend void tag_invoke(_Tag __tag, __receiver&& __self,
+    friend void tag_invoke(_Tag __tag, __receiver_&& __self,
                            _As&&... __as) noexcept
     {
-        _NVCXX_EXPAND_PACK(
-            _As, __as,
-            static_assert(__nothrow_callable<_Tag, _Receiver, _As...>);
-            __tag(std::move(__self).base(), (_As &&) __as...);)
+        __tag(std::move(__self.__op_state_->__rcvr_), (_As &&) __as...);
     }
 
-    friend auto tag_invoke(get_env_t, const __receiver& __self)
+    friend auto tag_invoke(get_env_t, const __receiver_& __self)
         -> env_of_t<_Receiver>
     {
-        return get_env(__self.base());
+        return get_env(__self.__op_state_->__rcvr_);
     }
 
-    __operation<_SenderId, _ReceiverId, _FunId, _Let>* __op_state_;
+    using __operation_base_t =
+        __operation_base_<_ReceiverId, _FunId, _Let, _Tuples...>;
+    __operation_base_t* __op_state_;
 };
 
 template <class _SenderId, class _ReceiverId, class _FunId, class _Let>
-struct __operation
+using __receiver = __gather_sigs_t<
+    _Let, __t<_SenderId>, env_of_t<__t<_ReceiverId>>, __q<__decayed_tuple>,
+    __munique<__mbind_front_q<__receiver_, _ReceiverId, _FunId, _Let>>>;
+
+template <class _SenderId, class _ReceiverId, class _FunId, class _Let>
+using __operation_base = typename __receiver<_SenderId, _ReceiverId, _FunId,
+                                             _Let>::__operation_base_t;
+
+template <class _SenderId, class _ReceiverId, class _FunId, class _Let>
+struct __operation : __operation_base<_SenderId, _ReceiverId, _FunId, _Let>
 {
     using _Sender = __t<_SenderId>;
-    using _Receiver = __t<_ReceiverId>;
     using _Fun = __t<_FunId>;
+    using __op_base_t = __operation_base<_SenderId, _ReceiverId, _FunId, _Let>;
     using __receiver_t = __receiver<_SenderId, _ReceiverId, _FunId, _Let>;
 
     friend void tag_invoke(start_t, __operation& __self) noexcept
@@ -4103,14 +4231,10 @@
 
     template <class _Receiver2>
     __operation(_Sender&& __sndr, _Receiver2&& __rcvr, _Fun __fun) :
-        __rcvr_((_Receiver2 &&) __rcvr), __fun_((_Fun &&) __fun),
+        __op_base_t{{}, (_Receiver2 &&) __rcvr, (_Fun &&) __fun},
         __op_state2_(connect((_Sender &&) __sndr, __receiver_t{this}))
     {}
-    STDEXEC_IMMOVABLE(__operation);
 
-    _Receiver __rcvr_;
-    _Fun __fun_;
-    [[no_unique_address]] __storage<_Sender, _Receiver, _Fun, _Let> __storage_;
     connect_result_t<_Sender, __receiver_t> __op_state2_;
 };
 
@@ -4130,14 +4254,9 @@
                    __x<remove_cvref_t<_Receiver>>, _FunId, _Set>;
 
     template <class _Sender, class _Env>
-    using __with_error = __if_c<__sends<_Set, _Sender, _Env>,
-                                __with_exception_ptr, completion_signatures<>>;
-
-    template <class _Sender, class _Env>
     using __completions =
-        __mapply<__transform<__tfx_signal<_Env, _Fun, _Set>,
-                             __mbind_front_q<__concat_completion_signatures_t,
-                                             __with_error<_Sender, _Env>>>,
+        __mapply<__transform<__mbind_front_q1<__tfx_signal_t, _Env, _Fun, _Set>,
+                             __q<__concat_completion_signatures_t>>,
                  completion_signatures_of_t<_Sender, _Env>>;
 
     template <__decays_to<__sender> _Self, receiver _Receiver>
@@ -4151,8 +4270,7 @@
                                                ((_Self &&) __self).__fun_};
     }
 
-    template <tag_category<forwarding_sender_query> _Tag,
-              class... _As _NVCXX_CAPTURE_PACK(_As)>
+    template <tag_category<forwarding_sender_query> _Tag, class... _As>
         requires __callable<_Tag, const _Sender&, _As...>
     friend auto
         tag_invoke(_Tag __tag, const __sender& __self, _As&&... __as) noexcept(
@@ -4160,9 +4278,7 @@
             -> __call_result_if_t<tag_category<_Tag, forwarding_sender_query>,
                                   _Tag, const _Sender&, _As...>
     {
-        _NVCXX_EXPAND_PACK_RETURN(
-            _As, __as,
-            return ((_Tag &&) __tag)(__self.__sndr_, (_As &&) __as...);)
+        return ((_Tag &&) __tag)(__self.__sndr_, (_As &&) __as...);
     }
 
     template <__decays_to<__sender> _Self, class _Env>
@@ -4182,8 +4298,8 @@
 {
     using __t = _SetTag;
     template <class _Sender, class _Fun>
-    using __sender = __impl::__sender<__x<remove_cvref_t<_Sender>>,
-                                      __x<remove_cvref_t<_Fun>>, _LetTag>;
+    using __sender = __let::__sender<__x<remove_cvref_t<_Sender>>,
+                                     __x<remove_cvref_t<_Fun>>, _LetTag>;
 
     template <sender _Sender, __movable_value _Fun>
         requires __tag_invocable_with_completion_scheduler<_LetTag, set_value_t,
@@ -4221,15 +4337,14 @@
         return {{}, {}, {(_Fun &&) __fun}};
     }
 };
-} // namespace __impl
 
-struct let_value_t : __let::__impl::__let_xxx_t<let_value_t, set_value_t>
+struct let_value_t : __let::__let_xxx_t<let_value_t, set_value_t>
 {};
 
-struct let_error_t : __let::__impl::__let_xxx_t<let_error_t, set_error_t>
+struct let_error_t : __let::__let_xxx_t<let_error_t, set_error_t>
 {};
 
-struct let_stopped_t : __let::__impl::__let_xxx_t<let_stopped_t, set_stopped_t>
+struct let_stopped_t : __let::__let_xxx_t<let_stopped_t, set_stopped_t>
 {};
 } // namespace __let
 using __let::let_value_t;
@@ -4267,19 +4382,19 @@
     {
         using _Value = __single_sender_value_t<_Sender, env_of_t<_Receiver>>;
         static_assert(constructible_from<_Value, _Ty>);
-        execution::set_value(((__receiver &&) * this).base(),
-                             std::optional<_Value>{(_Ty &&) __a});
+        stdexec::set_value(((__receiver &&) * this).base(),
+                           std::optional<_Value>{(_Ty &&) __a});
     }
     catch (...)
     {
-        execution::set_error(((__receiver &&) * this).base(),
-                             std::current_exception());
+        stdexec::set_error(((__receiver &&) * this).base(),
+                           std::current_exception());
     }
     void set_stopped() && noexcept
     {
         using _Value = __single_sender_value_t<_Sender, env_of_t<_Receiver>>;
-        execution::set_value(((__receiver &&) * this).base(),
-                             std::optional<_Value>{std::nullopt});
+        stdexec::set_value(((__receiver &&) * this).base(),
+                           std::optional<_Value>{std::nullopt});
     }
 
     __operation<_SenderId, _ReceiverId>* __op_;
@@ -4330,8 +4445,7 @@
         return {((_Self &&) __self).__sndr_, (_Receiver &&) __rcvr};
     }
 
-    template <tag_category<forwarding_sender_query> _Tag,
-              class... _As _NVCXX_CAPTURE_PACK(_As)>
+    template <tag_category<forwarding_sender_query> _Tag, class... _As>
         requires __callable<_Tag, const _Sender&, _As...>
     friend auto
         tag_invoke(_Tag __tag, const __sender& __self, _As&&... __as) noexcept(
@@ -4339,9 +4453,7 @@
             -> __call_result_if_t<tag_category<_Tag, forwarding_sender_query>,
                                   _Tag, const _Sender&, _As...>
     {
-        _NVCXX_EXPAND_PACK_RETURN(
-            _As, __as,
-            return ((_Tag &&) __tag)(__self.__sndr_, (_As &&) __as...);)
+        return ((_Tag &&) __tag)(__self.__sndr_, (_As &&) __as...);
     }
 
     template <class... _Tys>
@@ -4528,11 +4640,11 @@
             return __self.__schedule();
         }
 
-        friend execution::forward_progress_guarantee
+        friend stdexec::forward_progress_guarantee
             tag_invoke(get_forward_progress_guarantee_t,
                        const __scheduler&) noexcept
         {
-            return execution::forward_progress_guarantee::parallel;
+            return stdexec::forward_progress_guarantee::parallel;
         }
 
         // BUGBUG NOT TO SPEC
@@ -4684,14 +4796,11 @@
         __self.__op_state_->__complete();
     }
 
-    template <__one_of<set_error_t, set_stopped_t> _Tag,
-              class... _As _NVCXX_CAPTURE_PACK(_As)>
+    template <__one_of<set_error_t, set_stopped_t> _Tag, class... _As>
         requires __callable<_Tag, _Receiver, _As...>
     friend void tag_invoke(_Tag, __receiver2&& __self, _As&&... __as) noexcept
     {
-        _NVCXX_EXPAND_PACK(_As, __as,
-                           _Tag{}((_Receiver &&) __self.__op_state_->__rcvr_,
-                                  (_As &&) __as...);)
+        _Tag{}((_Receiver &&) __self.__op_state_->__rcvr_, (_As &&) __as...);
     }
 
     friend auto tag_invoke(get_env_t, const __receiver2& __self)
@@ -4720,7 +4829,6 @@
 
     template <class... _Args>
     static constexpr bool __nothrow_complete_ =
-        __nothrow_connectable<schedule_result_t<_Scheduler>, __receiver2_t> &&
         (__nothrow_decay_copyable<_Args> && ...);
 
     template <class _Tag, class... _Args>
@@ -4734,28 +4842,20 @@
         __self.__op_state_->__data_
             .template emplace<__decayed_tuple<_Tag, _Args...>>(
                 _Tag{}, (_Args &&) __args...);
-        // Schedule the completion to happen on the scheduler's
-        // execution context.
-        __self.__op_state_->__state2_.emplace(
-            __conv{[__op_state = __self.__op_state_] {
-                return connect(schedule(__op_state->__sched_),
-                               __receiver2_t{__op_state});
-            }});
-        // Enqueue the scheduled operation:
-        start(*__self.__op_state_->__state2_);
+        // Enqueue the schedule operation so the completion happens
+        // on the scheduler's execution context.
+        start(__self.__op_state_->__state2_);
     }
 
     template <__one_of<set_value_t, set_error_t, set_stopped_t> _Tag,
-              class... _Args _NVCXX_CAPTURE_PACK(_Args)>
+              class... _Args>
         requires __callable<_Tag, _Receiver, _Args...>
     friend void tag_invoke(_Tag __tag, __receiver1&& __self,
                            _Args&&... __args) noexcept
     {
-        _NVCXX_EXPAND_PACK(
-            _Args, __args,
-            __try_call((_Receiver &&) __self.__op_state_->__rcvr_,
-                       __fun_c<__complete_<_Tag, _Args...>>, (_Tag &&) __tag,
-                       (__receiver1 &&) __self, (_Args &&) __args...);)
+        __try_call((_Receiver &&) __self.__op_state_->__rcvr_,
+                   __fun_c<__complete_<_Tag, _Args...>>, (_Tag &&) __tag,
+                   (__receiver1 &&) __self, (_Args &&) __args...);
     }
 
     friend auto tag_invoke(get_env_t, const __receiver1& __self)
@@ -4780,16 +4880,16 @@
     _Scheduler __sched_;
     _Receiver __rcvr_;
     __variant_t __data_;
-    std::optional<
-        connect_result_t<schedule_result_t<_Scheduler>, __receiver2_t>>
-        __state2_;
     connect_result_t<_CvrefSender, __receiver1_t> __state1_;
+    connect_result_t<schedule_result_t<_Scheduler>, __receiver2_t> __state2_;
 
+    template <__decays_to<_Receiver> _CvrefReceiver>
     __operation1(_Scheduler __sched, _CvrefSender&& __sndr,
-                 __decays_to<_Receiver> auto&& __rcvr) :
-        __sched_(__sched),
-        __rcvr_((decltype(__rcvr)&&)__rcvr),
-        __state1_(connect((_CvrefSender &&) __sndr, __receiver1_t{this}))
+                 _CvrefReceiver&& __rcvr) :
+        __sched_((_Scheduler &&) __sched),
+        __rcvr_((_CvrefReceiver &&) __rcvr),
+        __state1_(connect((_CvrefSender &&) __sndr, __receiver1_t{this})),
+        __state2_(connect(schedule(__sched_), __receiver2_t{this}))
     {}
     STDEXEC_IMMOVABLE(__operation1);
 
@@ -4802,8 +4902,8 @@
     try
     {
         std::visit(
-            [&](auto&& __tupl) -> void {
-                if constexpr (__decays_to<decltype(__tupl), std::monostate>)
+            [&]<class _Tup>(_Tup& __tupl) -> void {
+                if constexpr (same_as<_Tup, std::monostate>)
                 {
                     std::terminate(); // reaching this indicates a bug in
                                       // schedule_from
@@ -4811,14 +4911,14 @@
                 else
                 {
                     std::apply(
-                        [&](auto __tag, auto&&... __args) -> void {
-                            __tag((_Receiver &&) __rcvr_,
-                                  (decltype(__args)&&)__args...);
+                        [&]<class... _Args>(auto __tag,
+                                            _Args&... __args) -> void {
+                            __tag((_Receiver &&) __rcvr_, (_Args &&) __args...);
                         },
-                        (decltype(__tupl)&&)__tupl);
+                        __tupl);
                 }
             },
-            (__variant_t &&) __data_);
+            __data_);
     }
     catch (...)
     {
@@ -4826,6 +4926,11 @@
     }
 };
 
+template <class _Tag>
+using __decay_signature =
+    __transform<__q1<decay_t>,
+                __mcompose<__q1<completion_signatures>, __qf<_Tag>>>;
+
 template <class _SchedulerId, class _SenderId>
 struct __sender
 {
@@ -4851,8 +4956,7 @@
         return __self.__sched_;
     }
 
-    template <tag_category<forwarding_sender_query> _Tag,
-              class... _As _NVCXX_CAPTURE_PACK(_As)>
+    template <tag_category<forwarding_sender_query> _Tag, class... _As>
         requires __callable<_Tag, const _Sender&, _As...>
     friend auto
         tag_invoke(_Tag __tag, const __sender& __self, _As&&... __as) noexcept(
@@ -4860,9 +4964,7 @@
             -> __call_result_if_t<tag_category<_Tag, forwarding_sender_query>,
                                   _Tag, const _Sender&, _As...>
     {
-        _NVCXX_EXPAND_PACK_RETURN(
-            _As, _as,
-            return ((_Tag &&) __tag)(__self.__sndr_, (_As &&) __as...);)
+        return ((_Tag &&) __tag)(__self.__sndr_, (_As &&) __as...);
     }
 
     template <class... _Errs>
@@ -4875,20 +4977,21 @@
                                     __all_nothrow_decay_copyable>>,
                completion_signatures<>, __with_exception_ptr>;
 
-    template <class...>
-    using __value_t = completion_signatures<>;
+    template <class _Env>
+    using __scheduler_completions_t =
+        __make_completion_signatures<schedule_result_t<_Scheduler>, _Env,
+                                     __with_error_t<_Env>,
+                                     __mconst<completion_signatures<>>>;
 
     template <__decays_to<__sender> _Self, class _Env>
     friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
-        -> make_completion_signatures<
-            __member_t<_Self, _Sender>, _Env,
-            make_completion_signatures<schedule_result_t<_Scheduler>, _Env,
-                                       __with_error_t<_Env>, __value_t>>;
+        -> __make_completion_signatures<
+            __member_t<_Self, _Sender>, _Env, __scheduler_completions_t<_Env>,
+            __decay_signature<set_value_t>, __decay_signature<set_error_t>>;
 };
 
 struct schedule_from_t
 {
-    // NOT TO SPEC: permit non-typed senders:
     template <scheduler _Scheduler, sender _Sender>
         requires tag_invocable<schedule_from_t, _Scheduler, _Sender>
     auto operator()(_Scheduler&& __sched, _Sender&& __sndr) const
@@ -4898,7 +5001,6 @@
         return tag_invoke(*this, (_Scheduler &&) __sched, (_Sender &&) __sndr);
     }
 
-    // NOT TO SPEC: permit non-typed senders:
     template <scheduler _Scheduler, sender _Sender>
     auto operator()(_Scheduler&& __sched, _Sender&& __sndr) const
         -> __sender<__x<decay_t<_Scheduler>>, __x<decay_t<_Sender>>>
@@ -4990,7 +5092,7 @@
     auto get_env() const -> __make_env_t<env_of_t<_Receiver>,
                                          __with_t<get_scheduler_t, _Scheduler>>
     {
-        return __make_env(execution::get_env(this->base()),
+        return __make_env(stdexec::get_env(this->base()),
                           __with(get_scheduler, __op_state_->__scheduler_));
     }
 };
@@ -5096,8 +5198,7 @@
                 (_Receiver &&) __rcvr};
     }
 
-    template <tag_category<forwarding_sender_query> _Tag,
-              class... _As _NVCXX_CAPTURE_PACK(_As)>
+    template <tag_category<forwarding_sender_query> _Tag, class... _As>
         requires __callable<_Tag, const _Sender&, _As...>
     friend auto
         tag_invoke(_Tag __tag, const __sender& __self, _As&&... __as) noexcept(
@@ -5105,9 +5206,7 @@
             -> __call_result_if_t<tag_category<_Tag, forwarding_sender_query>,
                                   _Tag, const _Sender&, _As...>
     {
-        _NVCXX_EXPAND_PACK_RETURN(
-            _As, __as,
-            return ((_Tag &&) __tag)(__self.__sndr_, (_As &&) __as...);)
+        return ((_Tag &&) __tag)(__self.__sndr_, (_As &&) __as...);
     }
 
     template <class...>
@@ -5140,6 +5239,13 @@
     auto operator()(_Scheduler&& __sched, _Sender&& __sndr) const
         -> __impl::__sender<__x<decay_t<_Scheduler>>, __x<decay_t<_Sender>>>
     {
+        // connect-based customization will remove the need for this check
+        using __has_customizations =
+            __call_result_t<__has_algorithm_customizations_t, _Scheduler>;
+        static_assert(
+            !__has_customizations{},
+            "For now the default stdexec::on implementation doesn't support scheduling "
+            "onto schedulers that customize algorithms.");
         return {(_Scheduler &&) __sched, (_Sender &&) __sndr};
     }
 };
@@ -5210,14 +5316,13 @@
         using __variant_t =
             __into_variant_result_t<_Sender, env_of_t<_Receiver>>;
         static_assert(constructible_from<__variant_t, std::tuple<_As&&...>>);
-        execution::set_value(
-            ((__receiver &&) * this).base(),
-            __variant_t{std::tuple<_As&&...>{(_As &&) __as...}});
+        stdexec::set_value(((__receiver &&) * this).base(),
+                           __variant_t{std::tuple<_As&&...>{(_As &&) __as...}});
     }
     catch (...)
     {
-        execution::set_error(((__receiver &&) * this).base(),
-                             std::current_exception());
+        stdexec::set_error(((__receiver &&) * this).base(),
+                           std::current_exception());
     }
 
   public:
@@ -5252,13 +5357,11 @@
             __nothrow_connectable<_Sender, __receiver_t<_Receiver>>)
             -> connect_result_t<_Sender, __receiver_t<_Receiver>>
     {
-        return execution::connect(
-            (_Sender &&) __self.__sndr_,
-            __receiver_t<_Receiver>{(_Receiver &&) __rcvr});
+        return stdexec::connect((_Sender &&) __self.__sndr_,
+                                __receiver_t<_Receiver>{(_Receiver &&) __rcvr});
     }
 
-    template <tag_category<forwarding_sender_query> _Tag,
-              class... _As _NVCXX_CAPTURE_PACK(_As)>
+    template <tag_category<forwarding_sender_query> _Tag, class... _As>
         requires __callable<_Tag, const _Sender&, _As...>
     friend auto
         tag_invoke(_Tag __tag, const __sender& __self, _As&&... __as) noexcept(
@@ -5266,9 +5369,7 @@
             -> __call_result_if_t<tag_category<_Tag, forwarding_sender_query>,
                                   _Tag, const _Sender&, _As...>
     {
-        _NVCXX_EXPAND_PACK_RETURN(
-            _As, __as,
-            return ((_Tag &&) __tag)(__self.__sndr_, (_As &&) __as...);)
+        return ((_Tag &&) __tag)(__self.__sndr_, (_As &&) __as...);
     }
 
     template <class _Env>
@@ -5276,8 +5377,8 @@
         -> __compl_sigs<_Env>;
 
   public:
-    explicit __sender(__decays_to<_Sender> auto&& __sndr) :
-        __sndr_((decltype(__sndr))__sndr)
+    template <__decays_to<_Sender> _CvrefSender>
+    explicit __sender(_CvrefSender&& __sndr) : __sndr_((_CvrefSender &&) __sndr)
     {}
 };
 
@@ -5456,7 +5557,7 @@
             -> __make_env_t<env_of_t<_Receiver>,
                             __with_t<get_stop_token_t, in_place_stop_token>>
         {
-            return __make_env(execution::get_env(base()),
+            return __make_env(stdexec::get_env(base()),
                               __with(get_stop_token,
                                      __op_state_->__stop_source_.get_token()));
         }
@@ -5484,7 +5585,7 @@
             -> std::tuple<__child_op_state_t<__t<_SenderIds>, __index<_Is>>...>;
 
         using __child_op_states_tuple_t =
-            decltype((__connect_children_)(_Indices{}));
+            decltype(__operation::__connect_children_(_Indices{}));
 
         void __arrive() noexcept
         {
@@ -5511,13 +5612,13 @@
                                     [this](auto&... __all_vals) -> void {
                                         try
                                         {
-                                            execution::set_value(
+                                            stdexec::set_value(
                                                 (_Receiver &&) __recvr_,
                                                 std::move(__all_vals)...);
                                         }
                                         catch (...)
                                         {
-                                            execution::set_error(
+                                            stdexec::set_error(
                                                 (_Receiver &&) __recvr_,
                                                 std::current_exception());
                                         }
@@ -5534,13 +5635,13 @@
                 case __error:
                     std::visit(
                         [this](auto& __err) noexcept {
-                            execution::set_error((_Receiver &&) __recvr_,
-                                                 std::move(__err));
+                            stdexec::set_error((_Receiver &&) __recvr_,
+                                               std::move(__err));
                         },
                         __errors_);
                     break;
                 case __stopped:
-                    execution::set_stopped((_Receiver &&) __recvr_);
+                    stdexec::set_stopped((_Receiver &&) __recvr_);
                     break;
                 default:;
             }
@@ -5549,12 +5650,12 @@
         template <size_t... _Is>
         __operation(_WhenAll&& __when_all, _Receiver __rcvr,
                     std::index_sequence<_Is...>) :
+            __recvr_((_Receiver &&) __rcvr),
             __child_states_{__conv{[&__when_all, this]() {
-                return execution::connect(
+                return stdexec::connect(
                     std::get<_Is>(((_WhenAll &&) __when_all).__sndrs_),
                     __receiver<_CvrefReceiverId, _Is>{{}, this});
-            }}...},
-            __recvr_((_Receiver &&) __rcvr)
+            }}...}
         {}
         __operation(_WhenAll&& __when_all, _Receiver __rcvr) :
             __operation((_WhenAll &&) __when_all, (_Receiver &&) __rcvr,
@@ -5572,15 +5673,19 @@
             {
                 // Stop has already been requested. Don't bother starting
                 // the child operations.
-                execution::set_stopped((_Receiver &&) __self.__recvr_);
+                stdexec::set_stopped((_Receiver &&) __self.__recvr_);
             }
             else
             {
                 apply(
                     [](auto&&... __child_ops) noexcept -> void {
-                        (execution::start(__child_ops), ...);
+                        (stdexec::start(__child_ops), ...);
                     },
                     __self.__child_states_);
+                if constexpr (sizeof...(_SenderIds) == 0)
+                {
+                    __self.__complete();
+                }
             }
         }
 
@@ -5594,7 +5699,7 @@
                                               __single_or<void>>...>,
                  __>;
 
-        __child_op_states_tuple_t __child_states_;
+        in_place_stop_source __stop_source_{};
         _Receiver __recvr_;
         std::atomic<std::size_t> __count_{sizeof...(_SenderIds)};
         // Could be non-atomic here and atomic_ref everywhere except
@@ -5602,10 +5707,10 @@
         std::atomic<__state_t> __state_{__started};
         error_types_of_t<__sender, __env_t<_Env>, __variant> __errors_{};
         [[no_unique_address]] __child_values_tuple_t __values_{};
-        in_place_stop_source __stop_source_{};
         std::optional<typename stop_token_of_t<
             env_of_t<_Receiver>&>::template callback_type<__on_stop_requested>>
             __on_stop_{};
+        __child_op_states_tuple_t __child_states_;
     };
 
     template <__decays_to<__sender> _Self, receiver _Receiver>
@@ -5630,8 +5735,7 @@
 {
     template <sender... _Senders>
         requires tag_invocable<when_all_t, _Senders...> &&
-                 sender<tag_invoke_result_t<when_all_t, _Senders...>> &&
-                 (sizeof...(_Senders) > 0)
+                 sender<tag_invoke_result_t<when_all_t, _Senders...>>
                  auto operator()(_Senders&&... __sndrs) const
                  noexcept(nothrow_tag_invocable<when_all_t, _Senders...>)
                      -> tag_invoke_result_t<when_all_t, _Senders...>
@@ -5640,10 +5744,9 @@
     }
 
     template <sender... _Senders>
-        requires(!tag_invocable<when_all_t, _Senders...>) &&
-                (sizeof...(_Senders) > 0)
-                auto operator()(_Senders&&... __sndrs) const
-                -> __impl::__sender<__x<decay_t<_Senders>>...>
+        requires(!tag_invocable<when_all_t, _Senders...>)
+    auto operator()(_Senders&&... __sndrs) const
+        -> __impl::__sender<__x<decay_t<_Senders>>...>
     {
         return __impl::__sender<__x<decay_t<_Senders>>...>{(_Senders &&)
                                                                __sndrs...};
@@ -5823,22 +5926,22 @@
 {
 template <class _Sender>
 using __into_variant_result_t =
-    decltype(execution::into_variant(__declval<_Sender>()));
+    decltype(stdexec::into_variant(__declval<_Sender>()));
 
 struct __env
 {
-    execution::run_loop::__scheduler __sched_;
+    stdexec::run_loop::__scheduler __sched_;
 
-    friend auto tag_invoke(execution::get_scheduler_t,
+    friend auto tag_invoke(stdexec::get_scheduler_t,
                            const __env& __self) noexcept
-        -> execution::run_loop::__scheduler
+        -> stdexec::run_loop::__scheduler
     {
         return __self.__sched_;
     }
 
-    friend auto tag_invoke(execution::get_delegatee_scheduler_t,
+    friend auto tag_invoke(stdexec::get_delegatee_scheduler_t,
                            const __env& __self) noexcept
-        -> execution::run_loop::__scheduler
+        -> stdexec::run_loop::__scheduler
     {
         return __self.__sched_;
     }
@@ -5846,10 +5949,10 @@
 
 // What should sync_wait(just_stopped()) return?
 template <class _Sender>
-    requires execution::sender<_Sender, __env>
+    requires stdexec::sender<_Sender, __env>
 using __sync_wait_result_t =
-    execution::value_types_of_t<_Sender, __env, execution::__decayed_tuple,
-                                __single_t>;
+    stdexec::value_types_of_t<_Sender, __env, stdexec::__decayed_tuple,
+                              __single>;
 
 template <class _Sender>
 using __sync_wait_with_variant_result_t =
@@ -5863,7 +5966,7 @@
 {
     using _Sender = __t<_SenderId>;
     __state<_SenderId>* __state_;
-    execution::run_loop* __loop_;
+    stdexec::run_loop* __loop_;
     template <class _Error>
     void __set_error(_Error __err) noexcept
     {
@@ -5877,15 +5980,13 @@
                 std::make_exception_ptr((_Error &&) __err));
         __loop_->finish();
     }
-    template <class _Sender2 = _Sender, class... _As _NVCXX_CAPTURE_PACK(_As)>
+    template <class _Sender2 = _Sender, class... _As>
         requires constructible_from<__sync_wait_result_t<_Sender2>, _As...>
-    friend void tag_invoke(execution::set_value_t, __receiver&& __rcvr,
+    friend void tag_invoke(stdexec::set_value_t, __receiver&& __rcvr,
                            _As&&... __as) noexcept
     try
     {
-        _NVCXX_EXPAND_PACK(
-            _As, __as,
-            __rcvr.__state_->__data_.template emplace<1>((_As &&) __as...);)
+        __rcvr.__state_->__data_.template emplace<1>((_As &&) __as...);
         __rcvr.__loop_->finish();
     }
     catch (...)
@@ -5893,18 +5994,18 @@
         __rcvr.__set_error(std::current_exception());
     }
     template <class _Error>
-    friend void tag_invoke(execution::set_error_t, __receiver&& __rcvr,
+    friend void tag_invoke(stdexec::set_error_t, __receiver&& __rcvr,
                            _Error __err) noexcept
     {
         __rcvr.__set_error((_Error &&) __err);
     }
-    friend void tag_invoke(execution::set_stopped_t __d,
+    friend void tag_invoke(stdexec::set_stopped_t __d,
                            __receiver&& __rcvr) noexcept
     {
         __rcvr.__state_->__data_.template emplace<3>(__d);
         __rcvr.__loop_->finish();
     }
-    friend __env tag_invoke(execution::get_env_t,
+    friend __env tag_invoke(stdexec::get_env_t,
                             const __receiver& __rcvr) noexcept
     {
         return {__rcvr.__loop_->get_scheduler()};
@@ -5916,13 +6017,13 @@
 {
     using _Tuple = __sync_wait_result_t<__t<_SenderId>>;
     std::variant<std::monostate, _Tuple, std::exception_ptr,
-                 execution::set_stopped_t>
+                 stdexec::set_stopped_t>
         __data_{};
 };
 
 template <class _Sender>
 using __into_variant_result_t =
-    decltype(execution::into_variant(__declval<_Sender>()));
+    decltype(stdexec::into_variant(__declval<_Sender>()));
 } // namespace __impl
 
 ////////////////////////////////////////////////////////////////////////////
@@ -5930,31 +6031,31 @@
 struct sync_wait_t
 {
     // TODO: constrain on return type
-    template <execution::__single_value_variant_sender<__impl::__env>
+    template <stdexec::__single_value_variant_sender<__impl::__env>
                   _Sender> // NOT TO SPEC
-        requires execution::__tag_invocable_with_completion_scheduler<
-            sync_wait_t, execution::set_value_t, _Sender>
+        requires stdexec::__tag_invocable_with_completion_scheduler<
+            sync_wait_t, stdexec::set_value_t, _Sender>
     tag_invoke_result_t<
         sync_wait_t,
-        execution::__completion_scheduler_for<_Sender, execution::set_value_t>,
+        stdexec::__completion_scheduler_for<_Sender, stdexec::set_value_t>,
         _Sender>
         operator()(_Sender&& __sndr) const
         noexcept(nothrow_tag_invocable<sync_wait_t,
-                                       execution::__completion_scheduler_for<
-                                           _Sender, execution::set_value_t>,
+                                       stdexec::__completion_scheduler_for<
+                                           _Sender, stdexec::set_value_t>,
                                        _Sender>)
     {
         auto __sched =
-            execution::get_completion_scheduler<execution::set_value_t>(__sndr);
+            stdexec::get_completion_scheduler<stdexec::set_value_t>(__sndr);
         return tag_invoke(sync_wait_t{}, std::move(__sched),
                           (_Sender &&) __sndr);
     }
 
     // TODO: constrain on return type
-    template <execution::__single_value_variant_sender<__impl::__env>
+    template <stdexec::__single_value_variant_sender<__impl::__env>
                   _Sender> // NOT TO SPEC
-        requires(!execution::__tag_invocable_with_completion_scheduler<
-                    sync_wait_t, execution::set_value_t, _Sender>) &&
+        requires(!stdexec::__tag_invocable_with_completion_scheduler<
+                    sync_wait_t, stdexec::set_value_t, _Sender>) &&
                 tag_invocable<sync_wait_t, _Sender>
     tag_invoke_result_t<sync_wait_t, _Sender> operator()(_Sender&& __sndr) const
         noexcept(nothrow_tag_invocable<sync_wait_t, _Sender>)
@@ -5962,25 +6063,25 @@
         return tag_invoke(sync_wait_t{}, (_Sender &&) __sndr);
     }
 
-    template <execution::__single_value_variant_sender<__impl::__env> _Sender>
-        requires(!execution::__tag_invocable_with_completion_scheduler<
-                    sync_wait_t, execution::set_value_t, _Sender>) &&
+    template <stdexec::__single_value_variant_sender<__impl::__env> _Sender>
+        requires(!stdexec::__tag_invocable_with_completion_scheduler<
+                    sync_wait_t, stdexec::set_value_t, _Sender>) &&
                 (!tag_invocable<sync_wait_t, _Sender>) &&
-                execution::sender<_Sender, __impl::__env> &&
-                execution::sender_to<_Sender, __impl::__receiver<__x<_Sender>>>
+                stdexec::sender<_Sender, __impl::__env> &&
+                stdexec::sender_to<_Sender, __impl::__receiver<__x<_Sender>>>
                 auto operator()(_Sender&& __sndr) const
                 -> std::optional<__impl::__sync_wait_result_t<_Sender>>
     {
         using state_t = __impl::__state<__x<_Sender>>;
         state_t __state{};
-        execution::run_loop __loop;
+        stdexec::run_loop __loop;
 
         // Launch the sender with a continuation that will fill in a variant
         // and notify a condition variable.
-        auto __op_state = execution::connect(
+        auto __op_state = stdexec::connect(
             (_Sender &&) __sndr,
             __impl::__receiver<__x<_Sender>>{&__state, &__loop});
-        execution::start(__op_state);
+        stdexec::start(__op_state);
 
         // Wait for the variant to be filled in.
         __loop.run();
@@ -5999,39 +6100,38 @@
 // [execution.senders.consumers.sync_wait_with_variant]
 struct sync_wait_with_variant_t
 {
-    template <execution::sender<__impl::__env> _Sender>
-        requires execution::__tag_invocable_with_completion_scheduler<
-            sync_wait_with_variant_t, execution::set_value_t, _Sender>
+    template <stdexec::sender<__impl::__env> _Sender>
+        requires stdexec::__tag_invocable_with_completion_scheduler<
+            sync_wait_with_variant_t, stdexec::set_value_t, _Sender>
     tag_invoke_result_t<
         sync_wait_with_variant_t,
-        execution::__completion_scheduler_for<_Sender, execution::set_value_t>,
+        stdexec::__completion_scheduler_for<_Sender, stdexec::set_value_t>,
         _Sender>
         operator()(_Sender&& __sndr) const
         noexcept(nothrow_tag_invocable<sync_wait_with_variant_t,
-                                       execution::__completion_scheduler_for<
-                                           _Sender, execution::set_value_t>,
+                                       stdexec::__completion_scheduler_for<
+                                           _Sender, stdexec::set_value_t>,
                                        _Sender>)
     {
         static_assert(
             std::is_same_v<
                 tag_invoke_result_t<sync_wait_with_variant_t,
-                                    execution::__completion_scheduler_for<
-                                        _Sender, execution::set_value_t>,
+                                    stdexec::__completion_scheduler_for<
+                                        _Sender, stdexec::set_value_t>,
                                     _Sender>,
                 std::optional<
                     __impl::__sync_wait_with_variant_result_t<_Sender>>>,
-            "The type of tag_invoke(execution::sync_wait_with_variant, execution::get_completion_scheduler, S) "
+            "The type of tag_invoke(stdexec::sync_wait_with_variant, stdexec::get_completion_scheduler, S) "
             "must be sync-wait-with-variant-type<S, sync-wait-env>");
 
         auto __sched =
-            execution::get_completion_scheduler<execution::set_value_t>(__sndr);
+            stdexec::get_completion_scheduler<stdexec::set_value_t>(__sndr);
         return tag_invoke(sync_wait_with_variant_t{}, std::move(__sched),
                           (_Sender &&) __sndr);
     }
-    template <execution::sender<__impl::__env> _Sender>
-        requires(!execution::__tag_invocable_with_completion_scheduler<
-                    sync_wait_with_variant_t, execution::set_value_t,
-                    _Sender>) &&
+    template <stdexec::sender<__impl::__env> _Sender>
+        requires(!stdexec::__tag_invocable_with_completion_scheduler<
+                    sync_wait_with_variant_t, stdexec::set_value_t, _Sender>) &&
                 tag_invocable<sync_wait_with_variant_t, _Sender>
     tag_invoke_result_t<sync_wait_with_variant_t, _Sender>
         operator()(_Sender&& __sndr) const
@@ -6042,21 +6142,20 @@
                 tag_invoke_result_t<sync_wait_with_variant_t, _Sender>,
                 std::optional<
                     __impl::__sync_wait_with_variant_result_t<_Sender>>>,
-            "The type of tag_invoke(execution::sync_wait_with_variant, S) "
+            "The type of tag_invoke(stdexec::sync_wait_with_variant, S) "
             "must be sync-wait-with-variant-type<S, sync-wait-env>");
 
         return tag_invoke(sync_wait_with_variant_t{}, (_Sender &&) __sndr);
     }
-    template <execution::sender<__impl::__env> _Sender>
-        requires(!execution::__tag_invocable_with_completion_scheduler<
-                    sync_wait_with_variant_t, execution::set_value_t,
-                    _Sender>) &&
+    template <stdexec::sender<__impl::__env> _Sender>
+        requires(!stdexec::__tag_invocable_with_completion_scheduler<
+                    sync_wait_with_variant_t, stdexec::set_value_t, _Sender>) &&
                 (!tag_invocable<sync_wait_with_variant_t, _Sender>) &&
                 invocable<sync_wait_t, __impl::__into_variant_result_t<_Sender>>
     std::optional<__impl::__sync_wait_with_variant_result_t<_Sender>>
         operator()(_Sender&& __sndr) const
     {
-        return sync_wait_t{}(execution::into_variant((_Sender &&) __sndr));
+        return sync_wait_t{}(stdexec::into_variant((_Sender &&) __sndr));
     }
 };
 } // namespace __sync_wait
@@ -6064,91 +6163,9 @@
 inline constexpr sync_wait_t sync_wait{};
 using __sync_wait::sync_wait_with_variant_t;
 inline constexpr sync_wait_with_variant_t sync_wait_with_variant{};
-
-namespace __create
-{
-struct __void
-{
-    template <class _Fn>
-    void emplace(_Fn&& __fn) noexcept(__nothrow_callable<_Fn>)
-    {
-        ((_Fn &&) __fn)();
-    }
-};
-
-template <class _Receiver, class _Args>
-struct __context
-{
-    [[no_unique_address]] _Receiver receiver;
-    [[no_unique_address]] _Args args;
-};
-
-template <class _ReceiverId, class _FnId, class _ArgsId>
-struct __operation
-{
-    using _Fn = __t<_FnId>;
-    using _Context = __context<__t<_ReceiverId>, __t<_ArgsId>>;
-    using _Result = __call_result_t<_Fn, _Context&>;
-    using _State =
-        __if_c<same_as<_Result, void>, __void, std::optional<_Result>>;
-
-    [[no_unique_address]] _Context __ctx_;
-    [[no_unique_address]] _Fn __fn_;
-    [[no_unique_address]] _State __state_{};
-
-    friend void tag_invoke(start_t, __operation& __self) noexcept
-    {
-        __self.__state_.emplace(__conv{
-            [&]() noexcept { return ((_Fn &&) __self.__fn_)(__self.__ctx_); }});
-    }
-};
-
-template <class _Sigs, class _FnId, class _ArgsId>
-struct __sender
-{
-    using _Fn = __t<_FnId>;
-    using _Args = __t<_ArgsId>;
-    using completion_signatures = _Sigs;
-
-    _Fn __fn_;
-    _Args __args_;
-
-    template <__decays_to<__sender> _Self, receiver_of<_Sigs> _Receiver>
-        requires __callable<_Fn, __context<_Receiver, _Args>&> &&
-                 constructible_from<_Fn, __member_t<_Self, _Fn>> &&
-                 constructible_from<_Args, __member_t<_Self, _Args>>
-                 friend auto tag_invoke(connect_t, _Self&& __self,
-                                        _Receiver&& __rcvr)
-                     -> __operation<__x<decay_t<_Receiver>>, _FnId, _ArgsId>
-    {
-        static_assert(__nothrow_callable<_Fn, __context<_Receiver, _Args>&>);
-        return {{(_Receiver &&) __rcvr, ((_Self &&) __self).__args_},
-                ((_Self &&) __self).__fn_};
-    }
-};
-
-template <__completion_signature... _Sigs>
-struct __create_t
-{
-    using __compl_sigs = completion_signatures<_Sigs...>;
-
-    template <class _Fn, class... _Args>
-        requires move_constructible<_Fn> &&
-                 constructible_from<__decayed_tuple<_Args...>, _Args...>
-                 auto operator()(_Fn __fn, _Args&&... __args) const
-                 -> __sender<__compl_sigs, __x<_Fn>,
-                             __x<__decayed_tuple<_Args...>>>
-    {
-        return {(_Fn &&) __fn, {(_Args &&) __args...}};
-    }
-};
-} // namespace __create
-
-template <__completion_signature... _Sigs>
-inline constexpr __create::__create_t<_Sigs...> create{};
 } // namespace stdexec
 
-#include <sdbusplus/async/stdexec/__detail/__p2300.hpp>
+#include "__detail/__p2300.hpp"
 
 #ifdef __EDG__
 #pragma diagnostic pop
diff --git a/include/sdbusplus/async/stdexec/functional.hpp b/include/sdbusplus/async/stdexec/functional.hpp
index 7e714e8..bcdb709 100644
--- a/include/sdbusplus/async/stdexec/functional.hpp
+++ b/include/sdbusplus/async/stdexec/functional.hpp
@@ -15,8 +15,8 @@
  */
 #pragma once
 
-#include <sdbusplus/async/stdexec/__detail/__meta.hpp>
-#include <sdbusplus/async/stdexec/concepts.hpp>
+#include "__detail/__meta.hpp"
+#include "concepts.hpp"
 
 #include <functional>
 
@@ -53,13 +53,14 @@
 template <auto _Fun>
 struct __fun_c_t
 {
+    using _FunT = decltype(_Fun);
     template <class... _Args>
-        requires __callable<decltype(_Fun), _Args...>
+        requires __callable<_FunT, _Args...>
     auto operator()(_Args&&... __args) const
-        noexcept(noexcept(((decltype(_Fun)&&)_Fun)((_Args &&) __args...)))
-            -> __call_result_t<decltype(_Fun), _Args...>
+        noexcept(noexcept(_Fun((_Args &&) __args...)))
+            -> __call_result_t<_FunT, _Args...>
     {
-        return ((decltype(_Fun)&&)_Fun)((_Args &&) __args...);
+        return _Fun((_Args &&) __args...);
     }
 };
 template <auto _Fun>
@@ -103,7 +104,7 @@
     using type = tag_invoke_result_t<_Tag, _Args...>;
 };
 
-struct __tag
+struct tag_invoke_t
 {
     template <class _Tag, class... _Args>
         requires tag_invocable<_Tag, _Args...>
@@ -116,7 +117,8 @@
 };
 } // namespace __tag_invoke
 
-inline constexpr __tag_invoke::__tag tag_invoke{};
+using __tag_invoke::tag_invoke_t;
+inline constexpr tag_invoke_t tag_invoke{};
 
 template <auto& _Tag>
 using tag_t = decay_t<decltype(_Tag)>;
diff --git a/include/sdbusplus/async/stdexec/scope.hpp b/include/sdbusplus/async/stdexec/scope.hpp
index 99af50d..57215a2 100644
--- a/include/sdbusplus/async/stdexec/scope.hpp
+++ b/include/sdbusplus/async/stdexec/scope.hpp
@@ -15,7 +15,7 @@
  */
 #pragma once
 
-#include <sdbusplus/async/stdexec/__detail/__meta.hpp>
+#include "../stdexec/__detail/__meta.hpp"
 
 namespace exec
 {
diff --git a/include/sdbusplus/async/stdexec/stop_token.hpp b/include/sdbusplus/async/stdexec/stop_token.hpp
index 18d9c34..e17de00 100644
--- a/include/sdbusplus/async/stdexec/stop_token.hpp
+++ b/include/sdbusplus/async/stdexec/stop_token.hpp
@@ -17,7 +17,6 @@
 #pragma once
 
 #include <atomic>
-#include <cassert>
 #include <cstdint>
 #include <thread>
 #include <type_traits>
@@ -28,6 +27,9 @@
 #include <stop_token>
 #endif
 
+#include "__detail/__config.hpp"
+#include "concepts.hpp"
+
 namespace stdexec
 {
 // [stoptoken.inplace], class in_place_stop_token
@@ -275,8 +277,9 @@
 
 inline in_place_stop_source::~in_place_stop_source()
 {
-    assert((__state_.load(std::memory_order_relaxed) & __locked_flag_) == 0);
-    assert(__callbacks_ == nullptr);
+    STDEXEC_ASSERT(
+        (__state_.load(std::memory_order_relaxed) & __locked_flag_) == 0);
+    STDEXEC_ASSERT(__callbacks_ == nullptr);
 }
 
 inline bool in_place_stop_source::request_stop() noexcept
diff --git a/include/sdbusplus/async/stdexec/task.hpp b/include/sdbusplus/async/stdexec/task.hpp
index cae8d35..5b25135 100644
--- a/include/sdbusplus/async/stdexec/task.hpp
+++ b/include/sdbusplus/async/stdexec/task.hpp
@@ -15,10 +15,10 @@
  */
 #pragma once
 
-#include <sdbusplus/async/stdexec/__detail/__meta.hpp>
-#include <sdbusplus/async/stdexec/coroutine.hpp>
-#include <sdbusplus/async/stdexec/execution.hpp>
-#include <sdbusplus/async/stdexec/scope.hpp>
+#include "../stdexec/__detail/__meta.hpp"
+#include "../stdexec/coroutine.hpp"
+#include "../stdexec/execution.hpp"
+#include "scope.hpp"
 
 #include <any>
 #include <cassert>
@@ -35,18 +35,18 @@
 {
 template <class _Ty>
 concept __stop_token_provider =
-    requires(const _Ty& t) { std::execution::get_stop_token(t); };
+    requires(const _Ty& t) { stdexec::get_stop_token(t); };
 
 template <class _Ty>
 concept __indirect_stop_token_provider = requires(const _Ty& t) {
                                              {
-                                                 std::execution::get_env(t)
+                                                 stdexec::get_env(t)
                                                  } -> __stop_token_provider;
                                          };
 
 struct __forward_stop_request
 {
-    std::in_place_stop_source& __stop_source_;
+    stdexec::in_place_stop_source& __stop_source_;
     void operator()() noexcept
     {
         __stop_source_.request_stop();
@@ -64,11 +64,11 @@
     template <class _ParentPromise>
     friend struct __default_awaiter_context;
 
-    std::in_place_stop_token __stop_token_;
+    stdexec::in_place_stop_token __stop_token_;
 
-    friend auto tag_invoke(std::execution::get_stop_token_t,
+    friend auto tag_invoke(stdexec::get_stop_token_t,
                            const __default_task_context_impl& __self) noexcept
-        -> std::in_place_stop_token
+        -> stdexec::in_place_stop_token
     {
         return __self.__stop_token_;
     }
@@ -108,8 +108,8 @@
 template <__indirect_stop_token_provider _ParentPromise>
 struct __default_awaiter_context<_ParentPromise>
 {
-    using __stop_token_t = std::execution::stop_token_of_t<
-        std::execution::env_of_t<_ParentPromise>>;
+    using __stop_token_t =
+        stdexec::stop_token_of_t<stdexec::env_of_t<_ParentPromise>>;
     using __stop_callback_t =
         typename __stop_token_t::template callback_type<__forward_stop_request>;
 
@@ -119,9 +119,8 @@
         // stop_source when stop is requested on the parent coroutine's stop
         // token.
         :
-        __stop_callback_{
-            std::execution::get_stop_token(std::execution::get_env(__parent)),
-            __forward_stop_request{__stop_source_}}
+        __stop_callback_{stdexec::get_stop_token(stdexec::get_env(__parent)),
+                         __forward_stop_request{__stop_source_}}
     {
         static_assert(
             std::is_nothrow_constructible_v<__stop_callback_t, __stop_token_t,
@@ -129,31 +128,31 @@
         __self.__stop_token_ = __stop_source_.get_token();
     }
 
-    std::in_place_stop_source __stop_source_{};
+    stdexec::in_place_stop_source __stop_source_{};
     __stop_callback_t __stop_callback_;
 };
 
 // If the parent coroutine's type has a stop token of type in_place_stop_token,
 // we don't need to register a stop callback.
 template <__indirect_stop_token_provider _ParentPromise>
-    requires std::same_as<std::in_place_stop_token,
-                          std::execution::stop_token_of_t<
-                              std::execution::env_of_t<_ParentPromise>>>
+    requires std::same_as<
+        stdexec::in_place_stop_token,
+        stdexec::stop_token_of_t<stdexec::env_of_t<_ParentPromise>>>
 struct __default_awaiter_context<_ParentPromise>
 {
     explicit __default_awaiter_context(__default_task_context_impl& __self,
                                        _ParentPromise& __parent) noexcept
     {
         __self.__stop_token_ =
-            std::execution::get_stop_token(std::execution::get_env(__parent));
+            stdexec::get_stop_token(stdexec::get_env(__parent));
     }
 };
 
 // If the parent coroutine's stop token is unstoppable, there's no point
 // forwarding stop tokens or stop requests at all.
 template <__indirect_stop_token_provider _ParentPromise>
-    requires stdexec::unstoppable_token<std::execution::stop_token_of_t<
-        std::execution::env_of_t<_ParentPromise>>>
+    requires stdexec::unstoppable_token<
+        stdexec::stop_token_of_t<stdexec::env_of_t<_ParentPromise>>>
 struct __default_awaiter_context<_ParentPromise>
 {
     explicit __default_awaiter_context(__default_task_context_impl&,
@@ -178,19 +177,20 @@
         // Register a callback that will request stop on this basic_task's
         // stop_source when stop is requested on the parent coroutine's stop
         // token.
-        using __stop_token_t = std::execution::stop_token_of_t<
-            std::execution::env_of_t<_ParentPromise>>;
+        using __stop_token_t =
+            stdexec::stop_token_of_t<stdexec::env_of_t<_ParentPromise>>;
         using __stop_callback_t =
             typename __stop_token_t::template callback_type<
                 __forward_stop_request>;
 
-        if constexpr (std::same_as<__stop_token_t, std::in_place_stop_token>)
+        if constexpr (std::same_as<__stop_token_t,
+                                   stdexec::in_place_stop_token>)
         {
-            __self.__stop_token_ = std::execution::get_stop_token(
-                std::execution::get_env(__parent));
+            __self.__stop_token_ =
+                stdexec::get_stop_token(stdexec::get_env(__parent));
         }
-        else if (auto __token = std::execution::get_stop_token(
-                     std::execution::get_env(__parent));
+        else if (auto __token =
+                     stdexec::get_stop_token(stdexec::get_env(__parent));
                  __token.stop_possible())
         {
             __stop_callback_.emplace<__stop_callback_t>(
@@ -199,12 +199,12 @@
         }
     }
 
-    std::in_place_stop_source __stop_source_{};
+    stdexec::in_place_stop_source __stop_source_{};
     std::any __stop_callback_{};
 };
 
 template <class _Promise, class _ParentPromise = void>
-using awaiter_context_t = typename std::execution::env_of_t<
+using awaiter_context_t = typename stdexec::env_of_t<
     _Promise>::template awaiter_context_t<_Promise, _ParentPromise>;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -289,7 +289,7 @@
         }
         using __context_t =
             typename _Context::template promise_context_t<__promise>;
-        friend __context_t tag_invoke(std::execution::get_env_t,
+        friend __context_t tag_invoke(stdexec::get_env_t,
                                       const __promise& __self)
         {
             return __self.__context_;
@@ -350,9 +350,9 @@
         requires std::constructible_from<
             awaiter_context_t<__promise, _ParentPromise>, __promise&,
             _ParentPromise&>
-    friend __task_awaitable<_ParentPromise>
-        tag_invoke(std::execution::as_awaitable_t, basic_task&& __self,
-                   _ParentPromise&) noexcept
+    friend __task_awaitable<_ParentPromise> tag_invoke(stdexec::as_awaitable_t,
+                                                       basic_task&& __self,
+                                                       _ParentPromise&) noexcept
     {
         return __task_awaitable<_ParentPromise>{
             std::exchange(__self.__coro_, {})};
@@ -370,17 +370,17 @@
     //   as arguments of a function type. In other words, set_value_t() if _Ty
     //   is void, and set_value_t(_Ty) otherwise.
     using __set_value_sig_t = stdexec::__minvoke1<
-        stdexec::__remove<void, stdexec::__qf<std::execution::set_value_t>>,
-        _Ty>;
+        stdexec::__remove<void, stdexec::__qf<stdexec::set_value_t>>, _Ty>;
 
     // Specify basic_task's completion signatures
     //   This is only necessary when basic_task is not generally awaitable
     //   owing to constraints imposed by its _Context parameter.
-    using __task_traits_t = std::execution::completion_signatures<
-        __set_value_sig_t, std::execution::set_error_t(std::exception_ptr),
-        std::execution::set_stopped_t()>;
+    using __task_traits_t =
+        stdexec::completion_signatures<__set_value_sig_t,
+                                       stdexec::set_error_t(std::exception_ptr),
+                                       stdexec::set_stopped_t()>;
 
-    friend auto tag_invoke(std::execution::get_completion_signatures_t,
+    friend auto tag_invoke(stdexec::get_completion_signatures_t,
                            const basic_task&, auto) -> __task_traits_t;
 
     explicit basic_task(__coro::coroutine_handle<promise_type> __coro) noexcept
diff --git a/src/async/context.cpp b/src/async/context.cpp
index bbb198e..2f6454d 100644
--- a/src/async/context.cpp
+++ b/src/async/context.cpp
@@ -142,7 +142,7 @@
     wait_for_wait_process_stopped();
 
     // Wait for all the internal tasks to complete.
-    std::this_thread::sync_wait(
+    stdexec::this_thread::sync_wait(
         internal_tasks.empty() | execution::upon_error([&](auto&& e) {
             pending_exceptions.emplace_back(std::move(e));
         }));
diff --git a/test/async/context.cpp b/test/async/context.cpp
index 6e688c7..03480c9 100644
--- a/test/async/context.cpp
+++ b/test/async/context.cpp
@@ -15,8 +15,8 @@
 
     void spawnStop()
     {
-        ctx->spawn(std::execution::just() |
-                   std::execution::then([this]() { ctx->request_stop(); }));
+        ctx->spawn(stdexec::just() |
+                   stdexec::then([this]() { ctx->request_stop(); }));
     }
 
     void runToStop()
@@ -35,7 +35,7 @@
 
 TEST_F(Context, SpawnedTask)
 {
-    ctx->spawn(std::execution::just());
+    ctx->spawn(stdexec::just());
     runToStop();
 }
 
@@ -50,8 +50,8 @@
 
 TEST_F(Context, SpawnThrowingTask)
 {
-    ctx->spawn(std::execution::just() |
-               std::execution::then([]() { throw std::logic_error("Oops"); }));
+    ctx->spawn(stdexec::just() |
+               stdexec::then([]() { throw std::logic_error("Oops"); }));
 
     EXPECT_THROW(runToStop(), std::logic_error);
     ctx->run();
@@ -62,9 +62,8 @@
     static constexpr size_t count = 100;
     for (size_t i = 0; i < count; ++i)
     {
-        ctx->spawn(std::execution::just() | std::execution::then([]() {
-                       throw std::logic_error("Oops");
-                   }));
+        ctx->spawn(stdexec::just() |
+                   stdexec::then([]() { throw std::logic_error("Oops"); }));
     }
     spawnStop();
 
@@ -84,7 +83,7 @@
 
     bool ran = false;
     ctx->spawn(sdbusplus::async::sleep_for(*ctx, timeout) |
-               std::execution::then([&ran]() { ran = true; }));
+               stdexec::then([&ran]() { ran = true; }));
 
     runToStop();
 
@@ -107,16 +106,15 @@
                 ++executed;
                 co_return (co_await one(count - 1, executed)) + 1;
             }
-            co_return co_await std::execution::just(0);
+            co_return co_await stdexec::just(0);
         }
     };
 
     static constexpr size_t count = 100;
     size_t executed = 0;
 
-    ctx->spawn(_::one(count, executed) | std::execution::then([=](auto result) {
-                   EXPECT_EQ(result, count);
-               }));
+    ctx->spawn(_::one(count, executed) |
+               stdexec::then([=](auto result) { EXPECT_EQ(result, count); }));
 
     runToStop();
 
@@ -133,11 +131,11 @@
                   "/this/is/a/bogus/path/for/SpawnMatcher"));
 
     // Await the match completion (which will never happen).
-    ctx->spawn(m->next() | std::execution::then([&ran](...) { ran = true; }));
+    ctx->spawn(m->next() | stdexec::then([&ran](...) { ran = true; }));
 
     // Destruct the match.
     ctx->spawn(sdbusplus::async::sleep_for(*ctx, 1ms) |
-               std::execution::then([&m](...) { m.reset(); }));
+               stdexec::then([&m](...) { m.reset(); }));
 
     EXPECT_THROW(runToStop(), sdbusplus::exception::UnhandledStop);
     EXPECT_NO_THROW(ctx->run());
@@ -166,7 +164,7 @@
     bool ran = false;
     ctx->spawn(_::fn(m->next(), ran));
     ctx->spawn(sdbusplus::async::sleep_for(*ctx, 1ms) |
-               std::execution::then([&]() { m.reset(); }));
+               stdexec::then([&]() { m.reset(); }));
 
     EXPECT_THROW(runToStop(), sdbusplus::exception::UnhandledStop);
     EXPECT_NO_THROW(ctx->run());
diff --git a/test/async/task.cpp b/test/async/task.cpp
index 6ee90f8..a7e5a15 100644
--- a/test/async/task.cpp
+++ b/test/async/task.cpp
@@ -17,7 +17,7 @@
     EXPECT_FALSE(value);
 
     // Run it and confirm the value is updated.
-    std::this_thread::sync_wait(t());
+    stdexec::this_thread::sync_wait(t());
     EXPECT_TRUE(value);
 }
 
@@ -41,7 +41,7 @@
     // Add boolean to confirm that co-routine actually executed by the
     // end.
     bool executed = false;
-    std::this_thread::sync_wait(_::two(executed));
+    stdexec::this_thread::sync_wait(_::two(executed));
     EXPECT_TRUE(executed);
 }
 
@@ -69,11 +69,11 @@
     };
 
     // Ensure throws surface up.
-    EXPECT_THROW(std::this_thread::sync_wait(_::one()), std::logic_error);
+    EXPECT_THROW(stdexec::this_thread::sync_wait(_::one()), std::logic_error);
 
     // Ensure throws can be caught inside a co-routine.
     bool caught = false;
-    std::this_thread::sync_wait(_::two(caught));
+    stdexec::this_thread::sync_wait(_::two(caught));
     EXPECT_TRUE(caught);
 }
 
@@ -88,16 +88,16 @@
                 ++executed;
                 co_return (co_await one(count - 1, executed)) + 1;
             }
-            co_return co_await std::execution::just(0);
+            co_return co_await stdexec::just(0);
         }
     };
 
     static constexpr size_t count = 100;
     size_t executed = 0;
 
-    std::this_thread::sync_wait(
+    stdexec::this_thread::sync_wait(
         _::one(count, executed) |
-        std::execution::then([=](auto result) { EXPECT_EQ(result, count); }));
+        stdexec::then([=](auto result) { EXPECT_EQ(result, count); }));
 
     EXPECT_EQ(executed, count);
 }
diff --git a/test/async/timer.cpp b/test/async/timer.cpp
index 07e7de7..7aee04f 100644
--- a/test/async/timer.cpp
+++ b/test/async/timer.cpp
@@ -15,7 +15,7 @@
     auto start = std::chrono::steady_clock::now();
 
     ctx.spawn(sdbusplus::async::sleep_for(ctx, timeout) |
-              std::execution::then([&ctx]() { ctx.request_stop(); }));
+              stdexec::then([&ctx]() { ctx.request_stop(); }));
     ctx.run();
 
     auto stop = std::chrono::steady_clock::now();
