stdexec: update to latest commit

Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: I1fa908582820eb1d8d64dcb4568dd52f80936ec1
diff --git a/include/sdbusplus/async/stdexec/__detail/__config.hpp b/include/sdbusplus/async/stdexec/__detail/__config.hpp
index 5be8786..0b3bc2d 100644
--- a/include/sdbusplus/async/stdexec/__detail/__config.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__config.hpp
@@ -21,28 +21,28 @@
 
 #include <cassert>
 
-#define STDEXEC_CAT_(X, ...) X##__VA_ARGS__
-#define STDEXEC_CAT(X, ...) STDEXEC_CAT_(X, __VA_ARGS__)
+#define STDEXEC_CAT_(_Xp, ...) _Xp##__VA_ARGS__
+#define STDEXEC_CAT(_Xp, ...) STDEXEC_CAT_(_Xp, __VA_ARGS__)
 
 #define STDEXEC_EXPAND(...) __VA_ARGS__
-#define STDEXEC_EVAL(M, ...) M(__VA_ARGS__)
+#define STDEXEC_EVAL(_M, ...) _M(__VA_ARGS__)
 
-#define STDEXEC_NOT(X) STDEXEC_CAT(STDEXEC_NOT_, X)
+#define STDEXEC_NOT(_Xp) STDEXEC_CAT(STDEXEC_NOT_, _Xp)
 #define STDEXEC_NOT_0 1
 #define STDEXEC_NOT_1 0
 
-#define STDEXEC_IIF_0(Y, ...) __VA_ARGS__
-#define STDEXEC_IIF_1(Y, ...) Y
-#define STDEXEC_IIF(X, Y, ...)                                                 \
-    STDEXEC_EVAL(STDEXEC_CAT(STDEXEC_IIF_, X), Y, __VA_ARGS__)
+#define STDEXEC_IIF_0(_Yp, ...) __VA_ARGS__
+#define STDEXEC_IIF_1(_Yp, ...) _Yp
+#define STDEXEC_IIF(_Xp, _Yp, ...)                                             \
+    STDEXEC_EVAL(STDEXEC_CAT(STDEXEC_IIF_, _Xp), _Yp, __VA_ARGS__)
 
 #define STDEXEC_COUNT(...)                                                     \
     STDEXEC_EXPAND(STDEXEC_COUNT_(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1))
-#define STDEXEC_COUNT_(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _N, ...) _N
+#define STDEXEC_COUNT_(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _Np, ...) _Np
 
 #define STDEXEC_CHECK(...) STDEXEC_EXPAND(STDEXEC_CHECK_N(__VA_ARGS__, 0, ))
-#define STDEXEC_CHECK_N(x, n, ...) n
-#define STDEXEC_PROBE(x) x, 1,
+#define STDEXEC_CHECK_N(_Xp, _Np, ...) _Np
+#define STDEXEC_PROBE(_Xp) _Xp, 1,
 
 #if defined(__NVCOMPILER)
 #define STDEXEC_NVHPC() 1
@@ -67,6 +67,24 @@
 #define STDEXEC_MSVC() 0
 #endif
 
+#if STDEXEC_CLANG()
+#define STDEXEC_STRINGIZE(__arg) #__arg
+#define STDEXEC_PRAGMA_PUSH() _Pragma("GCC diagnostic push")
+#define STDEXEC_PRAGMA_POP() _Pragma("GCC diagnostic pop")
+#define STDEXEC_PRAGMA_IGNORE(__arg)                                           \
+    _Pragma(STDEXEC_STRINGIZE(GCC diagnostic ignored __arg))
+#else
+#define STDEXEC_PRAGMA_PUSH()
+#define STDEXEC_PRAGMA_POP()
+#define STDEXEC_PRAGMA_IGNORE(__arg)
+#endif
+
+#ifdef __has_builtin
+#define STDEXEC_HAS_BUILTIN __has_builtin
+#else
+#define STDEXEC_HAS_BUILTIN(...) 0
+#endif
+
 #if STDEXEC_CLANG() && defined(__CUDACC__)
 #define STDEXEC_DETAIL_CUDACC_HOST_DEVICE __host__ __device__
 #else
@@ -78,11 +96,11 @@
     "Redefinition of STDEXEC_ASSERT is not permitted. Define STDEXEC_ASSERT_FN instead."
 #endif
 
-#define STDEXEC_ASSERT(_X)                                                     \
+#define STDEXEC_ASSERT(_Xp)                                                    \
     do                                                                         \
     {                                                                          \
-        static_assert(noexcept(_X));                                           \
-        STDEXEC_ASSERT_FN(_X);                                                 \
+        static_assert(noexcept(_Xp));                                          \
+        STDEXEC_ASSERT_FN(_Xp);                                                \
     } while (false)
 
 #ifndef STDEXEC_ASSERT_FN
diff --git a/include/sdbusplus/async/stdexec/__detail/__intrusive_ptr.hpp b/include/sdbusplus/async/stdexec/__detail/__intrusive_ptr.hpp
index a79a353..3c163f0 100644
--- a/include/sdbusplus/async/stdexec/__detail/__intrusive_ptr.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__intrusive_ptr.hpp
@@ -48,6 +48,7 @@
         // __intrusive_from_this() (which increments the atomic):
         ::new ((void*)__value_) _Ty{(_Us &&) __us...};
     }
+
     ~__control_block()
     {
         __value().~_Ty();
@@ -156,6 +157,7 @@
     }
 
     bool operator==(const __intrusive_ptr&) const = default;
+
     bool operator==(std::nullptr_t) const noexcept
     {
         return __data_ == nullptr;
diff --git a/include/sdbusplus/async/stdexec/__detail/__meta.hpp b/include/sdbusplus/async/stdexec/__detail/__meta.hpp
index 3d0cd50..5e2adde 100644
--- a/include/sdbusplus/async/stdexec/__detail/__meta.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__meta.hpp
@@ -31,14 +31,15 @@
 struct __ignore
 {
     __ignore() = default;
+
     constexpr __ignore(auto&&...) noexcept {}
 };
 
 // Before gcc-12, gcc really didn't like tuples or variants of immovable types
 #if defined(__GNUC__) && !defined(__clang__) && (__GNUC__ < 12)
-#define STDEXEC_IMMOVABLE(_X) _X(_X&&)
+#define STDEXEC_IMMOVABLE(_Xp) _Xp(_Xp&&)
 #else
-#define STDEXEC_IMMOVABLE(_X) _X(_X&&) = delete
+#define STDEXEC_IMMOVABLE(_Xp) _Xp(_Xp&&) = delete
 #endif
 
 // BUG (gcc PR93711): copy elision fails when initializing a
@@ -53,9 +54,6 @@
 struct __none_such
 {};
 
-template <class...>
-concept __typename = true;
-
 struct __immovable
 {
     __immovable() = default;
@@ -64,11 +62,22 @@
     STDEXEC_IMMOVABLE(__immovable);
 };
 
-template <class _T>
-using __t = typename _T::__t;
+struct __move_only
+{
+    __move_only() = default;
 
-template <bool _B>
-using __bool = std::bool_constant<_B>;
+    __move_only(__move_only&&) noexcept = default;
+    __move_only& operator=(__move_only&&) noexcept = default;
+
+    __move_only(const __move_only&) = delete;
+    __move_only& operator=(const __move_only&) = delete;
+};
+
+template <class _Tp>
+using __t = typename _Tp::__t;
+
+template <bool _Bp>
+using __mbool = std::bool_constant<_Bp>;
 
 template <class _Ty>
 struct __mtype
@@ -80,26 +89,29 @@
 template <class...>
 struct __types;
 
-template <class _T>
-using __midentity = _T;
+template <class... _Ts>
+concept __typename = requires { typename __types<_Ts...>; };
 
-template <std::size_t _N>
-using __msize_t = char[_N + 1];
+template <class _Tp>
+using __midentity = _Tp;
 
-template <class _T>
-inline constexpr auto __v = _T::value;
+template <std::size_t _Np>
+using __msize_t = char[_Np + 1];
 
-template <class _T, class _U>
-inline constexpr bool __v<std::is_same<_T, _U>> = false;
+template <class _Tp>
+inline constexpr auto __v = _Tp::value;
 
-template <class _T>
-inline constexpr bool __v<std::is_same<_T, _T>> = true;
+template <class _Tp, class _Up>
+inline constexpr bool __v<std::is_same<_Tp, _Up>> = false;
 
-template <class _T, _T _I>
-inline constexpr _T __v<std::integral_constant<_T, _I>> = _I;
+template <class _Tp>
+inline constexpr bool __v<std::is_same<_Tp, _Tp>> = true;
 
-template <std::size_t _I>
-inline constexpr std::size_t __v<char[_I]> = _I - 1;
+template <class _Tp, _Tp _Ip>
+inline constexpr _Tp __v<std::integral_constant<_Tp, _Ip>> = _Ip;
+
+template <std::size_t _Ip>
+inline constexpr std::size_t __v<char[_Ip]> = _Ip - 1;
 
 template <bool>
 struct __i
@@ -148,8 +160,8 @@
 template <class _Fn, class... _Back>
 using __mbind_back = __mbind_back_q<_Fn::template __f, _Back...>;
 
-template <template <class...> class _T, class... _Args>
-concept __valid = requires { typename __meval<_T, _Args...>; };
+template <template <class...> class _Tp, class... _Args>
+concept __valid = requires { typename __meval<_Tp, _Args...>; };
 
 template <class _Fn, class... _Args>
 concept __minvocable = __valid<_Fn::template __f, _Args...>;
@@ -165,12 +177,14 @@
 template <class _Fn, class... _Args>
 struct __mdefer_
 {};
+
 template <class _Fn, class... _Args>
     requires __minvocable<_Fn, _Args...>
 struct __mdefer_<_Fn, _Args...>
 {
     using __t = __minvoke<_Fn, _Args...>;
 };
+
 template <class _Fn, class... _Args>
 struct __mdefer : __mdefer_<_Fn, _Args...>
 {};
@@ -181,6 +195,7 @@
     template <class _True, class...>
     using __f = _True;
 };
+
 template <>
 struct __if_<false>
 {
@@ -200,11 +215,11 @@
     requires(sizeof...(_False) <= 1)
 using __if_c = __minvoke<__if_<_Pred>, _True, _False...>;
 
-template <class _T>
+template <class _Tp>
 struct __mconst
 {
     template <class...>
-    using __f = _T;
+    using __f = _Tp;
 };
 
 template <class _Fn, class _Default>
@@ -230,6 +245,7 @@
     using __f = __minvoke<__mfold_right_<sizeof...(_Tail) == 0>, _Fn,
                           __minvoke<_Fn, _State, _Head>, _Tail...>;
 };
+
 template <>
 struct __mfold_right_<true>
 { // empty pack
@@ -248,39 +264,58 @@
 template <class _Continuation, class...>
 struct __mconcat_
 {};
+
 template <class _Continuation, class... _As>
     requires(sizeof...(_As) == 0) && __minvocable<_Continuation, _As...>
 struct __mconcat_<_Continuation, _As...>
 {
     using __t = __minvoke<_Continuation, _As...>;
 };
-template <class _Continuation, template <class...> class _A, class... _As>
+
+template <class _Continuation, template <class...> class _Ap, class... _As>
     requires __minvocable<_Continuation, _As...>
-struct __mconcat_<_Continuation, _A<_As...>>
+struct __mconcat_<_Continuation, _Ap<_As...>>
 {
     using __t = __minvoke<_Continuation, _As...>;
 };
-template <class _Continuation, template <class...> class _A, class... _As,
-          template <class...> class _B, class... _Bs>
+
+template <               //
+    class _Continuation, //
+    template <class...> class _Ap,
+    class... _As, //
+    template <class...> class _Bp, class... _Bs>
     requires __minvocable<_Continuation, _As..., _Bs...>
-struct __mconcat_<_Continuation, _A<_As...>, _B<_Bs...>>
+struct __mconcat_<_Continuation, _Ap<_As...>, _Bp<_Bs...>>
 {
     using __t = __minvoke<_Continuation, _As..., _Bs...>;
 };
-template <class _Continuation, template <class...> class _A, class... _As,
-          template <class...> class _B, class... _Bs,
-          template <class...> class _C, class... _Cs>
+
+template <               //
+    class _Continuation, //
+    template <class...> class _Ap,
+    class... _As, //
+    template <class...> class _Bp,
+    class... _Bs, //
+    template <class...> class _Cp, class... _Cs>
     requires __minvocable<_Continuation, _As..., _Bs..., _Cs...>
-struct __mconcat_<_Continuation, _A<_As...>, _B<_Bs...>, _C<_Cs...>>
+struct __mconcat_<_Continuation, _Ap<_As...>, _Bp<_Bs...>, _Cp<_Cs...>>
 {
     using __t = __minvoke<_Continuation, _As..., _Bs..., _Cs...>;
 };
-template <class _Continuation, template <class...> class _A, class... _As,
-          template <class...> class _B, class... _Bs,
-          template <class...> class _C, class... _Cs,
-          template <class...> class _D, class... _Ds, class... _Tail>
-struct __mconcat_<_Continuation, _A<_As...>, _B<_Bs...>, _C<_Cs...>, _D<_Ds...>,
-                  _Tail...> :
+
+template <               //
+    class _Continuation, //
+    template <class...> class _Ap,
+    class... _As, //
+    template <class...> class _Bp,
+    class... _Bs, //
+    template <class...> class _Cp,
+    class... _Cs, //
+    template <class...> class _Dp,
+    class... _Ds, //
+    class... _Tail>
+struct __mconcat_<_Continuation, _Ap<_As...>, _Bp<_Bs...>, _Cp<_Cs...>,
+                  _Dp<_Ds...>, _Tail...> :
     __mconcat_<_Continuation, __types<_As..., _Bs..., _Cs..., _Ds...>, _Tail...>
 {};
 
@@ -298,19 +333,21 @@
     using __f = __minvoke<_Fn, _Ts...>;
 };
 
-template <class _Fn, class _T>
+template <class _Fn, class _Tp>
 struct __uncurry_;
-template <class _Fn, template <class...> class _A, class... _As>
+
+template <class _Fn, template <class...> class _Ap, class... _As>
     requires __minvocable<_Fn, _As...>
-struct __uncurry_<_Fn, _A<_As...>>
+struct __uncurry_<_Fn, _Ap<_As...>>
 {
     using __t = __minvoke<_Fn, _As...>;
 };
+
 template <class _Fn>
 struct __uncurry
 {
-    template <class _T>
-    using __f = __t<__uncurry_<_Fn, _T>>;
+    template <class _Tp>
+    using __f = __t<__uncurry_<_Fn, _Tp>>;
 };
 template <class _Fn, class _List>
 using __mapply = __minvoke<__uncurry<_Fn>, _List>;
@@ -335,11 +372,11 @@
     using __f = __msize_t<(bool(__v<__minvoke<_Fn, _Ts>>) + ... + 0)>;
 };
 
-template <class _T>
+template <class _Tp>
 struct __contains
 {
     template <class... _Args>
-    using __f = __bool<(__v<std::is_same<_T, _Args>> || ...)>;
+    using __f = __mbool<(__v<std::is_same<_Tp, _Args>> || ...)>;
 };
 
 template <class _Continuation = __q<__types>>
@@ -353,9 +390,10 @@
 struct __push_back_unique
 {
     template <class _List, class _Item>
-    using __f = __mapply<__if<__mapply<__contains<_Item>, _List>, _Continuation,
-                              __mbind_back<_Continuation, _Item>>,
-                         _List>;
+    using __f = //
+        __mapply<__if<__mapply<__contains<_Item>, _List>, _Continuation,
+                      __mbind_back<_Continuation, _Item>>,
+                 _List>;
 };
 
 template <class _Continuation = __q<__types>>
@@ -403,11 +441,20 @@
 struct __remove
 {
     template <class... _Args>
-    using __f =
+    using __f = //
         __minvoke<__mconcat<_Continuation>, __if<std::is_same<_Args, _Old>,
                                                  __types<>, __types<_Args>>...>;
 };
 
+template <class _Pred, class _Continuation = __q<__types>>
+struct __remove_if
+{
+    template <class... _Args>
+    using __f = //
+        __minvoke<__mconcat<_Continuation>,
+                  __if<__minvoke<_Pred, _Args>, __types<>, __types<_Args>>...>;
+};
+
 template <class _Return>
 struct __qf
 {
@@ -416,55 +463,60 @@
 };
 
 // A very simple std::declval replacement that doesn't handle void
-template <class _T>
-_T&& __declval() noexcept;
+template <class _Tp>
+_Tp&& __declval() noexcept;
 
 // For copying cvref from one type to another:
 struct __cp
 {
-    template <class _T>
-    using __f = _T;
+    template <class _Tp>
+    using __f = _Tp;
 };
+
 struct __cpc
 {
-    template <class _T>
-    using __f = const _T;
+    template <class _Tp>
+    using __f = const _Tp;
 };
+
 struct __cplr
 {
-    template <class _T>
-    using __f = _T&;
+    template <class _Tp>
+    using __f = _Tp&;
 };
+
 struct __cprr
 {
-    template <class _T>
-    using __f = _T&&;
+    template <class _Tp>
+    using __f = _Tp&&;
 };
+
 struct __cpclr
 {
-    template <class _T>
-    using __f = const _T&;
+    template <class _Tp>
+    using __f = const _Tp&;
 };
+
 struct __cpcrr
 {
-    template <class _T>
-    using __f = const _T&&;
+    template <class _Tp>
+    using __f = const _Tp&&;
 };
 
 template <class>
 extern __cp __cpcvr;
-template <class _T>
-extern __cpc __cpcvr<const _T>;
-template <class _T>
-extern __cplr __cpcvr<_T&>;
-template <class _T>
-extern __cprr __cpcvr<_T&&>;
-template <class _T>
-extern __cpclr __cpcvr<const _T&>;
-template <class _T>
-extern __cpcrr __cpcvr<const _T&&>;
-template <class _T>
-using __copy_cvref_fn = decltype(__cpcvr<_T>);
+template <class _Tp>
+extern __cpc __cpcvr<const _Tp>;
+template <class _Tp>
+extern __cplr __cpcvr<_Tp&>;
+template <class _Tp>
+extern __cprr __cpcvr<_Tp&&>;
+template <class _Tp>
+extern __cpclr __cpcvr<const _Tp&>;
+template <class _Tp>
+extern __cpcrr __cpcvr<const _Tp&&>;
+template <class _Tp>
+using __copy_cvref_fn = decltype(__cpcvr<_Tp>);
 
 template <class _From, class _To>
 using __copy_cvref_t = __minvoke<__copy_cvref_fn<_From>, _To>;
@@ -488,21 +540,21 @@
 
 // For hiding a template type parameter from ADL
 template <class _Ty>
-struct _X
+struct _Xp
 {
-    using __t = struct _T
+    using __t = struct _Up
     {
         using __t = _Ty;
     };
 };
 template <class _Ty>
-using __x = __t<_X<_Ty>>;
+using __x = __t<_Xp<_Ty>>;
 
 template <class _Ty>
 concept __has_id = requires { typename _Ty::__id; };
 
 template <class _Ty>
-struct _Y
+struct _Yp
 {
     using __t = _Ty;
 
@@ -513,17 +565,19 @@
     // a type that is setup to use ADL isolation.
     // static_assert(!__has_id<std::remove_cvref_t<_Ty>>);
 };
+
 template <bool = true>
 struct __id_
 {
     template <class _Ty>
     using __f = typename _Ty::__id;
 };
+
 template <>
 struct __id_<false>
 {
     template <class _Ty>
-    using __f = _Y<_Ty>;
+    using __f = _Yp<_Ty>;
 };
 template <class _Ty>
 using __id = __minvoke<__id_<__has_id<_Ty>>, _Ty>;
@@ -535,16 +589,18 @@
 using __cvref_id = __copy_cvref_t<_From, __id<_To>>;
 
 template <class _Fun, class... _As>
-concept __callable = requires(_Fun&& __fun, _As&&... __as) {
-                         ((_Fun &&) __fun)((_As &&) __as...);
-                     };
+concept __callable =                         //
+    requires(_Fun&& __fun, _As&&... __as) {  //
+        ((_Fun &&) __fun)((_As &&) __as...); //
+    };
 template <class _Fun, class... _As>
-concept __nothrow_callable = __callable<_Fun, _As...> &&
-                             requires(_Fun&& __fun, _As&&... __as) {
-                                 {
-                                     ((_Fun &&) __fun)((_As &&) __as...)
-                                 } noexcept;
-                             };
+concept __nothrow_callable =    //
+    __callable<_Fun, _As...> && //
+    requires(_Fun&& __fun, _As&&... __as) {
+        {
+            ((_Fun &&) __fun)((_As &&) __as...)
+        } noexcept;
+    };
 
 #if STDEXEC_NVHPC()
 // nvc++ doesn't cache the results of alias template specializations.
@@ -567,7 +623,7 @@
     using __f = __call_result_t<_Fun, _As...>;
 };
 template <bool _Enable, class _Fun, class... _As>
-using __call_result_if_t = typename __if<__bool<_Enable>, __qcall_result,
+using __call_result_if_t = typename __if<__mbool<_Enable>, __qcall_result,
                                          __>::template __f<_Fun, _As...>;
 
 // For emplacing non-movable types into optionals:
@@ -577,10 +633,12 @@
 {
     _Fn __fn_;
     using __t = __call_result_t<_Fn>;
+
     operator __t() && noexcept(__nothrow_callable<_Fn>)
     {
         return ((_Fn &&) __fn_)();
     }
+
     __t operator()() && noexcept(__nothrow_callable<_Fn>)
     {
         return ((_Fn &&) __fn_)();
@@ -589,17 +647,29 @@
 template <class _Fn>
 __conv(_Fn) -> __conv<_Fn>;
 
-template <class _T>
-using __cref_t = const std::remove_reference_t<_T>&;
+// Implemented as a class instead of a free function
+// because of a bizarre nvc++ compiler bug:
+struct __cref_fn
+{
+    template <class _Ty>
+    const _Ty& operator()(const _Ty&);
+};
+template <class _Ty>
+using __cref_t = decltype(__cref_fn{}(__declval<_Ty>()));
 
 template <class, class, class, class>
 struct __mzip_with2_;
-template <class _Fn, class _Continuation, template <class...> class _C,
-          class... _Cs, template <class...> class _D, class... _Ds>
+
+template <               //
+    class _Fn,           //
+    class _Continuation, //
+    template <class...> class _Cp,
+    class... _Cs, //
+    template <class...> class _Dp, class... _Ds>
     requires requires {
                  typename __minvoke<_Continuation, __minvoke<_Fn, _Cs, _Ds>...>;
              }
-struct __mzip_with2_<_Fn, _Continuation, _C<_Cs...>, _D<_Ds...>>
+struct __mzip_with2_<_Fn, _Continuation, _Cp<_Cs...>, _Dp<_Ds...>>
 {
     using __t = __minvoke<_Continuation, __minvoke<_Fn, _Cs, _Ds>...>;
 };
@@ -607,8 +677,8 @@
 template <class _Fn, class _Continuation = __q<__types>>
 struct __mzip_with2
 {
-    template <class _C, class _D>
-    using __f = __t<__mzip_with2_<_Fn, _Continuation, _C, _D>>;
+    template <class _Cp, class _Dp>
+    using __f = __t<__mzip_with2_<_Fn, _Continuation, _Cp, _Dp>>;
 };
 
 #if STDEXEC_GCC() && (__GNUC__ < 12)
@@ -617,16 +687,16 @@
 template <std::size_t... _Indices>
 extern __types<__msize_t<_Indices>...>
     __mconvert_indices<std::index_sequence<_Indices...>>;
-template <std::size_t _N>
+template <std::size_t _Np>
 using __mmake_index_sequence =
-    decltype(stdexec::__mconvert_indices<std::make_index_sequence<_N>>);
+    decltype(stdexec::__mconvert_indices<std::make_index_sequence<_Np>>);
 #else
 template <std::size_t... _Indices>
 __types<__msize_t<_Indices>...>
     __mconvert_indices(std::index_sequence<_Indices...>*);
-template <std::size_t _N>
+template <std::size_t _Np>
 using __mmake_index_sequence = decltype(stdexec::__mconvert_indices(
-    (std::make_index_sequence<_N>*)nullptr));
+    (std::make_index_sequence<_Np>*)nullptr));
 #endif
 
 template <class... _Ts>
@@ -636,12 +706,14 @@
 struct __mfind_if_
 {
     template <class _Fn, class _Continuation, class _Head, class... _Tail>
-    using __f = __minvoke<
-        __if_c<__v<__minvoke<_Fn, _Head>>, __mbind_front<_Continuation, _Head>,
-               __mbind_front<__mfind_if_<(sizeof...(_Tail) != 0)>, _Fn,
-                             _Continuation>>,
-        _Tail...>;
+    using __f = //
+        __minvoke<__if_c<__v<__minvoke<_Fn, _Head>>,
+                         __mbind_front<_Continuation, _Head>,
+                         __mbind_front<__mfind_if_<(sizeof...(_Tail) != 0)>,
+                                       _Fn, _Continuation>>,
+                  _Tail...>;
 };
+
 template <>
 struct __mfind_if_<false>
 {
@@ -666,11 +738,11 @@
 };
 
 template <class... _Booleans>
-using __mand = __bool<(__v<_Booleans> && ...)>;
+using __mand = __mbool<(__v<_Booleans> && ...)>;
 template <class... _Booleans>
-using __mor = __bool<(__v<_Booleans> || ...)>;
+using __mor = __mbool<(__v<_Booleans> || ...)>;
 template <class _Boolean>
-using __mnot = __bool<!__v<_Boolean>>;
+using __mnot = __mbool<!__v<_Boolean>>;
 
 template <class _Fn>
 struct __mall_of
@@ -678,12 +750,14 @@
     template <class... _Args>
     using __f = __mand<__minvoke<_Fn, _Args>...>;
 };
+
 template <class _Fn>
 struct __mnone_of
 {
     template <class... _Args>
     using __f = __mand<__mnot<__minvoke<_Fn, _Args>>...>;
 };
+
 template <class _Fn>
 struct __many_of
 {
@@ -692,8 +766,8 @@
 };
 
 #if __has_builtin(__type_pack_element)
-template <std::size_t _N, class... _Ts>
-using __m_at = __type_pack_element<_N, _Ts...>;
+template <std::size_t _Np, class... _Ts>
+using __m_at = __type_pack_element<_Np, _Ts...>;
 #else
 template <std::size_t>
 using __void_ptr = void*;
@@ -707,27 +781,27 @@
 template <std::size_t... _Is>
 struct __m_at_<std::index_sequence<_Is...>>
 {
-    template <class _U, class... _Us>
-    static _U __f_(__void_ptr<_Is>..., _U*, _Us*...);
+    template <class _Up, class... _Us>
+    static _Up __f_(__void_ptr<_Is>..., _Up*, _Us*...);
     template <class... _Ts>
     using __f = __t<decltype(__m_at_::__f_(__mtype_ptr<_Ts>()...))>;
 };
 
-template <std::size_t _N, class... _Ts>
-using __m_at = __minvoke<__m_at_<std::make_index_sequence<_N>>, _Ts...>;
+template <std::size_t _Np, class... _Ts>
+using __m_at = __minvoke<__m_at_<std::make_index_sequence<_Np>>, _Ts...>;
 #endif
 
-template <std::size_t _N>
+template <std::size_t _Np>
 struct __placeholder_;
-template <std::size_t _N>
-using __placeholder = __placeholder_<_N>*;
+template <std::size_t _Np>
+using __placeholder = __placeholder_<_Np>*;
 
 using __0 = __placeholder<0>;
 using __1 = __placeholder<1>;
 using __2 = __placeholder<2>;
 using __3 = __placeholder<3>;
 
-template <class _Ty, class _Noexcept = __bool<true>>
+template <class _Ty, class _Noexcept = __mbool<true>>
 struct __mconstruct
 {
     template <class... _As>
@@ -739,8 +813,8 @@
     }
 };
 
-template <template <class...> class _C, class _Noexcept = __bool<true>>
-using __mconstructor_for = __mcompose<__q<__mconstruct>, __q<_C>>;
+template <template <class...> class _Cp, class _Noexcept = __mbool<true>>
+using __mconstructor_for = __mcompose<__q<__mconstruct>, __q<_Cp>>;
 
 template <std::size_t>
 using __ignore_t = __ignore;
@@ -750,7 +824,8 @@
 {
     return (_Ty &&) __t;
 }
-template <std::size_t _N, class... _Ts>
+
+template <std::size_t _Np, class... _Ts>
 constexpr decltype(auto) __nth_pack_element(_Ts&&... __ts) noexcept
 {
     return [&]<std::size_t... _Is>(std::index_sequence<_Is...>*) noexcept
@@ -758,7 +833,7 @@
     {
         return stdexec::__nth_pack_element_<_Is...>((_Ts &&) __ts...);
     }
-    ((std::make_index_sequence<_N>*)nullptr);
+    ((std::make_index_sequence<_Np>*)nullptr);
 }
 
 template <class _Ty>
@@ -770,42 +845,47 @@
         return _Ty{};
     }
 };
-template <std::size_t _N>
-struct __mdispatch_<__placeholder<_N>>
+
+template <std::size_t _Np>
+struct __mdispatch_<__placeholder<_Np>>
 {
     template <class... _Ts>
     decltype(auto) operator()(_Ts&&... __ts) const noexcept
     {
-        return stdexec::__nth_pack_element<_N>((_Ts &&) __ts...);
+        return stdexec::__nth_pack_element<_Np>((_Ts &&) __ts...);
     }
 };
-template <std::size_t _N>
-struct __mdispatch_<__placeholder<_N>&>
+
+template <std::size_t _Np>
+struct __mdispatch_<__placeholder<_Np>&>
 {
     template <class... _Ts>
     decltype(auto) operator()(_Ts&&... __ts) const noexcept
     {
-        return stdexec::__nth_pack_element<_N>(__ts...);
+        return stdexec::__nth_pack_element<_Np>(__ts...);
     }
 };
-template <std::size_t _N>
-struct __mdispatch_<__placeholder<_N>&&>
+
+template <std::size_t _Np>
+struct __mdispatch_<__placeholder<_Np>&&>
 {
     template <class... _Ts>
     decltype(auto) operator()(_Ts&&... __ts) const noexcept
     {
-        return std::move(stdexec::__nth_pack_element<_N>(__ts...));
+        return std::move(stdexec::__nth_pack_element<_Np>(__ts...));
     }
 };
-template <std::size_t _N>
-struct __mdispatch_<const __placeholder<_N>&>
+
+template <std::size_t _Np>
+struct __mdispatch_<const __placeholder<_Np>&>
 {
     template <class... _Ts>
     decltype(auto) operator()(_Ts&&... __ts) const noexcept
     {
-        return std::as_const(stdexec::__nth_pack_element<_N>(__ts...));
+        return std::as_const(stdexec::__nth_pack_element<_Np>(__ts...));
     }
 };
+
 template <class _Ret, class... _Args>
 struct __mdispatch_<_Ret (*)(_Args...)>
 {
@@ -826,6 +906,7 @@
 template <class _Ty>
 struct __mdispatch
 {};
+
 template <class _Ret, class... _Args>
 struct __mdispatch<_Ret(_Args...)>
 {
@@ -852,23 +933,27 @@
 using __dispatch_result_t = __call_result_t<__mdispatch<_Ty>, _Ts...>;
 
 template <class _Signature, class... _Args>
-using __try_dispatch_ = __bool<__dispatchable<_Signature, _Args...>>;
+using __try_dispatch_ = __mbool<__dispatchable<_Signature, _Args...>>;
+
 template <class _Signatures, class _Continuation = __q<__mfront>>
 struct __which
 {};
-template <template <class...> class _C, class... _Signatures,
+
+template <template <class...> class _Cp, class... _Signatures,
           class _Continuation>
-struct __which<_C<_Signatures...>, _Continuation>
+struct __which<_Cp<_Signatures...>, _Continuation>
 {
     template <class... _Args>
-    using __f = __minvoke<
-        __mfind_if<__mbind_back_q<__try_dispatch_, _Args...>, _Continuation>,
-        _Signatures...>;
+    using __f = //
+        __minvoke<__mfind_if<__mbind_back_q<__try_dispatch_, _Args...>,
+                             _Continuation>,
+                  _Signatures...>;
 };
 
 template <class _Signatures, class _DefaultFn, class... _Args>
-using __make_dispatcher = __minvoke<
-    __if_c<__minvocable<__which<_Signatures>, _Args...>,
-           __mcompose<__q<__mdispatch>, __which<_Signatures>>, _DefaultFn>,
-    _Args...>;
+using __make_dispatcher = //
+    __minvoke<
+        __if_c<__minvocable<__which<_Signatures>, _Args...>,
+               __mcompose<__q<__mdispatch>, __which<_Signatures>>, _DefaultFn>,
+        _Args...>;
 } // namespace stdexec
diff --git a/include/sdbusplus/async/stdexec/__detail/__p2300.hpp b/include/sdbusplus/async/stdexec/__detail/__p2300.hpp
index b76f2ba..d76e65b 100644
--- a/include/sdbusplus/async/stdexec/__detail/__p2300.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__p2300.hpp
@@ -22,7 +22,9 @@
 #else
 #define STDEXEC_STD_DEPRECATED                                                 \
     [[deprecated(                                                              \
-        "Please access this entity in the ::stdexec:: namespace. Define STDEXEC_DISABLE_STD_DEPRECATIONS to silence this warning.")]]
+        "Please access this entity in the ::stdexec:: namespace. Define "      \
+        "STDEXEC_DISABLE_STD_DEPRECATIONS to silence this "                    \
+        "warning.")]]
 #endif
 
 namespace std
@@ -161,7 +163,7 @@
 
 // [exec.snd], senders
 template <class _Sender, class _Env = stdexec::no_env>
-concept sender /*STDEXEC_STD_DEPRECATED*/ = stdexec::sender<_Sender, _Env>;
+concept sender /*STDEXEC_STD_DEPRECATED*/ = stdexec::sender_in<_Sender, _Env>;
 
 template <class _Sender, class _Receiver>
 concept sender_to /*STDEXEC_STD_DEPRECATED*/ =
@@ -186,14 +188,18 @@
 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>
+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>
+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>;
 
@@ -329,14 +335,16 @@
     stdexec::completion_signatures<_Sigs...>;
 
 // [exec.utils.mkcmplsigs]
-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()>>
+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>;
@@ -349,7 +357,7 @@
 STDEXEC_STD_DEPRECATED
 inline constexpr auto execute = stdexec::execute;
 
-#if !_STD_NO_COROUTINES_
+#if !STDEXEC_STD_NO_COROUTINES_
 // [exec.as_awaitable]
 using as_awaitable_t STDEXEC_STD_DEPRECATED = stdexec::as_awaitable_t;
 STDEXEC_STD_DEPRECATED
@@ -359,7 +367,7 @@
 template <class _Promise>
 using with_awaitable_senders STDEXEC_STD_DEPRECATED =
     stdexec::with_awaitable_senders<_Promise>;
-#endif // !_STD_NO_COROUTINES_
+#endif // !STDEXEC_STD_NO_COROUTINES_
 } // namespace execution
 
 namespace this_thread
diff --git a/include/sdbusplus/async/stdexec/__detail/__scope.hpp b/include/sdbusplus/async/stdexec/__detail/__scope.hpp
new file mode 100644
index 0000000..6f0f685
--- /dev/null
+++ b/include/sdbusplus/async/stdexec/__detail/__scope.hpp
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2023 NVIDIA Corporation
+ *
+ * Licensed under the Apache License Version 2.0 with LLVM Exceptions
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *   https://llvm.org/LICENSE.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include "__meta.hpp"
+
+namespace stdexec
+{
+template <class _Fn, class... _Ts>
+    requires __nothrow_callable<_Fn, _Ts...>
+struct __scope_guard;
+
+template <class _Fn>
+struct __scope_guard<_Fn>
+{
+    [[no_unique_address]] _Fn __fn_;
+    [[no_unique_address]] __immovable __hidden_{};
+    bool __dismissed_{false};
+
+    ~__scope_guard()
+    {
+        if (!__dismissed_)
+            ((_Fn &&) __fn_)();
+    }
+
+    void __dismiss() noexcept
+    {
+        __dismissed_ = true;
+    }
+};
+
+template <class _Fn, class _T0>
+struct __scope_guard<_Fn, _T0>
+{
+    [[no_unique_address]] _Fn __fn_;
+    [[no_unique_address]] _T0 __t0_;
+    [[no_unique_address]] __immovable __hidden_{};
+
+    bool __dismissed_{false};
+
+    void __dismiss() noexcept
+    {
+        __dismissed_ = true;
+    }
+
+    ~__scope_guard()
+    {
+        if (!__dismissed_)
+            ((_Fn &&) __fn_)((_T0 &&) __t0_);
+    }
+};
+
+template <class _Fn, class _T0, class _T1>
+struct __scope_guard<_Fn, _T0, _T1>
+{
+    [[no_unique_address]] _Fn __fn_;
+    [[no_unique_address]] _T0 __t0_;
+    [[no_unique_address]] _T1 __t1_;
+    [[no_unique_address]] __immovable __hidden_{};
+
+    bool __dismissed_{false};
+
+    void __dismiss() noexcept
+    {
+        __dismissed_ = true;
+    }
+
+    ~__scope_guard()
+    {
+        if (!__dismissed_)
+            ((_Fn &&) __fn_)((_T0 &&) __t0_, (_T1 &&) __t1_);
+    }
+};
+
+template <class _Fn, class _T0, class _T1, class _T2>
+struct __scope_guard<_Fn, _T0, _T1, _T2>
+{
+    [[no_unique_address]] _Fn __fn_;
+    [[no_unique_address]] _T0 __t0_;
+    [[no_unique_address]] _T1 __t1_;
+    [[no_unique_address]] _T2 __t2_;
+    [[no_unique_address]] __immovable __hidden_{};
+
+    bool __dismissed_{false};
+
+    void __dismiss() noexcept
+    {
+        __dismissed_ = true;
+    }
+
+    ~__scope_guard()
+    {
+        if (!__dismissed_)
+            ((_Fn &&) __fn_)((_T0 &&) __t0_, (_T1 &&) __t1_, (_T2 &&) __t2_);
+    }
+};
+
+template <class _Fn, class... _Ts>
+__scope_guard(_Fn, _Ts...) -> __scope_guard<_Fn, _Ts...>;
+} // namespace stdexec
diff --git a/include/sdbusplus/async/stdexec/any_sender_of.hpp b/include/sdbusplus/async/stdexec/any_sender_of.hpp
new file mode 100644
index 0000000..19e1b9e
--- /dev/null
+++ b/include/sdbusplus/async/stdexec/any_sender_of.hpp
@@ -0,0 +1,1104 @@
+/* Copyright (c) 2023 Maikel Nadolski
+ * Copyright (c) 2023 NVIDIA Corporation
+ *
+ * Licensed under the Apache License Version 2.0 with LLVM Exceptions
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *   https://llvm.org/LICENSE.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <sdbusplus/async/stdexec/execution.hpp>
+
+#include <cstddef>
+
+namespace exec
+{
+namespace __any
+{
+using namespace stdexec;
+
+struct __create_vtable_t
+{
+    template <class _VTable, class _Tp>
+        requires __tag_invocable_r<const _VTable*, __create_vtable_t,
+                                   __mtype<_VTable>, __mtype<_Tp>>
+    constexpr const _VTable* operator()(__mtype<_VTable>,
+                                        __mtype<_Tp>) const noexcept
+    {
+        return tag_invoke(__create_vtable_t{}, __mtype<_VTable>{},
+                          __mtype<_Tp>{});
+    }
+};
+
+inline constexpr __create_vtable_t __create_vtable{};
+
+template <class _Sig>
+struct __query_vfun;
+
+template <class _Tag, class _Ret, class... _As>
+struct __query_vfun<_Tag (*const)(_Ret (*)(_As...))>
+{
+    _Ret (*__fn_)(void*, _As...);
+
+    _Ret operator()(_Tag, void* __rcvr, _As&&... __as) const
+    {
+        return __fn_(__rcvr, (_As &&) __as...);
+    }
+};
+
+template <class _Tag, class _Ret, class... _As>
+struct __query_vfun<_Tag (*)(_Ret (*)(_As...))>
+{
+    _Ret (*__fn_)(void*, _As...);
+
+    _Ret operator()(_Tag, void* __rcvr, _As&&... __as) const
+    {
+        return __fn_(__rcvr, (_As &&) __as...);
+    }
+};
+
+template <class _Tag, class _Ret, class... _As>
+struct __query_vfun<_Tag (*const)(_Ret (*)(_As...) noexcept)>
+{
+    _Ret (*__fn_)(void*, _As...) noexcept;
+
+    _Ret operator()(_Tag, void* __rcvr, _As&&... __as) const noexcept
+    {
+        return __fn_(__rcvr, (_As &&) __as...);
+    }
+};
+
+template <class _Tag, class _Ret, class... _As>
+struct __query_vfun<_Tag (*)(_Ret (*)(_As...) noexcept)>
+{
+    _Ret (*__fn_)(void*, _As...) noexcept;
+
+    _Ret operator()(_Tag, void* __rcvr, _As&&... __as) const noexcept
+    {
+        return __fn_(__rcvr, (_As &&) __as...);
+    }
+};
+
+template <class>
+struct __query_vfun_fn;
+
+template <class _EnvProvider>
+    requires __callable<get_env_t, const _EnvProvider&>
+struct __query_vfun_fn<_EnvProvider>
+{
+    template <class _Tag, class _Ret, class... _As>
+        requires __callable<_Tag, env_of_t<const _EnvProvider&>, _As...>
+    constexpr _Ret (*operator()(_Tag (*)(_Ret (*)(_As...)))
+                        const noexcept)(void*, _As...)
+    {
+        return +[](void* __env_provider, _As... __as) -> _Ret {
+            return _Tag{}(get_env(*(const _EnvProvider*)__env_provider),
+                          (_As &&) __as...);
+        };
+    }
+
+    template <class _Tag, class _Ret, class... _As>
+        requires __callable<_Tag, env_of_t<const _EnvProvider&>, _As...>
+    constexpr _Ret (*operator()(_Tag (*)(_Ret (*)(_As...) noexcept))
+                        const noexcept)(void*, _As...) noexcept
+    {
+        return +[](void* __env_provider, _As... __as) noexcept -> _Ret {
+            static_assert(
+                __nothrow_callable<_Tag, const env_of_t<_EnvProvider>&,
+                                   _As...>);
+            return _Tag{}(get_env(*(const _EnvProvider*)__env_provider),
+                          (_As &&) __as...);
+        };
+    }
+};
+
+template <class _Queryable>
+    requires(!__callable<get_env_t, const _Queryable&>)
+struct __query_vfun_fn<_Queryable>
+{
+    template <class _Tag, class _Ret, class... _As>
+        requires __callable<_Tag, const _Queryable&, _As...>
+    constexpr _Ret (*operator()(_Tag (*)(_Ret (*)(_As...)))
+                        const noexcept)(void*, _As...)
+    {
+        return +[](void* __queryable, _As... __as) -> _Ret {
+            return _Tag{}(*(const _Queryable*)__queryable, (_As &&) __as...);
+        };
+    }
+
+    template <class _Tag, class _Ret, class... _As>
+        requires __callable<_Tag, const _Queryable&, _As...>
+    constexpr _Ret (*operator()(_Tag (*)(_Ret (*)(_As...) noexcept))
+                        const noexcept)(void*, _As...) noexcept
+    {
+        return +[](void* __env_provider, _As... __as) noexcept -> _Ret {
+            static_assert(__nothrow_callable<_Tag, const _Queryable&, _As...>);
+            return _Tag{}(*(const _Queryable*)__env_provider, (_As &&) __as...);
+        };
+    }
+};
+
+template <class _Sig>
+struct __storage_vfun;
+
+template <class _Tag, class... _As>
+struct __storage_vfun<_Tag(void (*)(_As...))>
+{
+    void (*__fn_)(void*, _As...) = [](void*, _As...) {};
+
+    void operator()(_Tag, void* __storage, _As&&... __as) const
+    {
+        return __fn_(__storage, (_As &&) __as...);
+    }
+};
+
+template <class _Tag, class... _As>
+struct __storage_vfun<_Tag(void (*)(_As...) noexcept)>
+{
+    void (*__fn_)(void*, _As...) noexcept = [](void*, _As...) noexcept {};
+
+    void operator()(_Tag, void* __storage, _As&&... __as) const noexcept
+    {
+        return __fn_(__storage, (_As &&) __as...);
+    }
+};
+
+template <class _Storage, class _Tp>
+struct __storage_vfun_fn
+{
+    template <class _Tag, class... _As>
+        requires __callable<_Tag, __mtype<_Tp>, _Storage&, _As...>
+    constexpr void (*operator()(_Tag (*)(void (*)(_As...)))
+                        const noexcept)(void*, _As...)
+    {
+        return +[](void* __storage, _As... __as) -> void {
+            return _Tag{}(__mtype<_Tp>{}, *(_Storage*)__storage,
+                          (_As &&) __as...);
+        };
+    }
+
+    template <class _Tag, class... _As>
+        requires __callable<_Tag, __mtype<_Tp>, _Storage&, _As...>
+    constexpr void (*operator()(_Tag (*)(void (*)(_As...) noexcept))
+                        const noexcept)(void*, _As...) noexcept
+    {
+        return +[](void* __storage, _As... __as) noexcept -> void {
+            static_assert(
+                __nothrow_callable<_Tag, __mtype<_Tp>, _Storage&, _As...>);
+            return _Tag{}(__mtype<_Tp>{}, *(_Storage*)__storage,
+                          (_As &&) __as...);
+        };
+    }
+};
+
+struct __delete_t
+{
+    template <class _Storage, class _Tp>
+        requires tag_invocable<__delete_t, __mtype<_Tp>, _Storage&>
+    void operator()(__mtype<_Tp>, _Storage& __storage) noexcept
+    {
+        static_assert(
+            nothrow_tag_invocable<__delete_t, __mtype<_Tp>, _Storage&>);
+        tag_invoke(__delete_t{}, __mtype<_Tp>{}, __storage);
+    }
+};
+
+inline constexpr __delete_t __delete{};
+
+struct __copy_construct_t
+{
+    template <class _Storage, class _Tp>
+        requires tag_invocable<__copy_construct_t, __mtype<_Tp>, _Storage&,
+                               const _Storage&>
+    void operator()(
+        __mtype<_Tp>, _Storage& __self,
+        const _Storage&
+            __from) noexcept(nothrow_tag_invocable<__copy_construct_t,
+                                                   __mtype<_Tp>, _Storage&,
+                                                   const _Storage&>)
+    {
+        tag_invoke(__copy_construct_t{}, __mtype<_Tp>{}, __self, __from);
+    }
+};
+
+inline constexpr __copy_construct_t __copy_construct{};
+
+struct __move_construct_t
+{
+    template <class _Storage, class _Tp>
+        requires tag_invocable<__move_construct_t, __mtype<_Tp>, _Storage&,
+                               _Storage&&>
+    void operator()(__mtype<_Tp>, _Storage& __self,
+                    __midentity<_Storage&&> __from) noexcept
+    {
+        static_assert(nothrow_tag_invocable<__move_construct_t, __mtype<_Tp>,
+                                            _Storage&, _Storage&&>);
+        tag_invoke(__move_construct_t{}, __mtype<_Tp>{}, __self,
+                   (_Storage &&) __from);
+    }
+};
+
+inline constexpr __move_construct_t __move_construct{};
+
+template <class _ParentVTable, class... _StorageCPOs>
+struct __storage_vtable;
+
+template <class _ParentVTable, class... _StorageCPOs>
+    requires requires { _ParentVTable::operator(); }
+struct __storage_vtable<_ParentVTable, _StorageCPOs...> :
+    _ParentVTable,
+    __storage_vfun<_StorageCPOs>...
+{
+    using _ParentVTable::operator();
+    using __storage_vfun<_StorageCPOs>::operator()...;
+};
+
+template <class _ParentVTable, class... _StorageCPOs>
+    requires(!requires { _ParentVTable::operator(); })
+struct __storage_vtable<_ParentVTable, _StorageCPOs...> :
+    _ParentVTable,
+    __storage_vfun<_StorageCPOs>...
+{
+    using __storage_vfun<_StorageCPOs>::operator()...;
+};
+
+template <class _ParentVTable, class... _StorageCPOs>
+inline constexpr __storage_vtable<_ParentVTable, _StorageCPOs...>
+    __null_storage_vtbl{};
+
+template <class _ParentVTable, class... _StorageCPOs>
+constexpr const __storage_vtable<_ParentVTable, _StorageCPOs...>*
+    __default_storage_vtable(
+        __storage_vtable<_ParentVTable, _StorageCPOs...>*) noexcept
+{
+    return &__null_storage_vtbl<_ParentVTable, _StorageCPOs...>;
+}
+
+template <class _Storage, class _Tp, class _ParentVTable, class... _StorageCPOs>
+static const __storage_vtable<_ParentVTable, _StorageCPOs...> __storage_vtbl{
+    {*__create_vtable(__mtype<_ParentVTable>{}, __mtype<_Tp>{})},
+    {__storage_vfun_fn<_Storage, _Tp>{}((_StorageCPOs*)nullptr)}...};
+
+template <class _Vtable, class _Allocator, bool _Copyable = false,
+          std::size_t _Alignment = alignof(std::max_align_t),
+          std::size_t _InlineSize = 3 * sizeof(void*)>
+struct __storage
+{
+    class __t;
+};
+
+template <class _Vtable, class _Allocator, bool _Copyable,
+          std::size_t _Alignment, std::size_t _InlineSize>
+class __storage<_Vtable, _Allocator, _Copyable, _Alignment, _InlineSize>::__t :
+    __if_c<_Copyable, __, __move_only>
+{
+    static_assert(
+        std::is_convertible_v<
+            typename std::allocator_traits<_Allocator>::void_pointer, void*>);
+
+    static constexpr std::size_t __buffer_size = std::max(_InlineSize,
+                                                          sizeof(void*));
+    static constexpr std::size_t __alignment = std::max(_Alignment,
+                                                        alignof(void*));
+    using __with_copy = __copy_construct_t(void(const __t&));
+    using __with_move = __move_construct_t(void(__t&&) noexcept);
+    using __with_delete = __delete_t(void() noexcept);
+
+    template <class _Tp>
+    static constexpr bool __is_small =
+        sizeof(_Tp) <= __buffer_size && alignof(_Tp) <= __alignment &&
+        std::is_nothrow_move_constructible_v<_Tp>;
+
+    using __vtable_t = __if_c<
+        _Copyable,
+        __storage_vtable<_Vtable, __with_delete, __with_move, __with_copy>,
+        __storage_vtable<_Vtable, __with_delete, __with_move>>;
+
+    template <class _Tp>
+    static constexpr const __vtable_t* __get_vtable_of_type() noexcept
+    {
+        if constexpr (_Copyable)
+        {
+            return &__storage_vtbl<__t, __decay_t<_Tp>, _Vtable, __with_delete,
+                                   __with_move, __with_copy>;
+        }
+        else
+        {
+            return &__storage_vtbl<__t, __decay_t<_Tp>, _Vtable, __with_delete,
+                                   __with_move>;
+        }
+    }
+
+  public:
+    using __id = __storage;
+
+    __t() = default;
+
+    template <__not_decays_to<__t> _Tp>
+        requires __callable<__create_vtable_t, __mtype<_Vtable>,
+                            __mtype<__decay_t<_Tp>>>
+    __t(_Tp&& __object) : __vtable_{__get_vtable_of_type<_Tp>()}
+    {
+        using _Dp = __decay_t<_Tp>;
+        if constexpr (__is_small<_Dp>)
+        {
+            __construct_small<_Dp>((_Tp &&) __object);
+        }
+        else
+        {
+            __construct_large<_Dp>((_Tp &&) __object);
+        }
+    }
+
+    template <class _Tp, class... _Args>
+        requires __callable<__create_vtable_t, __mtype<_Vtable>, __mtype<_Tp>>
+    __t(std::in_place_type_t<_Tp>, _Args&&... __args) :
+        __vtable_{__get_vtable_of_type<_Tp>()}
+    {
+        if constexpr (__is_small<_Tp>)
+        {
+            __construct_small<_Tp>((_Args &&) __args...);
+        }
+        else
+        {
+            __construct_large<_Tp>((_Args &&) __args...);
+        }
+    }
+
+    __t(const __t& __other)
+        requires(_Copyable)
+    {
+        (*__other.__vtable_)(__copy_construct, this, __other);
+    }
+
+    __t& operator=(const __t& __other)
+        requires(_Copyable)
+    {
+        __t tmp(__other);
+        return *this = std::move(tmp);
+    }
+
+    __t(__t&& __other) noexcept
+    {
+        (*__other.__vtable_)(__move_construct, this, (__t &&) __other);
+    }
+
+    __t& operator=(__t&& __other) noexcept
+    {
+        __reset();
+        (*__other.__vtable_)(__move_construct, this, (__t &&) __other);
+        return *this;
+    }
+
+    ~__t()
+    {
+        __reset();
+    }
+
+    void __reset() noexcept
+    {
+        (*__vtable_)(__delete, this);
+        __object_pointer_ = nullptr;
+        __vtable_ = __default_storage_vtable((__vtable_t*)nullptr);
+    }
+
+    const _Vtable* __get_vtable() const noexcept
+    {
+        return __vtable_;
+    }
+
+    void* __get_object_pointer() const noexcept
+    {
+        return __object_pointer_;
+    }
+
+  private:
+    template <class _Tp, class... _As>
+    void __construct_small(_As&&... __args)
+    {
+        static_assert(sizeof(_Tp) <= __buffer_size &&
+                      alignof(_Tp) <= __alignment);
+        _Tp* __pointer = static_cast<_Tp*>(static_cast<void*>(&__buffer_[0]));
+        using _Alloc = typename std::allocator_traits<
+            _Allocator>::template rebind_alloc<_Tp>;
+        _Alloc __alloc{__allocator_};
+        std::allocator_traits<_Alloc>::construct(__alloc, __pointer,
+                                                 (_As &&) __args...);
+        __object_pointer_ = __pointer;
+    }
+
+    template <class _Tp, class... _As>
+    void __construct_large(_As&&... __args)
+    {
+        using _Alloc = typename std::allocator_traits<
+            _Allocator>::template rebind_alloc<_Tp>;
+        _Alloc __alloc{__allocator_};
+        _Tp* __pointer = std::allocator_traits<_Alloc>::allocate(__alloc, 1);
+        try
+        {
+            std::allocator_traits<_Alloc>::construct(__alloc, __pointer,
+                                                     (_As &&) __args...);
+        }
+        catch (...)
+        {
+            std::allocator_traits<_Alloc>::deallocate(__alloc, __pointer, 1);
+            throw;
+        }
+        __object_pointer_ = __pointer;
+    }
+
+    template <class _Tp>
+    friend void tag_invoke(__delete_t, __mtype<_Tp>, __t& __self) noexcept
+    {
+        if (!__self.__object_pointer_)
+        {
+            return;
+        }
+        using _Alloc = typename std::allocator_traits<
+            _Allocator>::template rebind_alloc<_Tp>;
+        _Alloc __alloc{__self.__allocator_};
+        _Tp* __pointer =
+            static_cast<_Tp*>(std::exchange(__self.__object_pointer_, nullptr));
+        std::allocator_traits<_Alloc>::destroy(__alloc, __pointer);
+        if constexpr (!__is_small<_Tp>)
+        {
+            std::allocator_traits<_Alloc>::deallocate(__alloc, __pointer, 1);
+        }
+    }
+
+    template <class _Tp>
+    friend void tag_invoke(__move_construct_t, __mtype<_Tp>, __t& __self,
+                           __t&& __other) noexcept
+    {
+        if (!__other.__object_pointer_)
+        {
+            return;
+        }
+        _Tp* __pointer = static_cast<_Tp*>(
+            std::exchange(__other.__object_pointer_, nullptr));
+        if constexpr (__is_small<_Tp>)
+        {
+            _Tp& __other_object = *__pointer;
+            __self.template __construct_small<_Tp>((_Tp &&) __other_object);
+            using _Alloc = typename std::allocator_traits<
+                _Allocator>::template rebind_alloc<_Tp>;
+            _Alloc __alloc{__self.__allocator_};
+            std::allocator_traits<_Alloc>::destroy(__alloc, __pointer);
+        }
+        else
+        {
+            __self.__object_pointer_ = __pointer;
+        }
+        __self.__vtable_ = std::exchange(
+            __other.__vtable_, __default_storage_vtable((__vtable_t*)nullptr));
+    }
+
+    template <class _Tp>
+        requires _Copyable
+    friend void tag_invoke(__copy_construct_t, __mtype<_Tp>, __t& __self,
+                           const __t& __other)
+    {
+        if (!__other.__object_pointer_)
+        {
+            return;
+        }
+        const _Tp& __other_object =
+            *static_cast<const _Tp*>(__other.__object_pointer_);
+        if constexpr (__is_small<_Tp>)
+        {
+            __self.template __construct_small<_Tp>(__other_object);
+        }
+        else
+        {
+            __self.template __construct_large<_Tp>(__other_object);
+        }
+        __self.__vtable_ = __other.__vtable_;
+    }
+
+    const __vtable_t* __vtable_{__default_storage_vtable((__vtable_t*)nullptr)};
+    void* __object_pointer_{nullptr};
+    alignas(__alignment) std::byte __buffer_[__buffer_size]{};
+    [[no_unique_address]] _Allocator __allocator_{};
+};
+
+template <class _VTable, class _Allocator = std::allocator<std::byte>>
+using __unique_storage_t = __t<__storage<_VTable, _Allocator>>;
+
+template <class _VTable, class _Allocator = std::allocator<std::byte>>
+using __copyable_storage_t = __t<__storage<_VTable, _Allocator, true>>;
+
+namespace __rec
+{
+template <class _Sig>
+struct __rcvr_vfun;
+
+template <class _Sigs, class... _Queries>
+struct __vtable
+{
+    class __t;
+};
+
+template <class _Sigs, class... _Queries>
+struct __ref;
+
+template <class _Tag, class... _As>
+struct __rcvr_vfun<_Tag(_As...)>
+{
+    void (*__fn_)(void*, _As...) noexcept;
+};
+
+template <class _Rcvr>
+struct __rcvr_vfun_fn
+{
+    template <class _Tag, class... _As>
+    constexpr void (*operator()(_Tag (*)(_As...))
+                        const noexcept)(void*, _As...) noexcept
+    {
+        return +[](void* __rcvr, _As... __as) noexcept -> void {
+            _Tag{}((_Rcvr &&) * (_Rcvr*)__rcvr, (_As &&) __as...);
+        };
+    }
+};
+
+template <class... _Sigs, class... _Queries>
+struct __vtable<completion_signatures<_Sigs...>, _Queries...>
+{
+    class __t : public __rcvr_vfun<_Sigs>..., public __query_vfun<_Queries>...
+    {
+      public:
+        using __query_vfun<_Queries>::operator()...;
+
+      private:
+        template <class _Rcvr>
+            requires receiver_of<_Rcvr, completion_signatures<_Sigs...>> &&
+                     (__callable<__query_vfun_fn<_Rcvr>, _Queries> && ...)
+        friend const __t* tag_invoke(__create_vtable_t, __mtype<__t>,
+                                     __mtype<_Rcvr>) noexcept
+        {
+            static const __t __vtable_{
+                {__rcvr_vfun_fn<_Rcvr>{}((_Sigs*)nullptr)}...,
+                {__query_vfun_fn<_Rcvr>{}((_Queries) nullptr)}...};
+            return &__vtable_;
+        }
+    };
+};
+
+template <class... _Sigs, class... _Queries>
+struct __ref<completion_signatures<_Sigs...>, _Queries...>
+{
+  private:
+    using __vtable_t =
+        __t<__vtable<completion_signatures<_Sigs...>, _Queries...>>;
+
+    struct __env_t
+    {
+        const __vtable_t* __vtable_;
+        void* __rcvr_;
+
+        template <class _Tag, class... _As>
+            requires __callable<const __vtable_t&, _Tag, void*, _As...>
+        friend auto
+            tag_invoke(_Tag, const __env_t& __self, _As&&... __as) noexcept(
+                __nothrow_callable<const __vtable_t&, _Tag, void*, _As...>)
+                -> __call_result_t<const __vtable_t&, _Tag, void*, _As...>
+        {
+            return (*__self.__vtable_)(_Tag{}, __self.__rcvr_,
+                                       (_As &&) __as...);
+        }
+    } __env_;
+
+  public:
+    template <__none_of<__ref, const __ref, __env_t, const __env_t> _Rcvr>
+        requires receiver_of<_Rcvr, completion_signatures<_Sigs...>> &&
+                 (__callable<__query_vfun_fn<_Rcvr>, _Queries> && ...)
+    __ref(_Rcvr& __rcvr) noexcept :
+        __env_{__create_vtable(__mtype<__vtable_t>{}, __mtype<_Rcvr>{}),
+               &__rcvr}
+    {}
+
+    template <__one_of<set_value_t, set_error_t, set_stopped_t> _Tag,
+              __decays_to<__ref> _Self, class... _As>
+        requires __one_of<_Tag(_As...), _Sigs...>
+    friend void tag_invoke(_Tag, _Self&& __self, _As&&... __as) noexcept
+    {
+        (*static_cast<const __rcvr_vfun<_Tag(_As...)>*>(__self.__env_.__vtable_)
+              ->__fn_)(((_Self &&) __self).__env_.__rcvr_, (_As &&) __as...);
+    }
+
+    template <std::same_as<__ref> Self>
+    friend const __env_t& tag_invoke(get_env_t, const Self& __self) noexcept
+    {
+        return __self.__env_;
+    }
+};
+} // namespace __rec
+
+class __operation_vtable
+{
+  public:
+    void (*__start_)(void*) noexcept;
+
+  private:
+    template <class _Op>
+    friend const __operation_vtable* tag_invoke(__create_vtable_t,
+                                                __mtype<__operation_vtable>,
+                                                __mtype<_Op>) noexcept
+    {
+        static __operation_vtable __vtable{
+            [](void* __object_pointer) noexcept -> void {
+                STDEXEC_ASSERT(__object_pointer);
+                _Op& __op = *static_cast<_Op*>(__object_pointer);
+                static_assert(operation_state<_Op>);
+                start(__op);
+            }};
+        return &__vtable;
+    }
+};
+
+using __unique_operation_storage = __unique_storage_t<__operation_vtable>;
+
+template <class _Sigs, class _Queries>
+using __receiver_ref =
+    __mapply<__mbind_front<__q<__rec::__ref>, _Sigs>, _Queries>;
+
+template <class _Receiver, class _Sigs, class _Queries>
+struct __operation_base
+{
+    [[no_unique_address]] _Receiver __receiver_;
+};
+
+template <class _Sender, class _Receiver, class _Queries>
+struct __operation
+{
+    using _Sigs = completion_signatures_of_t<_Sender>;
+    using __receiver_ref_t = __receiver_ref<_Sigs, _Queries>;
+
+    struct __rec
+    {
+        __operation_base<_Receiver, _Sigs, _Queries>* __op_;
+
+        template <__one_of<set_value_t, set_error_t, set_stopped_t> _CPO,
+                  __decays_to<__rec> _Self, class... _Args>
+            requires __callable<_CPO, _Receiver&&, _Args...>
+        friend void tag_invoke(_CPO, _Self&& __self, _Args&&... __args) noexcept
+        {
+            _CPO{}((_Receiver &&) __self.__op_->__receiver_,
+                   (_Args &&) __args...);
+        }
+
+        friend env_of_t<_Receiver> tag_invoke(get_env_t,
+                                              const __rec& __self) noexcept
+        {
+            return get_env(__self.__op_->__receiver_);
+        }
+    };
+
+    class __t : __immovable, __operation_base<_Receiver, _Sigs, _Queries>
+    {
+      public:
+        using __id = __operation;
+
+        __t(_Sender&& __sender, _Receiver&& __receiver) :
+            __operation_base<_Receiver, _Sigs, _Queries>{(_Receiver &&)
+                                                             __receiver},
+            __storage_{__sender.__connect(__receiver_ref_t{__rec_})}
+        {}
+
+      private:
+        __rec __rec_{
+            static_cast<__operation_base<_Receiver, _Sigs, _Queries>*>(this)};
+        __unique_operation_storage __storage_{};
+
+        friend void tag_invoke(start_t, __t& __self) noexcept
+        {
+            STDEXEC_ASSERT(__self.__storage_.__get_vtable()->__start_);
+            __self.__storage_.__get_vtable()->__start_(
+                __self.__storage_.__get_object_pointer());
+        }
+    };
+};
+
+template <class _Queries>
+class __query_vtable;
+
+template <template <class...> class _L, typename... _Queries>
+class __query_vtable<_L<_Queries...>> : public __query_vfun<_Queries>...
+{
+  public:
+    using __query_vfun<_Queries>::operator()...;
+
+  private:
+    template <class _EnvProvider>
+        requires(__callable<__query_vfun_fn<_EnvProvider>, _Queries> && ...)
+    friend const __query_vtable* tag_invoke(__create_vtable_t,
+                                            __mtype<__query_vtable>,
+                                            __mtype<_EnvProvider>) noexcept
+    {
+        static const __query_vtable __vtable{
+            {__query_vfun_fn<_EnvProvider>{}((_Queries) nullptr)}...};
+        return &__vtable;
+    }
+};
+
+template <class _Sigs, class _SenderQueries = __types<>,
+          class _ReceiverQueries = __types<>>
+struct __sender
+{
+    using __receiver_ref_t = __receiver_ref<_Sigs, _ReceiverQueries>;
+
+    class __vtable : public __query_vtable<_SenderQueries>
+    {
+      public:
+        using __id = __vtable;
+
+        const __query_vtable<_SenderQueries>& __queries() const noexcept
+        {
+            return *this;
+        }
+
+        __unique_operation_storage (*__connect_)(void*, __receiver_ref_t);
+
+      private:
+        template <sender_to<__receiver_ref_t> _Sender>
+        friend const __vtable* tag_invoke(__create_vtable_t, __mtype<__vtable>,
+                                          __mtype<_Sender>) noexcept
+        {
+            static const __vtable __vtable_{
+                {*__create_vtable(__mtype<__query_vtable<_SenderQueries>>{},
+                                  __mtype<_Sender>{})},
+                [](void* __object_pointer,
+                   __receiver_ref_t __receiver) -> __unique_operation_storage {
+                    _Sender& __sender =
+                        *static_cast<_Sender*>(__object_pointer);
+                    using __op_state_t =
+                        connect_result_t<_Sender, __receiver_ref_t>;
+                    return __unique_operation_storage{
+                        std::in_place_type<__op_state_t>, __conv{[&] {
+                            return connect((_Sender &&) __sender,
+                                           (__receiver_ref_t &&) __receiver);
+                        }}};
+                }};
+            return &__vtable_;
+        }
+    };
+
+    class __env_t
+    {
+      public:
+        __env_t(const __vtable* __vtable, void* __sender) noexcept :
+            __vtable_{__vtable}, __sender_{__sender}
+        {}
+
+      private:
+        const __vtable* __vtable_;
+        void* __sender_;
+
+        template <class _Tag, class... _As>
+            requires __callable<const __query_vtable<_SenderQueries>&, _Tag,
+                                void*, _As...>
+        friend auto
+            tag_invoke(_Tag, const __env_t& __self, _As&&... __as) noexcept(
+                __nothrow_callable<const __query_vtable<_SenderQueries>&, _Tag,
+                                   void*, _As...>)
+                -> __call_result_t<const __query_vtable<_SenderQueries>&, _Tag,
+                                   void*, _As...>
+        {
+            return __self.__vtable_->__queries()(_Tag{}, __self.__sender_,
+                                                 (_As &&) __as...);
+        }
+    };
+
+    class __t
+    {
+      public:
+        using __id = __sender;
+        using completion_signatures = _Sigs;
+        using is_sender = void;
+
+        __t(const __t&) = delete;
+        __t& operator=(const __t&) = delete;
+
+        __t(__t&&) = default;
+        __t& operator=(__t&&) = default;
+
+        template <__not_decays_to<__t> _Sender>
+            requires sender_to<_Sender, __receiver_ref<_Sigs, _ReceiverQueries>>
+        __t(_Sender&& __sndr) : __storage_{(_Sender &&) __sndr}
+        {}
+
+        __unique_operation_storage __connect(__receiver_ref_t __receiver)
+        {
+            return __storage_.__get_vtable()->__connect_(
+                __storage_.__get_object_pointer(),
+                (__receiver_ref_t &&) __receiver);
+        }
+
+        explicit operator bool() const noexcept
+        {
+            return __get_object_pointer(__storage_) != nullptr;
+        }
+
+      private:
+        __unique_storage_t<__vtable> __storage_;
+
+        template <receiver_of<_Sigs> _Rcvr>
+        friend stdexec::__t<
+            __operation<__t, __decay_t<_Rcvr>, _ReceiverQueries>>
+            tag_invoke(connect_t, __t&& __self, _Rcvr&& __rcvr)
+        {
+            return {(__t &&) __self, (_Rcvr &&) __rcvr};
+        }
+
+        friend __env_t tag_invoke(get_env_t, const __t& __self) noexcept
+        {
+            return {__self.__storage_.__get_vtable(),
+                    __self.__storage_.__get_object_pointer()};
+        }
+    };
+};
+
+template <class _ScheduleSender, class _SchedulerQueries = __types<>>
+class __scheduler
+{
+  public:
+    template <class _Scheduler>
+        requires(!__decays_to<_Scheduler, __scheduler>) && scheduler<_Scheduler>
+    __scheduler(_Scheduler&& __scheduler) :
+        __storage_{(_Scheduler &&) __scheduler}
+    {}
+
+    using __sender_t = _ScheduleSender;
+
+  private:
+    class __vtable : public __query_vtable<_SchedulerQueries>
+    {
+      public:
+        __sender_t (*__schedule_)(void*) noexcept;
+        bool (*__equal_to_)(const void*, const void* other) noexcept;
+
+        const __query_vtable<_SchedulerQueries>& __queries() const noexcept
+        {
+            return *this;
+        }
+
+      private:
+        template <scheduler _Scheduler>
+        friend const __vtable* tag_invoke(__create_vtable_t, __mtype<__vtable>,
+                                          __mtype<_Scheduler>) noexcept
+        {
+            static const __vtable __vtable_{
+                {*__create_vtable(__mtype<__query_vtable<_SchedulerQueries>>{},
+                                  __mtype<_Scheduler>{})},
+                [](void* __object_pointer) noexcept -> __sender_t {
+                    const _Scheduler& __scheduler =
+                        *static_cast<const _Scheduler*>(__object_pointer);
+                    return __sender_t{schedule(__scheduler)};
+                },
+                [](const void* __self, const void* __other) noexcept -> bool {
+                    static_assert(noexcept(std::declval<const _Scheduler&>() ==
+                                           std::declval<const _Scheduler&>()));
+                    STDEXEC_ASSERT(__self && __other);
+                    const _Scheduler& __self_scheduler =
+                        *static_cast<const _Scheduler*>(__self);
+                    const _Scheduler& __other_scheduler =
+                        *static_cast<const _Scheduler*>(__other);
+                    return __self_scheduler == __other_scheduler;
+                }};
+            return &__vtable_;
+        }
+    };
+
+    template <same_as<__scheduler> _Self>
+    friend __sender_t tag_invoke(schedule_t, const _Self& __self) noexcept
+    {
+        STDEXEC_ASSERT(__self.__storage_.__get_vtable()->__schedule_);
+        return __self.__storage_.__get_vtable()->__schedule_(
+            __self.__storage_.__get_object_pointer());
+    }
+
+    template <class _Tag, same_as<__scheduler> _Self, class... _As>
+        requires __callable<const __query_vtable<_SchedulerQueries>&, _Tag,
+                            void*, _As...>
+    friend auto tag_invoke(_Tag, const _Self& __self, _As&&... __as) noexcept(
+        __nothrow_callable<const __query_vtable<_SchedulerQueries>&, _Tag,
+                           void*, _As...>)
+        -> __call_result_t<const __query_vtable<_SchedulerQueries>&, _Tag,
+                           void*, _As...>
+    {
+        return __self.__storage_.__get_vtable()->__queries()(
+            _Tag{}, __self.__storage_.__get_object_pointer(), (_As &&) __as...);
+    }
+
+    friend bool operator==(const __scheduler& __self,
+                           const __scheduler& __other) noexcept
+    {
+        if (__self.__storage_.__get_vtable() !=
+            __other.__storage_.__get_vtable())
+        {
+            return false;
+        }
+        void* __p = __self.__storage_.__get_object_pointer();
+        void* __o = __other.__storage_.__get_object_pointer();
+        // if both object pointers are not null, use the virtual equal_to
+        // function
+        return (__p && __o &&
+                __self.__storage_.__get_vtable()->__equal_to_(__p, __o))
+               // if both object pointers are nullptrs, they are equal
+               || (!__p && !__o);
+    }
+
+    friend bool operator!=(const __scheduler& __self,
+                           const __scheduler& __other) noexcept
+    {
+        return !(__self == __other);
+    }
+
+    __copyable_storage_t<__vtable> __storage_{};
+};
+} // namespace __any
+
+template <auto... _Sigs>
+using queries = stdexec::__types<decltype(_Sigs)...>;
+
+template <class _Completions, auto... _ReceiverQueries>
+class any_receiver_ref
+{
+    using __receiver_base =
+        __any::__rec::__ref<_Completions, decltype(_ReceiverQueries)...>;
+    using __env_t = stdexec::env_of_t<__receiver_base>;
+    __receiver_base __receiver_;
+
+    template <class _Tag, stdexec::__decays_to<any_receiver_ref> Self,
+              class... _As>
+        requires stdexec::tag_invocable<
+            _Tag, stdexec::__copy_cvref_t<Self, __receiver_base>, _As...>
+    friend auto tag_invoke(_Tag, Self&& __self, _As&&... __as) noexcept(
+        std::is_nothrow_invocable_v<
+            _Tag, stdexec::__copy_cvref_t<Self, __receiver_base>, _As...>)
+    {
+        return tag_invoke(_Tag{}, ((Self &&) __self).__receiver_,
+                          (_As &&) __as...);
+    }
+
+  public:
+    using is_receiver = void;
+
+    template <stdexec::__none_of<any_receiver_ref, const any_receiver_ref,
+                                 __env_t, const __env_t>
+                  _Receiver>
+        requires stdexec::receiver_of<_Receiver, _Completions>
+    any_receiver_ref(_Receiver& __receiver) noexcept(
+        stdexec::__nothrow_constructible_from<__receiver_base, _Receiver>) :
+        __receiver_(__receiver)
+    {}
+
+    template <auto... _SenderQueries>
+    class any_sender
+    {
+        using __sender_base = stdexec::__t<
+            __any::__sender<_Completions, queries<_SenderQueries...>,
+                            queries<_ReceiverQueries...>>>;
+        __sender_base __sender_;
+
+        template <class _Tag, stdexec::__decays_to<any_sender> Self,
+                  class... _As>
+            requires stdexec::tag_invocable<
+                _Tag, stdexec::__copy_cvref_t<Self, __sender_base>, _As...>
+        friend auto tag_invoke(_Tag, Self&& __self, _As&&... __as) noexcept(
+            std::is_nothrow_invocable_v<
+                _Tag, stdexec::__copy_cvref_t<Self, __sender_base>, _As...>)
+        {
+            return tag_invoke(_Tag{}, ((Self &&) __self).__sender_,
+                              (_As &&) __as...);
+        }
+
+      public:
+        using is_sender = void;
+        using completion_signatures =
+            typename __sender_base::completion_signatures;
+
+        template <class _Sender>
+            requires(!stdexec::__decays_to<_Sender, any_sender>) &&
+                    stdexec::sender<_Sender>
+        any_sender(_Sender&& __sender) noexcept(
+            stdexec::__nothrow_constructible_from<__sender_base, _Sender>) :
+            __sender_((_Sender &&) __sender)
+        {}
+
+        template <auto... _SchedulerQueries>
+        class any_scheduler
+        {
+            using __schedule_completions =
+                stdexec::__concat_completion_signatures_t<
+                    _Completions,
+                    stdexec::completion_signatures<stdexec::set_value_t()>>;
+            using __schedule_receiver =
+                any_receiver_ref<__schedule_completions, _ReceiverQueries...>;
+
+            template <typename _Tag, typename _Sig>
+            static _Tag __ret_fn(_Tag (*const)(_Sig));
+
+            template <class _Tag>
+            struct __ret_equals_to
+            {
+                template <class _Sig>
+                using __f =
+                    std::is_same<_Tag, decltype(__ret_fn((_Sig) nullptr))>;
+            };
+
+            using schedule_sender_queries = stdexec::__minvoke<
+                stdexec::__remove_if<__ret_equals_to<
+                    stdexec::get_completion_scheduler_t<stdexec::set_value_t>>>,
+                decltype(_SenderQueries)...>;
+
+            template <class... _Queries>
+            using __schedule_sender_fn = typename __schedule_receiver::template any_sender<
+                stdexec::get_completion_scheduler<stdexec::set_value_t>.template signature<any_scheduler() noexcept>>;
+            using __schedule_sender =
+                stdexec::__mapply<stdexec::__q<__schedule_sender_fn>,
+                                  schedule_sender_queries>;
+
+            using __scheduler_base =
+                __any::__scheduler<__schedule_sender,
+                                   queries<_SchedulerQueries...>>;
+
+            __scheduler_base __scheduler_;
+
+          public:
+            template <class _Scheduler>
+                requires(!stdexec::__decays_to<_Scheduler, any_scheduler> &&
+                         stdexec::scheduler<_Scheduler>)
+            any_scheduler(_Scheduler&& __scheduler) :
+                __scheduler_{(_Scheduler &&) __scheduler}
+            {}
+
+          private:
+            template <class _Tag, stdexec::__decays_to<any_scheduler> Self,
+                      class... _As>
+                requires stdexec::tag_invocable<
+                    _Tag, stdexec::__copy_cvref_t<Self, __scheduler_base>,
+                    _As...>
+            friend auto tag_invoke(_Tag, Self&& __self, _As&&... __as) noexcept(
+                std::is_nothrow_invocable_v<
+                    _Tag, stdexec::__copy_cvref_t<Self, __scheduler_base>,
+                    _As...>)
+            {
+                return tag_invoke(_Tag{}, ((Self &&) __self).__scheduler_,
+                                  (_As &&) __as...);
+            }
+
+            friend bool
+                operator==(const any_scheduler& __self,
+                           const any_scheduler& __other) noexcept = default;
+        };
+    };
+};
+} // namespace exec
diff --git a/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp b/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp
new file mode 100644
index 0000000..4db9d6a
--- /dev/null
+++ b/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp
@@ -0,0 +1,296 @@
+/*
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ * Copyright (c) 2021-2022 NVIDIA Corporation
+ *
+ * Licensed under the Apache License Version 2.0 with LLVM Exceptions
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *   https://llvm.org/LICENSE.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+// The original idea is taken from libunifex and adapted to stdexec.
+
+#include "../stdexec/execution.hpp"
+#include "any_sender_of.hpp"
+#include "inline_scheduler.hpp"
+
+#include <exception>
+#include <type_traits>
+
+namespace exec
+{
+namespace __at_coro_exit
+{
+using namespace stdexec;
+
+using __any_scheduler = //
+    any_receiver_ref<   //
+        completion_signatures<set_error_t(std::exception_ptr),
+                              set_stopped_t()>> //
+    ::any_sender<>::any_scheduler<>;
+
+struct __die_on_stop_t
+{
+    template <class _Receiver>
+    struct __receiver_id
+    {
+        struct __t
+        {
+            using __id = __receiver_id;
+            _Receiver __receiver_;
+
+            template <__decays_to<__t> _Self, class... _Args>
+                requires __callable<set_value_t, _Receiver, _Args...>
+            friend void tag_invoke(set_value_t, _Self&& __self,
+                                   _Args&&... __args) noexcept
+            {
+                set_value((_Receiver &&) __self.__receiver_,
+                          (_Args &&) __args...);
+            }
+
+            template <__decays_to<__t> _Self, class _Error>
+                requires __callable<set_error_t, _Receiver, _Error>
+            friend void tag_invoke(set_error_t, _Self&& __self,
+                                   _Error&& __error) noexcept
+            {
+                set_error((_Receiver &&) __self.__receiver_,
+                          (_Error &&) __error);
+            }
+
+            [[noreturn]] friend void tag_invoke(set_stopped_t, __t&&) noexcept
+            {
+                std::terminate();
+            }
+
+            friend env_of_t<_Receiver> tag_invoke(get_env_t,
+                                                  const __t& __self) noexcept
+            {
+                return get_env(__self.__receiver_);
+            }
+        };
+    };
+    template <class _Rec>
+    using __receiver = __t<__receiver_id<_Rec>>;
+
+    template <class _Sender>
+    struct __sender_id
+    {
+        template <class _Env>
+        using __completion_signatures = //
+            __mapply<__remove<set_stopped_t(), __q<completion_signatures>>,
+                     completion_signatures_of_t<_Sender, _Env>>;
+
+        struct __t
+        {
+            using __id = __sender_id;
+            using is_sender = void;
+
+            _Sender __sender_;
+
+            template <receiver _Receiver>
+                requires sender_to<_Sender, __receiver<_Receiver>>
+            friend connect_result_t<_Sender, __receiver<_Receiver>>
+                tag_invoke(connect_t, __t&& __self, _Receiver&& __rcvr) noexcept
+            {
+                return connect((_Sender &&) __self.__sender_,
+                               __receiver<_Receiver>{(_Receiver &&) __rcvr});
+            }
+
+            template <__decays_to<__t> _Self, class _Env>
+            friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+                -> dependent_completion_signatures<_Env>;
+            template <__decays_to<__t> _Self, class _Env>
+            friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
+                -> __completion_signatures<_Env>
+                requires true;
+
+            friend env_of_t<_Sender> tag_invoke(get_env_t,
+                                                const __t& __self) noexcept
+            {
+                return get_env(__self.__sender_);
+            }
+        };
+    };
+    template <class _Sender>
+    using __sender = __t<__sender_id<__decay_t<_Sender>>>;
+
+    template <sender _Sender>
+    __sender<_Sender> operator()(_Sender&& __sndr) const
+        noexcept(__nothrow_decay_copyable<_Sender>)
+    {
+        return __sender<_Sender>{(_Sender &&) __sndr};
+    }
+
+    template <class _Value>
+    _Value&& operator()(_Value&& __value) const noexcept
+    {
+        return (_Value &&) __value;
+    }
+};
+
+inline constexpr __die_on_stop_t __die_on_stop;
+
+template <class _Promise>
+concept __has_continuation = //
+    requires(_Promise& __promise, __continuation_handle<> __c) {
+        {
+            __promise.continuation()
+            } -> convertible_to<__continuation_handle<>>;
+        {
+            __promise.set_continuation(__c)
+        };
+    };
+
+template <class... _Ts>
+class [[nodiscard]] __task
+{
+    struct __promise;
+
+  public:
+    using promise_type = __promise;
+
+    explicit __task(__coro::coroutine_handle<__promise> __coro) noexcept :
+        __coro_(__coro)
+    {}
+
+    __task(__task&& __that) noexcept :
+        __coro_(std::exchange(__that.__coro_, {}))
+    {}
+
+    bool await_ready() const noexcept
+    {
+        return false;
+    }
+
+    template <__has_continuation _Promise>
+    bool await_suspend(__coro::coroutine_handle<_Promise> __parent) noexcept
+    {
+        __coro_.promise().__scheduler_ =
+            get_scheduler(get_env(__parent.promise()));
+        __coro_.promise().set_continuation(__parent.promise().continuation());
+        __parent.promise().set_continuation(__coro_);
+        return false;
+    }
+
+    std::tuple<_Ts&...> await_resume() noexcept
+    {
+        return std::exchange(__coro_, {}).promise().__args_;
+    }
+
+  private:
+    struct __final_awaitable
+    {
+        static constexpr bool await_ready() noexcept
+        {
+            return false;
+        }
+
+        static __coro::coroutine_handle<>
+            await_suspend(__coro::coroutine_handle<__promise> __h) noexcept
+        {
+            __promise& __p = __h.promise();
+            auto __coro = __p.__is_unhandled_stopped_
+                              ? __p.continuation().unhandled_stopped()
+                              : __p.continuation().handle();
+            __h.destroy();
+            return __coro;
+        }
+
+        void await_resume() const noexcept {}
+    };
+
+    struct __env
+    {
+        const __promise& __promise_;
+
+        friend __any_scheduler tag_invoke(get_scheduler_t,
+                                          __env __self) noexcept
+        {
+            return __self.__promise_.__scheduler_;
+        }
+    };
+
+    struct __promise : with_awaitable_senders<__promise>
+    {
+        template <class _Action>
+        explicit __promise(_Action&&, _Ts&... __ts) noexcept : __args_{__ts...}
+        {}
+
+        __coro::suspend_always initial_suspend() noexcept
+        {
+            return {};
+        }
+
+        __final_awaitable final_suspend() noexcept
+        {
+            return {};
+        }
+
+        void return_void() noexcept {}
+
+        [[noreturn]] void unhandled_exception() noexcept
+        {
+            std::terminate();
+        }
+
+        __coro::coroutine_handle<__promise> unhandled_stopped() noexcept
+        {
+            __is_unhandled_stopped_ = true;
+            return __coro::coroutine_handle<__promise>::from_promise(*this);
+        }
+
+        __task get_return_object() noexcept
+        {
+            return __task(
+                __coro::coroutine_handle<__promise>::from_promise(*this));
+        }
+
+        template <class _Awaitable>
+        decltype(auto) await_transform(_Awaitable&& __awaitable) noexcept
+        {
+            return as_awaitable(__die_on_stop((_Awaitable &&) __awaitable),
+                                *this);
+        }
+
+        friend __env tag_invoke(get_env_t, const __promise& __self) noexcept
+        {
+            return {__self};
+        }
+
+        bool __is_unhandled_stopped_{false};
+        std::tuple<_Ts&...> __args_{};
+        __any_scheduler __scheduler_{inline_scheduler{}};
+    };
+
+    __coro::coroutine_handle<__promise> __coro_;
+};
+
+struct __at_coro_exit_t
+{
+  private:
+    template <class _Action, class... _Ts>
+    static __task<_Ts...> __impl(_Action __action, _Ts... __ts)
+    {
+        co_await ((_Action &&) __action)((_Ts &&) __ts...);
+    }
+
+  public:
+    template <class _Action, class... _Ts>
+        requires __callable<__decay_t<_Action>, __decay_t<_Ts>...>
+    __task<_Ts...> operator()(_Action&& __action, _Ts&&... __ts) const
+    {
+        return __impl((_Action &&) __action, (_Ts &&) __ts...);
+    }
+};
+} // namespace __at_coro_exit
+
+inline constexpr __at_coro_exit::__at_coro_exit_t at_coroutine_exit{};
+} // namespace exec
diff --git a/include/sdbusplus/async/stdexec/commit.info b/include/sdbusplus/async/stdexec/commit.info
index a7276cd..0cebda7 100644
--- a/include/sdbusplus/async/stdexec/commit.info
+++ b/include/sdbusplus/async/stdexec/commit.info
@@ -1 +1 @@
-268b9d858c0a0e63af4806c3065dc096319375d6
+3bd568c7df8fcf725421254a27700f9ed1f64ff1
diff --git a/include/sdbusplus/async/stdexec/concepts.hpp b/include/sdbusplus/async/stdexec/concepts.hpp
index d95c44c..0e5cfb2 100644
--- a/include/sdbusplus/async/stdexec/concepts.hpp
+++ b/include/sdbusplus/async/stdexec/concepts.hpp
@@ -34,24 +34,26 @@
 #include <type_traits>
 #endif
 
+#include "__detail/__meta.hpp"
+
 namespace stdexec::__std_concepts
 {
 #if defined(__clang__)
-template <class _A, class _B>
-concept __same_as = __is_same(_A, _B);
+template <class _Ap, class _Bp>
+concept __same_as = __is_same(_Ap, _Bp);
 #elif defined(__GNUC__)
-template <class _A, class _B>
-concept __same_as = __is_same_as(_A, _B);
+template <class _Ap, class _Bp>
+concept __same_as = __is_same_as(_Ap, _Bp);
 #else
-template <class _A, class _B>
+template <class _Ap, class _Bp>
 inline constexpr bool __same_as = false;
-template <class _A>
-inline constexpr bool __same_as<_A, _A> = true;
+template <class _Ap>
+inline constexpr bool __same_as<_Ap, _Ap> = true;
 #endif
 
 // Make sure we're using a same_as concept that doesn't instantiate std::is_same
-template <class _A, class _B>
-concept same_as = __same_as<_A, _B> && __same_as<_B, _A>;
+template <class _Ap, class _Bp>
+concept same_as = __same_as<_Ap, _Bp> && __same_as<_Bp, _Ap>;
 
 #if STDEXEC_HAS_STD_CONCEPTS_HEADER()
 
@@ -65,74 +67,162 @@
 template <class T>
 concept integral = std::is_integral_v<T>;
 
-template <class _A, class _B>
-concept derived_from =
-    std::is_base_of_v<_B, _A> &&
-    std::is_convertible_v<const volatile _A*, const volatile _B*>;
+template <class _Ap, class _Bp>
+concept derived_from =             //
+    std::is_base_of_v<_Bp, _Ap> && //
+    std::is_convertible_v<const volatile _Ap*, const volatile _Bp*>;
 
 template <class _From, class _To>
-concept convertible_to =
-    std::is_convertible_v<_From, _To> &&
+concept convertible_to =                 //
+    std::is_convertible_v<_From, _To> && //
     requires(_From (&__fun)()) { static_cast<_To>(__fun()); };
 
-template <class _T>
-concept equality_comparable = requires(const std::remove_reference_t<_T>& __t) {
-                                  {
-                                      __t == __t
-                                      } -> convertible_to<bool>;
-                                  {
-                                      __t != __t
-                                      } -> convertible_to<bool>;
-                              };
+template <class _Ty>
+concept equality_comparable = //
+    requires(__cref_t<_Ty> __t) {
+        {
+            __t == __t
+            } -> convertible_to<bool>;
+        {
+            __t != __t
+            } -> convertible_to<bool>;
+    };
 #endif
 } // namespace stdexec::__std_concepts
 
 namespace stdexec
 {
 using namespace __std_concepts;
-using std::decay_t;
 
-// // TODO: this makes nvc++ sad. Find out why.
-// template <class _Ty>
-//   _Ty __decay__(const _Ty&);
-// template <class _Ty>
-//   _Ty* __decay__(_Ty*);
+#if __has_builtin(__decay)
+template <class _Ty>
+using __decay_t = __decay(_Ty);
+#elif STDEXEC_NVHPC()
+template <class _Ty>
+using __decay_t = std::decay_t<_Ty>;
+#else
+namespace __tt
+{
+struct __decay_object
+{
+    template <class _Ty>
+    static _Ty __g(const _Ty&);
+    template <class _Ty>
+    using __f = decltype(__g(__declval<_Ty>()));
+};
 
-// template <class _Ty>
-//   auto __decay_(_Ty&&(*__fn)()) -> decltype((__decay__)(__fn()));
-// template <class>
-//   void __decay_(...);
+struct __decay_default
+{
+    template <class _Ty>
+    static _Ty __g(_Ty);
+    template <class _Ty>
+    using __f = decltype(__g(__declval<_Ty>()));
+};
 
-// template <class _Ty>
-//   using decay_t = decltype((__decay_<_Ty>)(0));
+struct __decay_abominable
+{
+    template <class _Ty>
+    using __f = _Ty;
+};
+
+struct __decay_void
+{
+    template <class _Ty>
+    using __f = void;
+};
+
+template <class _Ty>
+extern __decay_object __mdecay;
+
+template <class _Ty, class... Us>
+extern __decay_default __mdecay<_Ty(Us...)>;
+
+template <class _Ty, class... Us>
+extern __decay_default __mdecay<_Ty(Us...) noexcept>;
+
+template <class _Ty, class... Us>
+extern __decay_default __mdecay<_Ty (&)(Us...)>;
+
+template <class _Ty, class... Us>
+extern __decay_default __mdecay<_Ty (&)(Us...) noexcept>;
+
+template <class _Ty, class... Us>
+extern __decay_abominable __mdecay<_Ty(Us...) const>;
+
+template <class _Ty, class... Us>
+extern __decay_abominable __mdecay<_Ty(Us...) const noexcept>;
+
+template <class _Ty, class... Us>
+extern __decay_abominable __mdecay<_Ty(Us...) const&>;
+
+template <class _Ty, class... Us>
+extern __decay_abominable __mdecay<_Ty(Us...) const & noexcept>;
+
+template <class _Ty, class... Us>
+extern __decay_abominable __mdecay<_Ty(Us...) const&&>;
+
+template <class _Ty, class... Us>
+extern __decay_abominable __mdecay<_Ty(Us...) const && noexcept>;
+
+template <class _Ty>
+extern __decay_default __mdecay<_Ty[]>;
+
+template <class _Ty, std::size_t N>
+extern __decay_default __mdecay<_Ty[N]>;
+
+template <class _Ty, std::size_t N>
+extern __decay_default __mdecay<_Ty (&)[N]>;
+
+template <>
+inline __decay_void __mdecay<void>;
+
+template <>
+inline __decay_void __mdecay<const void>;
+} // namespace __tt
+
+template <class _Ty>
+using __decay_t = typename decltype(__tt::__mdecay<_Ty>)::template __f<_Ty>;
+#endif
 
 // C++20 concepts
-template <class _T, class _U>
-concept __decays_to = __same_as<decay_t<_T>, _U>;
+template <class _Ty, class _Up>
+concept __decays_to = __same_as<__decay_t<_Ty>, _Up>;
+
+template <class _Ty, class _Up>
+concept __not_decays_to = !
+__decays_to<_Ty, _Up>;
+
+template <bool _TrueOrFalse>
+concept __satisfies = _TrueOrFalse;
 
 template <class...>
 concept __true = true;
 
-template <class _C>
-concept __class = __true<int _C::*> && (!__same_as<const _C, _C>);
+template <class _Cp>
+concept __class = __true<int _Cp::*> && (!__same_as<const _Cp, _Cp>);
 
-template <class _T, class... _As>
-concept __one_of = (__same_as<_T, _As> || ...);
+template <class _Ty, class... _As>
+concept __one_of = (__same_as<_Ty, _As> || ...);
 
-template <class _T, class... _Us>
-concept __all_of = (__same_as<_T, _Us> && ...);
+template <class _Ty, class... _Us>
+concept __all_of = (__same_as<_Ty, _Us> && ...);
 
-template <class _T, class... _Us>
-concept __none_of = ((!__same_as<_T, _Us>) && ...);
+template <class _Ty, class... _Us>
+concept __none_of = ((!__same_as<_Ty, _Us>) && ...);
 
 // Not exactly right, but close.
-template <class _T>
-concept __boolean_testable_ = convertible_to<_T, bool>;
+template <class _Ty>
+concept __boolean_testable_ = convertible_to<_Ty, bool>;
+
+template <class _Ty>
+inline constexpr bool __is_lvalue_reference_ = false;
+template <class _Ty>
+inline constexpr bool __is_lvalue_reference_<_Ty&> = true;
 
 // Avoid using libstdc++'s object concepts because they instantiate a
 // lot of templates.
 template <class _Ty>
-inline constexpr bool __destructible_ =
+inline constexpr bool __destructible_ = //
     requires {
         {
             ((_Ty && (*)() noexcept) nullptr)().~_Ty()
@@ -142,60 +232,169 @@
 inline constexpr bool __destructible_<_Ty&> = true;
 template <class _Ty>
 inline constexpr bool __destructible_<_Ty&&> = true;
-template <class _Ty, std::size_t _N>
-inline constexpr bool __destructible_<_Ty[_N]> = __destructible_<_Ty>;
+template <class _Ty, std::size_t _Np>
+inline constexpr bool __destructible_<_Ty[_Np]> = __destructible_<_Ty>;
 
 template <class T>
 concept destructible = __destructible_<T>;
 
 #if __has_builtin(__is_constructible)
-template <class _T, class... _As>
-concept constructible_from = destructible<_T> && __is_constructible(_T, _As...);
+template <class _Ty, class... _As>
+concept constructible_from = //
+    destructible<_Ty> &&     //
+    __is_constructible(_Ty, _As...);
 #else
-template <class _T, class... _As>
-concept constructible_from = destructible<_T> && is_constructible_v<_T, _As...>;
+template <class _Ty, class... _As>
+concept constructible_from = //
+    destructible<_Ty> &&     //
+    is_constructible_v<_Ty, _As...>;
 #endif
 
-template <class _T>
-concept move_constructible = constructible_from<_T, _T>;
+template <class _Ty>
+concept default_initializable = //
+    constructible_from<_Ty> &&  //
+    requires { _Ty{}; } &&      //
+    requires { ::new _Ty; };
 
-template <class _T>
-concept copy_constructible = move_constructible<_T> &&
-                             constructible_from<_T, _T const&>;
+template <class _Ty>
+concept move_constructible = //
+    constructible_from<_Ty, _Ty>;
 
-template <class _T>
-concept __movable_value = move_constructible<decay_t<_T>> &&
-                          constructible_from<decay_t<_T>, _T>;
+template <class _Ty>
+concept copy_constructible = //
+    move_constructible<_Ty>  //
+    && constructible_from<_Ty, const _Ty&>;
+
+template <class _LHS, class _RHS>
+concept assignable_from =           //
+    __is_lvalue_reference_<_LHS> && //
+    // std::common_reference_with<
+    //   const std::remove_reference_t<_LHS>&,
+    //   const std::remove_reference_t<_RHS>&> &&
+    requires(_LHS __lhs, _RHS&& __rhs) {
+        {
+            __lhs = ((_RHS &&) __rhs)
+            } -> same_as<_LHS>;
+    };
+
+namespace __swap
+{
+using std::swap;
+
+template <class _Ty, class _Uy>
+concept swappable_with = //
+    requires(_Ty&& __t, _Uy&& __u) { swap((_Ty &&) __t, (_Uy &&) __u); };
+
+inline constexpr const auto __fn = //
+    []<class _Ty, swappable_with<_Ty> _Uy>(_Ty&& __t, _Uy&& __u) noexcept(
+        noexcept(swap((_Ty &&) __t, (_Uy &&) __u))) {
+        swap((_Ty &&) __t, (_Uy &&) __u);
+    };
+} // namespace __swap
+
+using __swap::swappable_with;
+inline constexpr const auto& swap = __swap::__fn;
+
+template <class _Ty>
+concept swappable = //
+    swappable_with<_Ty, _Ty>;
+
+template <class _Ty>
+concept movable =                 //
+    std::is_object_v<_Ty> &&      //
+    move_constructible<_Ty> &&    //
+    assignable_from<_Ty&, _Ty> && //
+    swappable<_Ty>;
+
+template <class _Ty>
+concept copyable =                       //
+    copy_constructible<_Ty> &&           //
+    movable<_Ty> &&                      //
+    assignable_from<_Ty&, _Ty&> &&       //
+    assignable_from<_Ty&, const _Ty&> && //
+    assignable_from<_Ty&, const _Ty>;
+
+template <class _Ty>
+concept semiregular = //
+    copyable<_Ty> &&  //
+    default_initializable<_Ty>;
+
+template <class _Ty>
+concept regular =       //
+    semiregular<_Ty> && //
+    equality_comparable<_Ty>;
+
+template <class T, class U>
+concept __partially_ordered_with = //
+    requires(__cref_t<T> t, __cref_t<U> u) {
+        {
+            t < u
+            } -> __boolean_testable_;
+        {
+            t > u
+            } -> __boolean_testable_;
+        {
+            t <= u
+            } -> __boolean_testable_;
+        {
+            t >= u
+            } -> __boolean_testable_;
+        {
+            u < t
+            } -> __boolean_testable_;
+        {
+            u > t
+            } -> __boolean_testable_;
+        {
+            u <= t
+            } -> __boolean_testable_;
+        {
+            u >= t
+            } -> __boolean_testable_;
+    };
+
+template <class _Ty>
+concept totally_ordered =       //
+    equality_comparable<_Ty> && //
+    __partially_ordered_with<_Ty, _Ty>;
+
+template <class _Ty>
+concept __movable_value =                 //
+    move_constructible<__decay_t<_Ty>> && //
+    constructible_from<__decay_t<_Ty>, _Ty>;
 
 template <class _Trait>
 concept __is_true = _Trait::value;
 
 template <class, template <class...> class>
 constexpr bool __is_instance_of_ = false;
-template <class... _As, template <class...> class _T>
-constexpr bool __is_instance_of_<_T<_As...>, _T> = true;
+template <class... _As, template <class...> class _Ty>
+constexpr bool __is_instance_of_<_Ty<_As...>, _Ty> = true;
 
-template <class _Ty, template <class...> class _T>
-concept __is_instance_of = __is_instance_of_<_Ty, _T>;
+template <class _Ay, template <class...> class _Ty>
+concept __is_instance_of = __is_instance_of_<_Ay, _Ty>;
 
-template <class _Ty, template <class...> class _T>
+template <class _Ay, template <class...> class _Ty>
 concept __is_not_instance_of = !
-__is_instance_of<_Ty, _T>;
+__is_instance_of<_Ay, _Ty>;
 
 #if __has_builtin(__is_nothrow_constructible)
-template <class _T, class... _As>
-concept __nothrow_constructible_from = constructible_from<_T, _As...> &&
-                                       __is_nothrow_constructible(_T, _As...);
+template <class _Ty, class... _As>
+concept __nothrow_constructible_from = constructible_from<_Ty, _As...> &&
+                                       __is_nothrow_constructible(_Ty, _As...);
 #else
-template <class _T, class... _As>
+template <class _Ty, class... _As>
 concept __nothrow_constructible_from =
-    constructible_from<_T, _As...> &&
-    std::is_nothrow_constructible_v<_T, _As...>;
+    constructible_from<_Ty, _As...> &&
+    std::is_nothrow_constructible_v<_Ty, _As...>;
 #endif
 
 template <class _Ty>
+concept __decay_copyable = constructible_from<__decay_t<_Ty>, _Ty>;
+
+template <class _Ty>
 concept __nothrow_decay_copyable =
-    __nothrow_constructible_from<decay_t<_Ty>, _Ty>;
+    __nothrow_constructible_from<__decay_t<_Ty>, _Ty>;
 } // namespace stdexec
 
 #if !STDEXEC_HAS_STD_CONCEPTS_HEADER()
diff --git a/include/sdbusplus/async/stdexec/coroutine.hpp b/include/sdbusplus/async/stdexec/coroutine.hpp
index 597355a..ee0b6fd 100644
--- a/include/sdbusplus/async/stdexec/coroutine.hpp
+++ b/include/sdbusplus/async/stdexec/coroutine.hpp
@@ -25,20 +25,21 @@
 #include <experimental/coroutine>
 namespace __coro = std::experimental;
 #else
-#define _STD_NO_COROUTINES_ 1
+#define STDEXEC_STD_NO_COROUTINES_ 1
 #endif
 
 namespace stdexec
 {
-#if !_STD_NO_COROUTINES_
+#if !STDEXEC_STD_NO_COROUTINES_
 // Define some concepts and utilities for working with awaitables
-template <class _T>
-concept __await_suspend_result = __one_of<_T, void, bool> ||
-                                 __is_instance_of<_T, __coro::coroutine_handle>;
+template <class _Tp>
+concept __await_suspend_result =
+    __one_of<_Tp, void, bool> ||
+    __is_instance_of<_Tp, __coro::coroutine_handle>;
 
 template <class _Awaiter, class _Promise>
 concept __with_await_suspend =
-    same_as<_Promise, void> ||
+    same_as<_Promise, void> || //
     requires(_Awaiter& __await, __coro::coroutine_handle<_Promise> __h) {
         {
             __await.await_suspend(__h)
@@ -46,10 +47,12 @@
     };
 
 template <class _Awaiter, class _Promise = void>
-concept __awaiter = requires(_Awaiter& __await) {
-                        __await.await_ready() ? 1 : 0;
-                        __await.await_resume();
-                    } && __with_await_suspend<_Awaiter, _Promise>;
+concept __awaiter = //
+    requires(_Awaiter& __await) {
+        __await.await_ready() ? 1 : 0;
+        __await.await_resume();
+    } && //
+    __with_await_suspend<_Awaiter, _Promise>;
 
 template <class _Awaitable>
 decltype(auto) __get_awaiter(_Awaitable&& __await, void*)
@@ -97,15 +100,15 @@
 }
 
 template <class _Awaitable, class _Promise = void>
-concept __awaitable =
+concept __awaitable = //
     requires(_Awaitable&& __await, _Promise* __promise) {
         {
             stdexec::__get_awaiter((_Awaitable &&) __await, __promise)
             } -> __awaiter<_Promise>;
     };
 
-template <class _T>
-_T& __as_lvalue(_T&&);
+template <class _Tp>
+_Tp& __as_lvalue(_Tp&&);
 
 template <class _Awaitable, class _Promise = void>
     requires __awaitable<_Awaitable, _Promise>
diff --git a/include/sdbusplus/async/stdexec/execution.hpp b/include/sdbusplus/async/stdexec/execution.hpp
index be0acf3..d0f0bb1 100644
--- a/include/sdbusplus/async/stdexec/execution.hpp
+++ b/include/sdbusplus/async/stdexec/execution.hpp
@@ -17,6 +17,7 @@
 
 #include "__detail/__intrusive_ptr.hpp"
 #include "__detail/__meta.hpp"
+#include "__detail/__scope.hpp"
 #include "concepts.hpp"
 #include "coroutine.hpp"
 #include "functional.hpp"
@@ -35,22 +36,6 @@
 #include <type_traits>
 #include <variant>
 
-#if STDEXEC_CLANG()
-#define STDEXEC_STRINGIZE(__arg) #__arg
-#define STDEXEC_PRAGMA_PUSH() _Pragma("GCC diagnostic push")
-#define STDEXEC_PRAGMA_POP() _Pragma("GCC diagnostic pop")
-#define STDEXEC_PRAGMA_IGNORE(__arg)                                           \
-    _Pragma(STDEXEC_STRINGIZE(GCC diagnostic ignored __arg))
-#else
-#define STDEXEC_PRAGMA_PUSH()
-#define STDEXEC_PRAGMA_POP()
-#define STDEXEC_PRAGMA_IGNORE(__arg)
-#endif
-
-#if STDEXEC_NVHPC() || STDEXEC_GCC()
-#define STDEXEC_NON_LEXICAL_FRIENDSHIP 1
-#endif
-
 #ifdef __EDG__
 #pragma diagnostic push
 #pragma diag_suppress 1302
@@ -58,35 +43,42 @@
 #endif
 
 #ifdef STDEXEC_ENABLE_R5_DEPRECATIONS
-#define R5_SENDER_DEPR_WARNING                                                 \
-    [[deprecated(                                                              \
-        "Deprecated sender type detected. Please update the type to satisfy the boolean stdexec::enable_sender<S> trait. Defining a member type alias named 'is_sender' is one way to do this.")]]
-#define R5_RECEIVER_DEPR_WARNING                                               \
-    [[deprecated(                                                              \
-        "Deprecated receiver type detected. Please update the type for to satisfy the boolean stdexec::enable_receiver<R> trait. Defining a member type alias named 'is_receiver' is one way to do this.")]]
+#define STDEXEC_R5_SENDER_DEPR_WARNING                                                    \
+    [[deprecated(                                                                         \
+        "Deprecated sender type detected. Please update the type to satisfy the boolean " \
+        "stdexec::enable_sender<S> trait. "                                               \
+        "Defining a member type alias named 'is_sender' is one way to do this.")]]
+#define STDEXEC_R5_RECEIVER_DEPR_WARNING                                                              \
+    [[deprecated(                                                                                     \
+        "Deprecated receiver type detected. Please update the type for to satisfy the boolean "       \
+        "stdexec::enable_receiver<R> trait. Defining a member type alias named 'is_receiver' is one " \
+        "way to do this.")]]
 #else
-#define R5_SENDER_DEPR_WARNING
-#define R5_RECEIVER_DEPR_WARNING
+#define STDEXEC_R5_SENDER_DEPR_WARNING
+#define STDEXEC_R5_RECEIVER_DEPR_WARNING
 #endif
 
+#define STDEXEC_LEGACY_R5_CONCEPTS() 1
+
 STDEXEC_PRAGMA_PUSH()
 STDEXEC_PRAGMA_IGNORE("-Wundefined-inline")
 STDEXEC_PRAGMA_IGNORE("-Wundefined-internal")
 
 namespace stdexec
 {
-// BUGBUG
-namespace execution = stdexec;
-namespace this_thread = stdexec;
-
-using std::remove_cvref_t;
-
 // [exec.queries.queryable]
 template <class T>
 concept queryable = destructible<T>;
 
+template <class Tag>
+struct __query
+{
+    template <class Sig>
+    static inline constexpr Tag (*signature)(Sig) = nullptr;
+};
+
 // [exec.fwd_env]
-namespace __forwarding_query
+namespace __fwding_query
 {
 struct forwarding_query_t
 {
@@ -107,9 +99,13 @@
         }
     }
 };
-} // namespace __forwarding_query
-inline constexpr __forwarding_query::forwarding_query_t forwarding_query{};
-using __forwarding_query::forwarding_query_t;
+} // namespace __fwding_query
+
+inline constexpr __fwding_query::forwarding_query_t forwarding_query{};
+using __fwding_query::forwarding_query_t;
+
+template <class _Tag>
+concept __forwarding_query = forwarding_query(_Tag{});
 
 /////////////////////////////////////////////////////////////////////////////
 // [execution.receivers]
@@ -136,6 +132,7 @@
     using __id = empty_env;
 };
 } // namespace __env
+
 using __env::empty_env;
 using __empty_env
     [[deprecated("Please use stdexec::empty_env now.")]] = empty_env;
@@ -143,8 +140,8 @@
 /////////////////////////////////////////////////////////////////////////////
 // [execution.senders]
 template <class _Sender>
-concept __enable_sender =
-    requires { typename _Sender::is_sender; } ||
+concept __enable_sender =                        //
+    requires { typename _Sender::is_sender; } || //
     __awaitable<_Sender, __compl_sigs::__env_promise<empty_env>>;
 
 template <class _Sender>
@@ -153,30 +150,27 @@
 // [execution.schedulers.queries], scheduler queries
 namespace __scheduler_queries
 {
-template <class _Ty>
-const _Ty& __cref_fn(const _Ty&);
-template <class _Ty>
-using __cref_t = decltype(__scheduler_queries::__cref_fn(__declval<_Ty>()));
-
-struct execute_may_block_caller_t
+struct execute_may_block_caller_t : __query<execute_may_block_caller_t>
 {
-    template <class _T>
-        requires tag_invocable<execute_may_block_caller_t, __cref_t<_T>>
-    constexpr bool operator()(_T&& __t) const noexcept
+    template <class _Tp>
+        requires tag_invocable<execute_may_block_caller_t, __cref_t<_Tp>>
+    constexpr bool operator()(_Tp&& __t) const noexcept
     {
         static_assert(
             same_as<bool, tag_invoke_result_t<execute_may_block_caller_t,
-                                              __cref_t<_T>>>);
+                                              __cref_t<_Tp>>>);
         static_assert(
-            nothrow_tag_invocable<execute_may_block_caller_t, __cref_t<_T>>);
+            nothrow_tag_invocable<execute_may_block_caller_t, __cref_t<_Tp>>);
         return tag_invoke(execute_may_block_caller_t{}, std::as_const(__t));
     }
+
     constexpr bool operator()(auto&&) const noexcept
     {
         return true;
     }
 };
 } // namespace __scheduler_queries
+
 using __scheduler_queries::execute_may_block_caller_t;
 inline constexpr execute_may_block_caller_t execute_may_block_caller{};
 
@@ -191,6 +185,7 @@
 {
 struct get_completion_signatures_t;
 }
+
 using __get_completion_signatures::get_completion_signatures_t;
 
 /////////////////////////////////////////////////////////////////////////////
@@ -212,6 +207,7 @@
     using __tag_t = _Tag;
     using __value_t = _Value;
     _Value __value_;
+
     struct __t
     {
         using __id = __with;
@@ -221,32 +217,34 @@
 
         __t(__with&& __w) : __value_(((__with &&) __w).__value_) {}
 
-        template <same_as<_Tag> _T, class... _Ts>
-        friend __val_or_ref_t
-            tag_invoke(_T, const __t& __self, _Ts&&...) noexcept(
-                std::is_nothrow_copy_constructible_v<__val_or_ref_t>)
+        template <same_as<_Tag> _Tp, class... _Ts>
+        friend __val_or_ref_t tag_invoke(_Tp, const __t& __self, _Ts&&...) //
+            noexcept(std::is_nothrow_copy_constructible_v<__val_or_ref_t>)
         {
             return __self.__value_;
         }
     };
 };
+
 template <class _Tag>
 struct __with<_Tag, __none_such>
 {
     using __tag_t = _Tag;
     using __value_t = __none_such;
+
     struct __t
     {
         using __id = __with;
+
         __t(__with) {}
 
-        template <same_as<_Tag> _T, class... _Ts>
-        friend void tag_invoke(_T, const __t&, _Ts&&...) = delete;
+        template <same_as<_Tag> _Tp, class... _Ts>
+        friend void tag_invoke(_Tp, const __t&, _Ts&&...) = delete;
     };
 };
 
 template <__class _Tag, class _Value>
-__with<_Tag, decay_t<_Value>> __with_(_Tag, _Value&& __val)
+__with<_Tag, __decay_t<_Value>> __with_(_Tag, _Value&& __val)
 {
     return {(_Value &&) __val};
 }
@@ -272,14 +270,13 @@
         [[no_unique_address]] _BaseEnv __base_env_{};
 
         // Forward the receiver queries:
-        template <
-            __none_of<__tag_of<_WithIds>..., get_completion_signatures_t> _Tag,
-            same_as<__t> _Self, class... _As>
-            requires __callable<_Tag, const __base_env_of<_Self>&, _As...>
-        friend auto tag_invoke(_Tag __tag, const _Self& __self,
-                               _As&&... __as) noexcept
-            -> __call_result_if_t<same_as<_Self, __t>, _Tag,
-                                  const __base_env_of<_Self>&, _As...>
+        template <__forwarding_query _Tag, same_as<__t> _Self, class... _As>
+            requires __none_of<_Tag, __tag_of<_WithIds>...> &&
+                     __callable<_Tag, const __base_env_of<_Self>&, _As...>
+                     friend auto tag_invoke(_Tag __tag, const _Self& __self,
+                                            _As&&... __as) noexcept
+                     -> __call_result_if_t<same_as<_Self, __t>, _Tag,
+                                           const __base_env_of<_Self>&, _As...>
         {
             return ((_Tag &&) __tag)(__self.__base_env_, (_As &&) __as...);
         }
@@ -306,7 +303,7 @@
     template <__none_of<no_env> _BaseEnv, class... _Tags, class... _Values>
         requires __is_not_instance_of<_BaseEnv, __with>
     auto operator()(_BaseEnv&& __base_env, __with<_Tags, _Values>... __ws) const
-        -> __env_t<decay_t<_BaseEnv>, __with<_Tags, _Values>...>
+        -> __env_t<__decay_t<_BaseEnv>, __with<_Tags, _Values>...>
     {
         return {{std::move(__ws)}..., (_BaseEnv &&) __base_env};
     }
@@ -352,6 +349,7 @@
     }
 };
 } // namespace __env
+
 using __env::__with;
 using __env::__with_;
 
@@ -368,11 +366,17 @@
 using env_of_t = __call_result_t<get_env_t, _EnvProvider>;
 
 template <class _EnvProvider>
-concept environment_provider = requires(_EnvProvider& __ep) {
-                                   {
-                                       get_env(std::as_const(__ep))
-                                       } -> __none_of<no_env, void>;
-                               };
+concept environment_provider = //
+    requires(_EnvProvider& __ep) {
+        {
+            get_env(std::as_const(__ep))
+            } -> queryable;
+        // NOT TO SPEC: Remove the following line when we deprecate all
+        // R5 entities.
+        {
+            get_env(std::as_const(__ep))
+            } -> __none_of<no_env, void>;
+    };
 
 /////////////////////////////////////////////////////////////////////////////
 // [execution.receivers]
@@ -430,6 +434,7 @@
     }
 };
 } // namespace __receivers
+
 using __receivers::set_error_t;
 using __receivers::set_stopped_t;
 using __receivers::set_value_t;
@@ -470,6 +475,7 @@
 {
 struct as_awaitable_t;
 }
+
 using __as_awaitable::as_awaitable_t;
 extern const as_awaitable_t as_awaitable;
 
@@ -508,6 +514,8 @@
 __types<__minvoke<_Ty>> __test(_Tag (*)());
 template <class, class = void>
 __types<> __test(...);
+template <class _Tag, class _Ty = void, class... _Args>
+void __test(_Tag (*)(_Args...) noexcept) = delete;
 #endif
 
 // To be kept in sync with the promise type used in __connect_awaitable
@@ -522,9 +530,9 @@
 
     template <class _Ty>
         requires tag_invocable<as_awaitable_t, _Ty, __env_promise&>
-    auto await_transform(_Ty&& __value) noexcept(
-        nothrow_tag_invocable<as_awaitable_t, _Ty, __env_promise&>)
-        -> tag_invoke_result_t<as_awaitable_t, _Ty, __env_promise&>
+    auto await_transform(_Ty&& __value) //
+        noexcept(nothrow_tag_invocable<as_awaitable_t, _Ty, __env_promise&>)
+            -> tag_invoke_result_t<as_awaitable_t, _Ty, __env_promise&>
     {
         return tag_invoke(as_awaitable, (_Ty &&) __value, *this);
     }
@@ -536,9 +544,10 @@
 // BUGBUG not to spec!
 struct __dependent
 {
-#if !_STD_NO_COROUTINES_
+#if !STDEXEC_STD_NO_COROUTINES_
     bool await_ready();
-    void await_suspend(const __coro::coroutine_handle<__env_promise<no_env>>&);
+    template <class _Env>
+    void await_suspend(__coro::coroutine_handle<__env_promise<_Env>>);
     __dependent await_resume();
 #endif
 };
@@ -560,6 +569,7 @@
     decltype(__compl_sigs::__test<_Tag, _Ty>((_Sig*)nullptr));
 #endif
 } // namespace __compl_sigs
+
 using __compl_sigs::__completion_signature;
 using __compl_sigs::__env_promise;
 using no_env_promise = __env_promise<no_env>;
@@ -634,6 +644,7 @@
 // [execution.receivers]
 template <class _Sig>
 struct _MISSING_COMPLETION_SIGNAL_;
+
 template <class _Tag, class... _Args>
 struct _MISSING_COMPLETION_SIGNAL_<_Tag(_Args...)>
 {
@@ -657,8 +668,8 @@
 };
 
 template <class _Receiver, class _Tag, class... _Args>
-using __missing_completion_signal_t =
-    __if<__bool<nothrow_tag_invocable<_Tag, _Receiver, _Args...>>,
+using __missing_completion_signal_t = //
+    __if<__mbool<nothrow_tag_invocable<_Tag, _Receiver, _Args...>>,
          __found_completion_signature,
          _MISSING_COMPLETION_SIGNAL_<_Tag(_Args...)>>;
 
@@ -671,37 +682,47 @@
     -> decltype((__has_completion<_Receiver>((_Sigs*)0), ...));
 
 template <class _Completion, class _Receiver>
-concept __is_valid_completion = _Completion::template
+concept __is_valid_completion = //
+    _Completion::template
 _WITH_RECEIVER_<_Receiver>::value;
 } // namespace __receiver_concepts
 
+using __receiver_concepts::__has_completions;
+using __receiver_concepts::__is_valid_completion;
+
 /////////////////////////////////////////////////////////////////////////////
 // [execution.receivers]
+//   NOT TO SPEC:
+//   As we upgrade the receiver related entities from R5 to R7,
+//   we allow types that do not yet satisfy enable_receiver to
+//   still satisfy the receiver concept if the type provides an
+//   explicit get_env. All R5 receivers provided an explicit get_env,
+//   so this is backwards compatible.
+template <class _Receiver>
+concept __receiver_r5_or_r7 =  //
+    enable_receiver<_Receiver> //
+    || tag_invocable<get_env_t, __cref_t<_Receiver>>;
 
 template <class _Receiver>
-concept receiver =
-    // NOT TO SPEC:
-    // As we upgrade the receiver related entities from R5 to R7,
-    // we allow types that do not yet satisfy enable_receiver to
-    // still satisfy the receiver concept if the type provides an
-    // explicit get_env. All R5 receivers provided an explicit get_env,
-    // so this is backwards compatible.
-    //  NOTE: Double-negation here is to make the constraint atomic
-    !!(enable_receiver<_Receiver> ||
-       tag_invocable<get_env_t, __cref_t<_Receiver>>) &&
-    environment_provider<__cref_t<_Receiver>> &&
-    move_constructible<remove_cvref_t<_Receiver>> &&
-    constructible_from<remove_cvref_t<_Receiver>, _Receiver>;
+concept __receiver = //
+                     // Nested requirement here is to make this an atomic
+                     // constraint
+    requires { requires __receiver_r5_or_r7<_Receiver>; };
+
+template <class _Receiver>
+concept receiver = __receiver<_Receiver> &&                     //
+                   environment_provider<__cref_t<_Receiver>> && //
+                   move_constructible<__decay_t<_Receiver>> &&  //
+                   constructible_from<__decay_t<_Receiver>, _Receiver>;
 
 template <class _Receiver, class _Completions>
-concept receiver_of =
-    receiver<_Receiver> &&
+concept receiver_of =      //
+    receiver<_Receiver> && //
     requires(_Completions* __required_completions) {
         {
-            __receiver_concepts::__has_completions<remove_cvref_t<_Receiver>>(
-                __required_completions)
-            } -> __receiver_concepts::__is_valid_completion<
-                remove_cvref_t<_Receiver>>;
+            __has_completions<__decay_t<_Receiver>>(__required_completions)
+            } //
+                ->__is_valid_completion<__decay_t<_Receiver>>;
     };
 
 /////////////////////////////////////////////////////////////////////////////
@@ -713,8 +734,7 @@
     __valid<tag_invoke_result_t, get_completion_signatures_t, _Sender, _Env>;
 
 template <class _Sender, class...>
-using __member_alias_t =
-    typename remove_cvref_t<_Sender>::completion_signatures;
+using __member_alias_t = typename __decay_t<_Sender>::completion_signatures;
 
 template <class _Sender>
 concept __with_member_alias = __valid<__member_alias_t, _Sender>;
@@ -753,15 +773,26 @@
                     set_error_t(std::exception_ptr)>>{};
             }
         }
+#if STDEXEC_LEGACY_R5_CONCEPTS()
+        else if constexpr (same_as<_Env, no_env> &&
+                           enable_sender<__decay_t<_Sender>>)
+        {
+            return __mconst<dependent_completion_signatures<no_env>>{};
+        }
+#endif
     }
 
     template <class _Sender, class _Env>
     using __impl_fn = decltype(__impl<_Sender, _Env>());
 
     template <class _Sender, class _Env = no_env>
-        requires(__with_tag_invoke<_Sender, _Env> ||
-                 __with_member_alias<_Sender> ||
-                 __awaitable<_Sender, __env_promise<_Env>>)
+        requires(__with_tag_invoke<_Sender, _Env> //
+                 || __with_member_alias<_Sender>  //
+                 || __awaitable<_Sender, __env_promise<_Env>>
+#if STDEXEC_LEGACY_R5_CONCEPTS()
+                 || (same_as<_Env, no_env> && enable_sender<__decay_t<_Sender>>)
+#endif
+                     )
     constexpr auto operator()(_Sender&&, const _Env& = {}) const noexcept
         -> __minvoke<__impl_fn<_Sender, _Env>, _Sender, _Env>
     {
@@ -788,31 +819,56 @@
     __valid_completion_signatures<__completion_signatures_of_t<_Sender, _Env>,
                                   _Env>;
 
+#if !STDEXEC_LEGACY_R5_CONCEPTS()
+// Here is the R7 sender concepts, not yet enabled.
+template <class _Sender>
+concept sender =                               //
+    enable_sender<__decay_t<_Sender>> &&       //
+    environment_provider<__cref_t<_Sender>> && //
+    move_constructible<__decay_t<_Sender>> &&  //
+    constructible_from<__decay_t<_Sender>, _Sender>;
+
+template <class _Sender, class _Env = empty_env>
+concept sender_in =    //
+    sender<_Sender> && //
+    __with_completion_signatures<_Sender, _Env>;
+
+#else
+template <class _Sender, class _Env>
+concept __sender_r7 = same_as<_Env, no_env> &&
+                      enable_sender<__decay_t<_Sender>>;
+
+// Here are the sender concepts that provide backward compatibility
+// with R5-style senders.
+template <class _Sender, class _Env = no_env>
+concept __sender_r5_or_r7 =                 //
+    __satisfies<__sender_r7<_Sender, _Env>> //
+    || __with_completion_signatures<_Sender, _Env>;
+
 template <class _Sender, class _Env = no_env>
 concept __sender =
-    // Double-negation here is to make this an atomic constraint
-    !!((same_as<_Env, no_env> && enable_sender<remove_cvref_t<_Sender>>) ||
-       __with_completion_signatures<_Sender, _Env>);
+    // Nested requirement here is to make this an atomic constraint
+    requires { requires __sender_r5_or_r7<_Sender, _Env>; };
 
-/////////////////////////////////////////////////////////////////////////////
-// [execution.senders]
 template <class _Sender, class _Env = no_env>
 concept sender =
     // NOT TO SPEC
     // The sender related concepts are temporarily "in flight" being
     // upgraded from P2300R5 to the get_env / enable_sender aware version
     // in P2300R7.
-    __sender<_Sender> && __sender<_Sender, _Env> &&
-    environment_provider<__cref_t<_Sender>> &&
-    move_constructible<remove_cvref_t<_Sender>> &&
-    constructible_from<remove_cvref_t<_Sender>, _Sender>;
+    __sender<_Sender> &&                       //
+    __sender<_Sender, _Env> &&                 //
+    environment_provider<__cref_t<_Sender>> && //
+    move_constructible<__decay_t<_Sender>> &&  //
+    constructible_from<__decay_t<_Sender>, _Sender>;
 
-template <class _Sender, class _Env>
+template <class _Sender, class _Env = empty_env>
 concept sender_in = sender<_Sender, _Env>;
+#endif
 
 // __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
+// sender's metadata. If sender<S> and sender_in<S, Ctx> are both true, then
+// they had better report the same metadata. This completion signatures wrapper
 // enforces that at compile time.
 template <class _Sender, class _Env>
 struct __checked_completion_signatures
@@ -828,7 +884,7 @@
 };
 
 template <class _Sender, class _Env = no_env>
-    requires sender<_Sender, _Env>
+    requires sender_in<_Sender, _Env>
 using completion_signatures_of_t =
     __t<__checked_completion_signatures<_Sender, _Env>>;
 
@@ -837,9 +893,9 @@
     __not_a_variant() = delete;
 };
 template <class... _Ts>
-using __variant =
+using __variant = //
     __minvoke<__if_c<sizeof...(_Ts) != 0,
-                     __transform<__q<decay_t>, __munique<__q<std::variant>>>,
+                     __transform<__q<__decay_t>, __munique<__q<std::variant>>>,
                      __mconst<__not_a_variant>>,
               _Ts...>;
 
@@ -847,7 +903,7 @@
     __munique<__mbind_front_q<std::variant, std::monostate>>;
 
 template <class... _Ts>
-using __decayed_tuple = std::tuple<decay_t<_Ts>...>;
+using __decayed_tuple = std::tuple<__decay_t<_Ts>...>;
 
 template <class _Tag, class _Tuple>
 struct __select_completions_for
@@ -856,47 +912,67 @@
     using __f = __minvoke<_Tag2, _Tuple, _Args...>;
 };
 
+template <class _Tuple>
+struct __invoke_completions
+{
+    template <class _Tag, class... _Args>
+    using __f = __minvoke<_Tag, _Tuple, _Args...>;
+};
+
 template <class _Tag, class _Tuple>
 using __select_completions_for_or =
     __with_default<__select_completions_for<_Tag, _Tuple>, __>;
 
+template <class _Tag, class... _Args>
+using __set_tag_type = _Tag(_Args...);
+
+template <class _Tag, class _Completions>
+using __only_gather_signal = __compl_sigs::__for_all_sigs<
+    _Completions,
+    __select_completions_for_or<_Tag, __mbind_front_q<__set_tag_type, _Tag>>,
+    __remove<__, __q<completion_signatures>>>;
+
 template <class _Tag, class _Completions, class _Tuple, class _Variant>
 using __gather_signal =
-    __compl_sigs::__for_all_sigs<_Completions,
-                                 __select_completions_for_or<_Tag, _Tuple>,
-                                 __remove<__, _Variant>>;
+    __compl_sigs::__for_all_sigs<__only_gather_signal<_Tag, _Completions>,
+                                 __invoke_completions<_Tuple>, _Variant>;
 
 template <class _Tag, class _Sender, class _Env, class _Tuple, class _Variant>
-    requires sender<_Sender, _Env>
+    requires sender_in<_Sender, _Env>
 using __gather_completions_for =
     __gather_signal<_Tag, completion_signatures_of_t<_Sender, _Env>, _Tuple,
                     _Variant>;
 
-template <class _Sender, class _Env = no_env,
-          class _Tuple = __q<__decayed_tuple>, class _Variant = __q<__variant>>
-    requires sender<_Sender, _Env>
+template <                               //
+    class _Sender,                       //
+    class _Env = no_env,                 //
+    class _Tuple = __q<__decayed_tuple>, //
+    class _Variant = __q<__variant>>
+    requires sender_in<_Sender, _Env>
 using __value_types_of_t =
     __gather_completions_for<set_value_t, _Sender, _Env, _Tuple, _Variant>;
 
 template <class _Sender, class _Env = no_env, class _Variant = __q<__variant>>
-    requires sender<_Sender, _Env>
+    requires sender_in<_Sender, _Env>
 using __error_types_of_t = __gather_completions_for<set_error_t, _Sender, _Env,
                                                     __q<__midentity>, _Variant>;
 
-template <class _Sender, class _Env = no_env,
-          template <class...> class _Tuple = __decayed_tuple,
-          template <class...> class _Variant = __variant>
-    requires sender<_Sender, _Env>
+template <                                              //
+    class _Sender,                                      //
+    class _Env = no_env,                                //
+    template <class...> class _Tuple = __decayed_tuple, //
+    template <class...> class _Variant = __variant>
+    requires sender_in<_Sender, _Env>
 using value_types_of_t =
     __value_types_of_t<_Sender, _Env, __q<_Tuple>, __q<_Variant>>;
 
 template <class _Sender, class _Env = no_env,
           template <class...> class _Variant = __variant>
-    requires sender<_Sender, _Env>
+    requires sender_in<_Sender, _Env>
 using error_types_of_t = __error_types_of_t<_Sender, _Env, __q<_Variant>>;
 
 template <class _Tag, class _Sender, class _Env = no_env>
-    requires sender<_Sender, _Env>
+    requires sender_in<_Sender, _Env>
 using __count_of =
     __compl_sigs::__for_all_sigs<completion_signatures_of_t<_Sender, _Env>,
                                  __q<__mfront>, __mcount<_Tag>>;
@@ -918,19 +994,19 @@
     value_types_of_t<_Sender, _Env, __types, __msingle>;
 
 template <class _Sender, class _Env = no_env>
-concept __single_typed_sender = sender<_Sender, _Env> &&
+concept __single_typed_sender = sender_in<_Sender, _Env> &&
                                 __valid<__single_sender_value_t, _Sender, _Env>;
 
 template <class _Sender, class _Env = no_env>
 concept __single_value_variant_sender =
-    sender<_Sender, _Env> &&
+    sender_in<_Sender, _Env> &&
     __valid<__single_value_variant_sender_t, _Sender, _Env>;
 
 template <class... Errs>
-using __nofail = __bool<sizeof...(Errs) == 0>;
+using __nofail = __mbool<sizeof...(Errs) == 0>;
 
 template <class _Sender, class _Env = no_env>
-concept __nofail_sender = sender<_Sender, _Env> &&
+concept __nofail_sender = sender_in<_Sender, _Env> &&
                           (__v<error_types_of_t<_Sender, _Env, __nofail>>);
 
 /////////////////////////////////////////////////////////////////////////////
@@ -946,29 +1022,44 @@
 using __ensure_concat =
     __minvoke<__mconcat<__q<completion_signatures>>, _Sigs...>;
 
-template <class _Sender, class _Env, class _Sigs, class _SetValue,
-          class _SetError, class _SetStopped>
-using __compl_sigs_t = __concat_completion_signatures_t<
-    _Sigs, __value_types_of_t<_Sender, _Env, _SetValue, __q<__ensure_concat>>,
-    __error_types_of_t<_Sender, _Env,
-                       __transform<_SetError, __q<__ensure_concat>>>,
-    __if_c<sends_stopped<_Sender, _Env>, _SetStopped, completion_signatures<>>>;
+template <           //
+    class _Sender,   //
+    class _Env,      //
+    class _Sigs,     //
+    class _SetValue, //
+    class _SetError, //
+    class _SetStopped>
+using __compl_sigs_t = //
+    __concat_completion_signatures_t<
+        _Sigs,
+        __value_types_of_t<_Sender, _Env, _SetValue, __q<__ensure_concat>>,
+        __error_types_of_t<_Sender, _Env,
+                           __transform<_SetError, __q<__ensure_concat>>>,
+        __if_c<sends_stopped<_Sender, _Env>, _SetStopped,
+               completion_signatures<>>>;
 
-template <class _Sender, class _Env, class _Sigs, class _SetValue,
-          class _SetError, class _SetStopped>
+template <           //
+    class _Sender,   //
+    class _Env,      //
+    class _Sigs,     //
+    class _SetValue, //
+    class _SetError, //
+    class _SetStopped>
 auto __make(int)
     -> __compl_sigs_t<_Sender, _Env, _Sigs, _SetValue, _SetError, _SetStopped>;
 
 template <class, class _Env, class, class, class, class>
 auto __make(long) -> dependent_completion_signatures<_Env>;
 
-template <class _Sender, class _Env = no_env,
-          __valid_completion_signatures<_Env> _Sigs = completion_signatures<>,
-          class _SetValue = __q<__default_set_value>,
-          class _SetError = __q<__default_set_error>,
-          __valid_completion_signatures<_Env> _SetStopped =
-              completion_signatures<set_stopped_t()>>
-    requires sender<_Sender, _Env>
+template <                                                               //
+    class _Sender,                                                       //
+    class _Env = no_env,                                                 //
+    __valid_completion_signatures<_Env> _Sigs = completion_signatures<>, //
+    class _SetValue = __q<__default_set_value>,                          //
+    class _SetError = __q<__default_set_error>,                          //
+    __valid_completion_signatures<_Env> _SetStopped =
+        completion_signatures<set_stopped_t()>>
+    requires sender_in<_Sender, _Env>
 using __make_completion_signatures =
     decltype(__make<_Sender, _Env, _Sigs, _SetValue, _SetError, _SetStopped>(
         0));
@@ -1000,7 +1091,7 @@
 //    template <class...> class SetValue = __default_set_value,
 //    template <class> class SetError = __default_set_error,
 //    class SetStopped = completion_signatures<set_stopped_t()>>
-//      requires sender<Sndr, Env>
+//      requires sender_in<Sndr, Env>
 //  using make_completion_signatures =
 //    completion_signatures< ... >;
 //  ```
@@ -1041,14 +1132,15 @@
 //  If any of the above type computations are ill-formed,
 //  `make_completion_signatures<Sndr, Env, AddlSigs, SetValue, SetError,
 //  SendsStopped>` is an alias for an empty struct
-template <class _Sender, class _Env = no_env,
-          __valid_completion_signatures<_Env> _Sigs = completion_signatures<>,
-          template <class...>
-          class _SetValue = __compl_sigs::__default_set_value,
-          template <class> class _SetError = __compl_sigs::__default_set_error,
-          __valid_completion_signatures<_Env> _SetStopped =
-              completion_signatures<set_stopped_t()>>
-    requires sender<_Sender, _Env>
+template <                                                                   //
+    class _Sender,                                                           //
+    class _Env = no_env,                                                     //
+    __valid_completion_signatures<_Env> _Sigs = completion_signatures<>,     //
+    template <class...> class _SetValue = __compl_sigs::__default_set_value, //
+    template <class> class _SetError = __compl_sigs::__default_set_error,    //
+    __valid_completion_signatures<_Env> _SetStopped =
+        completion_signatures<set_stopped_t()>>
+    requires sender_in<_Sender, _Env>
 using make_completion_signatures =
     __make_completion_signatures<_Sender, _Env, _Sigs, __q<_SetValue>,
                                  __q<_SetError>, _SetStopped>;
@@ -1077,6 +1169,7 @@
     }
 };
 } // namespace __scheduler_queries
+
 using __scheduler_queries::forwarding_scheduler_query_t;
 inline constexpr forwarding_scheduler_query_t forwarding_scheduler_query{};
 
@@ -1103,37 +1196,36 @@
     }
 };
 } // namespace __schedule
+
 using __schedule::schedule_t;
 inline constexpr schedule_t schedule{};
 
 // NOT TO SPEC
 template <class _Tag, const auto& _Predicate>
-concept tag_category = requires {
-                           typename __bool<bool{_Predicate(_Tag{})}>;
-                           requires bool {
-                               _Predicate(_Tag{})
-                           };
-                       };
+concept tag_category = //
+    requires {
+        typename __mbool<bool{_Predicate(_Tag{})}>;
+        requires bool {
+            _Predicate(_Tag{})
+        };
+    };
 
 // [execution.schedulers.queries], scheduler queries
 namespace __scheduler_queries
 {
-template <class _Ty>
-const _Ty& __cref_fn(const _Ty&);
-template <class _Ty>
-using __cref_t = decltype(__scheduler_queries::__cref_fn(__declval<_Ty>()));
-
-struct get_forward_progress_guarantee_t
+struct get_forward_progress_guarantee_t :
+    __query<get_forward_progress_guarantee_t>
 {
-    template <class _T>
-        requires tag_invocable<get_forward_progress_guarantee_t, __cref_t<_T>>
-    constexpr auto operator()(_T&& __t) const noexcept(
-        nothrow_tag_invocable<get_forward_progress_guarantee_t, __cref_t<_T>>)
-        -> tag_invoke_result_t<get_forward_progress_guarantee_t, __cref_t<_T>>
+    template <class _Tp>
+        requires tag_invocable<get_forward_progress_guarantee_t, __cref_t<_Tp>>
+    constexpr auto operator()(_Tp&& __t) const noexcept(
+        nothrow_tag_invocable<get_forward_progress_guarantee_t, __cref_t<_Tp>>)
+        -> tag_invoke_result_t<get_forward_progress_guarantee_t, __cref_t<_Tp>>
     {
         return tag_invoke(get_forward_progress_guarantee_t{},
                           std::as_const(__t));
     }
+
     constexpr stdexec::forward_progress_guarantee
         operator()(auto&&) const noexcept
     {
@@ -1141,29 +1233,33 @@
     }
 };
 
-struct __has_algorithm_customizations_t
+struct __has_algorithm_customizations_t :
+    __query<__has_algorithm_customizations_t>
 {
-    template <class _T>
+    template <class _Tp>
     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>{}))
+        tag_invoke_result_t<__has_algorithm_customizations_t, __cref_t<_Tp>>;
+
+    template <class _Tp>
+        requires tag_invocable<__has_algorithm_customizations_t, __cref_t<_Tp>>
+    constexpr __result_t<_Tp> operator()(_Tp&& __t) const
+        noexcept(noexcept(__result_t<_Tp>{}))
     {
-        using _Boolean =
-            tag_invoke_result_t<__has_algorithm_customizations_t, __cref_t<_T>>;
+        using _Boolean = tag_invoke_result_t<__has_algorithm_customizations_t,
+                                             __cref_t<_Tp>>;
         static_assert(_Boolean{}
                           ? true
                           : true); // must be contextually convertible to bool
         return _Boolean{};
     }
+
     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{};
@@ -1177,16 +1273,18 @@
 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 __has_schedule = requires(_Scheduler&& __sched) {
-                             {
-                                 schedule((_Scheduler &&) __sched)
-                                 } -> sender;
-                         };
+concept __has_schedule = //
+    requires(_Scheduler&& __sched) {
+        {
+            schedule((_Scheduler &&) __sched)
+            } -> sender;
+    };
 
 template <class _Scheduler>
 concept __sender_has_completion_scheduler =
@@ -1195,14 +1293,15 @@
         {
             tag_invoke(std::move(__tag),
                        get_env(schedule((_Scheduler &&) __sched)))
-            } -> same_as<remove_cvref_t<_Scheduler>>;
+            } -> same_as<__decay_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>>;
+concept scheduler =                                  //
+    __has_schedule<_Scheduler> &&                    //
+    __sender_has_completion_scheduler<_Scheduler> && //
+    equality_comparable<__decay_t<_Scheduler>> &&    //
+    copy_constructible<__decay_t<_Scheduler>>;
 
 // NOT TO SPEC
 template <scheduler _Scheduler>
@@ -1216,13 +1315,14 @@
 template <class _T0>
 concept __allocator = true;
 
-struct get_scheduler_t
+struct get_scheduler_t : __query<get_scheduler_t>
 {
     friend constexpr bool tag_invoke(forwarding_query_t,
                                      const get_scheduler_t&) noexcept
     {
         return true;
     }
+
     template <__none_of<no_env> _Env>
         requires tag_invocable<get_scheduler_t, const _Env&> &&
                  scheduler<tag_invoke_result_t<get_scheduler_t, const _Env&>>
@@ -1232,39 +1332,43 @@
         static_assert(nothrow_tag_invocable<get_scheduler_t, const _Env&>);
         return tag_invoke(get_scheduler_t{}, __env);
     }
+
     auto operator()() const noexcept;
 };
 
-struct get_delegatee_scheduler_t
+struct get_delegatee_scheduler_t : __query<get_delegatee_scheduler_t>
 {
     friend constexpr bool tag_invoke(forwarding_query_t,
                                      const get_delegatee_scheduler_t&) noexcept
     {
         return true;
     }
-    template <class _T>
+
+    template <class _Tp>
         requires nothrow_tag_invocable<get_delegatee_scheduler_t,
-                                       __cref_t<_T>> &&
+                                       __cref_t<_Tp>> &&
                  scheduler<tag_invoke_result_t<get_delegatee_scheduler_t,
-                                               __cref_t<_T>>>
-                 auto operator()(_T&& __t) const
+                                               __cref_t<_Tp>>>
+                 auto operator()(_Tp&& __t) const
                  noexcept(nothrow_tag_invocable<get_delegatee_scheduler_t,
-                                                __cref_t<_T>>)
+                                                __cref_t<_Tp>>)
                      -> tag_invoke_result_t<get_delegatee_scheduler_t,
-                                            __cref_t<_T>>
+                                            __cref_t<_Tp>>
     {
         return tag_invoke(get_delegatee_scheduler_t{}, std::as_const(__t));
     }
+
     auto operator()() const noexcept;
 };
 
-struct get_allocator_t
+struct get_allocator_t : __query<get_allocator_t>
 {
     friend constexpr bool tag_invoke(forwarding_query_t,
                                      const get_allocator_t&) noexcept
     {
         return true;
     }
+
     template <__none_of<no_env> _Env>
         requires nothrow_tag_invocable<get_allocator_t, const _Env&> &&
                  __allocator<tag_invoke_result_t<get_allocator_t, const _Env&>>
@@ -1274,21 +1378,24 @@
     {
         return tag_invoke(get_allocator_t{}, __env);
     }
+
     auto operator()() const noexcept;
 };
 
-struct get_stop_token_t
+struct get_stop_token_t : __query<get_stop_token_t>
 {
     friend constexpr bool tag_invoke(forwarding_query_t,
                                      const get_stop_token_t&) noexcept
     {
         return true;
     }
+
     template <__none_of<no_env> _Env>
     never_stop_token operator()(const _Env&) const noexcept
     {
         return {};
     }
+
     template <__none_of<no_env> _Env>
         requires tag_invocable<get_stop_token_t, const _Env&> &&
                  stoppable_token<
@@ -1299,9 +1406,11 @@
     {
         return tag_invoke(get_stop_token_t{}, __env);
     }
+
     auto operator()() const noexcept;
 };
 } // namespace __queries
+
 using __queries::get_allocator_t;
 using __queries::get_delegatee_scheduler_t;
 using __queries::get_scheduler_t;
@@ -1311,20 +1420,20 @@
 inline constexpr get_allocator_t get_allocator{};
 inline constexpr get_stop_token_t get_stop_token{};
 
-template <class _T>
-using stop_token_of_t =
-    remove_cvref_t<decltype(get_stop_token(__declval<_T>()))>;
+template <class _Tp>
+using stop_token_of_t = __decay_t<decltype(get_stop_token(__declval<_Tp>()))>;
 
 template <receiver _Receiver>
 using __current_scheduler_t =
     __call_result_t<get_scheduler_t, env_of_t<_Receiver>>;
 
 template <class _SchedulerProvider>
-concept __scheduler_provider = requires(const _SchedulerProvider& __sp) {
-                                   {
-                                       get_scheduler(__sp)
-                                       } -> scheduler<>;
-                               };
+concept __scheduler_provider = //
+    requires(const _SchedulerProvider& __sp) {
+        {
+            get_scheduler(__sp)
+            } -> scheduler<>;
+    };
 
 /////////////////////////////////////////////////////////////////////////////
 // [execution.op_state]
@@ -1334,27 +1443,28 @@
 {
     template <class _Op>
         requires tag_invocable<start_t, _Op&>
-    void operator()(_Op& __op) const
-        noexcept(nothrow_tag_invocable<start_t, _Op&>)
+    void operator()(_Op& __op) const noexcept
     {
+        static_assert(nothrow_tag_invocable<start_t, _Op&>);
         (void)tag_invoke(start_t{}, __op);
     }
 };
 } // namespace __start
+
 using __start::start_t;
 inline constexpr start_t start{};
 
 /////////////////////////////////////////////////////////////////////////////
 // [execution.op_state]
-template <class _O>
-concept operation_state = destructible<_O> && std::is_object_v<_O> &&
-                          requires(_O& __o) {
-                              {
-                                  start(__o)
-                              } noexcept;
-                          };
+template <class _Op>
+concept operation_state =    //
+    destructible<_Op> &&     //
+    std::is_object_v<_Op> && //
+    requires(_Op& __op) {    //
+        start(__op);
+    };
 
-#if !_STD_NO_COROUTINES_
+#if !STDEXEC_STD_NO_COROUTINES_
 /////////////////////////////////////////////////////////////////////////////
 // __connect_awaitable_
 namespace __connect_awaitable_
@@ -1365,44 +1475,21 @@
     {
         return {};
     }
+
     [[noreturn]] __coro::suspend_always final_suspend() noexcept
     {
         std::terminate();
     }
+
     [[noreturn]] void unhandled_exception() noexcept
     {
         std::terminate();
     }
+
     [[noreturn]] void return_void() noexcept
     {
         std::terminate();
     }
-    template <class _Fun>
-    auto yield_value(_Fun&& __fun) noexcept
-    {
-        struct awaiter
-        {
-            _Fun&& __fun_;
-            bool await_ready() noexcept
-            {
-                return false;
-            }
-            void await_suspend(__coro::coroutine_handle<>) noexcept(
-                __nothrow_callable<_Fun>)
-            {
-                // If this throws, the runtime catches the exception,
-                // resumes the __connect_awaitable coroutine, and immediately
-                // rethrows the exception. The end result is that an
-                // exception_ptr to the exception gets passed to set_error.
-                ((_Fun &&) __fun_)();
-            }
-            [[noreturn]] void await_resume() noexcept
-            {
-                std::terminate();
-            }
-        };
-        return awaiter{(_Fun &&) __fun};
-    }
 };
 
 struct __operation_base
@@ -1455,7 +1542,7 @@
 
         __coro::coroutine_handle<> unhandled_stopped() noexcept
         {
-            set_stopped(std::move(__rcvr_));
+            set_stopped((_Receiver &&) __rcvr_);
             // Returning noop_coroutine here causes the __connect_awaitable
             // coroutine to never resume past the point where it co_await's
             // the awaitable.
@@ -1476,9 +1563,9 @@
 
         template <class _Awaitable>
             requires tag_invocable<as_awaitable_t, _Awaitable, __t&>
-        auto await_transform(_Awaitable&& __await) noexcept(
-            nothrow_tag_invocable<as_awaitable_t, _Awaitable, __t&>)
-            -> tag_invoke_result_t<as_awaitable_t, _Awaitable, __t&>
+        auto await_transform(_Awaitable&& __await) //
+            noexcept(nothrow_tag_invocable<as_awaitable_t, _Awaitable, __t&>)
+                -> tag_invoke_result_t<as_awaitable_t, _Awaitable, __t&>
         {
             return tag_invoke(as_awaitable, (_Awaitable &&) __await, *this);
         }
@@ -1503,6 +1590,34 @@
 struct __connect_awaitable_t
 {
   private:
+    template <class _Fun, class... _Ts>
+    static auto __co_call(_Fun __fun, _Ts&&... __as) noexcept
+    {
+        auto __fn = [&, __fun]() noexcept { __fun((_Ts &&) __as...); };
+
+        struct __awaiter
+        {
+            decltype(__fn) __fn_;
+
+            static constexpr bool await_ready() noexcept
+            {
+                return false;
+            }
+
+            void await_suspend(__coro::coroutine_handle<>) noexcept
+            {
+                __fn_();
+            }
+
+            [[noreturn]] void await_resume() noexcept
+            {
+                std::terminate();
+            }
+        };
+
+        return __awaiter{__fn};
+    }
+
     template <class _Awaitable, class _Receiver>
     static __operation_t<_Receiver> __co_impl(_Awaitable __await,
                                               _Receiver __rcvr)
@@ -1511,40 +1626,28 @@
         std::exception_ptr __eptr;
         try
         {
-            // This is a bit mind bending control-flow wise.
-            // We are first evaluating the co_await expression.
-            // Then the result of that is passed into a lambda
-            // that curries a reference to the result into another
-            // lambda which is then returned to 'co_yield'.
-            // The 'co_yield' expression then invokes this lambda
-            // after the coroutine is suspended so that it is safe
-            // for the receiver to destroy the coroutine.
-            auto __fun = [&](auto&&... __as) noexcept {
-                return [&]() noexcept -> void {
-                    set_value((_Receiver &&) __rcvr,
-                              (std::add_rvalue_reference_t<__result_t>)__as...);
-                };
-            };
-            if constexpr (std::is_void_v<__result_t>)
-                co_yield (co_await (_Awaitable &&) __await, __fun());
+            if constexpr (same_as<__result_t, void>)
+                co_await (co_await (_Awaitable &&) __await,
+                          __co_call(set_value, (_Receiver &&) __rcvr));
             else
-                co_yield __fun(co_await (_Awaitable &&) __await);
+                co_await __co_call(set_value, (_Receiver &&) __rcvr,
+                                   co_await (_Awaitable &&) __await);
         }
         catch (...)
         {
             __eptr = std::current_exception();
         }
-        co_yield [&]() noexcept -> void {
-            set_error((_Receiver &&) __rcvr, (std::exception_ptr &&) __eptr);
-        };
+        co_await __co_call(set_error, (_Receiver &&) __rcvr,
+                           (std::exception_ptr &&) __eptr);
     }
 
     template <receiver _Receiver, class _Awaitable>
-    using __completions_t = completion_signatures<
-        __minvoke< // set_value_t() or set_value_t(T)
-            __remove<void, __qf<set_value_t>>,
-            __await_result_t<_Awaitable, __promise_t<_Receiver>>>,
-        set_error_t(std::exception_ptr), set_stopped_t()>;
+    using __completions_t = //
+        completion_signatures<
+            __minvoke< // set_value_t() or set_value_t(T)
+                __remove<void, __qf<set_value_t>>,
+                __await_result_t<_Awaitable, __promise_t<_Receiver>>>,
+            set_error_t(std::exception_ptr), set_stopped_t()>;
 
   public:
     template <class _Receiver, __awaitable<__promise_t<_Receiver>> _Awaitable>
@@ -1556,6 +1659,7 @@
     }
 };
 } // namespace __connect_awaitable_
+
 using __connect_awaitable_::__connect_awaitable_t;
 #else
 struct __connect_awaitable_t
@@ -1567,7 +1671,7 @@
 // [exec.snd_queries]
 namespace __sender_queries
 {
-struct forwarding_sender_query_t
+struct forwarding_sender_query_t : __query<forwarding_sender_query_t>
 {
     template <class _Tag>
     constexpr bool operator()(_Tag __tag) const noexcept
@@ -1585,6 +1689,7 @@
     }
 };
 } // namespace __sender_queries
+
 using __sender_queries::forwarding_sender_query_t;
 inline constexpr forwarding_sender_query_t forwarding_sender_query{};
 
@@ -1592,6 +1697,11 @@
 {
 struct __is_debug_env_t
 {
+    friend constexpr bool tag_invoke(forwarding_query_t,
+                                     const __is_debug_env_t&) noexcept
+    {
+        return true;
+    }
     template <class _Env>
         requires tag_invocable<__is_debug_env_t, _Env>
     void operator()(_Env&&) const noexcept;
@@ -1659,20 +1769,23 @@
 {
 struct connect_t;
 
-template <class _T>
-R5_SENDER_DEPR_WARNING void
+template <class _Tp>
+STDEXEC_R5_SENDER_DEPR_WARNING //
+    void
     __update_sender_type_to_p2300r7_by_adding_enable_sender_trait()
 {}
 
-template <class _T>
-R5_RECEIVER_DEPR_WARNING void
+template <class _Tp>
+STDEXEC_R5_RECEIVER_DEPR_WARNING //
+    void
     __update_receiver_type_to_p2300r7_by_adding_enable_receiver_trait()
 {}
 
 template <class _Sender, class _Receiver>
 concept __connectable_with_tag_invoke =
-    receiver<_Receiver> && sender<_Sender, env_of_t<_Receiver>> &&
-    __receiver_from<_Receiver, _Sender> &&
+    receiver<_Receiver> &&                     //
+    sender_in<_Sender, env_of_t<_Receiver>> && //
+    __receiver_from<_Receiver, _Sender> &&     //
     tag_invocable<connect_t, _Sender, _Receiver>;
 
 struct connect_t
@@ -1681,13 +1794,13 @@
     static constexpr auto __select_impl() noexcept
     {
         // Report that 2300R5-style senders and receivers are deprecated:
-        if constexpr (!enable_sender<remove_cvref_t<_Sender>>)
+        if constexpr (!enable_sender<__decay_t<_Sender>>)
             __update_sender_type_to_p2300r7_by_adding_enable_sender_trait<
-                remove_cvref_t<_Sender>>();
+                __decay_t<_Sender>>();
 
-        if constexpr (!enable_receiver<remove_cvref_t<_Receiver>>)
+        if constexpr (!enable_receiver<__decay_t<_Receiver>>)
             __update_receiver_type_to_p2300r7_by_adding_enable_receiver_trait<
-                remove_cvref_t<_Receiver>>();
+                __decay_t<_Receiver>>();
 
         if constexpr (__connectable_with_tag_invoke<_Sender, _Receiver>)
         {
@@ -1712,7 +1825,7 @@
     template <class _Sender, class _Receiver>
     using __select_impl_t = decltype(__select_impl<_Sender, _Receiver>());
 
-    template <class _Sender, class _Receiver>
+    template <sender _Sender, receiver _Receiver>
         requires __connectable_with_tag_invoke<_Sender, _Receiver> ||
                  __callable<__connect_awaitable_t, _Sender, _Receiver> ||
                  tag_invocable<__is_debug_env_t, env_of_t<_Receiver>>
@@ -1840,9 +1953,9 @@
 /////////////////////////////////////////////////////////////////////////////
 // [exec.snd]
 template <class _Sender, class _Receiver>
-concept sender_to = receiver<_Receiver> &&
-                    sender<_Sender, env_of_t<_Receiver>> &&
-                    __receiver_from<_Receiver, _Sender> &&
+concept sender_to = receiver<_Receiver> &&                     //
+                    sender_in<_Sender, env_of_t<_Receiver>> && //
+                    __receiver_from<_Receiver, _Sender> &&     //
                     requires(_Sender&& __sndr, _Receiver&& __rcvr) {
                         connect((_Sender &&) __sndr, (_Receiver &&) __rcvr);
                     };
@@ -1854,7 +1967,7 @@
 
 template <class _Sender, class _SetSig, class _Env = no_env>
 concept sender_of =
-    sender<_Sender, _Env> &&
+    sender_in<_Sender, _Env> &&
     same_as<__types<_SetSig>, __gather_completions_for<
                                   __tag_of_sig_t<_SetSig>, _Sender, _Env,
                                   __qf<__tag_of_sig_t<_SetSig>>, __q<__types>>>;
@@ -1864,7 +1977,7 @@
 namespace __sender_queries
 {
 template <__one_of<set_value_t, set_error_t, set_stopped_t> _CPO>
-struct get_completion_scheduler_t
+struct get_completion_scheduler_t : __query<get_completion_scheduler_t<_CPO>>
 {
     // NOT TO SPEC:
     friend constexpr bool tag_invoke(forwarding_sender_query_t,
@@ -1872,6 +1985,7 @@
     {
         return true;
     }
+
     friend constexpr bool tag_invoke(forwarding_query_t,
                                      const get_completion_scheduler_t&) noexcept
     {
@@ -1894,6 +2008,7 @@
     }
 };
 } // namespace __sender_queries
+
 using __sender_queries::forwarding_sender_query_t;
 using __sender_queries::get_completion_scheduler_t;
 
@@ -1916,7 +2031,7 @@
     tag_invocable<_Fun, __completion_scheduler_for<_Sender, _CPO>, _Sender,
                   _As...>;
 
-#if !_STD_NO_COROUTINES_
+#if !STDEXEC_STD_NO_COROUTINES_
 /////////////////////////////////////////////////////////////////////////////
 // stdexec::as_awaitable [execution.coro_utils.as_awaitable]
 namespace __as_awaitable
@@ -1939,14 +2054,16 @@
         requires constructible_from<__value_or_void_t<_Value>, _Us...>
     friend void tag_invoke(set_value_t, __receiver_base&& __self,
                            _Us&&... __us) noexcept
-    try
     {
-        __self.__result_->template emplace<1>((_Us &&) __us...);
-        __self.__continuation_.resume();
-    }
-    catch (...)
-    {
-        set_error((__receiver_base &&) __self, std::current_exception());
+        try
+        {
+            __self.__result_->template emplace<1>((_Us &&) __us...);
+            __self.__continuation_.resume();
+        }
+        catch (...)
+        {
+            set_error((__receiver_base &&) __self, std::current_exception());
+        }
     }
 
     template <class _Error>
@@ -1972,9 +2089,11 @@
 struct __receiver
 {
     using _Promise = stdexec::__t<_PromiseId>;
+
     struct __t : __receiver_base<_Value>
     {
         using __id = __receiver;
+
         friend void tag_invoke(set_stopped_t, __t&& __self) noexcept
         {
             auto __continuation =
@@ -1988,17 +2107,10 @@
         // Forward get_env query to the coroutine promise
         friend __env_t<_Promise&> tag_invoke(get_env_t, const __t& __self)
         {
-            if constexpr (__callable<get_env_t, _Promise&>)
-            {
-                auto __continuation =
-                    __coro::coroutine_handle<_Promise>::from_address(
-                        __self.__continuation_.address());
-                return get_env(__continuation.promise());
-            }
-            else
-            {
-                return empty_env{};
-            }
+            auto __continuation =
+                __coro::coroutine_handle<_Promise>::from_address(
+                    __self.__continuation_.address());
+            return get_env(__continuation.promise());
         }
     };
 };
@@ -2046,11 +2158,11 @@
     using _Promise = stdexec::__t<_PromiseId>;
     using _Sender = stdexec::__t<_SenderId>;
     using __value = __value_t<_Sender, _Promise>;
+
     struct __t : __sender_awaitable_base<__value>
     {
-        __t(_Sender&& sndr,
-            __coro::coroutine_handle<_Promise>
-                __hcoro) noexcept(__nothrow_connectable<_Sender, __receiver>) :
+        __t(_Sender&& sndr, __coro::coroutine_handle<_Promise> __hcoro) //
+            noexcept(__nothrow_connectable<_Sender, __receiver>) :
             __op_state_(connect((_Sender &&) sndr,
                                 __receiver{{&this->__result_, __hcoro}}))
         {}
@@ -2072,73 +2184,84 @@
 
 template <class _Sender, class _Promise>
 concept __awaitable_sender =
-    __single_typed_sender<_Sender, __env_t<_Promise>> &&
-    sender_to<_Sender, __receiver_t<_Sender, _Promise>> &&
+    __single_typed_sender<_Sender, __env_t<_Promise>> &&   //
+    sender_to<_Sender, __receiver_t<_Sender, _Promise>> && //
     requires(_Promise& __promise) {
         {
             __promise.unhandled_stopped()
             } -> convertible_to<__coro::coroutine_handle<>>;
     };
 
+struct __unspecified
+{
+    __unspecified get_return_object() noexcept;
+    __unspecified initial_suspend() noexcept;
+    __unspecified final_suspend() noexcept;
+    void unhandled_exception() noexcept;
+    void return_void() noexcept;
+    __coro::coroutine_handle<> unhandled_stopped() noexcept;
+};
+
 struct as_awaitable_t
 {
-    template <class _T, class _Promise>
+    template <class _Tp, class _Promise>
     static constexpr auto __select_impl_() noexcept
     {
-        if constexpr (tag_invocable<as_awaitable_t, _T, _Promise&>)
+        if constexpr (tag_invocable<as_awaitable_t, _Tp, _Promise&>)
         {
-            using _Result = tag_invoke_result_t<as_awaitable_t, _T, _Promise&>;
+            using _Result = tag_invoke_result_t<as_awaitable_t, _Tp, _Promise&>;
             constexpr bool _Nothrow =
-                nothrow_tag_invocable<as_awaitable_t, _T, _Promise&>;
+                nothrow_tag_invocable<as_awaitable_t, _Tp, _Promise&>;
             return static_cast<_Result (*)() noexcept(_Nothrow)>(nullptr);
         }
-        else if constexpr (__awaitable<_T>)
-        { // NOT __awaitable<_T, _Promise> !!
-            return static_cast < _T && (*)() noexcept > (nullptr);
+        else if constexpr (__awaitable<_Tp, __unspecified>)
+        { // NOT __awaitable<_Tp, _Promise> !!
+            return static_cast < _Tp && (*)() noexcept > (nullptr);
         }
-        else if constexpr (__awaitable_sender<_T, _Promise>)
+        else if constexpr (__awaitable_sender<_Tp, _Promise>)
         {
-            using _Result = __sender_awaitable_t<_Promise, _T>;
+            using _Result = __sender_awaitable_t<_Promise, _Tp>;
             constexpr bool _Nothrow = __nothrow_constructible_from<
-                _Result, _T, __coro::coroutine_handle<_Promise>>;
+                _Result, _Tp, __coro::coroutine_handle<_Promise>>;
             return static_cast<_Result (*)() noexcept(_Nothrow)>(nullptr);
         }
         else
         {
-            return static_cast < _T && (*)() noexcept > (nullptr);
+            return static_cast < _Tp && (*)() noexcept > (nullptr);
         }
     }
-    template <class _T, class _Promise>
-    using __select_impl_t = decltype(__select_impl_<_T, _Promise>());
+    template <class _Tp, class _Promise>
+    using __select_impl_t = decltype(__select_impl_<_Tp, _Promise>());
 
-    template <class _T, class _Promise>
-    auto operator()(_T&& __t, _Promise& __promise) const
-        noexcept(__nothrow_callable<__select_impl_t<_T, _Promise>>)
-            -> __call_result_t<__select_impl_t<_T, _Promise>>
+    template <class _Tp, class _Promise>
+    auto operator()(_Tp&& __t, _Promise& __promise) const
+        noexcept(__nothrow_callable<__select_impl_t<_Tp, _Promise>>)
+            -> __call_result_t<__select_impl_t<_Tp, _Promise>>
     {
-        if constexpr (tag_invocable<as_awaitable_t, _T, _Promise&>)
+        if constexpr (tag_invocable<as_awaitable_t, _Tp, _Promise&>)
         {
-            using _Result = tag_invoke_result_t<as_awaitable_t, _T, _Promise&>;
+            using _Result = tag_invoke_result_t<as_awaitable_t, _Tp, _Promise&>;
             static_assert(__awaitable<_Result, _Promise>);
-            return tag_invoke(*this, (_T &&) __t, __promise);
+            return tag_invoke(*this, (_Tp &&) __t, __promise);
         }
-        else if constexpr (__awaitable<_T>)
-        { // NOT __awaitable<_T, _Promise> !!
-            return (_T &&) __t;
+        else if constexpr (__awaitable<_Tp, __unspecified>)
+        { // NOT __awaitable<_Tp, _Promise> !!
+            return (_Tp &&) __t;
         }
-        else if constexpr (__awaitable_sender<_T, _Promise>)
+        else if constexpr (__awaitable_sender<_Tp, _Promise>)
         {
             auto __hcoro =
                 __coro::coroutine_handle<_Promise>::from_promise(__promise);
-            return __sender_awaitable_t<_Promise, _T>{(_T &&) __t, __hcoro};
+            return __sender_awaitable_t<_Promise, _Tp>{(_Tp &&) __t, __hcoro};
         }
         else
         {
-            return (_T &&) __t;
+            return (_Tp &&) __t;
         }
     }
 };
 } // namespace __as_awaitable
+
 using __as_awaitable::as_awaitable_t;
 inline constexpr as_awaitable_t as_awaitable;
 
@@ -2261,6 +2384,7 @@
     }
 };
 } // namespace __with_awaitable_senders
+
 using __with_awaitable_senders::__continuation_handle;
 using __with_awaitable_senders::with_awaitable_senders;
 #endif
@@ -2269,49 +2393,74 @@
 // NOT TO SPEC: __submit
 namespace __submit_
 {
-template <class _SenderId, class _ReceiverId>
-struct __operation
-{
-    using _Sender = stdexec::__t<_SenderId>;
-    using _Receiver = stdexec::__t<_ReceiverId>;
-    struct __t;
+template <class _ReceiverId>
+struct __operation_base;
 
-    struct __receiver
+template <class _ReceiverId>
+struct __operation_base
+{
+    using _Receiver = __t<_ReceiverId>;
+    _Receiver __rcvr_;
+
+    using __delete_fn_t = void(__operation_base<_ReceiverId>*) noexcept;
+    __delete_fn_t* __delete_;
+};
+
+template <class _ReceiverId>
+struct __receiver
+{
+    using is_receiver = void;
+    using _Receiver = stdexec::__t<_ReceiverId>;
+
+    struct __t
     {
-        using __t = __receiver;
         using __id = __receiver;
-        __operation::__t* __op_state_;
+        __operation_base<_ReceiverId>* __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>
             requires __callable<_Tag, _Receiver, _As...>
         friend void tag_invoke(
-            _Tag __tag, __receiver&& __self,
+            _Tag __tag, __t&& __self,
             _As&&... __as) noexcept(__nothrow_callable<_Tag, _Receiver, _As...>)
         {
             // Delete the state as cleanup:
-            std::unique_ptr<__operation::__t> __g{__self.__op_state_};
+            auto __g = __scope_guard{__self.__op_state_->__delete_,
+                                     __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)
+        friend auto tag_invoke(get_env_t, const __t& __self)
             -> env_of_t<_Receiver>
         {
             return get_env((const _Receiver&)__self.__op_state_->__rcvr_);
         }
     };
+};
+template <class _ReceiverId>
+using __receiver_t = __t<__receiver<_ReceiverId>>;
 
-    struct __t
-    {
-        using __id = __operation;
-        _Receiver __rcvr_;
-        connect_result_t<_Sender, __receiver> __op_state_;
-        __t(_Sender&& __sndr, _Receiver&& __rcvr) :
-            __rcvr_((_Receiver &&) __rcvr),
-            __op_state_(connect((_Sender &&) __sndr, __receiver{this}))
-        {}
-    };
+template <class _SenderId, class _ReceiverId>
+struct __operation : __operation_base<_ReceiverId>
+{
+    using _Sender = stdexec::__t<_SenderId>;
+    using _Receiver = stdexec::__t<_ReceiverId>;
+
+    connect_result_t<_Sender, __receiver_t<_ReceiverId>> __op_state_;
+
+    template <__decays_to<_Receiver> _CvrefReceiver>
+    __operation(_Sender&& __sndr, _CvrefReceiver&& __rcvr) :
+        __operation_base<_ReceiverId>{
+            (_CvrefReceiver &&) __rcvr,
+            [](__operation_base<_ReceiverId>* __self) noexcept {
+                delete static_cast<__operation*>(__self);
+            }},
+        __op_state_(
+            connect((_Sender &&) __sndr, __receiver_t<_ReceiverId>{this}))
+    {}
 };
 
 struct __submit_t
@@ -2319,12 +2468,13 @@
     template <receiver _Receiver, sender_to<_Receiver> _Sender>
     void operator()(_Sender&& __sndr, _Receiver __rcvr) const noexcept(false)
     {
-        start((new __t<__operation<__id<_Sender>, __id<_Receiver>>>{
+        start((new __operation<__id<_Sender>, __id<_Receiver>>{
                    (_Sender &&) __sndr, (_Receiver &&) __rcvr})
                   ->__op_state_);
     }
 };
 } // namespace __submit_
+
 using __submit_::__submit_t;
 inline constexpr __submit_t __submit{};
 
@@ -2334,10 +2484,12 @@
 {
     using __t = __scheduler;
     using __id = __scheduler;
+
     template <class _Receiver>
     struct __op : __immovable
     {
         _Receiver __recv_;
+
         friend void tag_invoke(start_t, __op& __self) noexcept
         {
             set_value((_Receiver &&) __self.__recv_);
@@ -2348,6 +2500,7 @@
     {
         using __t = __sender;
         using __id = __sender;
+        using is_sender = void;
         using completion_signatures =
             stdexec::completion_signatures<set_value_t()>;
 
@@ -2375,20 +2528,25 @@
 struct __detached_receiver
 {
     using _Env = stdexec::__t<_EnvId>;
+
     struct __t
     {
         using __id = __detached_receiver;
         [[no_unique_address]] _Env __env_;
+
         template <class... _As>
         friend void tag_invoke(set_value_t, __t&&, _As&&...) noexcept
         {}
+
         template <class _Error>
         [[noreturn]] friend void tag_invoke(set_error_t, __t&&,
                                             _Error&&) noexcept
         {
             std::terminate();
         }
+
         friend void tag_invoke(set_stopped_t, __t&&) noexcept {}
+
         friend const _Env& tag_invoke(get_env_t, const __t& __self) noexcept
         {
             // BUGBUG NOT TO SPEC
@@ -2397,8 +2555,7 @@
     };
 };
 template <class _Env>
-using __detached_receiver_t =
-    __t<__detached_receiver<__id<remove_cvref_t<_Env>>>>;
+using __detached_receiver_t = __t<__detached_receiver<__id<__decay_t<_Env>>>>;
 
 struct start_detached_t;
 
@@ -2406,7 +2563,7 @@
 // are the signatures to test against, in order:
 using _Sender = __0;
 using _Env = __1;
-using __cust_sigs =
+using __cust_sigs = //
     __types<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),
@@ -2447,6 +2604,7 @@
     }
 };
 } // namespace __start_detached
+
 using __start_detached::start_detached_t;
 inline constexpr start_detached_t start_detached{};
 
@@ -2461,6 +2619,7 @@
 struct __operation
 {
     using _Receiver = stdexec::__t<_ReceiverId>;
+
     struct __t : __immovable
     {
         using __id = __operation;
@@ -2488,26 +2647,24 @@
     struct __t
     {
         using __id = __basic_sender;
-        using completion_signatures = __completion_signatures_<_Tag, _Ts...>;
         using is_sender = void;
+        using completion_signatures = __completion_signatures_<_Tag, _Ts...>;
 
         std::tuple<_Ts...> __vals_;
 
         template <receiver_of<completion_signatures> _Receiver>
             requires(copy_constructible<_Ts> && ...)
-        friend auto tag_invoke(
-            connect_t, const __t& __sndr,
-            _Receiver
-                __rcvr) noexcept((std::is_nothrow_copy_constructible_v<_Ts> &&
-                                  ...)) -> __operation_t<_Receiver>
+        friend auto tag_invoke(connect_t, const __t& __sndr,
+                               _Receiver __rcvr) //
+            noexcept((std::is_nothrow_copy_constructible_v<_Ts> && ...))
+                -> __operation_t<_Receiver>
         {
             return {{}, __sndr.__vals_, (_Receiver &&) __rcvr};
         }
 
         template <receiver_of<completion_signatures> _Receiver>
-        friend auto
-            tag_invoke(connect_t, __t&& __sndr, _Receiver __rcvr) noexcept(
-                (std::is_nothrow_move_constructible_v<_Ts> && ...))
+        friend auto tag_invoke(connect_t, __t&& __sndr, _Receiver __rcvr) //
+            noexcept((std::is_nothrow_move_constructible_v<_Ts> && ...))
                 -> __operation_t<_Receiver>
         {
             return {{}, ((__t &&) __sndr).__vals_, (_Receiver &&) __rcvr};
@@ -2524,6 +2681,7 @@
 struct __sender
 {
     using __base = stdexec::__t<__basic_sender<set_value_t, _Values...>>;
+
     struct __t : __base
     {
         using __id = __sender;
@@ -2534,6 +2692,7 @@
 struct __error_sender
 {
     using __base = stdexec::__t<__basic_sender<set_error_t, _Error>>;
+
     struct __t : __base
     {
         using __id = __error_sender;
@@ -2550,9 +2709,9 @@
 {
     template <__movable_value... _Ts>
     STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
-        __t<__sender<decay_t<_Ts>...>>
+        __t<__sender<__decay_t<_Ts>...>>
         operator()(_Ts&&... __ts) const
-        noexcept((std::is_nothrow_constructible_v<decay_t<_Ts>, _Ts> && ...))
+        noexcept((__nothrow_constructible_from<__decay_t<_Ts>, _Ts> && ...))
     {
         return {{{(_Ts &&) __ts...}}};
     }
@@ -2562,9 +2721,9 @@
 {
     template <__movable_value _Error>
     STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
-        __t<__error_sender<decay_t<_Error>>>
+        __t<__error_sender<__decay_t<_Error>>>
         operator()(_Error&& __err) const
-        noexcept(std::is_nothrow_constructible_v<decay_t<_Error>, _Error>)
+        noexcept(__nothrow_constructible_from<__decay_t<_Error>, _Error>)
     {
         return {{{(_Error &&) __err}}};
     }
@@ -2580,6 +2739,7 @@
     }
 } just_stopped{};
 } // namespace __just
+
 using __just::just;
 using __just::just_error;
 using __just::just_stopped;
@@ -2592,21 +2752,27 @@
 struct __as_receiver
 {
     _Fun __fun_;
+
     friend void tag_invoke(set_value_t, __as_receiver&& __rcvr) noexcept
-    try
     {
-        __rcvr.__fun_();
+        try
+        {
+            __rcvr.__fun_();
+        }
+        catch (...)
+        {
+            set_error((__as_receiver &&) __rcvr, std::exception_ptr());
+        }
     }
-    catch (...)
-    {
-        set_error((__as_receiver &&) __rcvr, std::exception_ptr());
-    }
+
     [[noreturn]] friend void tag_invoke(set_error_t, __as_receiver&&,
                                         std::exception_ptr) noexcept
     {
         std::terminate();
     }
+
     friend void tag_invoke(set_stopped_t, __as_receiver&&) noexcept {}
+
     friend empty_env tag_invoke(get_env_t, const __as_receiver&)
     {
         return {};
@@ -2617,13 +2783,14 @@
 {
     template <scheduler _Scheduler, class _Fun>
         requires __callable<_Fun&> && move_constructible<_Fun>
-    void operator()(_Scheduler&& __sched, _Fun __fun) const
+    void operator()(_Scheduler&& __sched, _Fun __fun) const //
         noexcept(noexcept(__submit(schedule((_Scheduler &&) __sched),
                                    __as_receiver<_Fun>{(_Fun &&) __fun})))
     {
         (void)__submit(schedule((_Scheduler &&) __sched),
                        __as_receiver<_Fun>{(_Fun &&) __fun});
     }
+
     template <scheduler _Scheduler, class _Fun>
         requires __callable<_Fun&> && move_constructible<_Fun> &&
                  tag_invocable<execute_t, _Scheduler, _Fun>
@@ -2634,29 +2801,30 @@
     }
 };
 } // namespace __execute_
+
 using __execute_::execute_t;
 inline constexpr execute_t execute{};
 
 // NOT TO SPEC:
 namespace __closure
 {
-template <__class _D>
+template <__class _Dp>
 struct sender_adaptor_closure;
 }
+
 using __closure::sender_adaptor_closure;
 
-template <class _T>
+template <class _Tp>
 concept __sender_adaptor_closure =
-    derived_from<remove_cvref_t<_T>,
-                 sender_adaptor_closure<remove_cvref_t<_T>>> &&
-    move_constructible<remove_cvref_t<_T>> &&
-    constructible_from<remove_cvref_t<_T>, _T>;
+    derived_from<__decay_t<_Tp>, sender_adaptor_closure<__decay_t<_Tp>>> &&
+    move_constructible<__decay_t<_Tp>> &&
+    constructible_from<__decay_t<_Tp>, _Tp>;
 
-template <class _T, class _Sender>
+template <class _Tp, class _Sender>
 concept __sender_adaptor_closure_for =
-    __sender_adaptor_closure<_T> && sender<remove_cvref_t<_Sender>> &&
-    __callable<_T, remove_cvref_t<_Sender>> &&
-    sender<__call_result_t<_T, remove_cvref_t<_Sender>>>;
+    __sender_adaptor_closure<_Tp> && sender<__decay_t<_Sender>> &&
+    __callable<_Tp, __decay_t<_Sender>> &&
+    sender<__call_result_t<_Tp, __decay_t<_Sender>>>;
 
 namespace __closure
 {
@@ -2685,7 +2853,7 @@
     }
 };
 
-template <__class _D>
+template <__class _Dp>
 struct sender_adaptor_closure
 {};
 
@@ -2697,8 +2865,7 @@
 }
 
 template <__sender_adaptor_closure _T0, __sender_adaptor_closure _T1>
-__compose<remove_cvref_t<_T0>, remove_cvref_t<_T1>> operator|(_T0&& __t0,
-                                                              _T1&& __t1)
+__compose<__decay_t<_T0>, __decay_t<_T1>> operator|(_T0&& __t0, _T1&& __t1)
 {
     return {{}, (_T0 &&) __t0, (_T1 &&) __t1};
 }
@@ -2725,8 +2892,8 @@
     template <sender _Sender>
         requires __callable<const _Fun&, _Sender, const _As&...>
     __call_result_t<const _Fun&, _Sender, const _As&...>
-        operator()(_Sender&& __sndr) const& noexcept(
-            __nothrow_callable<const _Fun&, _Sender, const _As&...>)
+        operator()(_Sender&& __sndr) const& //
+        noexcept(__nothrow_callable<const _Fun&, _Sender, const _As&...>)
     {
         return std::apply(
             [&__sndr, this](const _As&... __as) {
@@ -2736,32 +2903,37 @@
     }
 };
 } // namespace __closure
+
 using __closure::__binder_back;
 
 namespace __adaptors
 {
 // A derived-to-base cast that works even when the base is not
 // accessible from derived.
-template <class _T, class _U>
+template <class _Tp, class _Up>
 STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
-    __copy_cvref_t<_U&&, _T>
-    __c_cast(_U&& u) noexcept
-    requires __decays_to<_T, _T>
+    __copy_cvref_t<_Up&&, _Tp>
+    __c_cast(_Up&& u) noexcept
+    requires __decays_to<_Tp, _Tp>
 {
-    static_assert(std::is_reference_v<__copy_cvref_t<_U&&, _T>>);
-    static_assert(std::is_base_of_v<_T, std::remove_reference_t<_U>>);
-    return (__copy_cvref_t<_U&&, _T>)(_U &&) u;
+    static_assert(std::is_reference_v<__copy_cvref_t<_Up&&, _Tp>>);
+    static_assert(std::is_base_of_v<_Tp, __decay_t<_Up>>);
+    return (__copy_cvref_t<_Up&&, _Tp>)(_Up &&) u;
 }
+
 namespace __no
 {
 struct __nope
 {};
+
 struct __receiver : __nope
 {};
+
 void tag_invoke(set_error_t, __receiver, std::exception_ptr) noexcept;
 void tag_invoke(set_stopped_t, __receiver) noexcept;
 empty_env tag_invoke(get_env_t, __receiver) noexcept;
 } // namespace __no
+
 using __not_a_receiver = __no::__receiver;
 
 template <class _Base>
@@ -2800,6 +2972,7 @@
         }
     };
 };
+
 template <derived_from<__no::__nope> _Base>
 struct __adaptor<_Base>
 {
@@ -2821,21 +2994,20 @@
             ->decltype(((_Self &&) __self)._TAG((_Ts &&) __ts...))             \
     {                                                                          \
         return ((_Self &&) __self)._TAG((_Ts &&) __ts...);                     \
-    }                                                                          \
-    /**/
+    } /**/
 #define _CALL_MEMBER(_TAG, ...) __call_##_TAG(__VA_ARGS__)
 
 #if STDEXEC_CLANG()
 // Only clang gets this right.
-#define _MISSING_MEMBER(_D, _TAG) requires { typename _D::_TAG; }
+#define _MISSING_MEMBER(_Dp, _TAG) requires { typename _Dp::_TAG; }
 #define _DEFINE_MEMBER(_TAG) _DISPATCH_MEMBER(_TAG) using _TAG = void
 #else
-#define _MISSING_MEMBER(_D, _TAG) (__missing_##_TAG<_D>())
+#define _MISSING_MEMBER(_Dp, _TAG) (__missing_##_TAG<_Dp>())
 #define _DEFINE_MEMBER(_TAG)                                                   \
-    template <class _D>                                                        \
+    template <class _Dp>                                                       \
     static constexpr bool __missing_##_TAG() noexcept                          \
     {                                                                          \
-        return requires { requires bool(int(_D::_TAG)); };                     \
+        return requires { requires bool(int(_Dp::_TAG)); };                    \
     }                                                                          \
     _DISPATCH_MEMBER(_TAG)                                                     \
     static constexpr int _TAG = 1 /**/
@@ -2854,28 +3026,28 @@
 
         static constexpr bool __has_base = !derived_from<_Base, __no::__nope>;
 
-        template <class _D>
-        using __base_from_derived_t = decltype(__declval<_D>().base());
+        template <class _Dp>
+        using __base_from_derived_t = decltype(__declval<_Dp>().base());
 
         using __get_base_t =
             __if_c<__has_base, __mbind_back_q<__copy_cvref_t, _Base>,
                    __q<__base_from_derived_t>>;
 
-        template <class _D>
-        using __base_t = __minvoke<__get_base_t, _D&&>;
+        template <class _Dp>
+        using __base_t = __minvoke<__get_base_t, _Dp&&>;
 
-        template <class _D>
+        template <class _Dp>
         STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
-            static __base_t<_D>
-            __get_base(_D&& __self) noexcept
+            static __base_t<_Dp>
+            __get_base(_Dp&& __self) noexcept
         {
             if constexpr (__has_base)
             {
-                return __c_cast<__t>((_D &&) __self).base();
+                return __c_cast<__t>((_Dp &&) __self).base();
             }
             else
             {
-                return ((_D &&) __self).base();
+                return ((_Dp &&) __self).base();
             }
         }
 
@@ -2891,15 +3063,15 @@
             _CALL_MEMBER(set_value, (_Derived &&) __self, (_As &&) __as...);
         }
 
-        template <same_as<set_value_t> _SetValue, class _D = _Derived,
+        template <same_as<set_value_t> _SetValue, class _Dp = _Derived,
                   class... _As>
-            requires _MISSING_MEMBER(_D, set_value) &&
-                     tag_invocable<set_value_t, __base_t<_D>, _As...>
+            requires _MISSING_MEMBER(_Dp, set_value) &&
+                     tag_invocable<set_value_t, __base_t<_Dp>, _As...>
         STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
             friend void tag_invoke(_SetValue, _Derived&& __self,
                                    _As&&... __as) noexcept
         {
-            stdexec::set_value(__get_base((_D &&) __self), (_As &&) __as...);
+            stdexec::set_value(__get_base((_Dp &&) __self), (_As &&) __as...);
         }
 
         template <same_as<set_error_t> _SetError, class _Error>
@@ -2915,9 +3087,9 @@
         }
 
         template <same_as<set_error_t> _SetError, class _Error,
-                  class _D = _Derived>
-            requires _MISSING_MEMBER(_D, set_error) &&
-                     tag_invocable<set_error_t, __base_t<_D>, _Error>
+                  class _Dp = _Derived>
+            requires _MISSING_MEMBER(_Dp, set_error) &&
+                     tag_invocable<set_error_t, __base_t<_Dp>, _Error>
         STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
             friend void tag_invoke(_SetError, _Derived&& __self,
                                    _Error&& __err) noexcept
@@ -2926,20 +3098,20 @@
                                (_Error &&) __err);
         }
 
-        template <same_as<set_stopped_t> _SetStopped, class _D = _Derived>
+        template <same_as<set_stopped_t> _SetStopped, class _Dp = _Derived>
         STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
             friend auto
             tag_invoke(_SetStopped, _Derived&& __self) noexcept
-            -> decltype(_CALL_MEMBER(set_stopped, (_D &&) __self))
+            -> decltype(_CALL_MEMBER(set_stopped, (_Dp &&) __self))
         {
             static_assert(
                 noexcept(_CALL_MEMBER(set_stopped, (_Derived &&) __self)));
             _CALL_MEMBER(set_stopped, (_Derived &&) __self);
         }
 
-        template <same_as<set_stopped_t> _SetStopped, class _D = _Derived>
-            requires _MISSING_MEMBER(_D, set_stopped) &&
-                     tag_invocable<set_stopped_t, __base_t<_D>>
+        template <same_as<set_stopped_t> _SetStopped, class _Dp = _Derived>
+            requires _MISSING_MEMBER(_Dp, set_stopped) &&
+                     tag_invocable<set_stopped_t, __base_t<_Dp>>
         STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
             friend void tag_invoke(_SetStopped, _Derived&& __self) noexcept
         {
@@ -2947,20 +3119,20 @@
         }
 
         // Pass through the get_env receiver query
-        template <same_as<get_env_t> _GetEnv, class _D = _Derived>
+        template <same_as<get_env_t> _GetEnv, class _Dp = _Derived>
         STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
             friend auto
             tag_invoke(_GetEnv, const _Derived& __self)
-                -> decltype(_CALL_MEMBER(get_env, (const _D&)__self))
+                -> decltype(_CALL_MEMBER(get_env, (const _Dp&)__self))
         {
             return _CALL_MEMBER(get_env, __self);
         }
 
-        template <same_as<get_env_t> _GetEnv, class _D = _Derived>
-            requires _MISSING_MEMBER(_D, get_env)
+        template <same_as<get_env_t> _GetEnv, class _Dp = _Derived>
+            requires _MISSING_MEMBER(_Dp, get_env)
         STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
             friend auto tag_invoke(_GetEnv, const _Derived& __self)
-                -> __call_result_t<get_env_t, __base_t<const _D&>>
+                -> __call_result_t<get_env_t, __base_t<const _Dp&>>
         {
             return stdexec::get_env(__get_base(__self));
         }
@@ -2989,9 +3161,8 @@
     __receiver_of_maybe_void<_Receiver, std::invoke_result_t<_Fun, _As...>>;
 
 template <class _Receiver, class _Fun, class... _As>
-void __set_value_invoke_(
-    _Receiver&& __rcvr, _Fun&& __fun,
-    _As&&... __as) noexcept(__nothrow_invocable<_Fun, _As...>)
+void __set_value_invoke_(_Receiver&& __rcvr, _Fun&& __fun, _As&&... __as) //
+    noexcept(__nothrow_invocable<_Fun, _As...>)
 {
     if constexpr (same_as<void, std::invoke_result_t<_Fun, _As...>>)
     {
@@ -3030,10 +3201,10 @@
 
 template <class _Fun, class... _Args>
     requires invocable<_Fun, _Args...>
-using __non_throwing_ = __bool<__nothrow_invocable<_Fun, _Args...>>;
+using __non_throwing_ = __mbool<__nothrow_invocable<_Fun, _Args...>>;
 
 template <class _Tag, class _Fun, class _Sender, class _Env>
-using __with_error_invoke_t =
+using __with_error_invoke_t = //
     __if_c<__v<__gather_completions_for<_Tag, _Sender, _Env,
                                         __mbind_front_q<__non_throwing_, _Fun>,
                                         __q<__mand>>>,
@@ -3041,7 +3212,7 @@
 
 template <class _Fun, class... _Args>
     requires invocable<_Fun, _Args...>
-using __set_value_invoke_t =
+using __set_value_invoke_t = //
     completion_signatures<__minvoke<__remove<void, __qf<set_value_t>>,
                                     std::invoke_result_t<_Fun, _Args...>>>;
 
@@ -3053,6 +3224,7 @@
 struct __receiver
 {
     using _Receiver = stdexec::__t<_ReceiverId>;
+
     struct __data
     {
         _Receiver __rcvr_;
@@ -3097,13 +3269,17 @@
     using _Receiver = stdexec::__t<_ReceiverId>;
     using __receiver_id = __receiver<_ReceiverId, _Fun>;
     using __receiver_t = stdexec::__t<__receiver_id>;
+
     struct __t : __immovable
     {
         using __id = __operation;
         typename __receiver_id::__data __data_;
         connect_result_t<_Sender, __receiver_t> __op_;
 
-        __t(_Sender&& __sndr, _Receiver __rcvr, _Fun __fun) :
+        __t(_Sender&& __sndr, _Receiver __rcvr, _Fun __fun) //
+            noexcept(__nothrow_decay_copyable<_Receiver>    //
+                         && __nothrow_decay_copyable<_Fun>  //
+                             && __nothrow_connectable<_Sender, __receiver_t>) :
             __data_{(_Receiver &&) __rcvr, (_Fun &&) __fun},
             __op_(connect((_Sender &&) __sndr, __receiver_t{&__data_}))
         {}
@@ -3129,21 +3305,27 @@
     struct __t
     {
         using __id = __sender;
+        using is_sender = void;
         [[no_unique_address]] _Sender __sndr_;
         [[no_unique_address]] _Fun __fun_;
 
         template <class _Self, class _Env>
-        using __completion_signatures = __make_completion_signatures<
-            __copy_cvref_t<_Self, _Sender>, _Env,
-            __with_error_invoke_t<set_value_t, _Fun,
-                                  __copy_cvref_t<_Self, _Sender>, _Env>,
-            __mbind_front_q<__set_value_invoke_t, _Fun>>;
+        using __completion_signatures = //
+            __make_completion_signatures<
+                __copy_cvref_t<_Self, _Sender>, _Env,
+                __with_error_invoke_t<set_value_t, _Fun,
+                                      __copy_cvref_t<_Self, _Sender>, _Env>,
+                __mbind_front_q<__set_value_invoke_t, _Fun>>;
 
         template <__decays_to<__t> _Self, receiver _Receiver>
             requires sender_to<__copy_cvref_t<_Self, _Sender>,
                                __receiver<_Receiver>>
-        friend auto tag_invoke(connect_t, _Self&& __self, _Receiver __rcvr)
-            -> __operation<_Self, _Receiver>
+        friend auto tag_invoke(connect_t, _Self&& __self, _Receiver __rcvr) //
+            noexcept(__nothrow_constructible_from<
+                     __operation<_Self, _Receiver>,
+                     __copy_cvref_t<_Self, _Sender>, _Receiver&&,
+                     __copy_cvref_t<_Self, _Fun>>)
+                -> __operation<_Self, _Receiver>
         {
             return {((_Self &&) __self).__sndr_, (_Receiver &&) __rcvr,
                     ((_Self &&) __self).__fun_};
@@ -3158,9 +3340,9 @@
             -> __completion_signatures<_Self, _Env>
             requires true;
 
-        friend auto tag_invoke(get_env_t, const __t& __self) noexcept(
-            __nothrow_callable<get_env_t, const _Sender&>)
-            -> __call_result_t<get_env_t, const _Sender&>
+        friend auto tag_invoke(get_env_t, const __t& __self) //
+            noexcept(__nothrow_callable<get_env_t, const _Sender&>)
+                -> __call_result_t<get_env_t, const _Sender&>
         {
             return get_env(__self.__sndr_);
         }
@@ -3170,7 +3352,7 @@
 struct then_t
 {
     template <class _Sender, class _Fun>
-    using __sender = __t<__sender<stdexec::__id<decay_t<_Sender>>, _Fun>>;
+    using __sender = __t<__sender<stdexec::__id<__decay_t<_Sender>>, _Fun>>;
 
     template <sender _Sender, __movable_value _Fun>
         requires(!__tag_invocable_with_completion_scheduler<then_t, set_value_t,
@@ -3181,6 +3363,7 @@
     {
         return __sender<_Sender, _Fun>{(_Sender &&) __sndr, (_Fun &&) __fun};
     }
+
     template <sender _Sender, __movable_value _Fun>
         requires __tag_invocable_with_completion_scheduler<then_t, set_value_t,
                                                            _Sender, _Fun>
@@ -3193,6 +3376,7 @@
         return tag_invoke(then_t{}, std::move(__sched), (_Sender &&) __sndr,
                           (_Fun &&) __fun);
     }
+
     template <sender _Sender, __movable_value _Fun>
         requires(!__tag_invocable_with_completion_scheduler<then_t, set_value_t,
                                                             _Sender, _Fun>) &&
@@ -3202,6 +3386,7 @@
     {
         return tag_invoke(then_t{}, (_Sender &&) __sndr, (_Fun &&) __fun);
     }
+
     template <class _Fun>
     __binder_back<then_t, _Fun> operator()(_Fun __fun) const
     {
@@ -3209,6 +3394,7 @@
     }
 };
 } // namespace __then
+
 using __then::then_t;
 inline constexpr then_t then{};
 
@@ -3274,25 +3460,26 @@
     struct __t
     {
         using __id = __sender;
+        using is_sender = void;
 
         [[no_unique_address]] _Sender __sndr_;
         [[no_unique_address]] _Fun __fun_;
 
         template <class _Self, class _Env>
-        using __completion_signatures = __make_completion_signatures<
-            __copy_cvref_t<_Self, _Sender>, _Env,
-            __with_error_invoke_t<set_error_t, _Fun,
-                                  __copy_cvref_t<_Self, _Sender>, _Env>,
-            __q<__compl_sigs::__default_set_value>,
-            __mbind_front_q<__set_value_invoke_t, _Fun>>;
+        using __completion_signatures = //
+            __make_completion_signatures<
+                __copy_cvref_t<_Self, _Sender>, _Env,
+                __with_error_invoke_t<set_error_t, _Fun,
+                                      __copy_cvref_t<_Self, _Sender>, _Env>,
+                __q<__compl_sigs::__default_set_value>,
+                __mbind_front_q<__set_value_invoke_t, _Fun>>;
 
         template <__decays_to<__t> _Self, receiver _Receiver>
             requires sender_to<__copy_cvref_t<_Self, _Sender>,
                                __receiver<_Receiver>>
-        friend auto
-            tag_invoke(connect_t, _Self&& __self, _Receiver __rcvr) noexcept(
-                __nothrow_connectable<__copy_cvref_t<_Self, _Sender>,
-                                      __receiver<_Receiver>>)
+        friend auto tag_invoke(connect_t, _Self&& __self, _Receiver __rcvr) //
+            noexcept(__nothrow_connectable<__copy_cvref_t<_Self, _Sender>,
+                                           __receiver<_Receiver>>)
                 -> connect_result_t<__copy_cvref_t<_Self, _Sender>,
                                     __receiver<_Receiver>>
         {
@@ -3310,9 +3497,9 @@
             -> __completion_signatures<_Self, _Env>
             requires true;
 
-        friend auto tag_invoke(get_env_t, const __t& __self) noexcept(
-            __nothrow_callable<get_env_t, const _Sender&>)
-            -> __call_result_t<get_env_t, const _Sender&>
+        friend auto tag_invoke(get_env_t, const __t& __self) //
+            noexcept(__nothrow_callable<get_env_t, const _Sender&>)
+                -> __call_result_t<get_env_t, const _Sender&>
         {
             return get_env(__self.__sndr_);
         }
@@ -3322,8 +3509,7 @@
 struct upon_error_t
 {
     template <class _Sender, class _Fun>
-    using __sender =
-        __t<__sender<stdexec::__id<remove_cvref_t<_Sender>>, _Fun>>;
+    using __sender = __t<__sender<stdexec::__id<__decay_t<_Sender>>, _Fun>>;
 
     template <sender _Sender, __movable_value _Fun>
         requires __tag_invocable_with_completion_scheduler<
@@ -3338,6 +3524,7 @@
         return tag_invoke(upon_error_t{}, std::move(__sched),
                           (_Sender &&) __sndr, (_Fun &&) __fun);
     }
+
     template <sender _Sender, __movable_value _Fun>
         requires(!__tag_invocable_with_completion_scheduler<
                     upon_error_t, set_error_t, _Sender, _Fun>) &&
@@ -3347,6 +3534,7 @@
     {
         return tag_invoke(upon_error_t{}, (_Sender &&) __sndr, (_Fun &&) __fun);
     }
+
     template <sender _Sender, __movable_value _Fun>
         requires(!__tag_invocable_with_completion_scheduler<
                     upon_error_t, set_error_t, _Sender, _Fun>) &&
@@ -3356,6 +3544,7 @@
     {
         return __sender<_Sender, _Fun>{(_Sender &&) __sndr, (_Fun &&) __fun};
     }
+
     template <class _Fun>
     __binder_back<upon_error_t, _Fun> operator()(_Fun __fun) const
     {
@@ -3363,6 +3552,7 @@
     }
 };
 } // namespace __upon_error
+
 using __upon_error::upon_error_t;
 inline constexpr upon_error_t upon_error{};
 
@@ -3422,28 +3612,29 @@
     struct __t
     {
         using __id = __sender;
+        using is_sender = void;
 
         [[no_unique_address]] _Sender __sndr_;
         [[no_unique_address]] _Fun __fun_;
 
         template <class _Self, class _Env>
-        using __completion_signatures = __make_completion_signatures<
-            __copy_cvref_t<_Self, _Sender>, _Env,
-            __with_error_invoke_t<set_stopped_t, _Fun,
-                                  __copy_cvref_t<_Self, _Sender>, _Env>,
-            __q<__compl_sigs::__default_set_value>,
-            __q<__compl_sigs::__default_set_error>, __set_value_invoke_t<_Fun>>;
+        using __completion_signatures = //
+            __make_completion_signatures<
+                __copy_cvref_t<_Self, _Sender>, _Env,
+                __with_error_invoke_t<set_stopped_t, _Fun,
+                                      __copy_cvref_t<_Self, _Sender>, _Env>,
+                __q<__compl_sigs::__default_set_value>,
+                __q<__compl_sigs::__default_set_error>,
+                __set_value_invoke_t<_Fun>>;
 
         template <__decays_to<__t> _Self, receiver _Receiver>
             requires __receiver_of_invoke_result<_Receiver, _Fun> &&
                      sender_to<__copy_cvref_t<_Self, _Sender>,
                                __receiver<_Receiver>>
-                     friend auto tag_invoke(
-                         connect_t, _Self&& __self,
-                         _Receiver
-                             __rcvr) noexcept(__nothrow_connectable<_Sender,
-                                                                    __receiver<
-                                                                        _Receiver>>)
+                     friend auto tag_invoke(connect_t, _Self&& __self,
+                                            _Receiver __rcvr) //
+                     noexcept(
+                         __nothrow_connectable<_Sender, __receiver<_Receiver>>)
                          -> connect_result_t<__copy_cvref_t<_Self, _Sender>,
                                              __receiver<_Receiver>>
         {
@@ -3461,9 +3652,9 @@
             -> __completion_signatures<_Self, _Env>
             requires true;
 
-        friend auto tag_invoke(get_env_t, const __t& __self) noexcept(
-            __nothrow_callable<get_env_t, const _Sender&>)
-            -> __call_result_t<get_env_t, const _Sender&>
+        friend auto tag_invoke(get_env_t, const __t& __self) //
+            noexcept(__nothrow_callable<get_env_t, const _Sender&>)
+                -> __call_result_t<get_env_t, const _Sender&>
         {
             return get_env(__self.__sndr_);
         }
@@ -3473,7 +3664,7 @@
 struct upon_stopped_t
 {
     template <class _Sender, class _Fun>
-    using __sender = __t<__sender<__id<remove_cvref_t<_Sender>>, _Fun>>;
+    using __sender = __t<__sender<__id<__decay_t<_Sender>>, _Fun>>;
 
     template <sender _Sender, __movable_value _Fun>
         requires __tag_invocable_with_completion_scheduler<
@@ -3489,6 +3680,7 @@
         return tag_invoke(upon_stopped_t{}, std::move(__sched),
                           (_Sender &&) __sndr, (_Fun &&) __fun);
     }
+
     template <sender _Sender, __movable_value _Fun>
         requires(!__tag_invocable_with_completion_scheduler<
                     upon_stopped_t, set_stopped_t, _Sender, _Fun>) &&
@@ -3499,6 +3691,7 @@
         return tag_invoke(upon_stopped_t{}, (_Sender &&) __sndr,
                           (_Fun &&) __fun);
     }
+
     template <sender _Sender, __movable_value _Fun>
         requires(!__tag_invocable_with_completion_scheduler<
                     upon_stopped_t, set_stopped_t, _Sender, _Fun>) &&
@@ -3508,6 +3701,7 @@
     {
         return __sender<_Sender, _Fun>{(_Sender &&) __sndr, (_Fun &&) __fun};
     }
+
     template <__callable _Fun>
     __binder_back<upon_stopped_t, _Fun> operator()(_Fun __fun) const
     {
@@ -3515,6 +3709,7 @@
     }
 };
 } // namespace __upon_stopped
+
 using __upon_stopped::upon_stopped_t;
 inline constexpr upon_stopped_t upon_stopped{};
 
@@ -3566,6 +3761,7 @@
 
       public:
         using __id = __receiver;
+
         explicit __t(_Receiver __rcvr, _Shape __shape, _Fun __fun) :
             receiver_adaptor<__t, _Receiver>((_Receiver &&) __rcvr),
             __shape_(__shape), __f_((_Fun &&) __fun)
@@ -3573,6 +3769,9 @@
     };
 };
 
+template <class _Ty>
+using __decay_ref = __decay_t<_Ty>&;
+
 template <class _SenderId, integral _Shape, class _Fun>
 struct __sender
 {
@@ -3585,30 +3784,34 @@
     struct __t
     {
         using __id = __sender;
+        using is_sender = void;
 
         [[no_unique_address]] _Sender __sndr_;
         [[no_unique_address]] _Shape __shape_;
         [[no_unique_address]] _Fun __fun_;
 
         template <class _Sender, class _Env>
-        using __with_error_invoke_t = __if_c<
-            __v<__value_types_of_t<
-                _Sender, _Env, __mbind_front_q<__non_throwing_, _Fun, _Shape>,
-                __q<__mand>>>,
-            completion_signatures<>, __with_exception_ptr>;
+        using __with_error_invoke_t = //
+            __if_c<
+                __v<__value_types_of_t<
+                    _Sender, _Env,
+                    __transform<__q<__decay_ref>,
+                                __mbind_front_q<__non_throwing_, _Fun, _Shape>>,
+                    __q<__mand>>>,
+                completion_signatures<>, __with_exception_ptr>;
 
         template <class _Self, class _Env>
-        using __completion_signatures = __make_completion_signatures<
-            __copy_cvref_t<_Self, _Sender>, _Env,
-            __with_error_invoke_t<__copy_cvref_t<_Self, _Sender>, _Env>>;
+        using __completion_signatures = //
+            __make_completion_signatures<
+                __copy_cvref_t<_Self, _Sender>, _Env,
+                __with_error_invoke_t<__copy_cvref_t<_Self, _Sender>, _Env>>;
 
         template <__decays_to<__t> _Self, receiver _Receiver>
             requires sender_to<__copy_cvref_t<_Self, _Sender>,
                                __receiver<_Receiver>>
-        friend auto
-            tag_invoke(connect_t, _Self&& __self, _Receiver __rcvr) noexcept(
-                __nothrow_connectable<__copy_cvref_t<_Self, _Sender>,
-                                      __receiver<_Receiver>>)
+        friend auto tag_invoke(connect_t, _Self&& __self, _Receiver __rcvr) //
+            noexcept(__nothrow_connectable<__copy_cvref_t<_Self, _Sender>,
+                                           __receiver<_Receiver>>)
                 -> connect_result_t<__copy_cvref_t<_Self, _Sender>,
                                     __receiver<_Receiver>>
         {
@@ -3627,9 +3830,9 @@
             -> __completion_signatures<_Self, _Env>
             requires true;
 
-        friend auto tag_invoke(get_env_t, const __t& __self) noexcept(
-            __nothrow_callable<get_env_t, const _Sender&>)
-            -> __call_result_t<get_env_t, const _Sender&>
+        friend auto tag_invoke(get_env_t, const __t& __self) //
+            noexcept(__nothrow_callable<get_env_t, const _Sender&>)
+                -> __call_result_t<get_env_t, const _Sender&>
         {
             return get_env(__self.__sndr_);
         }
@@ -3640,7 +3843,7 @@
 {
     template <sender _Sender, integral _Shape, class _Fun>
     using __sender =
-        __t<__sender<stdexec::__id<remove_cvref_t<_Sender>>, _Shape, _Fun>>;
+        __t<__sender<stdexec::__id<__decay_t<_Sender>>, _Shape, _Fun>>;
 
     template <sender _Sender, integral _Shape, __movable_value _Fun>
         requires __tag_invocable_with_completion_scheduler<
@@ -3654,6 +3857,7 @@
         return tag_invoke(bulk_t{}, std::move(__sched), (_Sender &&) __sndr,
                           (_Shape &&) __shape, (_Fun &&) __fun);
     }
+
     template <sender _Sender, integral _Shape, __movable_value _Fun>
         requires(!__tag_invocable_with_completion_scheduler<
                     bulk_t, set_value_t, _Sender, _Shape, _Fun>) &&
@@ -3664,6 +3868,7 @@
         return tag_invoke(bulk_t{}, (_Sender &&) __sndr, (_Shape &&) __shape,
                           (_Fun &&) __fun);
     }
+
     template <sender _Sender, integral _Shape, __movable_value _Fun>
         requires(!__tag_invocable_with_completion_scheduler<
                     bulk_t, set_value_t, _Sender, _Shape, _Fun>) &&
@@ -3674,6 +3879,7 @@
         return __sender<_Sender, _Shape, _Fun>{(_Sender &&) __sndr, __shape,
                                                (_Fun &&) __fun};
     }
+
     template <integral _Shape, class _Fun>
     __binder_back<bulk_t, _Shape, _Fun> operator()(_Shape __shape,
                                                    _Fun __fun) const
@@ -3682,6 +3888,7 @@
     }
 };
 } // namespace __bulk
+
 using __bulk::bulk_t;
 inline constexpr bulk_t bulk{};
 
@@ -3690,21 +3897,22 @@
 namespace __split
 {
 template <class _BaseEnv>
-using __env_t = __make_env_t<_BaseEnv, // BUGBUG NOT TO SPEC
-                             __with<get_stop_token_t, in_place_stop_token>>;
+using __env_t =            //
+    __make_env_t<_BaseEnv, // BUGBUG NOT TO SPEC
+                 __with<get_stop_token_t, in_place_stop_token>>;
 
-template <class _SenderId, class _EnvId>
+template <class _CvrefSenderId, class _EnvId>
 struct __sh_state;
 
-template <class _SenderId, class _EnvId>
+template <class _CvrefSenderId, class _EnvId>
 struct __receiver
 {
-    using _Sender = stdexec::__t<_SenderId>;
+    using _CvrefSender = stdexec::__cvref_t<_CvrefSenderId>;
     using _Env = stdexec::__t<_EnvId>;
 
     class __t
     {
-        stdexec::__t<__sh_state<_SenderId, _EnvId>>& __sh_state_;
+        stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>& __sh_state_;
 
       public:
         using __id = __receiver;
@@ -3713,7 +3921,7 @@
                   class... _As>
         friend void tag_invoke(_Tag __tag, __t&& __self, _As&&... __as) noexcept
         {
-            stdexec::__t<__sh_state<_SenderId, _EnvId>>& __state =
+            stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>& __state =
                 __self.__sh_state_;
 
             try
@@ -3738,8 +3946,8 @@
             return __self.__sh_state_.__env_;
         }
 
-        explicit __t(
-            stdexec::__t<__sh_state<_SenderId, _EnvId>>& __sh_state) noexcept :
+        explicit __t(stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>&
+                         __sh_state) noexcept :
             __sh_state_(__sh_state)
         {}
     };
@@ -3753,10 +3961,10 @@
     __notify_fn* __notify_{};
 };
 
-template <class _SenderId, class _EnvId>
+template <class _CvrefSenderId, class _EnvId>
 struct __sh_state
 {
-    using _Sender = stdexec::__t<_SenderId>;
+    using _CvrefSender = stdexec::__cvref_t<_CvrefSenderId>;
     using _Env = stdexec::__t<_EnvId>;
 
     struct __t
@@ -3764,36 +3972,37 @@
         using __id = __sh_state;
 
         template <class... _Ts>
-        using __bind_tuples =
+        using __bind_tuples = //
             __mbind_front_q<__variant,
                             std::tuple<set_stopped_t>, // Initial state of the
                                                        // variant is set_stopped
                             std::tuple<set_error_t, std::exception_ptr>,
                             _Ts...>;
 
-        using __bound_values_t =
-            __value_types_of_t<_Sender, __env_t<_Env>,
+        using __bound_values_t = //
+            __value_types_of_t<_CvrefSender, __env_t<_Env>,
                                __mbind_front_q<__decayed_tuple, set_value_t>,
                                __q<__bind_tuples>>;
 
-        using __variant_t = __error_types_of_t<
-            _Sender, __env_t<_Env>,
-            __transform<__mbind_front_q<__decayed_tuple, set_error_t>,
-                        __bound_values_t>>;
+        using __variant_t = //
+            __error_types_of_t<
+                _CvrefSender, __env_t<_Env>,
+                __transform<__mbind_front_q<__decayed_tuple, set_error_t>,
+                            __bound_values_t>>;
 
-        using __receiver_ = stdexec::__t<__receiver<_SenderId, _EnvId>>;
+        using __receiver_ = stdexec::__t<__receiver<_CvrefSenderId, _EnvId>>;
 
         in_place_stop_source __stop_source_{};
         __variant_t __data_;
         std::atomic<void*> __head_{nullptr};
         __env_t<_Env> __env_;
-        connect_result_t<_Sender&, __receiver_> __op_state2_;
+        connect_result_t<_CvrefSender, __receiver_> __op_state2_;
 
-        explicit __t(_Sender& __sndr, _Env __env) :
+        explicit __t(_CvrefSender&& __sndr, _Env __env) :
             __env_(__make_env(
                 (_Env &&) __env,
                 __with_(get_stop_token, __stop_source_.get_token()))),
-            __op_state2_(connect(__sndr, __receiver_{*this}))
+            __op_state2_(connect((_CvrefSender &&) __sndr, __receiver_{*this}))
         {}
 
         void __notify() noexcept
@@ -3814,10 +4023,10 @@
     };
 };
 
-template <class _SenderId, class _EnvId, class _ReceiverId>
+template <class _CvrefSenderId, class _EnvId, class _ReceiverId>
 struct __operation
 {
-    using _Sender = stdexec::__t<_SenderId>;
+    using _CvrefSender = stdexec::__cvref_t<_CvrefSenderId>;
     using _Env = stdexec::__t<_EnvId>;
     using _Receiver = stdexec::__t<_ReceiverId>;
 
@@ -3826,30 +4035,35 @@
         struct __on_stop_requested
         {
             in_place_stop_source& __stop_source_;
+
             void operator()() noexcept
             {
                 __stop_source_.request_stop();
             }
         };
-        using __on_stop = std::optional<typename stop_token_of_t<
-            env_of_t<_Receiver>&>::template callback_type<__on_stop_requested>>;
+
+        using __on_stop = //
+            std::optional<typename stop_token_of_t<env_of_t<_Receiver>&>::
+                              template callback_type<__on_stop_requested>>;
 
         _Receiver __recvr_;
         __on_stop __on_stop_{};
-        std::shared_ptr<stdexec::__t<__sh_state<_SenderId, _EnvId>>>
+        std::shared_ptr<stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>>
             __shared_state_;
 
       public:
         using __id = __operation;
-        __t(_Receiver&& __rcvr,
-            std::shared_ptr<stdexec::__t<__sh_state<_SenderId, _EnvId>>>
-                __shared_state) noexcept(std::
-                                             is_nothrow_move_constructible_v<
-                                                 _Receiver>) :
+
+        __t( //
+            _Receiver&& __rcvr,
+            std::shared_ptr<stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>>
+                __shared_state) //
+            noexcept(std::is_nothrow_move_constructible_v<_Receiver>) :
             __operation_base{nullptr, __notify},
             __recvr_((_Receiver &&) __rcvr),
             __shared_state_(std::move(__shared_state))
         {}
+
         STDEXEC_IMMOVABLE(__t);
 
         static void __notify(__operation_base* __self) noexcept
@@ -3871,7 +4085,7 @@
 
         friend void tag_invoke(start_t, __t& __self) noexcept
         {
-            stdexec::__t<__sh_state<_SenderId, _EnvId>>* __shared_state =
+            stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>* __shared_state =
                 __self.__shared_state_.get();
             std::atomic<void*>& __head = __shared_state->__head_;
             void* const __completion_state = static_cast<void*>(__shared_state);
@@ -3915,46 +4129,54 @@
     };
 };
 
-template <class _SenderId, class _EnvId>
+template <class _CvrefSenderId, class _EnvId>
 struct __sender
 {
-    using _Sender = stdexec::__t<_SenderId>;
+    using _CvrefSender = stdexec::__cvref_t<_CvrefSenderId>;
     using _Env = stdexec::__t<_EnvId>;
 
     template <class _Receiver>
-    using __operation =
-        stdexec::__t<__operation<_SenderId, _EnvId, stdexec::__id<_Receiver>>>;
+    using __operation = stdexec::__t<
+        __operation<_CvrefSenderId, _EnvId, stdexec::__id<_Receiver>>>;
 
-    class __t
+    struct __t
     {
-        using __sh_state_ = stdexec::__t<__sh_state<_SenderId, _EnvId>>;
+        using __id = __sender;
+        using is_sender = void;
+
+        explicit __t(_CvrefSender&& __sndr, _Env __env) :
+            __shared_state_{std::make_shared<__sh_state_>(
+                (_CvrefSender &&) __sndr, (_Env &&) __env)}
+        {}
+
+      private:
+        using __sh_state_ = stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>;
 
         template <class... _Tys>
         using __set_value_t =
-            completion_signatures<set_value_t(const decay_t<_Tys>&...)>;
+            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>&)>;
+            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>;
+        using __completions_t = //
+            make_completion_signatures<
+                // NOT TO SPEC:
+                // See
+                // https://github.com/brycelelbach/wg21_p2300_execution/issues/26
+                _CvrefSender, __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:
-        using __id = __sender;
-
         template <__decays_to<__t> _Self,
                   receiver_of<__completions_t<_Self>> _Receiver>
-        friend auto
-            tag_invoke(connect_t, _Self&& __self, _Receiver __recvr) noexcept(
-                std::is_nothrow_move_constructible_v<_Receiver>)
+        friend auto tag_invoke(connect_t, _Self&& __self, _Receiver __recvr) //
+            noexcept(std::is_nothrow_move_constructible_v<_Receiver>)
                 -> __operation<_Receiver>
         {
             return __operation<_Receiver>{(_Receiver &&) __recvr,
@@ -3964,12 +4186,6 @@
         template <__decays_to<__t> _Self, class _OtherEnv>
         friend auto tag_invoke(get_completion_signatures_t, _Self&&, _OtherEnv)
             -> __completions_t<_Self>;
-
-        explicit __t(_Sender __sndr, _Env __env) :
-            __sndr_((_Sender &&) __sndr), __shared_state_{
-                                              std::make_shared<__sh_state_>(
-                                                  __sndr_, (_Env &&) __env)}
-        {}
     };
 };
 
@@ -3979,28 +4195,27 @@
 // are the signatures to test against, in order:
 using _Sender = __0;
 using _Env = __1;
-using __cust_sigs = __types<
-    tag_invoke_t(split_t,
-                 get_completion_scheduler_t<set_value_t>(get_env_t(_Sender&)),
-                 _Sender),
-    tag_invoke_t(split_t,
-                 get_completion_scheduler_t<set_value_t>(get_env_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)>;
+using __cust_sigs = //
+    __types<tag_invoke_t(split_t,
+                         get_completion_scheduler_t<set_value_t>(
+                             get_env_t(const _Sender&)),
+                         _Sender),
+            tag_invoke_t(split_t,
+                         get_completion_scheduler_t<set_value_t>(
+                             get_env_t(const _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 =
     __minvocable<__which<__cust_sigs>, _Sender, _Env>;
 
 template <class _Sender, class _Env>
-using __sender_t = __t<__sender<stdexec::__id<remove_cvref_t<_Sender>>,
-                                stdexec::__id<remove_cvref_t<_Env>>>>;
-
-template <class _Sender, class _Env>
-using __receiver_t = __t<__receiver<stdexec::__id<remove_cvref_t<_Sender>>,
-                                    stdexec::__id<remove_cvref_t<_Env>>>>;
+using __sender_t = __t<__sender<stdexec::__cvref_id<_Sender, _Sender>,
+                                stdexec::__id<__decay_t<_Env>>>>;
 
 template <class _Sender, class _Env>
 using __dispatcher_for =
@@ -4010,8 +4225,8 @@
 struct split_t
 {
     template <sender _Sender, class _Env = empty_env>
-        requires(copy_constructible<remove_cvref_t<_Sender>> &&
-                 sender_to<_Sender&, __receiver_t<_Sender, _Env>>) ||
+        requires(sender_in<_Sender, _Env> &&
+                 __decay_copyable<env_of_t<_Sender>>) ||
                 __is_split_customized<_Sender, _Env>
                 auto operator()(_Sender&& __sndr, _Env&& __env = _Env{}) const
                 noexcept(__nothrow_callable<__dispatcher_for<_Sender, _Env>,
@@ -4029,6 +4244,7 @@
     }
 };
 } // namespace __split
+
 using __split::split_t;
 inline constexpr split_t split{};
 
@@ -4037,8 +4253,9 @@
 namespace __ensure_started
 {
 template <class _BaseEnv>
-using __env_t = __make_env_t<_BaseEnv, // NOT TO SPEC
-                             __with<get_stop_token_t, in_place_stop_token>>;
+using __env_t =            //
+    __make_env_t<_BaseEnv, // NOT TO SPEC
+                 __with<get_stop_token_t, in_place_stop_token>>;
 
 template <class _SenderId, class _EnvId>
 struct __sh_state;
@@ -4056,6 +4273,7 @@
 
       public:
         using __id = __receiver;
+
         explicit __t(stdexec::__t<__sh_state<_SenderId, _EnvId>>&
                          __shared_state) noexcept :
             __shared_state_(__shared_state.__intrusive_from_this())
@@ -4110,22 +4328,23 @@
         using __id = __sh_state;
 
         template <class... _Ts>
-        using __bind_tuples =
+        using __bind_tuples = //
             __mbind_front_q<__variant,
                             std::tuple<set_stopped_t>, // Initial state of the
                                                        // variant is set_stopped
                             std::tuple<set_error_t, std::exception_ptr>,
                             _Ts...>;
 
-        using __bound_values_t =
+        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, __env_t<_Env>,
-            __transform<__mbind_front_q<__decayed_tuple, set_error_t>,
-                        __bound_values_t>>;
+        using __variant_t = //
+            __error_types_of_t<
+                _Sender, __env_t<_Env>,
+                __transform<__mbind_front_q<__decayed_tuple, set_error_t>,
+                            __bound_values_t>>;
 
         using __receiver_t = stdexec::__t<__receiver<_SenderId, _EnvId>>;
 
@@ -4176,13 +4395,16 @@
         struct __on_stop_requested
         {
             in_place_stop_source& __stop_source_;
+
             void operator()() noexcept
             {
                 __stop_source_.request_stop();
             }
         };
-        using __on_stop = std::optional<typename stop_token_of_t<
-            env_of_t<_Receiver>&>::template callback_type<__on_stop_requested>>;
+
+        using __on_stop = //
+            std::optional<typename stop_token_of_t<env_of_t<_Receiver>&>::
+                              template callback_type<__on_stop_requested>>;
 
         _Receiver __rcvr_;
         __on_stop __on_stop_{};
@@ -4191,15 +4413,17 @@
 
       public:
         using __id = __operation;
-        __t(_Receiver __rcvr,
+
+        __t(                  //
+            _Receiver __rcvr, //
             __intrusive_ptr<stdexec::__t<__sh_state<_SenderId, _EnvId>>>
-                __shared_state) noexcept(std::
-                                             is_nothrow_move_constructible_v<
-                                                 _Receiver>) :
+                __shared_state) //
+            noexcept(std::is_nothrow_move_constructible_v<_Receiver>) :
             __operation_base{__notify},
             __rcvr_((_Receiver &&) __rcvr),
             __shared_state_(std::move(__shared_state))
         {}
+
         ~__t()
         {
             // Check to see if this operation was ever started. If not,
@@ -4210,6 +4434,7 @@
                 __shared_state_->__detach();
             }
         }
+
         STDEXEC_IMMOVABLE(__t);
 
         static void __notify(__operation_base* __self) noexcept
@@ -4280,53 +4505,17 @@
     using _Sender = stdexec::__t<_SenderId>;
     using _Env = stdexec::__t<_EnvId>;
 
-    class __t
+    struct __t
     {
-        using __sh_state_ = stdexec::__t<__sh_state<_SenderId, _EnvId>>;
-        template <class _Receiver>
-        using __operation = stdexec::__t<
-            __operation<_SenderId, _EnvId, stdexec::__id<_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<__t> _Self,
-                  receiver_of<__completions_t<_Self>> _Receiver>
-        friend auto
-            tag_invoke(connect_t, _Self&& __self, _Receiver __rcvr) noexcept(
-                std::is_nothrow_move_constructible_v<_Receiver>)
-                -> __operation<_Receiver>
-        {
-            return __operation<_Receiver>{(_Receiver &&) __rcvr,
-                                          std::move(__self).__shared_state_};
-        }
-
-        template <same_as<__t> _Self, class _OtherEnv>
-        friend auto tag_invoke(get_completion_signatures_t, _Self&&, _OtherEnv)
-            -> __completions_t<_Self>;
-
-      public:
         using __id = __sender;
+        using is_sender = void;
+
         explicit __t(_Sender __sndr, _Env __env) :
             __sndr_((_Sender &&) __sndr), __shared_state_{
                                               __make_intrusive<__sh_state_>(
                                                   __sndr_, (_Env &&) __env)}
         {}
+
         ~__t()
         {
             if (nullptr != __shared_state_)
@@ -4336,8 +4525,48 @@
                 __shared_state_->__detach(); // BUGBUG NOT TO SPEC
             }
         }
+
         // Move-only:
         __t(__t&&) = default;
+
+      private:
+        using __sh_state_ = stdexec::__t<__sh_state<_SenderId, _EnvId>>;
+        template <class _Receiver>
+        using __operation = stdexec::__t<
+            __operation<_SenderId, _EnvId, stdexec::__id<_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<__t> _Self,
+                  receiver_of<__completions_t<_Self>> _Receiver>
+        friend auto tag_invoke(connect_t, _Self&& __self, _Receiver __rcvr) //
+            noexcept(std::is_nothrow_move_constructible_v<_Receiver>)
+                -> __operation<_Receiver>
+        {
+            return __operation<_Receiver>{(_Receiver &&) __rcvr,
+                                          std::move(__self).__shared_state_};
+        }
+
+        template <same_as<__t> _Self, class _OtherEnv>
+        friend auto tag_invoke(get_completion_signatures_t, _Self&&, _OtherEnv)
+            -> __completions_t<_Self>;
     };
 };
 
@@ -4347,29 +4576,32 @@
 // are the signatures to test against, in order:
 using _Sender = __0;
 using _Env = __1;
-using __cust_sigs = __types<
-    tag_invoke_t(ensure_started_t,
-                 get_completion_scheduler_t<set_value_t>(get_env_t(_Sender&)),
-                 _Sender),
-    tag_invoke_t(ensure_started_t,
-                 get_completion_scheduler_t<set_value_t>(get_env_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)>;
+using __cust_sigs = //
+    __types<tag_invoke_t(
+                ensure_started_t,
+                get_completion_scheduler_t<set_value_t>(get_env_t(_Sender&)),
+                _Sender),
+            tag_invoke_t(
+                ensure_started_t,
+                get_completion_scheduler_t<set_value_t>(get_env_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 =
     __minvocable<__which<__cust_sigs>, _Sender, _Env>;
 
 template <class _Sender, class _Env>
-using __sender_t = __t<__sender<stdexec::__id<remove_cvref_t<_Sender>>,
-                                stdexec::__id<remove_cvref_t<_Env>>>>;
+using __sender_t = __t<__sender<stdexec::__id<__decay_t<_Sender>>,
+                                stdexec::__id<__decay_t<_Env>>>>;
 
 template <class _Sender, class _Env>
-using __receiver_t = __t<__receiver<stdexec::__id<remove_cvref_t<_Sender>>,
-                                    stdexec::__id<remove_cvref_t<_Env>>>>;
+using __receiver_t = __t<__receiver<stdexec::__id<__decay_t<_Sender>>,
+                                    stdexec::__id<__decay_t<_Env>>>>;
 
 template <class _Sender, class _Env>
 using __dispatcher_for =
@@ -4380,14 +4612,15 @@
 void __test_ensure_started_sender(const __sender<_SenderId, _EnvId>& __sndr2){};
 
 template <class _Sender>
-concept __ensure_started_sender = requires(typename _Sender::__id __sndr1) {
-                                      __test_ensure_started_sender(__sndr1);
-                                  };
+concept __ensure_started_sender = //
+    requires(typename _Sender::__id __sndr1) {
+        __test_ensure_started_sender(__sndr1);
+    };
 
 struct ensure_started_t
 {
     template <sender _Sender, class _Env = empty_env>
-        requires(copy_constructible<remove_cvref_t<_Sender>> &&
+        requires(copy_constructible<__decay_t<_Sender>> &&
                  sender_to<_Sender&, __receiver_t<_Sender, _Env>>) ||
                 __is_ensure_started_customized<_Sender, _Env>
                 auto operator()(_Sender&& __sndr, _Env&& __env = _Env{}) const
@@ -4412,6 +4645,7 @@
     }
 };
 } // namespace __ensure_started
+
 using __ensure_started::ensure_started_t;
 inline constexpr ensure_started_t ensure_started{};
 
@@ -4421,8 +4655,8 @@
 // [execution.senders.adaptors.let_stopped]
 namespace __let
 {
-template <class _T>
-using __decay_ref = decay_t<_T>&;
+template <class _Tp>
+using __decay_ref = __decay_t<_Tp>&;
 
 template <class _Fun>
 using __result_sender =
@@ -4443,10 +4677,12 @@
 struct __tfx_signal_<_Set, _Set(_Args...)>
 {
     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)>>;
+    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, class _Sig>
@@ -4461,7 +4697,7 @@
     {
         using __id = __operation_base_;
         using __results_variant_t = std::variant<std::monostate, _Tuples...>;
-        using __op_state_variant_t =
+        using __op_state_variant_t = //
             __minvoke<__transform<__uncurry<__op_state_for<_Receiver, _Fun>>,
                                   __nullable_variant_t>,
                       _Tuples...>;
@@ -4488,28 +4724,31 @@
                      sender_to<__minvoke<__result_sender<_Fun>, _As...>,
                                _Receiver>
         friend void tag_invoke(_Tag, __t&& __self, _As&&... __as) noexcept
-        try
         {
-            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.__op_state_->__rcvr_),
-                      std::current_exception());
+            try
+            {
+                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.__op_state_->__rcvr_),
+                          std::current_exception());
+            }
         }
 
         template <__one_of<set_value_t, set_error_t, set_stopped_t> _Tag,
@@ -4534,10 +4773,11 @@
 };
 
 template <class _CvrefSenderId, class _ReceiverId, class _Fun, class _Let>
-using __receiver = stdexec::__t<__gather_completions_for<
-    _Let, __cvref_t<_CvrefSenderId>, env_of_t<__t<_ReceiverId>>,
-    __q<__decayed_tuple>,
-    __munique<__mbind_front_q<__receiver_, _ReceiverId, _Fun, _Let>>>>;
+using __receiver = //
+    stdexec::__t<__gather_completions_for<
+        _Let, __cvref_t<_CvrefSenderId>, env_of_t<__t<_ReceiverId>>,
+        __q<__decayed_tuple>,
+        __munique<__mbind_front_q<__receiver_, _ReceiverId, _Fun, _Let>>>>;
 
 template <class _CvrefSenderId, class _ReceiverId, class _Fun, class _Let>
 using __operation_base = typename __receiver<_CvrefSenderId, _ReceiverId, _Fun,
@@ -4580,9 +4820,10 @@
     struct __t
     {
         using __id = __sender;
+        using is_sender = void;
 
         template <class _Self, class _Receiver>
-        using __operation_t =
+        using __operation_t = //
             stdexec::__t<__operation<stdexec::__cvref_id<_Self, _Sender>,
                                      stdexec::__id<_Receiver>, _Fun, _Set>>;
         template <class _Self, class _Receiver>
@@ -4590,10 +4831,11 @@
                                         stdexec::__id<_Receiver>, _Fun, _Set>;
 
         template <class _Sender, class _Env>
-        using __completions = __mapply<
-            __transform<__mbind_front_q<__tfx_signal_t, _Env, _Fun, _Set>,
-                        __q<__concat_completion_signatures_t>>,
-            completion_signatures_of_t<_Sender, _Env>>;
+        using __completions = //
+            __mapply<
+                __transform<__mbind_front_q<__tfx_signal_t, _Env, _Fun, _Set>,
+                            __q<__concat_completion_signatures_t>>,
+                completion_signatures_of_t<_Sender, _Env>>;
 
         template <__decays_to<__t> _Self, receiver _Receiver>
             requires sender_to<__copy_cvref_t<_Self, _Sender>,
@@ -4606,9 +4848,9 @@
                                                    ((_Self &&) __self).__fun_};
         }
 
-        friend auto tag_invoke(get_env_t, const __t& __self) noexcept(
-            __nothrow_callable<get_env_t, const _Sender&>)
-            -> __call_result_t<get_env_t, const _Sender&>
+        friend auto tag_invoke(get_env_t, const __t& __self) //
+            noexcept(__nothrow_callable<get_env_t, const _Sender&>)
+                -> __call_result_t<get_env_t, const _Sender&>
         {
             return get_env(__self.__sndr_);
         }
@@ -4632,7 +4874,7 @@
     using __t = _SetTag;
     template <class _Sender, class _Fun>
     using __sender = stdexec::__t<
-        __let::__sender<stdexec::__id<remove_cvref_t<_Sender>>, _Fun, _LetTag>>;
+        __let::__sender<stdexec::__id<__decay_t<_Sender>>, _Fun, _LetTag>>;
 
     template <sender _Sender, __movable_value _Fun>
         requires __tag_invocable_with_completion_scheduler<_LetTag, set_value_t,
@@ -4646,6 +4888,7 @@
         return tag_invoke(_LetTag{}, std::move(__sched), (_Sender &&) __sndr,
                           (_Fun &&) __fun);
     }
+
     template <sender _Sender, __movable_value _Fun>
         requires(!__tag_invocable_with_completion_scheduler<
                     _LetTag, set_value_t, _Sender, _Fun>) &&
@@ -4655,6 +4898,7 @@
     {
         return tag_invoke(_LetTag{}, (_Sender &&) __sndr, (_Fun &&) __fun);
     }
+
     template <sender _Sender, __movable_value _Fun>
         requires(!__tag_invocable_with_completion_scheduler<
                     _LetTag, set_value_t, _Sender, _Fun>) &&
@@ -4664,6 +4908,7 @@
     {
         return __sender<_Sender, _Fun>{(_Sender &&) __sndr, (_Fun &&) __fun};
     }
+
     template <class _Fun>
     __binder_back<_LetTag, _Fun> operator()(_Fun __fun) const
     {
@@ -4680,6 +4925,7 @@
 struct let_stopped_t : __let::__let_xxx_t<let_stopped_t, set_stopped_t>
 {};
 } // namespace __let
+
 using __let::let_value_t;
 inline constexpr let_value_t let_value{};
 using __let::let_error_t;
@@ -4709,6 +4955,7 @@
         {
             return (_Receiver &&) __op_->__rcvr_;
         }
+
         const _Receiver& base() const& noexcept
         {
             return __op_->__rcvr_;
@@ -4716,19 +4963,22 @@
 
         template <class _Ty>
         void set_value(_Ty&& __a) && noexcept
-        try
         {
-            using _Value =
-                __single_sender_value_t<_Sender, env_of_t<_Receiver>>;
-            static_assert(constructible_from<_Value, _Ty>);
-            stdexec::set_value(((__t &&) * this).base(),
-                               std::optional<_Value>{(_Ty &&) __a});
+            try
+            {
+                using _Value =
+                    __single_sender_value_t<_Sender, env_of_t<_Receiver>>;
+                static_assert(constructible_from<_Value, _Ty>);
+                stdexec::set_value(((__t &&) * this).base(),
+                                   std::optional<_Value>{(_Ty &&) __a});
+            }
+            catch (...)
+            {
+                stdexec::set_error(((__t &&) * this).base(),
+                                   std::current_exception());
+            }
         }
-        catch (...)
-        {
-            stdexec::set_error(((__t &&) * this).base(),
-                               std::current_exception());
-        }
+
         void set_stopped() && noexcept
         {
             using _Value =
@@ -4751,10 +5001,12 @@
     struct __t
     {
         using __id = __operation;
+
         __t(_Sender&& __sndr, _Receiver&& __rcvr) :
             __rcvr_((_Receiver &&) __rcvr),
             __op_state_(connect((_Sender &&) __sndr, __receiver_t{{}, this}))
         {}
+
         STDEXEC_IMMOVABLE(__t);
 
         friend void tag_invoke(start_t, __t& __self) noexcept
@@ -4775,6 +5027,7 @@
     struct __t
     {
         using __id = __sender;
+        using is_sender = void;
 
         template <class _Self, class _Receiver>
         using __operation_t =
@@ -4797,9 +5050,9 @@
             return {((_Self &&) __self).__sndr_, (_Receiver &&) __rcvr};
         }
 
-        friend auto tag_invoke(get_env_t, const __t& __self) noexcept(
-            __nothrow_callable<get_env_t, const _Sender&>)
-            -> __call_result_t<get_env_t, const _Sender&>
+        friend auto tag_invoke(get_env_t, const __t& __self) //
+            noexcept(__nothrow_callable<get_env_t, const _Sender&>)
+                -> __call_result_t<get_env_t, const _Sender&>
         {
             return get_env(__self.__sndr_);
         }
@@ -4827,10 +5080,11 @@
 {
     template <sender _Sender>
     auto operator()(_Sender&& __sndr) const
-        -> __t<__sender<stdexec::__id<decay_t<_Sender>>>>
+        -> __t<__sender<stdexec::__id<__decay_t<_Sender>>>>
     {
         return {(_Sender &&) __sndr};
     }
+
     __binder_back<stopped_as_optional_t> operator()() const noexcept
     {
         return {};
@@ -4843,11 +5097,13 @@
     auto operator()(_Sender&& __sndr, _Error __err) const
     {
         return (_Sender &&) __sndr |
-               let_stopped([__err2 = (_Error &&) __err]() mutable noexcept(
-                               std::is_nothrow_move_constructible_v<_Error>) {
-                   return just_error((_Error &&) __err2);
-               });
+               let_stopped(
+                   [__err2 = (_Error &&) __err]() mutable //
+                   noexcept(std::is_nothrow_move_constructible_v<_Error>) {
+                       return just_error((_Error &&) __err2);
+                   });
     }
+
     template <__movable_value _Error>
     auto operator()(_Error __err) const
         -> __binder_back<stopped_as_error_t, _Error>
@@ -4856,6 +5112,7 @@
     }
 };
 } // namespace __stopped_as_xxx
+
 using __stopped_as_xxx::stopped_as_optional_t;
 inline constexpr stopped_as_optional_t stopped_as_optional{};
 using __stopped_as_xxx::stopped_as_error_t;
@@ -4870,6 +5127,7 @@
 struct __task : __immovable
 {
     __task* __next_ = this;
+
     union
     {
         void (*__execute_)(__task*) noexcept;
@@ -4915,6 +5173,7 @@
         }
 
         explicit __t(__task* __tail) noexcept : __task{.__tail_ = __tail} {}
+
         __t(__task* __next, run_loop* __loop, _Receiver __rcvr) :
             __task{{}, __next, {&__execute_impl}}, __loop_{__loop},
             __rcvr_{(_Receiver &&) __rcvr}
@@ -4949,7 +5208,8 @@
         {
             using __t = __schedule_task;
             using __id = __schedule_task;
-            using completion_signatures =
+            using is_sender = void;
+            using completion_signatures = //
                 __completion_signatures_<set_value_t(),
                                          set_error_t(std::exception_ptr),
                                          set_stopped_t()>;
@@ -4983,7 +5243,7 @@
                 friend __scheduler tag_invoke(get_completion_scheduler_t<_CPO>,
                                               const __env& __self) noexcept
                 {
-                    return __scheduler{__self.__loop_};
+                    return __self.__loop_->get_scheduler();
                 }
             };
 
@@ -5018,7 +5278,7 @@
         }
 
         // BUGBUG NOT TO SPEC
-        friend bool tag_invoke(this_thread::execute_may_block_caller_t,
+        friend bool tag_invoke(execute_may_block_caller_t,
                                const __scheduler&) noexcept
         {
             return false;
@@ -5031,6 +5291,7 @@
 
         run_loop* __loop_;
     };
+
     __scheduler get_scheduler() noexcept
     {
         return __scheduler{this};
@@ -5052,13 +5313,15 @@
 
 template <class _ReceiverId>
 inline void __operation<_ReceiverId>::__t::__start_() noexcept
-try
 {
-    __loop_->__push_back_(this);
-}
-catch (...)
-{
-    set_error((_Receiver &&) __rcvr_, std::current_exception());
+    try
+    {
+        __loop_->__push_back_(this);
+    }
+    catch (...)
+    {
+        set_error((_Receiver &&) __rcvr_, std::current_exception());
+    }
 }
 
 inline void run_loop::run()
@@ -5107,11 +5370,11 @@
 //   variant<
 //     monostate,
 //     tuple<set_stopped_t>,
-//     tuple<set_value_t, decay_t<_Values1>...>,
-//     tuple<set_value_t, decay_t<_Values2>...>,
+//     tuple<set_value_t, __decay_t<_Values1>...>,
+//     tuple<set_value_t, __decay_t<_Values2>...>,
 //        ...
-//     tuple<set_error_t, decay_t<_Error1>>,
-//     tuple<set_error_t, decay_t<_Error2>>,
+//     tuple<set_error_t, __decay_t<_Error1>>,
+//     tuple<set_error_t, __decay_t<_Error2>>,
 //        ...
 //   >
 template <class _State, class... _Tuples>
@@ -5129,10 +5392,11 @@
                              __make_bind<_State>>;
 
 template <class _Sender, class _Env>
-using __variant_for_t = __minvoke<__minvoke<
-    __mfold_right<__nullable_variant_t,
-                  __mbind_front_q<__bind_completions_t, _Sender, _Env>>,
-    set_value_t, set_error_t, set_stopped_t>>;
+using __variant_for_t = //
+    __minvoke<__minvoke<
+        __mfold_right<__nullable_variant_t,
+                      __mbind_front_q<__bind_completions_t, _Sender, _Env>>,
+        set_value_t, set_error_t, set_stopped_t>>;
 
 template <class _SchedulerId, class _CvrefSenderId, class _ReceiverId>
 struct __operation1;
@@ -5207,9 +5471,8 @@
             (__nothrow_decay_copyable<_Args> && ...);
 
         template <class _Tag, class... _Args>
-        static void __complete_(
-            _Tag __tag, __t&& __self,
-            _Args&&... __args) noexcept(__nothrow_complete_<_Args...>)
+        static void __complete_(_Tag, __t&& __self, _Args&&... __args) //
+            noexcept(__nothrow_complete_<_Args...>)
         {
             // Write the tag and the args into the operation state so that
             // we can forward the completion from within the scheduler's
@@ -5268,6 +5531,7 @@
             __state1_(connect((_CvrefSender &&) __sndr, __receiver1_t{this})),
             __state2_(connect(schedule(__sched_), __receiver2_t{this}))
         {}
+
         STDEXEC_IMMOVABLE(__t);
 
         friend void tag_invoke(start_t, __t& __op_state) noexcept
@@ -5276,8 +5540,8 @@
         }
 
         void __complete() noexcept
-        try
         {
+            STDEXEC_ASSERT(!__data_.valueless_by_exception());
             std::visit(
                 [&]<class _Tup>(_Tup& __tupl) -> void {
                     if constexpr (same_as<_Tup, std::monostate>)
@@ -5298,16 +5562,12 @@
                 },
                 __data_);
         }
-        catch (...)
-        {
-            set_error((_Receiver &&) __rcvr_, std::current_exception());
-        }
     };
 };
 
 template <class _Tag>
 using __decay_signature =
-    __transform<__q<decay_t>,
+    __transform<__q<__decay_t>,
                 __mcompose<__q<completion_signatures>, __qf<_Tag>>>;
 
 template <class _SchedulerId>
@@ -5340,10 +5600,11 @@
     struct __t
     {
         using __id = __sender;
+        using is_sender = void;
         _Attrs __env_;
         _Sender __sndr_;
 
-        template <__decays_to<__t> _Self, class _Receiver>
+        template <__decays_to<__t> _Self, receiver _Receiver>
             requires sender_to<__copy_cvref_t<_Self, _Sender>, _Receiver>
         friend auto tag_invoke(connect_t, _Self&& __self, _Receiver __rcvr)
             -> stdexec::__t<
@@ -5361,26 +5622,36 @@
 
         template <class... _Errs>
         using __all_nothrow_decay_copyable =
-            __bool<(__nothrow_decay_copyable<_Errs> && ...)>;
+            __mbool<(__nothrow_decay_copyable<_Errs> && ...)>;
 
         template <class _Env>
-        using __with_error_t =
+        using __scheduler_with_error_t = //
             __if_c<__v<error_types_of_t<schedule_result_t<_Scheduler>, _Env,
                                         __all_nothrow_decay_copyable>>,
                    completion_signatures<>, __with_exception_ptr>;
 
         template <class _Env>
-        using __scheduler_completions_t =
+        using __scheduler_completions_t = //
             __make_completion_signatures<schedule_result_t<_Scheduler>, _Env,
-                                         __with_error_t<_Env>,
+                                         __scheduler_with_error_t<_Env>,
                                          __mconst<completion_signatures<>>>;
 
+        template <class _Env>
+        using __input_sender_with_error_t = //
+            __if_c<__v<value_types_of_t<
+                       _Sender, _Env, __all_nothrow_decay_copyable, __mand>> &&
+                       __v<error_types_of_t<_Sender, _Env,
+                                            __all_nothrow_decay_copyable>>,
+                   completion_signatures<>, __with_exception_ptr>;
+
         template <__decays_to<__t> _Self, class _Env>
         friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
             -> __make_completion_signatures<
                 __copy_cvref_t<_Self, _Sender>, _Env,
-                __scheduler_completions_t<_Env>, __decay_signature<set_value_t>,
-                __decay_signature<set_error_t>>;
+                __concat_completion_signatures_t<
+                    __scheduler_completions_t<_Env>,
+                    __input_sender_with_error_t<_Env>>,
+                __decay_signature<set_value_t>, __decay_signature<set_error_t>>;
     };
 };
 
@@ -5397,13 +5668,14 @@
 
     template <scheduler _Scheduler, sender _Sender>
     auto operator()(_Scheduler&& __sched, _Sender&& __sndr) const
-        -> stdexec::__t<__sender<stdexec::__id<decay_t<_Scheduler>>,
-                                 stdexec::__id<decay_t<_Sender>>>>
+        -> stdexec::__t<__sender<stdexec::__id<__decay_t<_Scheduler>>,
+                                 stdexec::__id<__decay_t<_Sender>>>>
     {
         return {{(_Scheduler &&) __sched}, (_Sender &&) __sndr};
     }
 };
 } // namespace __schedule_from
+
 using __schedule_from::schedule_from_t;
 inline constexpr schedule_from_t schedule_from{};
 
@@ -5428,6 +5700,7 @@
         return tag_invoke(transfer_t{}, std::move(csch), (_Sender &&) __sndr,
                           (_Scheduler &&) __sched);
     }
+
     template <sender _Sender, scheduler _Scheduler>
         requires(!__tag_invocable_with_completion_scheduler<
                     transfer_t, set_value_t, _Sender, _Scheduler>) &&
@@ -5439,6 +5712,7 @@
         return tag_invoke(transfer_t{}, (_Sender &&) __sndr,
                           (_Scheduler &&) __sched);
     }
+
     // NOT TO SPEC: permit non-typed senders:
     template <sender _Sender, scheduler _Scheduler>
         requires(!__tag_invocable_with_completion_scheduler<
@@ -5448,14 +5722,16 @@
     {
         return schedule_from((_Scheduler &&) __sched, (_Sender &&) __sndr);
     }
+
     template <scheduler _Scheduler>
-    __binder_back<transfer_t, decay_t<_Scheduler>>
+    __binder_back<transfer_t, __decay_t<_Scheduler>>
         operator()(_Scheduler&& __sched) const
     {
         return {{}, {}, {(_Scheduler &&) __sched}};
     }
 };
 } // namespace __transfer
+
 using __transfer::transfer_t;
 inline constexpr transfer_t transfer{};
 
@@ -5478,14 +5754,17 @@
         using __id = __receiver_ref;
         stdexec::__t<__operation<_SchedulerId, _SenderId, _ReceiverId>>*
             __op_state_;
+
         _Receiver&& base() && noexcept
         {
             return (_Receiver &&) __op_state_->__rcvr_;
         }
+
         const _Receiver& base() const& noexcept
         {
             return __op_state_->__rcvr_;
         }
+
         auto get_env() const
             -> __make_env_t<env_of_t<_Receiver>,
                             __with<get_scheduler_t, _Scheduler>>
@@ -5511,10 +5790,12 @@
             stdexec::__t<__receiver_ref<_SchedulerId, _SenderId, _ReceiverId>>;
         stdexec::__t<__operation<_SchedulerId, _SenderId, _ReceiverId>>*
             __op_state_;
+
         _Receiver&& base() && noexcept
         {
             return (_Receiver &&) __op_state_->__rcvr_;
         }
+
         const _Receiver& base() const& noexcept
         {
             return __op_state_->__rcvr_;
@@ -5571,6 +5852,7 @@
                                        __receiver_t{{}, this});
                     }}}
         {}
+
         STDEXEC_IMMOVABLE(__t);
 
         _Scheduler __scheduler_;
@@ -5592,6 +5874,8 @@
     struct __t
     {
         using __id = __sender;
+        using is_sender = void;
+
         template <class _ReceiverId>
         using __receiver_ref_t =
             stdexec::__t<__receiver_ref<_SchedulerId, _SenderId, _ReceiverId>>;
@@ -5620,9 +5904,9 @@
                     ((_Self &&) __self).__sndr_, (_Receiver &&) __rcvr};
         }
 
-        friend auto tag_invoke(get_env_t, const __t& __self) noexcept(
-            __nothrow_callable<get_env_t, const _Sender&>)
-            -> __call_result_t<get_env_t, const _Sender&>
+        friend auto tag_invoke(get_env_t, const __t& __self) //
+            noexcept(__nothrow_callable<get_env_t, const _Sender&>)
+                -> __call_result_t<get_env_t, const _Sender&>
         {
             return get_env(__self.__sndr_);
         }
@@ -5655,8 +5939,8 @@
 
     template <scheduler _Scheduler, sender _Sender>
     auto operator()(_Scheduler&& __sched, _Sender&& __sndr) const
-        -> __t<__sender<stdexec::__id<decay_t<_Scheduler>>,
-                        stdexec::__id<decay_t<_Sender>>>>
+        -> __t<__sender<stdexec::__id<__decay_t<_Scheduler>>,
+                        stdexec::__id<__decay_t<_Sender>>>>
     {
         // connect-based customization will remove the need for this check
         using __has_customizations =
@@ -5669,6 +5953,7 @@
     }
 };
 } // namespace __on
+
 using __on::on_t;
 inline constexpr on_t on{};
 
@@ -5692,6 +5977,7 @@
         return tag_invoke(*this, (_Scheduler &&) __sched,
                           (_Values &&) __vals...);
     }
+
     template <scheduler _Scheduler, __movable_value... _Values>
         requires(!tag_invocable<transfer_just_t, _Scheduler, _Values...> ||
                  !sender<tag_invoke_result_t<transfer_just_t, _Scheduler,
@@ -5704,6 +5990,7 @@
     }
 };
 } // namespace __transfer_just
+
 using __transfer_just::transfer_just_t;
 inline constexpr transfer_just_t transfer_just{};
 
@@ -5712,46 +5999,55 @@
 namespace __into_variant
 {
 template <class _Sender, class _Env>
-    requires sender<_Sender, _Env>
+    requires sender_in<_Sender, _Env>
 using __into_variant_result_t = value_types_of_t<_Sender, _Env>;
 
-template <class _SenderId, class _ReceiverId>
+template <class _ReceiverId, class _Variant>
 struct __receiver
 {
     using _Receiver = stdexec::__t<_ReceiverId>;
 
-    class __t : receiver_adaptor<__t, _Receiver>
+    struct __t
     {
-#if STDEXEC_NON_LEXICAL_FRIENDSHIP
-      public:
-#endif
-        using _Sender = stdexec::__t<_SenderId>;
+        using __id = __receiver;
         using _Receiver = stdexec::__t<_ReceiverId>;
-        friend receiver_adaptor<__t, _Receiver>;
+        _Receiver __rcvr_;
 
         // Customize set_value by building a variant and passing the result
         // to the base class
         template <class... _As>
-        void set_value(_As&&... __as) && noexcept
-        try
+            requires constructible_from<_Variant, std::tuple<_As&&...>>
+        friend void tag_invoke(set_value_t, __t&& __self,
+                               _As&&... __as) noexcept
         {
-            using __variant_t =
-                __into_variant_result_t<_Sender, env_of_t<_Receiver>>;
-            static_assert(
-                constructible_from<__variant_t, std::tuple<_As&&...>>);
-            stdexec::set_value(
-                ((__t &&) * this).base(),
-                __variant_t{std::tuple<_As&&...>{(_As &&) __as...}});
-        }
-        catch (...)
-        {
-            stdexec::set_error(((__t &&) * this).base(),
-                               std::current_exception());
+            try
+            {
+                set_value((_Receiver &&) __self.__rcvr_,
+                          _Variant{std::tuple<_As&&...>{(_As &&) __as...}});
+            }
+            catch (...)
+            {
+                set_error((_Receiver &&) __self.__rcvr_,
+                          std::current_exception());
+            }
         }
 
-      public:
-        using __id = __receiver;
-        using receiver_adaptor<__t, _Receiver>::receiver_adaptor;
+        template <class _Error>
+        friend void tag_invoke(set_error_t, __t&& __self,
+                               _Error&& __err) noexcept
+        {
+            set_error((_Receiver &&) __self.__rcvr_, (_Error &&) __err);
+        }
+
+        friend void tag_invoke(set_stopped_t, __t&& __self) noexcept
+        {
+            set_stopped((_Receiver &&) __self.__rcvr_);
+        }
+
+        friend env_of_t<_Receiver> tag_invoke(get_env_t, const __t& __self)
+        {
+            return get_env(__self.__rcvr_);
+        }
     };
 };
 
@@ -5760,30 +6056,41 @@
 {
     using _Sender = stdexec::__t<_SenderId>;
 
-    template <class _Receiver>
-    using __receiver_t =
-        stdexec::__t<__receiver<_SenderId, stdexec::__id<_Receiver>>>;
+    template <class _Env>
+    using __variant_t = __into_variant_result_t<_Sender, _Env>;
 
-    class __t
+    template <class _Receiver>
+    using __receiver_t = //
+        stdexec::__t<
+            __receiver<__id<_Receiver>, __variant_t<env_of_t<_Receiver>>>>;
+
+    struct __t
     {
+        using __id = __sender;
+        using is_sender = void;
+
+        template <__decays_to<_Sender> _CvrefSender>
+        explicit __t(_CvrefSender&& __sndr) : __sndr_((_CvrefSender &&) __sndr)
+        {}
+
+      private:
         template <class...>
         using __value_t = completion_signatures<>;
 
         template <class _Env>
-        using __compl_sigs = make_completion_signatures<
-            _Sender, _Env,
-            completion_signatures<set_value_t(
-                                      __into_variant_result_t<_Sender, _Env>),
-                                  set_error_t(std::exception_ptr)>,
-            __value_t>;
+        using __compl_sigs = //
+            make_completion_signatures<
+                _Sender, _Env,
+                completion_signatures<set_value_t(__variant_t<_Env>),
+                                      set_error_t(std::exception_ptr)>,
+                __value_t>;
 
         _Sender __sndr_;
 
         template <receiver _Receiver>
             requires sender_to<_Sender, __receiver_t<_Receiver>>
-        friend auto
-            tag_invoke(connect_t, __t&& __self, _Receiver __rcvr) noexcept(
-                __nothrow_connectable<_Sender, __receiver_t<_Receiver>>)
+        friend auto tag_invoke(connect_t, __t&& __self, _Receiver __rcvr) //
+            noexcept(__nothrow_connectable<_Sender, __receiver_t<_Receiver>>)
                 -> connect_result_t<_Sender, __receiver_t<_Receiver>>
         {
             return stdexec::connect(
@@ -5791,22 +6098,16 @@
                 __receiver_t<_Receiver>{(_Receiver &&) __rcvr});
         }
 
-        friend auto tag_invoke(get_env_t, const __t& __self) noexcept(
-            __nothrow_callable<get_env_t, const _Sender&>)
-            -> __call_result_t<get_env_t, const _Sender&>
+        friend auto tag_invoke(get_env_t, const __t& __self) //
+            noexcept(__nothrow_callable<get_env_t, const _Sender&>)
+                -> __call_result_t<get_env_t, const _Sender&>
         {
             return get_env(__self.__sndr_);
         }
 
         template <class _Env>
-        friend auto tag_invoke(get_completion_signatures_t, __t&&, _Env)
+        friend auto tag_invoke(get_completion_signatures_t, __t&&, _Env) //
             -> __compl_sigs<_Env>;
-
-      public:
-        using __id = __sender;
-        template <__decays_to<_Sender> _CvrefSender>
-        explicit __t(_CvrefSender&& __sndr) : __sndr_((_CvrefSender &&) __sndr)
-        {}
     };
 };
 
@@ -5814,17 +6115,19 @@
 {
     template <sender _Sender>
     auto operator()(_Sender&& __sndr) const
-        -> __t<__sender<stdexec::__id<remove_cvref_t<_Sender>>>>
+        -> __t<__sender<stdexec::__id<__decay_t<_Sender>>>>
     {
-        return __t<__sender<stdexec::__id<remove_cvref_t<_Sender>>>>{
-            (_Sender &&) __sndr};
+        return __t<__sender<stdexec::__id<__decay_t<_Sender>>>>{(_Sender &&)
+                                                                    __sndr};
     }
+
     auto operator()() const noexcept
     {
         return __binder_back<into_variant_t>{};
     }
 };
 } // namespace __into_variant
+
 using __into_variant::into_variant_t;
 inline constexpr into_variant_t into_variant{};
 
@@ -5843,6 +6146,7 @@
 struct __on_stop_requested
 {
     in_place_stop_source& __stop_source_;
+
     void operator()() noexcept
     {
         __stop_source_.request_stop();
@@ -5853,6 +6157,7 @@
 struct __env
 {
     using _Env = stdexec::__t<_EnvId>;
+
     struct __t
     {
         using __id = __env;
@@ -5866,8 +6171,10 @@
         }
 
         // Forward the receiver queries:
-        template <__none_of<get_completion_signatures_t, get_stop_token_t> _Tag,
-                  same_as<__t> _Self, class... _As>
+        template <                                                         //
+            __none_of<get_completion_signatures_t, get_stop_token_t> _Tag, //
+            same_as<__t> _Self,                                            //
+            class... _As>
             requires __callable<_Tag, const __make_dependent_on<_Env, _Self>&,
                                 _As...>
         friend auto tag_invoke(_Tag __tag, const _Self& __self,
@@ -5884,39 +6191,55 @@
 template <class _Env>
 using __env_t = __t<__if_c<same_as<_Env, no_env>, no_env, __env<__id<_Env>>>>;
 
-template <class _T>
-using __decay_rvalue_ref = decay_t<_T>&&;
+template <class _Tp>
+using __decay_rvalue_ref = __decay_t<_Tp>&&;
 
 template <class _Sender, class _Env>
-concept __max1_sender = sender<_Sender, _Env> &&
+concept __max1_sender = sender_in<_Sender, _Env> &&
                         __valid<__value_types_of_t, _Sender, _Env,
                                 __mconst<int>, __msingle_or<void>>;
 
 template <class _Env, class _Sender>
-using __single_values_of_t =
+using __single_values_of_t = //
     __value_types_of_t<_Sender, _Env,
                        __transform<__q<__decay_rvalue_ref>, __q<__types>>,
                        __q<__msingle>>;
 
 template <class _Env, class... _Senders>
-using __set_values_sig_t =
+using __set_values_sig_t = //
     completion_signatures<__minvoke<__mconcat<__qf<set_value_t>>,
                                     __single_values_of_t<_Env, _Senders>...>>;
 
+template <class... _Args>
+using __all_nothrow_decay_copyable =
+    __mbool<(__nothrow_decay_copyable<_Args> && ...)>;
+
+template <class _Env, class... _SenderIds>
+using __all_value_and_error_args_nothrow_decay_copyable =
+    __mand<__mand<value_types_of_t<__t<_SenderIds>, _Env,
+                                   __all_nothrow_decay_copyable, __mand>...>,
+           __mand<error_types_of_t<__t<_SenderIds>, _Env,
+                                   __all_nothrow_decay_copyable>...>>;
+
 template <class _Env, class... _Senders>
-using __completions_t = __concat_completion_signatures_t<
-    completion_signatures<set_error_t(std::exception_ptr&&), // TODO add this
-                                                             // only if the
-                                                             // copies can fail
-                          set_stopped_t()>,
-    __minvoke<__with_default<__mbind_front_q<__set_values_sig_t, _Env>,
-                             completion_signatures<>>,
-              _Senders...>,
-    __make_completion_signatures<
-        _Senders, _Env, completion_signatures<>,
-        __mconst<completion_signatures<>>,
-        __mcompose<__q<completion_signatures>, __qf<set_error_t>,
-                   __q<__decay_rvalue_ref>>>...>;
+using __completions_t = //
+    __concat_completion_signatures_t<
+        __if<__all_value_and_error_args_nothrow_decay_copyable<
+                 _Env, __id<_Senders>...>,
+             completion_signatures<set_stopped_t()>,
+             completion_signatures<set_stopped_t(),
+                                   set_error_t(std::exception_ptr&&)>>,
+        __minvoke<__with_default<__mbind_front_q<__set_values_sig_t, _Env>,
+                                 completion_signatures<>>,
+                  _Senders...>,
+        __make_completion_signatures<
+            _Senders, _Env, completion_signatures<>,
+            __mconst<completion_signatures<>>,
+            __mcompose<__q<completion_signatures>, __qf<set_error_t>,
+                       __q<__decay_rvalue_ref>>>...>;
+
+struct __not_an_error
+{};
 
 struct __tie_fn
 {
@@ -5931,11 +6254,21 @@
 struct __complete_fn
 {
     _Receiver& __rcvr_;
+
     __complete_fn(_Tag, _Receiver& __rcvr) noexcept : __rcvr_(__rcvr) {}
-    template <class... _Ts>
-    void operator()(_Ts&... __ts) const noexcept
+
+    template <class _Ty, class... _Ts>
+    void operator()(_Ty& __t, _Ts&... __ts) const noexcept
     {
-        _Tag{}((_Receiver &&) __rcvr_, (_Ts &&) __ts...);
+        if constexpr (!same_as<_Ty, __not_an_error>)
+        {
+            _Tag{}((_Receiver &&) __rcvr_, (_Ty &&) __t, (_Ts &&) __ts...);
+        }
+    }
+
+    void operator()() const noexcept
+    {
+        _Tag{}((_Receiver &&) __rcvr_);
     }
 };
 
@@ -5978,7 +6311,12 @@
                 }
                 break;
             case __error:
-                std::visit(__complete_fn{set_error, __recvr_}, __errors_);
+                if constexpr (!same_as<_ErrorsVariant,
+                                       std::variant<std::monostate>>)
+                {
+                    // One or more child operations completed with an error:
+                    std::visit(__complete_fn{set_error, __recvr_}, __errors_);
+                }
                 break;
             case __stopped:
                 stdexec::set_stopped((_Receiver &&) __recvr_);
@@ -6013,6 +6351,7 @@
     struct __t
     {
         using __id = __receiver;
+
         template <class _Error>
         void __set_error(_Error&& __err) noexcept
         {
@@ -6022,18 +6361,29 @@
                 __op_state_->__stop_source_.request_stop();
                 // We won the race, free to write the error into the operation
                 // state without worry.
-                try
+                if constexpr (__nothrow_decay_copyable<_Error>)
                 {
-                    __op_state_->__errors_.template emplace<decay_t<_Error>>(
+                    __op_state_->__errors_.template emplace<__decay_t<_Error>>(
                         (_Error &&) __err);
                 }
-                catch (...)
+                else
                 {
-                    __op_state_->__errors_.template emplace<std::exception_ptr>(
-                        std::current_exception());
+                    try
+                    {
+                        __op_state_->__errors_
+                            .template emplace<__decay_t<_Error>>((_Error &&)
+                                                                     __err);
+                    }
+                    catch (...)
+                    {
+                        __op_state_->__errors_
+                            .template emplace<std::exception_ptr>(
+                                std::current_exception());
+                    }
                 }
             }
         }
+
         template <class... _Values>
             requires same_as<_ValuesTuple, __ignore> ||
                      constructible_from<_TupleType, _Values...>
@@ -6043,29 +6393,38 @@
             if constexpr (!same_as<_ValuesTuple, __ignore>)
             {
                 static_assert(
-                    same_as<_TupleType, std::tuple<decay_t<_Values>...>>,
+                    same_as<_TupleType, std::tuple<__decay_t<_Values>...>>,
                     "One of the senders in this when_all() is fibbing about what types it sends");
                 // We only need to bother recording the completion values
                 // if we're not already in the "error" or "stopped" state.
                 if (__self.__op_state_->__state_ == __started)
                 {
-                    try
+                    if constexpr ((__nothrow_decay_copyable<_Values> && ...))
                     {
                         std::get<_Index>(__self.__op_state_->__values_)
                             .emplace((_Values &&) __vals...);
                     }
-                    catch (...)
+                    else
                     {
-                        __self.__set_error(std::current_exception());
+                        try
+                        {
+                            std::get<_Index>(__self.__op_state_->__values_)
+                                .emplace((_Values &&) __vals...);
+                        }
+                        catch (...)
+                        {
+                            __self.__set_error(std::current_exception());
+                        }
                     }
                 }
             }
             __self.__op_state_->__arrive();
         }
+
         template <class _Error>
             requires requires(_ErrorsVariant& __errors, _Error&& __err) {
-                         __errors.template emplace<decay_t<_Error>>((_Error &&)
-                                                                        __err);
+                         __errors.template emplace<__decay_t<_Error>>(
+                             (_Error &&) __err);
                      }
         friend void tag_invoke(set_error_t, __t&& __self,
                                _Error&& __err) noexcept
@@ -6073,6 +6432,7 @@
             __self.__set_error((_Error &&) __err);
             __self.__op_state_->__arrive();
         }
+
         friend void tag_invoke(set_stopped_t, __t&& __self) noexcept
             requires receiver_of<_Receiver,
                                  completion_signatures<set_stopped_t()>>
@@ -6088,20 +6448,22 @@
             }
             __self.__op_state_->__arrive();
         }
+
         friend __env_t<env_of_t<_Receiver>> tag_invoke(get_env_t,
                                                        const __t& __self)
         {
             return {stdexec::get_env(__self.__op_state_->__recvr_),
                     __self.__op_state_->__stop_source_.get_token()};
         }
+
         __operation_base<_ReceiverId, _ValuesTuple, _ErrorsVariant>*
             __op_state_;
     };
 };
 
 template <class _Env, class _Sender>
-using __values_opt_tuple_t =
-    __value_types_of_t<_Sender, __env_t<__id<_Env>>,
+using __values_opt_tuple_t = //
+    __value_types_of_t<_Sender, __env_t<_Env>,
                        __mcompose<__q<std::optional>, __q<__decayed_tuple>>,
                        __q<__msingle>>;
 
@@ -6111,15 +6473,26 @@
     using __completions = __completions_t<__env_t<_Env>, _Senders...>;
 
     // tuple<optional<tuple<Vs1...>>, optional<tuple<Vs2...>>, ...>
-    using __values_tuple = __minvoke<
-        __with_default<__transform<__mbind_front_q<__values_opt_tuple_t, _Env>,
-                                   __q<std::tuple>>,
-                       __ignore>,
-        _Senders...>;
+    using __values_tuple = //
+        __minvoke<__with_default<
+                      __transform<__mbind_front_q<__values_opt_tuple_t, _Env>,
+                                  __q<std::tuple>>,
+                      __ignore>,
+                  _Senders...>;
 
-    using __errors_variant =
-        __minvoke<__mconcat<__q<__variant>>, __types<std::exception_ptr>,
-                  error_types_of_t<_Senders, __env_t<__id<_Env>>, __types>...>;
+    using __nullable_variant_t_ =
+        __munique<__mbind_front_q<std::variant, __not_an_error>>;
+
+    using __error_types = //
+        __minvoke<__mconcat<__transform<__q<__decay_t>, __nullable_variant_t_>>,
+                  error_types_of_t<_Senders, __env_t<_Env>, __types>...>;
+
+    using __errors_variant = //
+        __if<__all_value_and_error_args_nothrow_decay_copyable<
+                 _Env, __id<_Senders>...>,
+             __error_types,
+             __minvoke<__push_back_unique<__q<std::variant>>, __error_types,
+                       std::exception_ptr>>;
 };
 
 template <receiver _Receiver,
@@ -6144,7 +6517,7 @@
     using __op_state = connect_result_t<_Sender, __receiver<__v<_Index>>>;
 
     template <class _Tuple = __q<std::tuple>>
-    using __op_states_tuple =
+    using __op_states_tuple = //
         __minvoke<__mzip_with2<__q<__op_state>, _Tuple>, __types<_Senders...>,
                   __mindex_sequence_for<_Senders...>>;
 };
@@ -6187,6 +6560,7 @@
                     __receiver_t<_Is>{this});
             }}...}
         {}
+
         template <class _SendersTuple>
         __t(_SendersTuple&& __sndrs, _Receiver __rcvr) :
             __t((_SendersTuple &&) __sndrs, (_Receiver &&) __rcvr, _Indices{})
@@ -6249,6 +6623,7 @@
     struct __t
     {
         using __id = __sender;
+        using is_sender = void;
 
         template <class... _Sndrs>
         explicit(sizeof...(_Sndrs) == 1) __t(_Sndrs&&... __sndrs) :
@@ -6290,7 +6665,7 @@
 {
     template <class... _Senders>
     using __sender_t = __t<__sender<std::index_sequence_for<_Senders...>,
-                                    __id<decay_t<_Senders>>...>>;
+                                    __id<__decay_t<_Senders>>...>>;
 
     template <sender... _Senders>
         requires tag_invocable<when_all_t, _Senders...> &&
@@ -6389,6 +6764,7 @@
     }
 };
 } // namespace __when_all
+
 using __when_all::when_all_t;
 inline constexpr when_all_t when_all{};
 using __when_all::when_all_with_variant_t;
@@ -6405,19 +6781,23 @@
 struct __operation
 {
     using _Receiver = stdexec::__t<_ReceiverId>;
+
     struct __t : __immovable
     {
         using __id = __operation;
         _Receiver __rcvr_;
+
         friend void tag_invoke(start_t, __t& __self) noexcept
-        try
         {
-            auto __env = get_env(__self.__rcvr_);
-            set_value(std::move(__self.__rcvr_), _Tag{}(__env));
-        }
-        catch (...)
-        {
-            set_error(std::move(__self.__rcvr_), std::current_exception());
+            try
+            {
+                auto __env = get_env(__self.__rcvr_);
+                set_value(std::move(__self.__rcvr_), _Tag{}(__env));
+            }
+            catch (...)
+            {
+                set_error(std::move(__self.__rcvr_), std::current_exception());
+            }
         }
     };
 };
@@ -6427,17 +6807,19 @@
 {
     using __t = __sender;
     using __id = __sender;
+    using is_sender = void;
+
     template <class _Env>
         requires __callable<_Tag, _Env>
-    using __completions_t =
+    using __completions_t = //
         completion_signatures<set_value_t(__call_result_t<_Tag, _Env>),
                               set_error_t(std::exception_ptr)>;
 
     template <class _Receiver>
         requires receiver_of<_Receiver, __completions_t<env_of_t<_Receiver>>>
-    friend auto tag_invoke(connect_t, __sender, _Receiver __rcvr) noexcept(
-        std::is_nothrow_move_constructible_v<_Receiver>)
-        -> stdexec::__t<__operation<_Tag, stdexec::__id<_Receiver>>>
+    friend auto tag_invoke(connect_t, __sender, _Receiver __rcvr) //
+        noexcept(std::is_nothrow_move_constructible_v<_Receiver>)
+            -> stdexec::__t<__operation<_Tag, stdexec::__id<_Receiver>>>
     {
         return {{}, (_Receiver &&) __rcvr};
     }
@@ -6473,14 +6855,17 @@
 {
     return read(get_scheduler);
 }
+
 inline auto get_delegatee_scheduler_t::operator()() const noexcept
 {
     return read(get_delegatee_scheduler);
 }
+
 inline auto get_allocator_t::operator()() const noexcept
 {
     return read(get_allocator);
 }
+
 inline auto get_stop_token_t::operator()() const noexcept
 {
     return read(get_stop_token);
@@ -6519,11 +6904,10 @@
 
 // What should sync_wait(just_stopped()) return?
 template <class _Sender, class _Continuation>
-using __sync_wait_result_impl =
-    __value_types_of_t<_Sender, __env, __transform<__q<decay_t>, _Continuation>,
-                       __q<__msingle>>;
+using __sync_wait_result_impl = __value_types_of_t<
+    _Sender, __env, __transform<__q<__decay_t>, _Continuation>, __q<__msingle>>;
 
-template <stdexec::sender<__env> _Sender>
+template <stdexec::sender_in<__env> _Sender>
 using __sync_wait_result_t = __sync_wait_result_impl<_Sender, __q<std::tuple>>;
 
 template <class _Sender>
@@ -6546,6 +6930,7 @@
         using __id = __receiver;
         __state<_Values...>* __state_;
         stdexec::run_loop* __loop_;
+
         template <class _Error>
         void __set_error(_Error __err) noexcept
         {
@@ -6559,31 +6944,37 @@
                     std::make_exception_ptr((_Error &&) __err));
             __loop_->finish();
         }
+
         template <class... _As>
             requires constructible_from<std::tuple<_Values...>, _As...>
         friend void tag_invoke(stdexec::set_value_t, __t&& __rcvr,
                                _As&&... __as) noexcept
-        try
         {
-            __rcvr.__state_->__data_.template emplace<1>((_As &&) __as...);
-            __rcvr.__loop_->finish();
+            try
+            {
+                __rcvr.__state_->__data_.template emplace<1>((_As &&) __as...);
+                __rcvr.__loop_->finish();
+            }
+            catch (...)
+            {
+                __rcvr.__set_error(std::current_exception());
+            }
         }
-        catch (...)
-        {
-            __rcvr.__set_error(std::current_exception());
-        }
+
         template <class _Error>
         friend void tag_invoke(stdexec::set_error_t, __t&& __rcvr,
                                _Error __err) noexcept
         {
             __rcvr.__set_error((_Error &&) __err);
         }
+
         friend void tag_invoke(stdexec::set_stopped_t __d,
                                __t&& __rcvr) noexcept
         {
             __rcvr.__state_->__data_.template emplace<3>(__d);
             __rcvr.__loop_->finish();
         }
+
         friend __env tag_invoke(stdexec::get_env_t, const __t& __rcvr) noexcept
         {
             return {__rcvr.__loop_->get_scheduler()};
@@ -6633,7 +7024,7 @@
         requires(!__tag_invocable_with_completion_scheduler<
                     sync_wait_t, set_value_t, _Sender>) &&
                 (!tag_invocable<sync_wait_t, _Sender>) &&
-                sender<_Sender, __env> &&
+                sender_in<_Sender, __env> &&
                 sender_to<_Sender, __receiver_t<_Sender>>
                 auto operator()(_Sender&& __sndr) const
                 -> std::optional<__sync_wait_result_t<_Sender>>
@@ -6665,7 +7056,7 @@
 // [execution.senders.consumers.sync_wait_with_variant]
 struct sync_wait_with_variant_t
 {
-    template <sender<__env> _Sender>
+    template <sender_in<__env> _Sender>
         requires __tag_invocable_with_completion_scheduler<
             sync_wait_with_variant_t, set_value_t, _Sender>
     tag_invoke_result_t<sync_wait_with_variant_t,
@@ -6689,7 +7080,8 @@
         return tag_invoke(sync_wait_with_variant_t{}, std::move(__sched),
                           (_Sender &&) __sndr);
     }
-    template <sender<__env> _Sender>
+
+    template <sender_in<__env> _Sender>
         requires(!__tag_invocable_with_completion_scheduler<
                     sync_wait_with_variant_t, set_value_t, _Sender>) &&
                 tag_invocable<sync_wait_with_variant_t, _Sender>
@@ -6706,7 +7098,8 @@
 
         return tag_invoke(sync_wait_with_variant_t{}, (_Sender &&) __sndr);
     }
-    template <sender<__env> _Sender>
+
+    template <sender_in<__env> _Sender>
         requires(!__tag_invocable_with_completion_scheduler<
                     sync_wait_with_variant_t, set_value_t, _Sender>) &&
                 (!tag_invocable<sync_wait_with_variant_t, _Sender>) &&
@@ -6718,10 +7111,12 @@
     }
 };
 } // namespace __sync_wait
+
 using __sync_wait::sync_wait_t;
 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 stdexec
 
 #include "__detail/__p2300.hpp"
diff --git a/include/sdbusplus/async/stdexec/functional.hpp b/include/sdbusplus/async/stdexec/functional.hpp
index c023f47..0a6a603 100644
--- a/include/sdbusplus/async/stdexec/functional.hpp
+++ b/include/sdbusplus/async/stdexec/functional.hpp
@@ -29,10 +29,11 @@
 #if STDEXEC_HAS_STD_CONCEPTS_HEADER()
 using std::invocable;
 #else
-template <class _F, class... _As>
-concept invocable = requires(_F&& __f, _As&&... __as) {
-                        std::invoke((_F &&) __f, (_As &&) __as...);
-                    };
+template <class _Fun, class... _As>
+concept invocable = //
+    requires(_Fun&& __f, _As&&... __as) {
+        std::invoke((_Fun &&) __f, (_As &&) __as...);
+    };
 #endif
 } // namespace stdexec::__std_concepts
 
@@ -43,18 +44,20 @@
 
 namespace stdexec
 {
-template <class _F, class... _As>
-concept __nothrow_invocable = invocable<_F, _As...> &&
-                              requires(_F&& __f, _As&&... __as) {
-                                  {
-                                      std::invoke((_F &&) __f, (_As &&) __as...)
-                                  } noexcept;
-                              };
+template <class _Fun, class... _As>
+concept __nothrow_invocable =  //
+    invocable<_Fun, _As...> && //
+    requires(_Fun&& __f, _As&&... __as) {
+        {
+            std::invoke((_Fun &&) __f, (_As &&) __as...)
+        } noexcept;
+    };
 
 template <auto _Fun>
 struct __fun_c_t
 {
     using _FunT = decltype(_Fun);
+
     template <class... _Args>
         requires __callable<_FunT, _Args...>
     auto operator()(_Args&&... __args) const
@@ -64,6 +67,7 @@
         return _Fun((_Args &&) __args...);
     }
 };
+
 template <auto _Fun>
 inline constexpr __fun_c_t<_Fun> __fun_c{};
 
@@ -76,14 +80,23 @@
 // std::invoke is more expensive at compile time than necessary,
 // and results in diagnostics that are more verbose than necessary.
 template <class _Tag, class... _Args>
-concept tag_invocable = requires(_Tag __tag, _Args&&... __args) {
-                            tag_invoke((_Tag &&) __tag, (_Args &&) __args...);
-                        };
+concept tag_invocable = //
+    requires(_Tag __tag, _Args&&... __args) {
+        tag_invoke((_Tag &&) __tag, (_Args &&) __args...);
+    };
+
+template <class _Ret, class _Tag, class... _Args>
+concept __tag_invocable_r = //
+    requires(_Tag __tag, _Args&&... __args) {
+        {
+            static_cast<_Ret>(tag_invoke((_Tag &&) __tag, (_Args &&) __args...))
+        };
+    };
 
 // NOT TO SPEC: nothrow_tag_invocable subsumes tag_invocable
 template <class _Tag, class... _Args>
 concept nothrow_tag_invocable =
-    tag_invocable<_Tag, _Args...> &&
+    tag_invocable<_Tag, _Args...> && //
     requires(_Tag __tag, _Args&&... __args) {
         {
             tag_invoke((_Tag &&) __tag, (_Args &&) __args...)
@@ -124,8 +137,9 @@
 inline constexpr tag_invoke_t tag_invoke{};
 
 template <auto& _Tag>
-using tag_t = decay_t<decltype(_Tag)>;
+using tag_t = __decay_t<decltype(_Tag)>;
 
+using __tag_invoke::__tag_invocable_r;
 using __tag_invoke::nothrow_tag_invocable;
 using __tag_invoke::tag_invocable;
 using __tag_invoke::tag_invoke_result;
diff --git a/include/sdbusplus/async/stdexec/import b/include/sdbusplus/async/stdexec/import
index 01c0705..7fbd6c2 100755
--- a/include/sdbusplus/async/stdexec/import
+++ b/include/sdbusplus/async/stdexec/import
@@ -4,7 +4,7 @@
 
 git -C "${execution_dir}" rev-parse HEAD > commit.info
 cp -r "${execution_dir}"/include/stdexec/* .
-cp "${execution_dir}"/include/exec/{scope,task}.hpp .
+cp "${execution_dir}"/include/exec/{any_sender_of,at_coroutine_exit,inline_scheduler,scope,task}.hpp .
 
 (find . -name "*.hpp" -print0 || true) | while IFS= read -r -d '' f
 do
diff --git a/include/sdbusplus/async/stdexec/inline_scheduler.hpp b/include/sdbusplus/async/stdexec/inline_scheduler.hpp
new file mode 100644
index 0000000..ec7ca3c
--- /dev/null
+++ b/include/sdbusplus/async/stdexec/inline_scheduler.hpp
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2021-2022 NVIDIA Corporation
+ *
+ * Licensed under the Apache License Version 2.0 with LLVM Exceptions
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *   https://llvm.org/LICENSE.txt
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include "../stdexec/execution.hpp"
+
+#include <exception>
+#include <type_traits>
+
+namespace exec
+{
+// A simple scheduler that executes its continuation inline, on the
+// thread of the caller of start().
+struct inline_scheduler
+{
+    template <class R_>
+    struct __op
+    {
+        using R = stdexec::__t<R_>;
+        [[no_unique_address]] R rec_;
+
+        friend void tag_invoke(stdexec::start_t, __op& op) noexcept
+        {
+            stdexec::set_value((R &&) op.rec_);
+        }
+    };
+
+    struct __sender
+    {
+        using is_sender = void;
+        using completion_signatures =
+            stdexec::completion_signatures<stdexec::set_value_t()>;
+
+        template <class R>
+        friend auto tag_invoke(stdexec::connect_t, __sender, R&& rec) //
+            noexcept(
+                stdexec::__nothrow_constructible_from<stdexec::__decay_t<R>, R>)
+                -> __op<stdexec::__x<stdexec::__decay_t<R>>>
+        {
+            return {(R &&) rec};
+        }
+
+        struct __env
+        {
+            friend inline_scheduler tag_invoke(
+                stdexec::get_completion_scheduler_t<stdexec::set_value_t>,
+                const __env&) //
+                noexcept
+            {
+                return {};
+            }
+        };
+
+        friend __env tag_invoke(stdexec::get_env_t, const __sender&) noexcept
+        {
+            return {};
+        }
+    };
+
+    friend __sender tag_invoke(stdexec::schedule_t,
+                               const inline_scheduler&) noexcept
+    {
+        return {};
+    }
+
+    friend stdexec::forward_progress_guarantee
+        tag_invoke(stdexec::get_forward_progress_guarantee_t,
+                   const inline_scheduler&) noexcept
+    {
+        return stdexec::forward_progress_guarantee::weakly_parallel;
+    }
+
+    bool operator==(const inline_scheduler&) const noexcept = default;
+};
+} // namespace exec
diff --git a/include/sdbusplus/async/stdexec/scope.hpp b/include/sdbusplus/async/stdexec/scope.hpp
index 57215a2..5b86305 100644
--- a/include/sdbusplus/async/stdexec/scope.hpp
+++ b/include/sdbusplus/async/stdexec/scope.hpp
@@ -15,29 +15,23 @@
  */
 #pragma once
 
-#include "../stdexec/__detail/__meta.hpp"
+#include "../stdexec/__detail/__scope.hpp"
 
 namespace exec
 {
-template <stdexec::__nothrow_callable _Fn>
+
+template <class _Fn, class... _Ts>
+    requires stdexec::__nothrow_callable<_Fn, _Ts...>
 struct scope_guard
 {
-    [[no_unique_address]] _Fn __fn_;
-    [[no_unique_address]] stdexec::__immovable __hidden_{};
-    bool __dismissed_{false};
-
-    ~scope_guard()
-    {
-        if (!__dismissed_)
-            ((_Fn &&) __fn_)();
-    }
+    stdexec::__scope_guard<_Fn, _Ts...> __guard_;
 
     void dismiss() noexcept
     {
-        __dismissed_ = true;
+        __guard_.__dismiss();
     }
 };
+template <class _Fn, class... _Ts>
+scope_guard(_Fn, _Ts...) -> scope_guard<_Fn, _Ts...>;
 
-template <stdexec::__nothrow_callable _Fn>
-scope_guard(_Fn) -> scope_guard<_Fn>;
 } // namespace exec
diff --git a/include/sdbusplus/async/stdexec/stop_token.hpp b/include/sdbusplus/async/stdexec/stop_token.hpp
index 6fd2719..a518051 100644
--- a/include/sdbusplus/async/stdexec/stop_token.hpp
+++ b/include/sdbusplus/async/stdexec/stop_token.hpp
@@ -53,8 +53,10 @@
 
   protected:
     using __execute_fn_t = void(__in_place_stop_callback_base*) noexcept;
-    explicit __in_place_stop_callback_base(const in_place_stop_source* __source,
-                                           __execute_fn_t* __execute) noexcept :
+
+    explicit __in_place_stop_callback_base(   //
+        const in_place_stop_source* __source, //
+        __execute_fn_t* __execute) noexcept :
         __source_(__source),
         __execute_(__execute)
     {}
@@ -110,14 +112,17 @@
   public:
     template <class>
     using callback_type = __callback_type;
+
     static constexpr bool stop_requested() noexcept
     {
         return false;
     }
+
     static constexpr bool stop_possible() noexcept
     {
         return false;
     }
+
     bool operator==(const never_stop_token&) const noexcept = default;
 };
 
@@ -135,6 +140,7 @@
     in_place_stop_token get_token() const noexcept;
 
     bool request_stop() noexcept;
+
     bool stop_requested() const noexcept
     {
         return (__state_.load(std::memory_order_acquire) &
@@ -232,9 +238,9 @@
   public:
     template <class _Fun2>
         requires constructible_from<_Fun, _Fun2>
-    explicit in_place_stop_callback(
-        in_place_stop_token __token,
-        _Fun2&& __fun) noexcept(std::is_nothrow_constructible_v<_Fun, _Fun2>) :
+    explicit in_place_stop_callback(in_place_stop_token __token,
+                                    _Fun2&& __fun) //
+        noexcept(__nothrow_constructible_from<_Fun, _Fun2>) :
         __stok::__in_place_stop_callback_base(
             __token.__source_, &in_place_stop_callback::__execute_impl_),
         __fun_((_Fun2 &&) __fun)
@@ -442,11 +448,11 @@
 }
 
 template <class _Token>
-concept stoppable_token = copy_constructible<_Token> &&
-                          move_constructible<_Token> &&
-                          std::is_nothrow_copy_constructible_v<_Token> &&
-                          std::is_nothrow_move_constructible_v<_Token> &&
-                          equality_comparable<_Token> &&
+concept stoppable_token = copy_constructible<_Token> &&                   //
+                          move_constructible<_Token> &&                   //
+                          std::is_nothrow_copy_constructible_v<_Token> && //
+                          std::is_nothrow_move_constructible_v<_Token> && //
+                          equality_comparable<_Token> &&                  //
                           requires(const _Token& __token) {
                               {
                                   __token.stop_requested()
@@ -463,23 +469,28 @@
 
 template <class _Token, typename _Callback, typename _Initializer = _Callback>
 concept stoppable_token_for =
-    stoppable_token<_Token> && __callable<_Callback> &&
-    requires { typename _Token::template callback_type<_Callback>; } &&
-    constructible_from<_Callback, _Initializer> &&
-    constructible_from<typename _Token::template callback_type<_Callback>,
-                       _Token, _Initializer> &&
-    constructible_from<typename _Token::template callback_type<_Callback>,
-                       _Token&, _Initializer> &&
-    constructible_from<typename _Token::template callback_type<_Callback>,
-                       const _Token, _Initializer> &&
+    stoppable_token<_Token> && __callable<_Callback> &&                 //
+    requires { typename _Token::template callback_type<_Callback>; } && //
+    constructible_from<_Callback, _Initializer> &&                      //
+    constructible_from<                                                 //
+        typename _Token::template callback_type<_Callback>, _Token,
+        _Initializer> && //
+    constructible_from<  //
+        typename _Token::template callback_type<_Callback>, _Token&,
+        _Initializer> && //
+    constructible_from<  //
+        typename _Token::template callback_type<_Callback>, const _Token,
+        _Initializer> && //
     constructible_from<typename _Token::template callback_type<_Callback>,
                        const _Token&, _Initializer>;
 
 template <class _Token>
-concept unstoppable_token = stoppable_token<_Token> &&
-                            requires {
-                                {
-                                    _Token::stop_possible()
-                                    } -> __boolean_testable_;
-                            } && (!_Token::stop_possible());
+concept unstoppable_token =    //
+    stoppable_token<_Token> && //
+    requires {
+        {
+            _Token::stop_possible()
+            } -> __boolean_testable_;
+    } && //
+    (!_Token::stop_possible());
 } // namespace stdexec
diff --git a/include/sdbusplus/async/stdexec/task.hpp b/include/sdbusplus/async/stdexec/task.hpp
index a5066cd..a3d84eb 100644
--- a/include/sdbusplus/async/stdexec/task.hpp
+++ b/include/sdbusplus/async/stdexec/task.hpp
@@ -18,6 +18,9 @@
 #include "../stdexec/__detail/__meta.hpp"
 #include "../stdexec/coroutine.hpp"
 #include "../stdexec/execution.hpp"
+#include "any_sender_of.hpp"
+#include "at_coroutine_exit.hpp"
+#include "inline_scheduler.hpp"
 #include "scope.hpp"
 
 #include <any>
@@ -33,20 +36,48 @@
 {
 namespace __task
 {
-template <class _Ty>
-concept __stop_token_provider =
-    requires(const _Ty& t) { stdexec::get_stop_token(t); };
+using namespace stdexec;
+
+using __any_scheduler = //
+    any_receiver_ref<   //
+        completion_signatures<set_error_t(std::exception_ptr),
+                              set_stopped_t()> //
+        >::any_sender<>::any_scheduler<>;
 
 template <class _Ty>
-concept __indirect_stop_token_provider = requires(const _Ty& t) {
-                                             {
-                                                 stdexec::get_env(t)
-                                                 } -> __stop_token_provider;
-                                         };
+concept __stop_token_provider = //
+    requires(const _Ty& t) {    //
+        get_stop_token(t);
+    };
+
+template <class _Ty>
+concept __indirect_stop_token_provider = //
+    requires(const _Ty& t) {
+        {
+            get_env(t)
+            } -> __stop_token_provider;
+    };
+
+template <class _Ty>
+concept __indirect_scheduler_provider = //
+    requires(const _Ty& t) {
+        {
+            get_env(t)
+            } -> __scheduler_provider;
+    };
+
+template <class _ParentPromise>
+void __check_parent_promise_has_scheduler() noexcept
+{
+    static_assert(__indirect_scheduler_provider<_ParentPromise>,
+                  "exec::task<T> cannot be co_await-ed in a coroutine that "
+                  "does not have an associated scheduler.");
+}
 
 struct __forward_stop_request
 {
-    stdexec::in_place_stop_source& __stop_source_;
+    in_place_stop_source& __stop_source_;
+
     void operator()() noexcept
     {
         __stop_source_.request_stop();
@@ -59,16 +90,37 @@
 ////////////////////////////////////////////////////////////////////////////////
 // This is the context that is associated with basic_task's promise type
 // by default. It handles forwarding of stop requests from parent to child.
+enum class __scheduler_affinity
+{
+    __none,
+    __sticky
+};
+
+template <__scheduler_affinity _SchedulerAffinity =
+              __scheduler_affinity::__sticky>
 class __default_task_context_impl
 {
     template <class _ParentPromise>
     friend struct __default_awaiter_context;
 
-    stdexec::in_place_stop_token __stop_token_;
+    static constexpr bool __with_scheduler = _SchedulerAffinity ==
+                                             __scheduler_affinity::__sticky;
 
-    friend auto tag_invoke(stdexec::get_stop_token_t,
+    [[no_unique_address]] __if_c<__with_scheduler, __any_scheduler, __ignore> //
+        __scheduler_{exec::inline_scheduler{}};
+    in_place_stop_token __stop_token_;
+
+    friend const __any_scheduler&
+        tag_invoke(get_scheduler_t,
+                   const __default_task_context_impl& __self) noexcept
+        requires(__with_scheduler)
+    {
+        return __self.__scheduler_;
+    }
+
+    friend auto tag_invoke(get_stop_token_t,
                            const __default_task_context_impl& __self) noexcept
-        -> stdexec::in_place_stop_token
+        -> in_place_stop_token
     {
         return __self.__stop_token_;
     }
@@ -76,11 +128,23 @@
   public:
     __default_task_context_impl() = default;
 
+    template <scheduler _Scheduler>
+    explicit __default_task_context_impl(_Scheduler&& __scheduler) :
+        __scheduler_{(_Scheduler &&) __scheduler}
+    {}
+
     bool stop_requested() const noexcept
     {
         return __stop_token_.stop_requested();
     }
 
+    template <scheduler _Scheduler>
+    void set_scheduler(_Scheduler&& __sched)
+        requires(__with_scheduler)
+    {
+        __scheduler_ = (_Scheduler &&) __sched;
+    }
+
     template <class _ThisPromise>
     using promise_context_t = __default_task_context_impl;
 
@@ -89,16 +153,29 @@
 };
 
 template <class _Ty>
-using default_task_context = __default_task_context_impl;
+using default_task_context =
+    __default_task_context_impl<__scheduler_affinity::__sticky>;
+
+template <class _Ty>
+using __raw_task_context =
+    __default_task_context_impl<__scheduler_affinity::__none>;
 
 // This is the context associated with basic_task's awaiter. By default
 // it does nothing.
 template <class _ParentPromise>
 struct __default_awaiter_context
 {
-    explicit __default_awaiter_context(__default_task_context_impl&,
-                                       _ParentPromise&) noexcept
-    {}
+    template <__scheduler_affinity _Affinity>
+    explicit __default_awaiter_context(
+        __default_task_context_impl<_Affinity>& __self,
+        _ParentPromise& __parent) noexcept
+    {
+        if constexpr (_Affinity == __scheduler_affinity::__sticky)
+        {
+            __check_parent_promise_has_scheduler<_ParentPromise>();
+            __self.__scheduler_ = get_scheduler(get_env(__parent));
+        }
+    }
 };
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -108,56 +185,74 @@
 template <__indirect_stop_token_provider _ParentPromise>
 struct __default_awaiter_context<_ParentPromise>
 {
-    using __stop_token_t =
-        stdexec::stop_token_of_t<stdexec::env_of_t<_ParentPromise>>;
+    using __stop_token_t = stop_token_of_t<env_of_t<_ParentPromise>>;
     using __stop_callback_t =
         typename __stop_token_t::template callback_type<__forward_stop_request>;
 
-    explicit __default_awaiter_context(__default_task_context_impl& __self,
-                                       _ParentPromise& __parent) noexcept
+    template <__scheduler_affinity _Affinity>
+    explicit __default_awaiter_context(
+        __default_task_context_impl<_Affinity>& __self,
+        _ParentPromise& __parent) noexcept
         // 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.
         :
-        __stop_callback_{stdexec::get_stop_token(stdexec::get_env(__parent)),
+        __stop_callback_{get_stop_token(get_env(__parent)),
                          __forward_stop_request{__stop_source_}}
     {
+        if constexpr (_Affinity == __scheduler_affinity::__sticky)
+        {
+            __check_parent_promise_has_scheduler<_ParentPromise>();
+            __self.__scheduler_ = get_scheduler(get_env(__parent));
+        }
         static_assert(
             std::is_nothrow_constructible_v<__stop_callback_t, __stop_token_t,
                                             __forward_stop_request>);
         __self.__stop_token_ = __stop_source_.get_token();
     }
 
-    stdexec::in_place_stop_source __stop_source_{};
+    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<
-        stdexec::in_place_stop_token,
-        stdexec::stop_token_of_t<stdexec::env_of_t<_ParentPromise>>>
+    requires std::same_as<in_place_stop_token,
+                          stop_token_of_t<env_of_t<_ParentPromise>>>
 struct __default_awaiter_context<_ParentPromise>
 {
-    explicit __default_awaiter_context(__default_task_context_impl& __self,
-                                       _ParentPromise& __parent) noexcept
+    template <__scheduler_affinity _Affinity>
+    explicit __default_awaiter_context(
+        __default_task_context_impl<_Affinity>& __self,
+        _ParentPromise& __parent) noexcept
     {
-        __self.__stop_token_ =
-            stdexec::get_stop_token(stdexec::get_env(__parent));
+        if constexpr (_Affinity == __scheduler_affinity::__sticky)
+        {
+            __check_parent_promise_has_scheduler<_ParentPromise>();
+            __self.__scheduler_ = get_scheduler(get_env(__parent));
+        }
+        __self.__stop_token_ = get_stop_token(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<
-        stdexec::stop_token_of_t<stdexec::env_of_t<_ParentPromise>>>
+    requires unstoppable_token<stop_token_of_t<env_of_t<_ParentPromise>>>
 struct __default_awaiter_context<_ParentPromise>
 {
-    explicit __default_awaiter_context(__default_task_context_impl&,
-                                       _ParentPromise&) noexcept
-    {}
+    template <__scheduler_affinity _Affinity>
+    explicit __default_awaiter_context(
+        __default_task_context_impl<_Affinity>& __self,
+        _ParentPromise& __parent) noexcept
+    {
+        if constexpr (_Affinity == __scheduler_affinity::__sticky)
+        {
+            __check_parent_promise_has_scheduler<_ParentPromise>();
+            __self.__scheduler_ = get_scheduler(get_env(__parent));
+        }
+    }
 };
 
 // Finally, if we don't know the parent coroutine's promise type, assume the
@@ -165,32 +260,42 @@
 template <>
 struct __default_awaiter_context<void>
 {
-    template <class _Ty>
-    explicit __default_awaiter_context(__default_task_context_impl&,
-                                       _Ty&) noexcept
-    {}
-
-    template <__indirect_stop_token_provider _ParentPromise>
-    explicit __default_awaiter_context(__default_task_context_impl& __self,
-                                       _ParentPromise& __parent)
+    template <__scheduler_affinity _Affinity, class _ParentPromise>
+    explicit __default_awaiter_context(
+        __default_task_context_impl<_Affinity>& __self,
+        _ParentPromise& __parent) noexcept
     {
+        if constexpr (_Affinity == __scheduler_affinity::__sticky)
+        {
+            __check_parent_promise_has_scheduler<_ParentPromise>();
+            __self.__scheduler_ = get_scheduler(get_env(__parent));
+        }
+    }
+
+    template <__scheduler_affinity _Affinity,
+              __indirect_stop_token_provider _ParentPromise>
+    explicit __default_awaiter_context(
+        __default_task_context_impl<_Affinity>& __self,
+        _ParentPromise& __parent)
+    {
+        if constexpr (_Affinity == __scheduler_affinity::__sticky)
+        {
+            __check_parent_promise_has_scheduler<_ParentPromise>();
+            __self.__scheduler_ = get_scheduler(get_env(__parent));
+        }
         // 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 =
-            stdexec::stop_token_of_t<stdexec::env_of_t<_ParentPromise>>;
+        using __stop_token_t = stop_token_of_t<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,
-                                   stdexec::in_place_stop_token>)
+        if constexpr (std::same_as<__stop_token_t, in_place_stop_token>)
         {
-            __self.__stop_token_ =
-                stdexec::get_stop_token(stdexec::get_env(__parent));
+            __self.__stop_token_ = get_stop_token(get_env(__parent));
         }
-        else if (auto __token =
-                     stdexec::get_stop_token(stdexec::get_env(__parent));
+        else if (auto __token = get_stop_token(get_env(__parent));
                  __token.stop_possible())
         {
             __stop_callback_.emplace<__stop_callback_t>(
@@ -199,13 +304,14 @@
         }
     }
 
-    stdexec::in_place_stop_source __stop_source_{};
+    in_place_stop_source __stop_source_{};
     std::any __stop_callback_{};
 };
 
 template <class _Promise, class _ParentPromise = void>
-using awaiter_context_t = typename stdexec::env_of_t<
-    _Promise>::template awaiter_context_t<_Promise, _ParentPromise>;
+using awaiter_context_t =                  //
+    typename __decay_t<env_of_t<_Promise>> //
+    ::template awaiter_context_t<_Promise, _ParentPromise>;
 
 ////////////////////////////////////////////////////////////////////////////////
 // In a base class so it can be specialized when _Ty is void:
@@ -216,6 +322,7 @@
     {
         __data_.template emplace<1>(std::move(value));
     }
+
     std::variant<std::monostate, _Ty, std::exception_ptr> __data_{};
 };
 
@@ -224,13 +331,37 @@
 {
     struct __void
     {};
+
     void return_void() noexcept
     {
         __data_.template emplace<1>(__void{});
     }
+
     std::variant<std::monostate, __void, std::exception_ptr> __data_{};
 };
 
+enum class disposition : unsigned
+{
+    stopped,
+    succeeded,
+    failed,
+};
+
+struct __reschedule_coroutine_on
+{
+    template <class _Scheduler>
+    struct __wrap
+    {
+        _Scheduler __sched_;
+    };
+
+    template <scheduler _Scheduler>
+    __wrap<_Scheduler> operator()(_Scheduler __sched) const noexcept
+    {
+        return {(_Scheduler &&) __sched};
+    }
+};
+
 ////////////////////////////////////////////////////////////////////////////////
 // basic_task
 template <class _Ty, class _Context = default_task_context<_Ty>>
@@ -260,43 +391,97 @@
         {
             return {};
         }
+
         static __coro::coroutine_handle<>
             await_suspend(__coro::coroutine_handle<__promise> __h) noexcept
         {
             return __h.promise().continuation().handle();
         }
+
         static void await_resume() noexcept {}
     };
 
-    struct __promise :
-        __promise_base<_Ty>,
-        stdexec::with_awaitable_senders<__promise>
+    struct __promise : __promise_base<_Ty>, with_awaitable_senders<__promise>
     {
         basic_task get_return_object() noexcept
         {
             return basic_task(
                 __coro::coroutine_handle<__promise>::from_promise(*this));
         }
+
         __coro::suspend_always initial_suspend() noexcept
         {
             return {};
         }
+
         __final_awaitable final_suspend() noexcept
         {
             return {};
         }
+
+        __task::disposition disposition() const noexcept
+        {
+            return static_cast<__task::disposition>(this->__data_.index());
+        }
+
         void unhandled_exception() noexcept
         {
             this->__data_.template emplace<2>(std::current_exception());
         }
+
+        template <sender _Awaitable>
+            requires __scheduler_provider<_Context> decltype(auto)
+        await_transform(_Awaitable&& __awaitable) noexcept
+        {
+            // TODO: If we have a complete-where-it-starts query then we can
+            // optimize this to avoid the reschedule
+            return as_awaitable(transfer((_Awaitable &&) __awaitable,
+                                         get_scheduler(__context_)),
+                                *this);
+        }
+
+        template <class _Scheduler>
+            requires __scheduler_provider<_Context> decltype(auto)
+        await_transform(
+            __reschedule_coroutine_on::__wrap<_Scheduler> __box) noexcept
+        {
+            if (!std::exchange(__rescheduled_, true))
+            {
+                // Create a cleanup action that transitions back onto the
+                // current scheduler:
+                auto __sched = get_scheduler(__context_);
+                auto __cleanup_task = at_coroutine_exit(schedule,
+                                                        std::move(__sched));
+                // Insert the cleanup action into the head of the continuation
+                // chain by making direct calls to the cleanup task's awaiter
+                // member functions. See type _cleanup_task in
+                // at_coroutine_exit.hpp:
+                __cleanup_task.await_suspend(
+                    __coro::coroutine_handle<__promise>::from_promise(*this));
+                (void)__cleanup_task.await_resume();
+            }
+            __context_.set_scheduler(__box.__sched_);
+            return as_awaitable(schedule(__box.__sched_), *this);
+        }
+
+        template <class _Awaitable>
+        decltype(auto) await_transform(_Awaitable&& __awaitable) noexcept
+        {
+            return with_awaitable_senders<__promise>::await_transform(
+                (_Awaitable &&) __awaitable);
+        }
+
         using __context_t =
             typename _Context::template promise_context_t<__promise>;
-        friend __context_t tag_invoke(stdexec::get_env_t,
-                                      const __promise& __self)
+
+        friend const __context_t& tag_invoke(get_env_t,
+                                             const __promise& __self) noexcept
         {
             return __self.__context_;
         }
+
         __context_t __context_;
+        bool __rescheduled_{false};
     };
 
     template <class _ParentPromise = void>
@@ -316,15 +501,15 @@
         {
             return {};
         }
-        template <class ParentPromise2>
+
+        template <class _ParentPromise2>
         __coro::coroutine_handle<> await_suspend(
-            __coro::coroutine_handle<ParentPromise2> __parent) noexcept
+            __coro::coroutine_handle<_ParentPromise2> __parent) noexcept
         {
-            static_assert(
-                stdexec::__one_of<_ParentPromise, ParentPromise2, void>);
-            __coro_.promise().set_continuation(__parent);
+            static_assert(__one_of<_ParentPromise, _ParentPromise2, void>);
             __context_.emplace(__coro_.promise().__context_,
                                __parent.promise());
+            __coro_.promise().set_continuation(__parent);
             if constexpr (requires {
                               __coro_.promise().stop_requested() ? 0 : 1;
                           })
@@ -334,6 +519,7 @@
             }
             return __coro_;
         }
+
         _Ty await_resume()
         {
             __context_.reset();
@@ -349,10 +535,10 @@
 
     // Make this task awaitable within a particular context:
     template <class _ParentPromise>
-        requires stdexec::constructible_from<
+        requires constructible_from<
             awaiter_context_t<__promise, _ParentPromise>, __promise&,
             _ParentPromise&>
-    friend __task_awaitable<_ParentPromise> tag_invoke(stdexec::as_awaitable_t,
+    friend __task_awaitable<_ParentPromise> tag_invoke(as_awaitable_t,
                                                        basic_task&& __self,
                                                        _ParentPromise&) noexcept
     {
@@ -362,7 +548,7 @@
 
     // Make this task generally awaitable:
     friend __task_awaitable<> operator co_await(basic_task&& __self) noexcept
-        requires stdexec::__valid<awaiter_context_t, __promise>
+        requires __valid<awaiter_context_t, __promise>
     {
         return __task_awaitable<>{std::exchange(__self.__coro_, {})};
     }
@@ -371,19 +557,17 @@
     //   the resulting list to __qf<set_value_t>, which uses the list of types
     //   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::__minvoke<
-        stdexec::__remove<void, stdexec::__qf<stdexec::set_value_t>>, _Ty>;
+    using __set_value_sig_t = __minvoke<__remove<void, __qf<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 =
-        stdexec::completion_signatures<__set_value_sig_t,
-                                       stdexec::set_error_t(std::exception_ptr),
-                                       stdexec::set_stopped_t()>;
+    using __task_traits_t = //
+        completion_signatures<__set_value_sig_t,
+                              set_error_t(std::exception_ptr), set_stopped_t()>;
 
-    friend auto tag_invoke(stdexec::get_completion_signatures_t,
-                           const basic_task&, auto) -> __task_traits_t;
+    friend auto tag_invoke(get_completion_signatures_t, const basic_task&, auto)
+        -> __task_traits_t;
 
     explicit basic_task(__coro::coroutine_handle<promise_type> __coro) noexcept
         :
@@ -394,6 +578,8 @@
 };
 } // namespace __task
 
+using task_disposition = __task::disposition;
+
 template <class _Ty>
 using default_task_context = __task::default_task_context<_Ty>;
 
@@ -405,6 +591,8 @@
 
 template <class _Ty>
 using task = basic_task<_Ty, default_task_context<_Ty>>;
+
+inline constexpr __task::__reschedule_coroutine_on reschedule_coroutine_on{};
 } // namespace exec
 
 STDEXEC_PRAGMA_POP()