stdexec: update to latest commit

Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: Iab95a1aed6e33663e918a382d6f43eb34028c5a5
diff --git a/include/sdbusplus/async/stdexec/__detail/__concepts.hpp b/include/sdbusplus/async/stdexec/__detail/__concepts.hpp
new file mode 100644
index 0000000..dd6d029
--- /dev/null
+++ b/include/sdbusplus/async/stdexec/__detail/__concepts.hpp
@@ -0,0 +1,106 @@
+/*
+ * 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 "__config.hpp"
+#include "__type_traits.hpp"
+
+namespace stdexec
+{
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+template <class _Fun, class... _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;
+    };
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+template <class...>
+struct __types;
+
+template <class... _Ts>
+concept __typename = requires { typename __types<_Ts...>; };
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+#if STDEXEC_CLANG()
+
+template <class _Ap, class _Bp>
+concept __same_as = __is_same(_Ap, _Bp);
+
+#elif STDEXEC_GCC()
+
+template <class _Ap, class _Bp>
+concept __same_as = __is_same_as(_Ap, _Bp);
+
+#else
+
+template <class _Ap, class _Bp>
+inline constexpr bool __same_as_v = false;
+
+template <class _Ap>
+inline constexpr bool __same_as_v<_Ap, _Ap> = true;
+
+template <class _Ap, class _Bp>
+concept __same_as = __same_as_v<_Ap, _Bp>;
+
+#endif
+
+// Handy concepts
+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 _Cp>
+concept __class = __true<int _Cp::*> && (!__same_as<const _Cp, _Cp>);
+
+template <class _Ty, class... _As>
+concept __one_of = (__same_as<_Ty, _As> || ...);
+
+template <class _Ty, class... _Us>
+concept __all_of = (__same_as<_Ty, _Us> && ...);
+
+template <class _Ty, class... _Us>
+concept __none_of = ((!__same_as<_Ty, _Us>)&&...);
+
+template <class, template <class...> class>
+constexpr bool __is_instance_of_ = false;
+template <class... _As, template <class...> class _Ty>
+constexpr bool __is_instance_of_<_Ty<_As...>, _Ty> = true;
+
+template <class _Ay, template <class...> class _Ty>
+concept __is_instance_of = __is_instance_of_<_Ay, _Ty>;
+
+template <class _Ay, template <class...> class _Ty>
+concept __is_not_instance_of = !__is_instance_of<_Ay, _Ty>;
+
+} // namespace stdexec
diff --git a/include/sdbusplus/async/stdexec/__detail/__config.hpp b/include/sdbusplus/async/stdexec/__detail/__config.hpp
index 0b3bc2d..08e11ac 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_(_Xp, ...) _Xp##__VA_ARGS__
-#define STDEXEC_CAT(_Xp, ...) STDEXEC_CAT_(_Xp, __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(_MACRO, ...) _MACRO(__VA_ARGS__)
 
-#define STDEXEC_NOT(_Xp) STDEXEC_CAT(STDEXEC_NOT_, _Xp)
+#define STDEXEC_NOT(_XP) STDEXEC_CAT(STDEXEC_NOT_, _XP)
 #define STDEXEC_NOT_0 1
 #define STDEXEC_NOT_1 0
 
-#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_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, _Np, ...) _Np
+#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(_Xp, _Np, ...) _Np
-#define STDEXEC_PROBE(_Xp) _Xp, 1,
+#define STDEXEC_CHECK_N(_XP, _NP, ...) _NP
+#define STDEXEC_PROBE(_XP) _XP, 1,
 
 #if defined(__NVCOMPILER)
 #define STDEXEC_NVHPC() 1
@@ -68,15 +68,15 @@
 #endif
 
 #if STDEXEC_CLANG()
-#define STDEXEC_STRINGIZE(__arg) #__arg
+#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))
+#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)
+#define STDEXEC_PRAGMA_IGNORE(_ARG)
 #endif
 
 #ifdef __has_builtin
@@ -85,24 +85,62 @@
 #define STDEXEC_HAS_BUILTIN(...) 0
 #endif
 
+// Before gcc-12, gcc really didn't like tuples or variants of immovable types
+#if STDEXEC_GCC() && (__GNUC__ < 12)
+#define STDEXEC_IMMOVABLE(_XP) _XP(_XP&&)
+#else
+#define STDEXEC_IMMOVABLE(_XP) _XP(_XP&&) = delete
+#endif
+
+// NVBUG #4067067
+#if STDEXEC_NVHPC()
+#define STDEXEC_NO_UNIQUE_ADDRESS
+#else
+#define STDEXEC_NO_UNIQUE_ADDRESS [[no_unique_address]]
+#endif
+
+// BUG (gcc PR93711): copy elision fails when initializing a
+// [[no_unique_address]] field from a function returning an object
+// of class type by value
+#if STDEXEC_GCC()
+#define STDEXEC_IMMOVABLE_NO_UNIQUE_ADDRESS
+#else
+#define STDEXEC_IMMOVABLE_NO_UNIQUE_ADDRESS [[no_unique_address]]
+#endif
+
 #if STDEXEC_CLANG() && defined(__CUDACC__)
 #define STDEXEC_DETAIL_CUDACC_HOST_DEVICE __host__ __device__
 #else
 #define STDEXEC_DETAIL_CUDACC_HOST_DEVICE
 #endif
 
+#if STDEXEC_NVHPC()
+#include <nv/target>
+#define STDEXEC_TERMINATE()                                                    \
+    NV_IF_TARGET(NV_IS_HOST, (std::terminate();), (__trap();)) void()
+#elif STDEXEC_CLANG() && defined(__CUDACC__) && defined(__CUDA_ARCH__)
+#define STDEXEC_TERMINATE()                                                    \
+    __trap();                                                                  \
+    __builtin_unreachable()
+#else
+#define STDEXEC_TERMINATE() std::terminate()
+#endif
+
 #ifdef STDEXEC_ASSERT
 #error                                                                         \
     "Redefinition of STDEXEC_ASSERT is not permitted. Define STDEXEC_ASSERT_FN instead."
 #endif
 
-#define STDEXEC_ASSERT(_Xp)                                                    \
+#define STDEXEC_ASSERT(_XP)                                                    \
     do                                                                         \
     {                                                                          \
-        static_assert(noexcept(_Xp));                                          \
-        STDEXEC_ASSERT_FN(_Xp);                                                \
+        static_assert(noexcept(_XP));                                          \
+        STDEXEC_ASSERT_FN(_XP);                                                \
     } while (false)
 
 #ifndef STDEXEC_ASSERT_FN
 #define STDEXEC_ASSERT_FN assert
 #endif
+
+namespace stdexec
+{}
diff --git a/include/sdbusplus/async/stdexec/__detail/__execution_fwd.hpp b/include/sdbusplus/async/stdexec/__detail/__execution_fwd.hpp
new file mode 100644
index 0000000..84c3387
--- /dev/null
+++ b/include/sdbusplus/async/stdexec/__detail/__execution_fwd.hpp
@@ -0,0 +1,174 @@
+/*
+ * 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 "__concepts.hpp"
+#include "__config.hpp"
+#include "__meta.hpp"
+
+namespace stdexec
+{
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+namespace __receivers
+{
+struct set_value_t;
+struct set_error_t;
+struct set_stopped_t;
+} // namespace __receivers
+
+using __receivers::set_error_t;
+using __receivers::set_stopped_t;
+using __receivers::set_value_t;
+extern const set_value_t set_value;
+extern const set_error_t set_error;
+extern const set_stopped_t set_stopped;
+
+template <class _Tag>
+concept __completion_tag =
+    __one_of<_Tag, set_value_t, set_error_t, set_stopped_t>;
+
+template <class _Sender>
+extern const bool enable_receiver;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+namespace __env
+{
+struct get_env_t;
+}
+
+using __env::get_env_t;
+extern const get_env_t get_env;
+
+template <class _EnvProvider>
+using env_of_t = __call_result_t<get_env_t, _EnvProvider>;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+enum class forward_progress_guarantee
+{
+    concurrent,
+    parallel,
+    weakly_parallel
+};
+
+namespace __queries
+{
+struct forwarding_query_t;
+struct execute_may_block_caller_t;
+struct get_forward_progress_guarantee_t;
+struct __has_algorithm_customizations_t;
+struct get_scheduler_t;
+struct get_delegatee_scheduler_t;
+struct get_allocator_t;
+struct get_stop_token_t;
+template <__completion_tag _CPO>
+struct get_completion_scheduler_t;
+} // namespace __queries
+
+using __queries::__has_algorithm_customizations_t;
+using __queries::execute_may_block_caller_t;
+using __queries::forwarding_query_t;
+using __queries::get_allocator_t;
+using __queries::get_completion_scheduler_t;
+using __queries::get_delegatee_scheduler_t;
+using __queries::get_forward_progress_guarantee_t;
+using __queries::get_scheduler_t;
+using __queries::get_stop_token_t;
+
+extern const forwarding_query_t forwarding_query;
+extern const execute_may_block_caller_t execute_may_block_caller;
+extern const __has_algorithm_customizations_t __has_algorithm_customizations;
+extern const get_forward_progress_guarantee_t get_forward_progress_guarantee;
+extern const get_scheduler_t get_scheduler;
+extern const get_delegatee_scheduler_t get_delegatee_scheduler;
+extern const get_allocator_t get_allocator;
+extern const get_stop_token_t get_stop_token;
+template <__completion_tag _CPO>
+extern const get_completion_scheduler_t<_CPO> get_completion_scheduler;
+
+template <class _Tp>
+using stop_token_of_t = __decay_t<__call_result_t<get_stop_token_t, _Tp>>;
+
+template <class _Sender, class _CPO>
+concept __has_completion_scheduler =
+    __callable<get_completion_scheduler_t<_CPO>,
+               __call_result_t<get_env_t, const _Sender&>>;
+
+template <class _Sender, class _CPO>
+using __completion_scheduler_for =
+    __call_result_t<get_completion_scheduler_t<_CPO>,
+                    __call_result_t<get_env_t, const _Sender&>>;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+namespace __get_completion_signatures
+{
+struct get_completion_signatures_t;
+}
+
+using __get_completion_signatures::get_completion_signatures_t;
+extern const get_completion_signatures_t get_completion_signatures;
+
+template <class _Sender, class _Env>
+using __completion_signatures_of_t =
+    __call_result_t<get_completion_signatures_t, _Sender, _Env>;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+namespace __connect
+{
+struct connect_t;
+}
+
+using __connect::connect_t;
+extern const connect_t connect;
+
+template <class _Sender, class _Receiver>
+using connect_result_t = __call_result_t<connect_t, _Sender, _Receiver>;
+
+template <class _Sender, class _Receiver>
+concept __nothrow_connectable =
+    __nothrow_callable<connect_t, _Sender, _Receiver>;
+
+template <class _Sender>
+extern const bool enable_sender;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+namespace __start
+{
+struct start_t;
+}
+
+using __start::start_t;
+extern const start_t start;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+namespace __schedule
+{
+struct schedule_t;
+}
+
+using __schedule::schedule_t;
+extern const schedule_t schedule;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+namespace __as_awaitable
+{
+struct as_awaitable_t;
+}
+
+using __as_awaitable::as_awaitable_t;
+extern const as_awaitable_t as_awaitable;
+
+} // namespace stdexec
diff --git a/include/sdbusplus/async/stdexec/__detail/__force_include.hpp b/include/sdbusplus/async/stdexec/__detail/__force_include.hpp
new file mode 100644
index 0000000..9a857f9
--- /dev/null
+++ b/include/sdbusplus/async/stdexec/__detail/__force_include.hpp
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 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.
+ */
+
+#if defined(__clang__) && defined(__CUDACC__)
+
+#ifdef __noinline__
+#undef __noinline__
+#endif
+
+#endif
diff --git a/include/sdbusplus/async/stdexec/__detail/__meta.hpp b/include/sdbusplus/async/stdexec/__detail/__meta.hpp
index 35c43a5..698526e 100644
--- a/include/sdbusplus/async/stdexec/__detail/__meta.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__meta.hpp
@@ -15,7 +15,9 @@
  */
 #pragma once
 
+#include "__concepts.hpp"
 #include "__config.hpp"
+#include "__type_traits.hpp"
 
 #include <cassert>
 #include <exception>
@@ -25,6 +27,9 @@
 namespace stdexec
 {
 
+template <class...>
+struct __undefined;
+
 struct __
 {};
 
@@ -35,22 +40,6 @@
     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(_Xp) _Xp(_Xp&&)
-#else
-#define STDEXEC_IMMOVABLE(_Xp) _Xp(_Xp&&) = delete
-#endif
-
-// BUG (gcc PR93711): copy elision fails when initializing a
-// [[no_unique_address]] field from a function returning an object
-// of class type by value
-#if defined(__GNUC__) && !defined(__clang__)
-#define STDEXEC_IMMOVABLE_NO_UNIQUE_ADDRESS
-#else
-#define STDEXEC_IMMOVABLE_NO_UNIQUE_ADDRESS [[no_unique_address]]
-#endif
-
 struct __none_such
 {};
 
@@ -85,21 +74,30 @@
     using __t = _Ty;
 };
 
-// Some utilities for manipulating lists of types at compile time
+template <auto _Value>
+using __mtypeof = decltype(_Value);
+
 template <class...>
 struct __types;
 
-template <class... _Ts>
-concept __typename = requires { typename __types<_Ts...>; };
-
 template <class _Tp>
 using __midentity = _Tp;
 
 template <std::size_t _Np>
 using __msize_t = char[_Np + 1];
 
+template <class _Tp, class _Up>
+using __mfirst = _Tp;
+
+template <class _Tp, class _UXp>
+using __msecond = _UXp;
+
 template <class _Tp>
-inline constexpr auto __v = _Tp::value;
+extern const __undefined<_Tp> __v;
+
+template <class _Tp>
+    requires __typename<__mtypeof<_Tp::value>>
+inline constexpr auto __v<_Tp> = _Tp::value;
 
 template <class _Tp, class _Up>
 inline constexpr bool __v<std::is_same<_Tp, _Up>> = false;
@@ -113,26 +111,145 @@
 template <std::size_t _Ip>
 inline constexpr std::size_t __v<char[_Ip]> = _Ip - 1;
 
-template <bool>
+template <std::size_t... _Is>
+using __indices = std::index_sequence<_Is...>*;
+
+template <std::size_t _Np>
+using __make_indices = std::make_index_sequence<_Np>*;
+
+template <class _Char>
+concept __mchar = __same_as<_Char, char>;
+
+template <std::size_t _Len>
+class __mstring
+{
+    template <std::size_t... _Is>
+    constexpr __mstring(const char (&__str)[_Len], __indices<_Is...>) noexcept :
+        __what_{__str[_Is]...}
+    {}
+
+  public:
+    constexpr __mstring(const char (&__str)[_Len]) noexcept :
+        __mstring{__str, __make_indices<_Len>{}}
+    {}
+
+    template <__mchar... _Char>
+        requires(sizeof...(_Char) == _Len)
+    constexpr __mstring(_Char... __chars) noexcept : __what_{__chars...}
+    {}
+
+    static constexpr std::size_t __length() noexcept
+    {
+        return _Len;
+    }
+
+    const char __what_[_Len];
+};
+
+#if STDEXEC_NVHPC() && (__EDG_VERSION__ < 604)
+// Use a non-standard extension for older nvc++ releases
+template <__mchar _Char, _Char... _Str>
+constexpr __mstring<sizeof...(_Str)> operator""__csz() noexcept
+{
+    return {_Str...};
+}
+#elif STDEXEC_NVHPC()
+// BUGBUG TODO This is to work around an unknown EDG bug
+template <__mstring _Str>
+constexpr auto operator""__csz() noexcept
+{
+    return _Str;
+}
+#else
+// Use a standard user-defined string literal template
+template <__mstring _Str>
+constexpr __mtypeof<_Str> operator""__csz() noexcept
+{
+    return _Str;
+}
+#endif
+
+using __msuccess = int;
+
+template <class _What, class... _With>
+struct _WARNING_
+{};
+
+template <class _What, class... _With>
+struct _ERROR_
+{
+    const _ERROR_& operator,(__msuccess) const noexcept;
+};
+
+template <class _What, class... _With>
+using __mexception = const _ERROR_<_What, _With...>&;
+
+template <class>
+extern __msuccess __ok_v;
+
+template <class _What, class... _With>
+extern _ERROR_<_What, _With...> __ok_v<__mexception<_What, _With...>>;
+
+template <class _Ty>
+using __ok_t = decltype(__ok_v<_Ty>);
+
+template <class... _Ts>
+using __disp = const decltype((__msuccess(), ..., __ok_t<_Ts>()))&;
+
+template <bool _AllOK>
 struct __i
 {
     template <template <class...> class _Fn, class... _Args>
     using __g = _Fn<_Args...>;
 };
 
-template <class...>
-concept __tru = true; // a dependent value
+template <>
+struct __i<false>
+{
+    template <template <class...> class, class... _Args>
+    using __g = __disp<_Args...>;
+};
+
+template <class _Arg>
+concept __ok = __same_as<__ok_t<_Arg>, __msuccess>;
+
+template <class _Arg>
+concept __merror = !__ok<_Arg>;
+
+template <class... _Args>
+concept _Ok = (__ok<_Args> && ...);
+
+#if STDEXEC_NVHPC()
+// Most compilers memoize alias template specializations, but
+// nvc++ does not. So we memoize the type computations by
+// indirecting through a class template specialization.
+template <template <class...> class _Fn, class... _Args>
+using __meval__ = typename __i<_Ok<_Args...>>::template __g<_Fn, _Args...>;
 
 template <template <class...> class _Fn, class... _Args>
-using __meval = typename __i<__tru<_Args...>>::template __g<_Fn, _Args...>;
+struct __meval_
+{};
+
+template <template <class...> class _Fn, class... _Args>
+    requires __typename<__meval__<_Fn, _Args...>>
+struct __meval_<_Fn, _Args...>
+{
+    using __t = __meval__<_Fn, _Args...>;
+};
+
+template <template <class...> class _Fn, class... _Args>
+using __meval = __t<__meval_<_Fn, _Args...>>;
+
+#else
+
+template <template <class...> class _Fn, class... _Args>
+using __meval = typename __i<_Ok<_Args...>>::template __g<_Fn, _Args...>;
+
+#endif
 
 template <class _Fn, class... _Args>
 using __minvoke = __meval<_Fn::template __f, _Args...>;
 
-template <class _Ty, class... _Args>
-using __make_dependent_on =
-    typename __i<__tru<_Args...>>::template __g<__midentity, _Ty>;
-
 template <template <class...> class _Fn>
 struct __q
 {
@@ -166,6 +283,13 @@
 template <class _Fn, class... _Args>
 concept __minvocable = __valid<_Fn::template __f, _Args...>;
 
+template <template <class...> class _Tp, class... _Args>
+concept __msucceeds = __valid<_Tp, _Args...> && __ok<__meval<_Tp, _Args...>>;
+
+template <class _Fn, class... _Args>
+concept __minvocable_succeeds = __minvocable<_Fn, _Args...> &&
+                                __ok<__minvoke<_Fn, _Args...>>;
+
 template <class _Fn, class... _Args>
 struct __force_minvoke_
 {
@@ -189,31 +313,33 @@
 struct __mdefer : __mdefer_<_Fn, _Args...>
 {};
 
-template <bool>
 struct __if_
 {
-    template <class _True, class...>
-    using __f = _True;
+    template <bool>
+    struct __
+    {
+        template <class _True, class...>
+        using __f = _True;
+    };
+
+    template <class _Pred, class _True, class... _False>
+    using __f = __minvoke<__<static_cast<bool>(__v<_Pred>)>, _True, _False...>;
 };
 
 template <>
-struct __if_<false>
+struct __if_::__<false>
 {
     template <class, class _False>
     using __f = _False;
 };
-#if STDEXEC_NVHPC()
-template <class _Pred, class _True, class... _False>
+
+template <class _Pred, class _True = void, class... _False>
     requires(sizeof...(_False) <= 1)
-using __if = __minvoke<__if_<_Pred::value>, _True, _False...>;
-#else
-template <class _Pred, class _True, class... _False>
+using __if = __minvoke<__if_, _Pred, _True, _False...>;
+
+template <bool _Pred, class _True = void, class... _False>
     requires(sizeof...(_False) <= 1)
-using __if = __minvoke<__if_<__v<_Pred>>, _True, _False...>;
-#endif
-template <bool _Pred, class _True, class... _False>
-    requires(sizeof...(_False) <= 1)
-using __if_c = __minvoke<__if_<_Pred>, _True, _False...>;
+using __if_c = __minvoke<__if_::__<_Pred>, _True, _False...>;
 
 template <class _Tp>
 struct __mconst
@@ -222,15 +348,71 @@
     using __f = _Tp;
 };
 
-template <class _Fn, class _Default>
-struct __with_default
+template <template <class...> class _Try, class _Catch>
+struct __mtry_catch_q
 {
     template <class... _Args>
     using __f =
-        __minvoke<__if_c<__minvocable<_Fn, _Args...>, _Fn, __mconst<_Default>>,
-                  _Args...>;
+        __minvoke<__if_c<__valid<_Try, _Args...>, __q<_Try>, _Catch>, _Args...>;
 };
 
+template <class _Try, class _Catch>
+struct __mtry_catch
+{
+    template <class... _Args>
+    using __f =
+        __minvoke<__if_c<__minvocable<_Try, _Args...>, _Try, _Catch>, _Args...>;
+};
+
+template <class _Fn, class _Default>
+using __with_default = __mtry_catch<_Fn, __mconst<_Default>>;
+
+inline constexpr __mstring __mbad_substitution =
+    "The specified meta-function could not be evaluated with the types provided."__csz;
+
+template <__mstring _Diagnostic = __mbad_substitution>
+struct _BAD_SUBSTITUTION_
+{};
+
+template <class... _Args>
+struct _WITH_TYPES_
+{};
+
+template <template <class...> class _Fun>
+struct _WITH_META_FUNCTION_T_
+{
+    template <class... _Args>
+    using __f = __mexception<_BAD_SUBSTITUTION_<>, _WITH_META_FUNCTION_T_,
+                             _WITH_TYPES_<_Args...>>;
+};
+
+template <class _Fun>
+struct _WITH_META_FUNCTION_
+{
+    template <class... _Args>
+    using __f = __mexception<_BAD_SUBSTITUTION_<>, _WITH_META_FUNCTION_,
+                             _WITH_TYPES_<_Args...>>;
+};
+
+template <template <class...> class _Fn>
+struct __mtry_eval_
+{
+    template <class... _Args>
+    using __f = __meval<_Fn, _Args...>;
+};
+
+template <template <class...> class _Fn, class... _Args>
+using __mtry_eval =
+    __minvoke<__mtry_catch<__mtry_eval_<_Fn>, _WITH_META_FUNCTION_T_<_Fn>>,
+              _Args...>;
+
+template <class _Fn, class... _Args>
+using __mtry_invoke =
+    __minvoke<__mtry_catch<_Fn, _WITH_META_FUNCTION_<_Fn>>, _Args...>;
+
+template <class _Ty, class... _Default>
+using __msuccess_or_t = __if_c<__ok<_Ty>, _Ty, _Default...>;
+
 template <class _Fn, class _Continuation = __q<__types>>
 struct __transform
 {
@@ -261,7 +443,7 @@
         __minvoke<__mfold_right_<sizeof...(_Args) == 0>, _Fn, _Init, _Args...>;
 };
 
-template <class _Continuation, class...>
+template <class _Continuation, class... _As>
 struct __mconcat_
 {};
 
@@ -336,6 +518,12 @@
 template <class _Fn, class _Tp>
 struct __uncurry_;
 
+template <__merror _Fn, class _Tp>
+struct __uncurry_<_Fn, _Tp>
+{
+    using __t = _Fn;
+};
+
 template <class _Fn, template <class...> class _Ap, class... _As>
     requires __minvocable<_Fn, _As...>
 struct __uncurry_<_Fn, _Ap<_As...>>
@@ -362,7 +550,7 @@
 struct __mcount
 {
     template <class... _Ts>
-    using __f = __msize_t<(__v<std::is_same<_Ts, _Ty>> + ... + 0)>;
+    using __f = __msize_t<(__same_as<_Ts, _Ty> + ... + 0)>;
 };
 
 template <class _Fn>
@@ -376,7 +564,7 @@
 struct __contains
 {
     template <class... _Args>
-    using __f = __mbool<(__v<std::is_same<_Tp, _Args>> || ...)>;
+    using __f = __mbool<(__same_as<_Tp, _Args> || ...)>;
 };
 
 template <class _Continuation = __q<__types>>
@@ -434,7 +622,7 @@
 {
     template <class... _Args>
     using __f = __minvoke<_Continuation,
-                          __if<std::is_same<_Args, _Old>, _New, _Args>...>;
+                          __if_c<__same_as<_Args, _Old>, _New, _Args>...>;
 };
 
 template <class _Old, class _Continuation = __q<__types>>
@@ -442,8 +630,8 @@
 {
     template <class... _Args>
     using __f = //
-        __minvoke<__mconcat<_Continuation>, __if<std::is_same<_Args, _Old>,
-                                                 __types<>, __types<_Args>>...>;
+        __minvoke<__mconcat<_Continuation>,
+                  __if_c<__same_as<_Args, _Old>, __types<>, __types<_Args>>...>;
 };
 
 template <class _Pred, class _Continuation = __q<__types>>
@@ -462,65 +650,6 @@
     using __f = _Return(_Args...);
 };
 
-// A very simple std::declval replacement that doesn't handle void
-template <class _Tp>
-_Tp&& __declval() noexcept;
-
-// For copying cvref from one type to another:
-struct __cp
-{
-    template <class _Tp>
-    using __f = _Tp;
-};
-
-struct __cpc
-{
-    template <class _Tp>
-    using __f = const _Tp;
-};
-
-struct __cplr
-{
-    template <class _Tp>
-    using __f = _Tp&;
-};
-
-struct __cprr
-{
-    template <class _Tp>
-    using __f = _Tp&&;
-};
-
-struct __cpclr
-{
-    template <class _Tp>
-    using __f = const _Tp&;
-};
-
-struct __cpcrr
-{
-    template <class _Tp>
-    using __f = const _Tp&&;
-};
-
-template <class>
-extern __cp __cpcvr;
-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>;
-
 template <class _Ty, class...>
 using __mfront_ = _Ty;
 template <class... _As>
@@ -585,23 +714,9 @@
 template <class _Ty>
 using __cvref_t = __copy_cvref_t<_Ty, __t<std::remove_cvref_t<_Ty>>>;
 
-template <class _From, class _To>
+template <class _From, class _To = __decay_t<_From>>
 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...);    //
-    };
-template <class _Fun, class... _As>
-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.
 // To avoid repeated computation of the same function return type,
@@ -623,8 +738,8 @@
     using __f = __call_result_t<_Fun, _As...>;
 };
 template <bool _Enable, class _Fun, class... _As>
-using __call_result_if_t = typename __if<__mbool<_Enable>, __qcall_result,
-                                         __>::template __f<_Fun, _As...>;
+using __call_result_if_t =
+    __minvoke<__if<__mbool<_Enable>, __qcall_result, __>, _Fun, _As...>;
 
 // For emplacing non-movable types into optionals:
 template <class _Fn>
@@ -738,11 +853,19 @@
 };
 
 template <class... _Booleans>
-using __mand = __mbool<(__v<_Booleans> && ...)>;
+using __mand_ = __mbool<(__v<_Booleans> && ...)>;
 template <class... _Booleans>
-using __mor = __mbool<(__v<_Booleans> || ...)>;
+using __mand = __meval<__mand_, _Booleans...>;
+
+template <class... _Booleans>
+using __mor_ = __mbool<(__v<_Booleans> || ...)>;
+template <class... _Booleans>
+using __mor = __meval<__mor_, _Booleans...>;
+
 template <class _Boolean>
-using __mnot = __mbool<!__v<_Boolean>>;
+using __mnot_ = __mbool<!__v<_Boolean>>;
+template <class _Boolean>
+using __mnot = __meval<__mnot_, _Boolean>;
 
 template <class _Fn>
 struct __mall_of
diff --git a/include/sdbusplus/async/stdexec/__detail/__p2300.hpp b/include/sdbusplus/async/stdexec/__detail/__p2300.hpp
index 8bd2403..56057ba 100644
--- a/include/sdbusplus/async/stdexec/__detail/__p2300.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__p2300.hpp
@@ -119,13 +119,6 @@
 // [exec.sched_queries], scheduler queries
 using forward_progress_guarantee STDEXEC_STD_DEPRECATED =
     stdexec::forward_progress_guarantee;
-using forwarding_scheduler_query_t STDEXEC_STD_DEPRECATED =
-    stdexec::forwarding_scheduler_query_t;
-using get_forward_progress_guarantee_t STDEXEC_STD_DEPRECATED =
-    stdexec::get_forward_progress_guarantee_t;
-STDEXEC_STD_DEPRECATED
-inline constexpr stdexec::forwarding_scheduler_query_t
-    forwarding_scheduler_query{};
 STDEXEC_STD_DEPRECATED
 inline constexpr stdexec::get_forward_progress_guarantee_t
     get_forward_progress_guarantee{};
@@ -216,14 +209,9 @@
 using connect_result_t STDEXEC_STD_DEPRECATED =
     stdexec::connect_result_t<_Sender, _Receiver>;
 
-// [exec.snd_queries], sender queries
-using forwarding_sender_query_t STDEXEC_STD_DEPRECATED =
-    stdexec::forwarding_sender_query_t;
 template <class _Tag>
 using get_completion_scheduler_t STDEXEC_STD_DEPRECATED =
     stdexec::get_completion_scheduler_t<_Tag>;
-STDEXEC_STD_DEPRECATED
-inline constexpr stdexec::forwarding_sender_query_t forwarding_sender_query{};
 
 template <class _Tag>
 STDEXEC_STD_DEPRECATED inline constexpr stdexec::get_completion_scheduler_t<
diff --git a/include/sdbusplus/async/stdexec/__detail/__scope.hpp b/include/sdbusplus/async/stdexec/__detail/__scope.hpp
index 4f47839..5ad6b93 100644
--- a/include/sdbusplus/async/stdexec/__detail/__scope.hpp
+++ b/include/sdbusplus/async/stdexec/__detail/__scope.hpp
@@ -26,8 +26,8 @@
 template <class _Fn>
 struct __scope_guard<_Fn>
 {
-    [[no_unique_address]] _Fn __fn_;
-    [[no_unique_address]] __immovable __hidden_{};
+    STDEXEC_NO_UNIQUE_ADDRESS _Fn __fn_;
+    STDEXEC_NO_UNIQUE_ADDRESS __immovable __hidden_{};
     bool __dismissed_{false};
 
     ~__scope_guard()
@@ -45,9 +45,9 @@
 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_{};
+    STDEXEC_NO_UNIQUE_ADDRESS _Fn __fn_;
+    STDEXEC_NO_UNIQUE_ADDRESS _T0 __t0_;
+    STDEXEC_NO_UNIQUE_ADDRESS __immovable __hidden_{};
 
     bool __dismissed_{false};
 
@@ -66,10 +66,10 @@
 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_{};
+    STDEXEC_NO_UNIQUE_ADDRESS _Fn __fn_;
+    STDEXEC_NO_UNIQUE_ADDRESS _T0 __t0_;
+    STDEXEC_NO_UNIQUE_ADDRESS _T1 __t1_;
+    STDEXEC_NO_UNIQUE_ADDRESS __immovable __hidden_{};
 
     bool __dismissed_{false};
 
@@ -88,11 +88,11 @@
 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_{};
+    STDEXEC_NO_UNIQUE_ADDRESS _Fn __fn_;
+    STDEXEC_NO_UNIQUE_ADDRESS _T0 __t0_;
+    STDEXEC_NO_UNIQUE_ADDRESS _T1 __t1_;
+    STDEXEC_NO_UNIQUE_ADDRESS _T2 __t2_;
+    STDEXEC_NO_UNIQUE_ADDRESS __immovable __hidden_{};
 
     bool __dismissed_{false};
 
diff --git a/include/sdbusplus/async/stdexec/__detail/__type_traits.hpp b/include/sdbusplus/async/stdexec/__detail/__type_traits.hpp
new file mode 100644
index 0000000..260cdc7
--- /dev/null
+++ b/include/sdbusplus/async/stdexec/__detail/__type_traits.hpp
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 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 "__config.hpp"
+
+namespace stdexec
+{
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+// A very simple std::declval replacement that doesn't handle void
+template <class _Tp>
+_Tp&& __declval() noexcept;
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+// __decay_t: An efficient implementation for std::decay
+#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>()));
+};
+
+struct __decay_default
+{
+    template <class _Ty>
+    static _Ty __g(_Ty);
+    template <class _Ty>
+    using __f = decltype(__g(__declval<_Ty>()));
+};
+
+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
+
+//////////////////////////////////////////////////////////////////////////////////////////////////
+// __copy_cvref_t: For copying cvref from one type to another
+struct __cp
+{
+    template <class _Tp>
+    using __f = _Tp;
+};
+
+struct __cpc
+{
+    template <class _Tp>
+    using __f = const _Tp;
+};
+
+struct __cplr
+{
+    template <class _Tp>
+    using __f = _Tp&;
+};
+
+struct __cprr
+{
+    template <class _Tp>
+    using __f = _Tp&&;
+};
+
+struct __cpclr
+{
+    template <class _Tp>
+    using __f = const _Tp&;
+};
+
+struct __cpcrr
+{
+    template <class _Tp>
+    using __f = const _Tp&&;
+};
+
+template <class>
+extern __cp __cpcvr;
+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 = typename __copy_cvref_fn<_From>::template __f<_To>;
+
+} // namespace stdexec
diff --git a/include/sdbusplus/async/stdexec/any_sender_of.hpp b/include/sdbusplus/async/stdexec/any_sender_of.hpp
index c4b19f4..ac7541b 100644
--- a/include/sdbusplus/async/stdexec/any_sender_of.hpp
+++ b/include/sdbusplus/async/stdexec/any_sender_of.hpp
@@ -526,7 +526,7 @@
     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_{};
+    STDEXEC_NO_UNIQUE_ADDRESS _Allocator __allocator_{};
 };
 
 template <class _VTable, class _Allocator = std::allocator<std::byte>>
@@ -615,6 +615,8 @@
     } __env_;
 
   public:
+    using is_receiver = void;
+
     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> && ...)
@@ -623,8 +625,7 @@
                &__rcvr}
     {}
 
-    template <__one_of<set_value_t, set_error_t, set_stopped_t> _Tag,
-              __decays_to<__ref> _Self, class... _As>
+    template <__completion_tag _Tag, __decays_to<__ref> _Self, class... _As>
         requires __one_of<_Tag(_As...), _Sigs...>
     friend void tag_invoke(_Tag, _Self&& __self, _As&&... __as) noexcept
     {
@@ -671,7 +672,7 @@
 template <class _Receiver, class _Sigs, class _Queries>
 struct __operation_base
 {
-    [[no_unique_address]] _Receiver __receiver_;
+    STDEXEC_NO_UNIQUE_ADDRESS _Receiver __receiver_;
 };
 
 template <class _Sender, class _Receiver, class _Queries>
@@ -682,10 +683,11 @@
 
     struct __rec
     {
+        using is_receiver = void;
         __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>
+        template <__completion_tag _CPO, __decays_to<__rec> _Self,
+                  class... _Args>
             requires __callable<_CPO, _Receiver&&, _Args...>
         friend void tag_invoke(_CPO, _Self&& __self, _Args&&... __args) noexcept
         {
@@ -727,8 +729,8 @@
 template <class _Queries>
 class __query_vtable;
 
-template <template <class...> class _L, typename... _Queries>
-class __query_vtable<_L<_Queries...>> : public __query_vfun<_Queries>...
+template <template <class...> class _List, typename... _Queries>
+class __query_vtable<_List<_Queries...>> : public __query_vfun<_Queries>...
 {
   public:
     using __query_vfun<_Queries>::operator()...;
@@ -987,6 +989,8 @@
 
   public:
     using is_receiver = void;
+    using __t = any_receiver_ref;
+    using __id = any_receiver_ref;
 
     template <stdexec::__none_of<any_receiver_ref, const any_receiver_ref,
                                  __env_t, const __env_t>
@@ -1070,6 +1074,9 @@
             __scheduler_base __scheduler_;
 
           public:
+            using __t = any_scheduler;
+            using __id = any_scheduler;
+
             template <class _Scheduler>
                 requires(!stdexec::__decays_to<_Scheduler, any_scheduler> &&
                          stdexec::scheduler<_Scheduler>)
diff --git a/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp b/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp
index 36eaf5c..29ef238 100644
--- a/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp
+++ b/include/sdbusplus/async/stdexec/at_coroutine_exit.hpp
@@ -47,23 +47,17 @@
             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,
+            template <__one_of<set_value_t, set_error_t> _Tag,
+                      __decays_to<__t> _Self, class... _Args>
+                requires __callable<_Tag, _Receiver, _Args...>
+            friend void tag_invoke(_Tag, _Self&& __self,
                                    _Args&&... __args) noexcept
             {
-                set_value((_Receiver&&)__self.__receiver_, (_Args&&)__args...);
+                _Tag{}((_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
+            template <same_as<set_stopped_t> _Tag>
+            [[noreturn]] friend void tag_invoke(_Tag, __t&&) noexcept
             {
                 std::terminate();
             }
diff --git a/include/sdbusplus/async/stdexec/commit.info b/include/sdbusplus/async/stdexec/commit.info
index 0cebda7..68f5a47 100644
--- a/include/sdbusplus/async/stdexec/commit.info
+++ b/include/sdbusplus/async/stdexec/commit.info
@@ -1 +1 @@
-3bd568c7df8fcf725421254a27700f9ed1f64ff1
+865e0370f92655691cf1e9a5abcdc2c4dab2ccb4
diff --git a/include/sdbusplus/async/stdexec/concepts.hpp b/include/sdbusplus/async/stdexec/concepts.hpp
index 11dbe43..c11d132 100644
--- a/include/sdbusplus/async/stdexec/concepts.hpp
+++ b/include/sdbusplus/async/stdexec/concepts.hpp
@@ -34,23 +34,11 @@
 #include <type_traits>
 #endif
 
+#include "__detail/__concepts.hpp"
 #include "__detail/__meta.hpp"
 
 namespace stdexec::__std_concepts
 {
-#if defined(__clang__)
-template <class _Ap, class _Bp>
-concept __same_as = __is_same(_Ap, _Bp);
-#elif defined(__GNUC__)
-template <class _Ap, class _Bp>
-concept __same_as = __is_same_as(_Ap, _Bp);
-#else
-template <class _Ap, class _Bp>
-inline constexpr bool __same_as = false;
-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 _Ap, class _Bp>
 concept same_as = __same_as<_Ap, _Bp> && __same_as<_Bp, _Ap>;
@@ -94,130 +82,6 @@
 {
 using namespace __std_concepts;
 
-#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>()));
-};
-
-struct __decay_default
-{
-    template <class _Ty>
-    static _Ty __g(_Ty);
-    template <class _Ty>
-    using __f = decltype(__g(__declval<_Ty>()));
-};
-
-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 _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 _Cp>
-concept __class = __true<int _Cp::*> && (!__same_as<const _Cp, _Cp>);
-
-template <class _Ty, class... _As>
-concept __one_of = (__same_as<_Ty, _As> || ...);
-
-template <class _Ty, class... _Us>
-concept __all_of = (__same_as<_Ty, _Us> && ...);
-
-template <class _Ty, class... _Us>
-concept __none_of = ((!__same_as<_Ty, _Us>)&&...);
-
-// Not exactly right, but close.
-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>
@@ -265,8 +129,8 @@
     && constructible_from<_Ty, const _Ty&>;
 
 template <class _LHS, class _RHS>
-concept assignable_from =           //
-    __is_lvalue_reference_<_LHS> && //
+concept assignable_from =   //
+    same_as<_LHS, _LHS&> && //
     // std::common_reference_with<
     //   const std::remove_reference_t<_LHS>&,
     //   const std::remove_reference_t<_RHS>&> &&
@@ -281,8 +145,10 @@
 using std::swap;
 
 template <class _Ty, class _Uy>
-concept swappable_with = //
-    requires(_Ty&& __t, _Uy&& __u) { swap((_Ty&&)__t, (_Uy&&)__u); };
+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(
@@ -323,6 +189,10 @@
     semiregular<_Ty> && //
     equality_comparable<_Ty>;
 
+// Not exactly right, but close.
+template <class _Ty>
+concept __boolean_testable_ = convertible_to<_Ty, bool>;
+
 template <class T, class U>
 concept __partially_ordered_with = //
     requires(__cref_t<T> t, __cref_t<U> u) {
@@ -362,20 +232,6 @@
     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 _Ty>
-constexpr bool __is_instance_of_<_Ty<_As...>, _Ty> = true;
-
-template <class _Ay, template <class...> class _Ty>
-concept __is_instance_of = __is_instance_of_<_Ay, _Ty>;
-
-template <class _Ay, template <class...> class _Ty>
-concept __is_not_instance_of = !__is_instance_of<_Ay, _Ty>;
-
 #if __has_builtin(__is_nothrow_constructible)
 template <class _Ty, class... _As>
 concept __nothrow_constructible_from = constructible_from<_Ty, _As...> &&
@@ -393,11 +249,14 @@
 template <class _Ty>
 concept __nothrow_decay_copyable =
     __nothrow_constructible_from<__decay_t<_Ty>, _Ty>;
+
+template <class _Range>
+using range_value_t = decltype(*begin(::std::declval<_Range>()));
+
 } // namespace stdexec
 
-#if !STDEXEC_HAS_STD_CONCEPTS_HEADER()
-namespace std
-{
-using namespace stdexec::__std_concepts;
-}
-#endif
+// #if !STDEXEC_HAS_STD_CONCEPTS_HEADER()
+// namespace std {
+//   using namespace stdexec::__std_concepts;
+// }
+// #endif
diff --git a/include/sdbusplus/async/stdexec/execution.hpp b/include/sdbusplus/async/stdexec/execution.hpp
index 33e5ae5..0c6d023 100644
--- a/include/sdbusplus/async/stdexec/execution.hpp
+++ b/include/sdbusplus/async/stdexec/execution.hpp
@@ -15,6 +15,7 @@
  */
 #pragma once
 
+#include "__detail/__execution_fwd.hpp"
 #include "__detail/__intrusive_ptr.hpp"
 #include "__detail/__meta.hpp"
 #include "__detail/__scope.hpp"
@@ -77,8 +78,9 @@
     static inline constexpr Tag (*signature)(Sig) = nullptr;
 };
 
-// [exec.fwd_env]
-namespace __fwding_query
+//////////////////////////////////////////////////////////////////////////////////////////////////
+// [exec.queries]
+namespace __queries
 {
 struct forwarding_query_t
 {
@@ -99,57 +101,7 @@
         }
     }
 };
-} // 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]
-template <class _Receiver>
-inline constexpr bool enable_receiver =
-    requires { typename _Receiver::is_receiver; };
-
-/////////////////////////////////////////////////////////////////////////////
-// completion_signatures
-namespace __compl_sigs
-{
-template <class _Env>
-struct __env_promise;
-struct __dependent;
-} // namespace __compl_sigs
-
-/////////////////////////////////////////////////////////////////////////////
-// env_of
-namespace __env
-{
-struct empty_env
-{
-    using __t = empty_env;
-    using __id = empty_env;
-};
-} // namespace __env
-
-using __env::empty_env;
-using __empty_env
-    [[deprecated("Please use stdexec::empty_env now.")]] = empty_env;
-
-/////////////////////////////////////////////////////////////////////////////
-// [execution.senders]
-template <class _Sender>
-concept __enable_sender =                        //
-    requires { typename _Sender::is_sender; } || //
-    __awaitable<_Sender, __compl_sigs::__env_promise<empty_env>>;
-
-template <class _Sender>
-inline constexpr bool enable_sender = __enable_sender<_Sender>;
-
-// [execution.schedulers.queries], scheduler queries
-namespace __scheduler_queries
-{
 struct execute_may_block_caller_t : __query<execute_may_block_caller_t>
 {
     template <class _Tp>
@@ -169,24 +121,186 @@
         return true;
     }
 };
-} // namespace __scheduler_queries
 
-using __scheduler_queries::execute_may_block_caller_t;
-inline constexpr execute_may_block_caller_t execute_may_block_caller{};
-
-enum class forward_progress_guarantee
+struct get_forward_progress_guarantee_t :
+    __query<get_forward_progress_guarantee_t>
 {
-    concurrent,
-    parallel,
-    weakly_parallel
+    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
+    {
+        return stdexec::forward_progress_guarantee::weakly_parallel;
+    }
 };
 
-namespace __get_completion_signatures
+struct __has_algorithm_customizations_t :
+    __query<__has_algorithm_customizations_t>
 {
-struct get_completion_signatures_t;
-}
+    template <class _Tp>
+    using __result_t =
+        tag_invoke_result_t<__has_algorithm_customizations_t, __cref_t<_Tp>>;
 
-using __get_completion_signatures::get_completion_signatures_t;
+    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<_Tp>>;
+        static_assert(_Boolean{}
+                          ? true
+                          : true); // must be contextually convertible to bool
+        return _Boolean{};
+    }
+
+    constexpr std::false_type operator()(auto&&) const noexcept
+    {
+        return {};
+    }
+};
+
+// TODO: implement allocator concept
+template <class _T0>
+concept __allocator = true;
+
+struct get_scheduler_t : __query<get_scheduler_t>
+{
+    friend constexpr bool tag_invoke(forwarding_query_t,
+                                     const get_scheduler_t&) noexcept
+    {
+        return true;
+    }
+
+    template <class _Env>
+        requires tag_invocable<get_scheduler_t, const _Env&>
+    auto operator()(const _Env& __env) const noexcept
+        -> tag_invoke_result_t<get_scheduler_t, const _Env&>;
+
+    auto operator()() const noexcept;
+};
+
+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 _Env>
+        requires tag_invocable<get_delegatee_scheduler_t, const _Env&>
+    auto operator()(const _Env& __t) const noexcept
+        -> tag_invoke_result_t<get_delegatee_scheduler_t, const _Env&>;
+
+    auto operator()() const noexcept;
+};
+
+struct get_allocator_t : __query<get_allocator_t>
+{
+    friend constexpr bool tag_invoke(forwarding_query_t,
+                                     const get_allocator_t&) noexcept
+    {
+        return true;
+    }
+
+    template <class _Env>
+        requires tag_invocable<get_allocator_t, const _Env&>
+    auto operator()(const _Env& __env) const noexcept
+        -> tag_invoke_result_t<get_allocator_t, const _Env&>
+    {
+        static_assert(nothrow_tag_invocable<get_allocator_t, const _Env&>);
+        static_assert(
+            __allocator<tag_invoke_result_t<get_allocator_t, const _Env&>>);
+        return tag_invoke(get_allocator_t{}, __env);
+    }
+
+    auto operator()() const noexcept;
+};
+
+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 <class _Env>
+    never_stop_token operator()(const _Env&) const noexcept
+    {
+        return {};
+    }
+
+    template <class _Env>
+        requires tag_invocable<get_stop_token_t, const _Env&>
+    auto operator()(const _Env& __env) const noexcept
+        -> tag_invoke_result_t<get_stop_token_t, const _Env&>
+    {
+        static_assert(nothrow_tag_invocable<get_stop_token_t, const _Env&>);
+        static_assert(stoppable_token<
+                      tag_invoke_result_t<get_stop_token_t, const _Env&>>);
+        return tag_invoke(get_stop_token_t{}, __env);
+    }
+
+    auto operator()() const noexcept;
+};
+
+template <class _Queryable, class _CPO>
+concept __has_completion_scheduler_for =
+    queryable<_Queryable> && //
+    tag_invocable<get_completion_scheduler_t<_CPO>, const _Queryable&>;
+
+template <__completion_tag _CPO>
+struct get_completion_scheduler_t : __query<get_completion_scheduler_t<_CPO>>
+{
+    friend constexpr bool
+        tag_invoke(forwarding_query_t,
+                   const get_completion_scheduler_t<_CPO>&) noexcept
+    {
+        return true;
+    }
+
+    template <__has_completion_scheduler_for<_CPO> _Queryable>
+    auto operator()(const _Queryable& __queryable) const noexcept
+        -> tag_invoke_result_t<get_completion_scheduler_t<_CPO>,
+                               const _Queryable&>;
+};
+} // namespace __queries
+
+using __queries::__has_algorithm_customizations_t;
+using __queries::execute_may_block_caller_t;
+using __queries::forwarding_query_t;
+using __queries::get_allocator_t;
+using __queries::get_completion_scheduler_t;
+using __queries::get_delegatee_scheduler_t;
+using __queries::get_forward_progress_guarantee_t;
+using __queries::get_scheduler_t;
+using __queries::get_stop_token_t;
+
+inline constexpr forwarding_query_t forwarding_query{};
+inline constexpr execute_may_block_caller_t execute_may_block_caller{};
+inline constexpr __has_algorithm_customizations_t
+    __has_algorithm_customizations{};
+inline constexpr get_forward_progress_guarantee_t
+    get_forward_progress_guarantee{};
+inline constexpr get_scheduler_t get_scheduler{};
+inline constexpr get_delegatee_scheduler_t get_delegatee_scheduler{};
+inline constexpr get_allocator_t get_allocator{};
+inline constexpr get_stop_token_t get_stop_token{};
+template <__completion_tag _CPO>
+inline constexpr get_completion_scheduler_t<_CPO> get_completion_scheduler{};
+
+template <class _Tag>
+concept __forwarding_query = forwarding_query(_Tag{});
 
 /////////////////////////////////////////////////////////////////////////////
 // env_of
@@ -200,6 +314,35 @@
     friend void tag_invoke(_Tag, _Self, _Ts&&...) = delete;
 };
 
+struct empty_env
+{
+    using __t = empty_env;
+    using __id = empty_env;
+};
+
+// To be kept in sync with the promise type used in __connect_awaitable
+template <class _Env>
+struct __env_promise
+{
+    template <class _Ty>
+    _Ty&& await_transform(_Ty&& __value) noexcept
+    {
+        return (_Ty&&)__value;
+    }
+
+    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&>
+    {
+        return tag_invoke(as_awaitable, (_Ty&&)__value, *this);
+    }
+
+    friend auto tag_invoke(get_env_t, const __env_promise&) noexcept
+        -> const _Env&;
+};
+
 template <__class _Tag, class _Value = __none_such>
     requires copy_constructible<std::unwrap_reference_t<_Value>>
 struct __with
@@ -213,7 +356,7 @@
         using __id = __with;
         using __val_or_ref_t = std::unwrap_reference_t<_Value>;
 
-        [[no_unique_address]] __val_or_ref_t __value_;
+        STDEXEC_NO_UNIQUE_ADDRESS __val_or_ref_t __value_;
 
         __t(__with&& __w) : __value_(((__with&&)__w).__value_) {}
 
@@ -262,12 +405,12 @@
     template <class _WithId>
     using __tag_of = typename _WithId::__tag_t;
     template <class _Self>
-    using __base_env_of = __make_dependent_on<_BaseEnv, _Self>;
+    using __base_env_of = __mfront<_BaseEnv, _Self>;
 
     struct __t : stdexec::__t<_WithIds>...
     {
         using __id = __env;
-        [[no_unique_address]] _BaseEnv __base_env_{};
+        STDEXEC_NO_UNIQUE_ADDRESS _BaseEnv __base_env_{};
 
         // Forward the receiver queries:
         template <__forwarding_query _Tag, same_as<__t> _Self, class... _As>
@@ -350,8 +493,15 @@
 };
 } // namespace __env
 
+using __env::empty_env;
+using __env::no_env;
+using __empty_env
+    [[deprecated("Please use stdexec::empty_env now.")]] = empty_env;
+
+using __env::__env_promise;
 using __env::__with;
 using __env::__with_;
+using no_env_promise = __env_promise<no_env>;
 
 inline constexpr __env::__make_env_t __make_env{};
 inline constexpr __env::get_env_t get_env{};
@@ -359,11 +509,11 @@
 template <class... _Ts>
 using __make_env_t = decltype(__make_env(__declval<_Ts>()...));
 
-using __env::get_env_t;
-using __env::no_env;
-
-template <class _EnvProvider>
-using env_of_t = __call_result_t<get_env_t, _EnvProvider>;
+#if STDEXEC_LEGACY_R5_CONCEPTS()
+using __default_env = no_env;
+#else
+using __default_env = empty_env;
+#endif
 
 template <class _EnvProvider>
 concept environment_provider = //
@@ -440,10 +590,6 @@
 inline constexpr set_error_t set_error{};
 inline constexpr set_stopped_t set_stopped{};
 
-template <class _Tag>
-concept __completion_tag =
-    __one_of<_Tag, set_value_t, set_error_t, set_stopped_t>;
-
 inline constexpr struct __try_call_t
 {
     template <class _Receiver, class _Fun, class... _Args>
@@ -469,14 +615,6 @@
     }
 } __try_call{};
 
-namespace __as_awaitable
-{
-struct as_awaitable_t;
-}
-
-using __as_awaitable::as_awaitable_t;
-extern const as_awaitable_t as_awaitable;
-
 /////////////////////////////////////////////////////////////////////////////
 // completion_signatures
 namespace __compl_sigs
@@ -516,29 +654,6 @@
 void __test(_Tag (*)(_Args...) noexcept) = delete;
 #endif
 
-// To be kept in sync with the promise type used in __connect_awaitable
-template <class _Env>
-struct __env_promise
-{
-    template <class _Ty>
-    _Ty&& await_transform(_Ty&& __value) noexcept
-    {
-        return (_Ty&&)__value;
-    }
-
-    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&>
-    {
-        return tag_invoke(as_awaitable, (_Ty&&)__value, *this);
-    }
-
-    friend auto tag_invoke(get_env_t, const __env_promise&) noexcept
-        -> const _Env&;
-};
-
 // BUGBUG not to spec!
 struct __dependent
 {
@@ -569,8 +684,6 @@
 } // namespace __compl_sigs
 
 using __compl_sigs::__completion_signature;
-using __compl_sigs::__env_promise;
-using no_env_promise = __env_promise<no_env>;
 
 template <same_as<no_env>>
 using dependent_completion_signatures = __compl_sigs::__dependent;
@@ -599,8 +712,15 @@
         _Variant, __minvoke<__as_tagged_tuple<_Sigs, _TaggedTuple>>...>>;
 
 template <class _Completions, class _TaggedTuple, class _Variant>
-using __for_all_sigs = __minvoke<decltype(__compl_sigs::__for_all_sigs_(
-    (_Completions*)nullptr, (_TaggedTuple*)nullptr, (_Variant*)nullptr))>;
+using __for_all_sigs =                          //
+    __minvoke<                                  //
+        decltype(__compl_sigs::__for_all_sigs_( //
+            (_Completions*)nullptr, (_TaggedTuple*)nullptr,
+            (_Variant*)nullptr))>;
+
+template <class _Completions, class _TaggedTuple, class _Variant>
+using __maybe_for_all_sigs =
+    __meval<__for_all_sigs, _Completions, _TaggedTuple, _Variant>;
 } // namespace __compl_sigs
 
 template <class _Ty>
@@ -608,87 +728,74 @@
     __is_instance_of<_Ty, completion_signatures>;
 
 template <class...>
-struct __concat_completion_signatures
-{
-    using __t = dependent_completion_signatures<no_env>;
-};
+auto __concat_completion_signatures_impl() //
+    -> dependent_completion_signatures<no_env>;
 
 template <__is_completion_signatures... _Completions>
-struct __concat_completion_signatures<_Completions...>
+auto __concat_completion_signatures_impl()
+    -> __minvoke<__mconcat<__munique<__q<completion_signatures>>>,
+                 _Completions...>;
+
+template <class... _Completions>
+using __concat_completion_signatures_impl_t = //
+    decltype(__concat_completion_signatures_impl<_Completions...>());
+
+template <class... _Completions>
+struct __concat_completion_signatures_
 {
-    using __t = __minvoke<__mconcat<__munique<__q<completion_signatures>>>,
-                          _Completions...>;
+    using __t = __meval<__concat_completion_signatures_impl_t, _Completions...>;
 };
 
 template <class... _Completions>
 using __concat_completion_signatures_t =
-    __t<__concat_completion_signatures<_Completions...>>;
+    __t<__concat_completion_signatures_<_Completions...>>;
 
 template <class _Completions, class _Env>
-inline constexpr bool __valid_completion_signatures_ = false;
+inline constexpr bool __expecting_completion_signatures = false;
+
 template <class... _Sigs, class _Env>
 inline constexpr bool
-    __valid_completion_signatures_<completion_signatures<_Sigs...>, _Env> =
+    __expecting_completion_signatures<completion_signatures<_Sigs...>, _Env> =
         true;
+
 template <>
-inline constexpr bool __valid_completion_signatures_<
+inline constexpr bool __expecting_completion_signatures<
     dependent_completion_signatures<no_env>, no_env> = true;
 
 template <class _Completions, class _Env>
 concept __valid_completion_signatures =
-    __valid_completion_signatures_<_Completions, _Env>;
+    __expecting_completion_signatures<_Completions, _Env>;
 
 /////////////////////////////////////////////////////////////////////////////
 // [execution.receivers]
+template <class _Receiver>
+struct _WITH_RECEIVER_
+{};
+
 template <class _Sig>
-struct _MISSING_COMPLETION_SIGNAL_;
-
-template <class _Tag, class... _Args>
-struct _MISSING_COMPLETION_SIGNAL_<_Tag(_Args...)>
-{
-    template <class _Receiver>
-    struct _WITH_RECEIVER_ : std::false_type
-    {};
-
-    friend auto operator,(_MISSING_COMPLETION_SIGNAL_, auto)
-        -> _MISSING_COMPLETION_SIGNAL_
-    {
-        return {};
-    }
-};
-
-namespace __receiver_concepts
-{
-struct __found_completion_signature
-{
-    template <class>
-    using _WITH_RECEIVER_ = std::true_type;
-};
+struct _MISSING_COMPLETION_SIGNAL_
+{};
 
 template <class _Receiver, class _Tag, class... _Args>
-using __missing_completion_signal_t = //
-    __if<__mbool<nothrow_tag_invocable<_Tag, _Receiver, _Args...>>,
-         __found_completion_signature,
-         _MISSING_COMPLETION_SIGNAL_<_Tag(_Args...)>>;
+auto __try_completion(_Tag (*)(_Args...))
+    -> __mexception<_MISSING_COMPLETION_SIGNAL_<_Tag(_Args...)>,
+                    _WITH_RECEIVER_<_Receiver>>;
 
 template <class _Receiver, class _Tag, class... _Args>
-auto __has_completion(_Tag (*)(_Args...))
-    -> __missing_completion_signal_t<_Receiver, _Tag, _Args...>;
+    requires nothrow_tag_invocable<_Tag, _Receiver, _Args...>
+__msuccess __try_completion(_Tag (*)(_Args...));
 
 template <class _Receiver, class... _Sigs>
-auto __has_completions(completion_signatures<_Sigs...>*)
-    -> decltype((__has_completion<_Receiver>((_Sigs*)0), ...));
-
-template <class _Completion, class _Receiver>
-concept __is_valid_completion = //
-    _Completion::template _WITH_RECEIVER_<_Receiver>::value;
-} // namespace __receiver_concepts
-
-using __receiver_concepts::__has_completions;
-using __receiver_concepts::__is_valid_completion;
+auto __try_completions(completion_signatures<_Sigs...>*)
+    -> decltype((__msuccess(), ...,
+                 stdexec::__try_completion<_Receiver>((_Sigs*)nullptr)));
 
 /////////////////////////////////////////////////////////////////////////////
 // [execution.receivers]
+template <class _Receiver>
+inline constexpr bool enable_receiver = //
+    requires { typename _Receiver::is_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
@@ -704,7 +811,7 @@
 concept __receiver = //
                      // Nested requirement here is to make this an atomic
                      // constraint
-    requires { requires __receiver_r5_or_r7<_Receiver>; };
+    requires { requires __receiver_r5_or_r7<__decay_t<_Receiver>>; };
 
 template <class _Receiver>
 concept receiver = __receiver<_Receiver> &&                     //
@@ -715,18 +822,252 @@
 template <class _Receiver, class _Completions>
 concept receiver_of =      //
     receiver<_Receiver> && //
-    requires(_Completions* __required_completions) {
+    requires(_Completions* __completions) {
         {
-            __has_completions<__decay_t<_Receiver>>(__required_completions)
-        } //
-            ->__is_valid_completion<__decay_t<_Receiver>>;
+            stdexec::__try_completions<__decay_t<_Receiver>>(__completions)
+        } -> __ok;
     };
 
+template <class _Receiver, class _Sender>
+concept __receiver_from =
+    receiver_of<_Receiver,
+                __completion_signatures_of_t<_Sender, env_of_t<_Receiver>>>;
+
+/////////////////////////////////////////////////////////////////////////////
+// Some utilities for debugging senders
+namespace __debug
+{
+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, const _Env&>
+    auto operator()(const _Env&) const noexcept
+        -> tag_invoke_result_t<__is_debug_env_t, const _Env&>;
+};
+template <class _Env>
+using __debug_env_t = __make_env_t<_Env, __with<__is_debug_env_t, bool>>;
+
+template <class _Env>
+concept __is_debug_env = tag_invocable<__debug::__is_debug_env_t, _Env>;
+
+struct __completion_signatures
+{};
+
+template <class _Sig>
+extern int __normalize_sig;
+
+template <class _Tag, class... _Args>
+extern _Tag (*__normalize_sig<_Tag(_Args...)>)(_Args&&...);
+
+template <class _Sig>
+using __normalize_sig_t = decltype(__normalize_sig<_Sig>);
+
+template <class... _Sigs>
+struct __valid_completions
+{
+    template <derived_from<__valid_completions> _Self, class _Tag,
+              class... _Args>
+        requires __one_of<_Tag (*)(_Args&&...), _Sigs...>
+    STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
+        friend void
+        tag_invoke(_Tag, _Self&&, _Args&&...) noexcept
+    {
+        STDEXEC_TERMINATE();
+    }
+};
+
+template <class _CvrefSenderId, class _Env, class _Completions>
+struct __debug_receiver
+{
+    using __t = __debug_receiver;
+    using __id = __debug_receiver;
+    using is_receiver = void;
+};
+
+template <class _CvrefSenderId, class _Env, class... _Sigs>
+struct __debug_receiver<_CvrefSenderId, _Env,
+                        completion_signatures<_Sigs...>> //
+    : __valid_completions<__normalize_sig_t<_Sigs>...>
+{
+    using __t = __debug_receiver;
+    using __id = __debug_receiver;
+    using is_receiver = void;
+
+    template <same_as<get_env_t> _Tag>
+    STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
+        friend __debug_env_t<_Env>
+        tag_invoke(_Tag, __debug_receiver) noexcept
+    {
+        STDEXEC_TERMINATE();
+    }
+};
+
+struct _COMPLETION_SIGNATURES_MISMATCH_
+{};
+
+template <class _Sig>
+struct _COMPLETION_SIGNATURE_
+{};
+
+template <class... _Sigs>
+struct _IS_NOT_ONE_OF_
+{};
+
+template <class _Sender>
+struct _SIGNAL_SENT_BY_SENDER_
+{};
+
+template <class _Warning>
+[[deprecated(
+    "The sender claims to send a particular set of completions,"
+    " but in actual fact it completes with a result that is not"
+    " one of the declared completion signatures.")]] STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
+    void
+    _ATTENTION_() noexcept
+{}
+
+template <class _Sig>
+struct __invalid_completion
+{
+    struct __t
+    {
+        template <class _CvrefSenderId, class _Env, class... _Sigs>
+        __t(__debug_receiver<_CvrefSenderId, _Env,
+                             completion_signatures<_Sigs...>>&&) noexcept
+        {
+            using _SenderId = __decay_t<_CvrefSenderId>;
+            using _Sender = stdexec::__t<_SenderId>;
+            using _What =  //
+                _WARNING_< //
+                    _COMPLETION_SIGNATURES_MISMATCH_,
+                    _COMPLETION_SIGNATURE_<_Sig>, _IS_NOT_ONE_OF_<_Sigs...>,
+                    _SIGNAL_SENT_BY_SENDER_<_Sender>>;
+            __debug::_ATTENTION_<_What>();
+        }
+    };
+};
+
+template <__completion_tag _Tag, class... _Args>
+STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
+    void
+    tag_invoke(_Tag, __t<__invalid_completion<_Tag(_Args...)>>,
+               _Args&&...) noexcept
+{}
+
+struct __debug_operation
+{
+    template <same_as<start_t> _Tag>
+    friend void tag_invoke(_Tag, __debug_operation&) noexcept
+    {}
+};
+
+////////////////////////////////////////////////////////////////////////////
+// `__debug_sender`
+// ===============
+//
+// Understanding why a particular sender doesn't connect to a particular
+// receiver is nigh impossible in the current design due to limitations in
+// how the compiler reports overload resolution failure in the presence of
+// constraints. `__debug_sender` is a utility to assist with the process. It
+// gives you the deep template instantiation backtrace that you need to
+// understand where in a chain of senders the problem is occurring.
+//
+// ```c++
+// template <class _Sigs, class _Env = empty_env, class _Sender>
+//   void __debug_sender(_Sender&& __sndr, _Env = {});
+//
+// template <class _Env = empty_env, class _Sender>
+//   void __debug_sender(_Sender&& __sndr, _Env = {});
+// ```
+//
+// **Usage:**
+//
+// To find out where in a chain of senders a sender is failing to connect
+// to a receiver, pass it to `__debug_sender`, optionally with an
+// environment argument; e.g. `__debug_sender(sndr [, env])`
+//
+// To find out why a sender will not connect to a receiver of a particular
+// signature, specify the set of completion signatures as an explicit template
+// argument that names an instantiation of `completion_signatures`; e.g.:
+// `__debug_sender<completion_signatures<set_value_t(int)>>(sndr [, env])`.
+//
+// **How it works:**
+//
+// The `__debug_sender` function `connect`'s the sender to a
+// `__debug_receiver`, whose environment is augmented with a special
+// `__is_debug_env_t` query. An additional fall-back overload is added to
+// the `connect` CPO that recognizes receivers whose environments respond to
+// that query and lets them through. Then in a non-immediate context, it
+// looks for a `tag_invoke(connect_t...)` overload for the input sender and
+// receiver. This will recurse until it hits the `tag_invoke` call that is
+// causing the failure.
+//
+// At least with clang, this gives me a nice backtrace, at the bottom of
+// which is the faulty `tag_invoke` overload with a mention of the
+// constraint that failed.
+template <class _Sigs, class _Env = empty_env, class _Sender>
+void __debug_sender(_Sender&& __sndr, const _Env& = {})
+{
+    if constexpr (!__is_debug_env<_Env> && !same_as<_Env, no_env>)
+    {
+        if (sizeof(_Sender) == ~0)
+        { // never true
+            using _Receiver =
+                __debug_receiver<__cvref_id<_Sender>, _Env, _Sigs>;
+            using _Operation = connect_result_t<_Sender, _Receiver>;
+            // static_assert(receiver_of<_Receiver, _Sigs>);
+            if constexpr (!same_as<_Operation, __debug_operation>)
+            {
+                auto __op = connect((_Sender&&)__sndr, _Receiver{});
+                start(__op);
+            }
+        }
+    }
+}
+
+template <class _Env = empty_env, class _Sender>
+void __debug_sender(_Sender&& __sndr, const _Env& = {})
+{
+    if constexpr (!__is_debug_env<_Env> && !same_as<_Env, no_env>)
+    {
+        if (sizeof(_Sender) == ~0)
+        { // never true
+            using _Sigs =
+                __completion_signatures_of_t<_Sender, __debug_env_t<_Env>>;
+            if constexpr (!same_as<_Sigs, __debug::__completion_signatures>)
+            {
+                using _Receiver =
+                    __debug_receiver<__cvref_id<_Sender>, _Env, _Sigs>;
+                using _Operation = connect_result_t<_Sender, _Receiver>;
+                // static_assert(receiver_of<_Receiver, _Sigs>);
+                if constexpr (!same_as<_Operation, __debug_operation>)
+                {
+                    auto __op = connect((_Sender&&)__sndr, _Receiver{});
+                    start(__op);
+                }
+            }
+        }
+    }
+}
+} // namespace __debug
+
+using __debug::__debug_sender;
+using __debug::__is_debug_env;
+
 /////////////////////////////////////////////////////////////////////////////
 // [execution.sndtraits]
 namespace __get_completion_signatures
 {
 template <class _Sender, class _Env>
+concept __r7_style_sender = same_as<_Env, no_env> &&
+                            enable_sender<__decay_t<_Sender>>;
+
+template <class _Sender, class _Env>
 concept __with_tag_invoke =
     __valid<tag_invoke_result_t, get_completion_signatures_t, _Sender, _Env>;
 
@@ -741,18 +1082,27 @@
     template <class _Sender, class _Env>
     static auto __impl()
     {
+        static_assert(STDEXEC_LEGACY_R5_CONCEPTS() || !same_as<_Env, no_env>);
         static_assert(sizeof(_Sender),
                       "Incomplete type used with get_completion_signatures");
         static_assert(sizeof(_Env),
                       "Incomplete type used with get_completion_signatures");
         if constexpr (__with_tag_invoke<_Sender, _Env>)
         {
-            return __mbind_front_q<tag_invoke_result_t,
-                                   get_completion_signatures_t>{};
+            using _Result =
+                tag_invoke_result_t<get_completion_signatures_t, _Sender, _Env>;
+            if constexpr (same_as<_Env, no_env> && __merror<_Result>)
+            {
+                return (dependent_completion_signatures<no_env>(*)()) nullptr;
+            }
+            else
+            {
+                return (_Result(*)()) nullptr;
+            }
         }
         else if constexpr (__with_member_alias<_Sender>)
         {
-            return __q<__member_alias_t>{};
+            return (__member_alias_t<_Sender, _Env>(*)()) nullptr;
         }
         else if constexpr (__awaitable<_Sender, __env_promise<_Env>>)
         {
@@ -760,38 +1110,51 @@
             if constexpr (same_as<_Result,
                                   dependent_completion_signatures<no_env>>)
             {
-                return __mconst<dependent_completion_signatures<no_env>>{};
+                return (dependent_completion_signatures<no_env>(*)()) nullptr;
             }
             else
             {
-                return __mconst<completion_signatures<
-                    // set_value_t() or set_value_t(T)
-                    __minvoke<__remove<void, __qf<set_value_t>>, _Result>,
-                    set_error_t(std::exception_ptr)>>{};
+                return (completion_signatures<
+                        // set_value_t() or set_value_t(T)
+                        __minvoke<__remove<void, __qf<set_value_t>>, _Result>,
+                        set_error_t(std::exception_ptr),
+                        set_stopped_t()>(*)()) nullptr;
             }
         }
+        else
 #if STDEXEC_LEGACY_R5_CONCEPTS()
-        else if constexpr (same_as<_Env, no_env> &&
-                           enable_sender<__decay_t<_Sender>>)
+            if constexpr (__r7_style_sender<_Sender, _Env>)
         {
-            return __mconst<dependent_completion_signatures<no_env>>{};
+            return (dependent_completion_signatures<no_env>(*)()) nullptr;
         }
+        else
 #endif
+            if constexpr (__is_debug_env<_Env>)
+        {
+            using __tag_invoke::tag_invoke;
+            // This ought to cause a hard error that indicates where the problem
+            // is.
+            using _Completions [[maybe_unused]] =
+                tag_invoke_result_t<get_completion_signatures_t, _Sender, _Env>;
+            return (__debug::__completion_signatures(*)()) nullptr;
+        }
+        else
+        {
+            return (void (*)()) nullptr;
+        }
     }
 
-    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>>
-#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>
+    template <class _Sender, class _Env = __default_env>
+        requires(__with_tag_invoke<_Sender, _Env> ||          //
+                 __with_member_alias<_Sender> ||              //
+                 __awaitable<_Sender, __env_promise<_Env>> || //
+#if STDEXEC_LEGACY_R5_CONCEPTS()                              //
+                 __r7_style_sender<_Sender, _Env> ||          //
+#endif                                                        //
+                 __is_debug_env<_Env>)                        //
+    constexpr auto operator()(_Sender&& __sndr,
+                              const _Env& __env) const noexcept
+        -> decltype(__impl<_Sender, _Env>()())
     {
         return {};
     }
@@ -802,20 +1165,16 @@
 inline constexpr get_completion_signatures_t get_completion_signatures{};
 
 /////////////////////////////////////////////////////////////////////////////
-// [execution.senders.traits]
-template <class _Sender, class _Env>
-using __completion_signatures_of_t =
-    __call_result_t<get_completion_signatures_t, _Sender, _Env>;
-
-/////////////////////////////////////////////////////////////////////////////
 // [execution.senders]
-// NOT TO SPEC (YET)
-template <class _Sender, class _Env>
-concept __with_completion_signatures =
-    __callable<get_completion_signatures_t, _Sender, _Env> &&
-    __valid_completion_signatures<__completion_signatures_of_t<_Sender, _Env>,
-                                  _Env>;
+template <class _Sender>
+concept __enable_sender =                        //
+    requires { typename _Sender::is_sender; } || //
+    __awaitable<_Sender, __env_promise<empty_env>>;
 
+template <class _Sender>
+inline constexpr bool enable_sender = __enable_sender<_Sender>;
+
+// NOT TO SPEC (YET)
 #if !STDEXEC_LEGACY_R5_CONCEPTS()
 // Here is the R7 sender concepts, not yet enabled.
 template <class _Sender>
@@ -828,24 +1187,25 @@
 template <class _Sender, class _Env = empty_env>
 concept sender_in =    //
     sender<_Sender> && //
-    __with_completion_signatures<_Sender, _Env>;
+    requires(_Sender&& __sndr, _Env&& __env) {
+        {
+            get_completion_signatures((_Sender&&)__sndr, (_Env&&)__env)
+        } -> __valid_completion_signatures<_Env>;
+    };
+
+template <class _Sender, class _Env = empty_env>
+    requires sender_in<_Sender, _Env>
+using completion_signatures_of_t = __completion_signatures_of_t<_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 =
-    // Nested requirement here is to make this an atomic constraint
-    requires { requires __sender_r5_or_r7<_Sender, _Env>; };
+concept __sender = //
+    requires(_Sender&& __sndr, _Env&& __env) {
+        get_completion_signatures((_Sender&&)__sndr, (_Env&&)__env);
+    } && //
+    __valid_completion_signatures<__completion_signatures_of_t<_Sender, _Env>,
+                                  _Env>;
 
 template <class _Sender, class _Env = no_env>
 concept sender =
@@ -860,30 +1220,32 @@
     constructible_from<__decay_t<_Sender>, _Sender>;
 
 template <class _Sender, class _Env = empty_env>
-concept sender_in = sender<_Sender, _Env>;
-#endif
+concept sender_in =            //
+    __sender<_Sender, _Env> && //
+    sender<_Sender, _Env>;
 
 // __checked_completion_signatures is for catching logic bugs in a typed
 // 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
+auto __checked_completion_signatures(_Sender&& __sndr,
+                                     const _Env& __env) noexcept
 {
-  private:
     using _WithEnv = __completion_signatures_of_t<_Sender, _Env>;
     using _WithoutEnv = __completion_signatures_of_t<_Sender, no_env>;
     static_assert(__one_of<_WithoutEnv, _WithEnv,
                            dependent_completion_signatures<no_env>>);
-
-  public:
-    using __t = _WithEnv;
-};
+    stdexec::__debug_sender<_WithEnv>((_Sender&&)__sndr, __env);
+    return _WithEnv{};
+}
 
 template <class _Sender, class _Env = no_env>
     requires sender_in<_Sender, _Env>
 using completion_signatures_of_t =
-    __t<__checked_completion_signatures<_Sender, _Env>>;
+    decltype(stdexec::__checked_completion_signatures(__declval<_Sender>(),
+                                                      __declval<_Env>()));
+#endif
 
 struct __not_a_variant
 {
@@ -900,7 +1262,7 @@
     __munique<__mbind_front_q<std::variant, std::monostate>>;
 
 template <class... _Ts>
-using __decayed_tuple = std::tuple<__decay_t<_Ts>...>;
+using __decayed_tuple = __meval<std::tuple, __decay_t<_Ts>...>;
 
 template <class _Tag, class _Tuple>
 struct __select_completions_for
@@ -917,84 +1279,100 @@
 };
 
 template <class _Tag, class _Tuple>
-using __select_completions_for_or =
+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>>>;
+using __only_gather_signal = //
+    __compl_sigs::__maybe_for_all_sigs<
+        _Completions, __select_completions_for_or<_Tag, __qf<_Tag>>,
+        __remove<__, __q<completion_signatures>>>;
 
 template <class _Tag, class _Completions, class _Tuple, class _Variant>
-using __gather_signal =
-    __compl_sigs::__for_all_sigs<__only_gather_signal<_Tag, _Completions>,
-                                 __invoke_completions<_Tuple>, _Variant>;
+using __gather_signal = //
+    __compl_sigs::__maybe_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_in<_Sender, _Env>
-using __gather_completions_for =
-    __gather_signal<_Tag, completion_signatures_of_t<_Sender, _Env>, _Tuple,
-                    _Variant>;
+using __gather_completions_for = //
+    __meval<                     //
+        __gather_signal, _Tag, __completion_signatures_of_t<_Sender, _Env>,
+        _Tuple, _Variant>;
 
 template <                               //
     class _Sender,                       //
-    class _Env = no_env,                 //
+    class _Env = __default_env,          //
+    class _Tuple = __q<__decayed_tuple>, //
+    class _Variant = __q<__variant>>
+using __try_value_types_of_t =           //
+    __gather_completions_for<set_value_t, _Sender, _Env, _Tuple, _Variant>;
+
+template <                               //
+    class _Sender,                       //
+    class _Env = __default_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>;
+using __value_types_of_t = //
+    __msuccess_or_t<__try_value_types_of_t<_Sender, _Env, _Tuple, _Variant>>;
 
-template <class _Sender, class _Env = no_env, class _Variant = __q<__variant>>
+template <class _Sender, class _Env = __default_env,
+          class _Variant = __q<__variant>>
+using __try_error_types_of_t =
+    __gather_completions_for<set_error_t, _Sender, _Env, __q<__midentity>,
+                             _Variant>;
+
+template <class _Sender, class _Env = __default_env,
+          class _Variant = __q<__variant>>
     requires sender_in<_Sender, _Env>
-using __error_types_of_t = __gather_completions_for<set_error_t, _Sender, _Env,
-                                                    __q<__midentity>, _Variant>;
+using __error_types_of_t =
+    __msuccess_or_t<__try_error_types_of_t<_Sender, _Env, _Variant>>;
 
 template <                                              //
     class _Sender,                                      //
-    class _Env = no_env,                                //
+    class _Env = __default_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 _Sender, class _Env = __default_env,
           template <class...> class _Variant = __variant>
     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_in<_Sender, _Env>
-using __count_of =
-    __compl_sigs::__for_all_sigs<completion_signatures_of_t<_Sender, _Env>,
-                                 __q<__mfront>, __mcount<_Tag>>;
+template <class _Tag, class _Sender, class _Env = __default_env>
+using __try_count_of = //
+    __compl_sigs::__maybe_for_all_sigs<
+        __completion_signatures_of_t<_Sender, _Env>, __q<__mfront>,
+        __mcount<_Tag>>;
 
-template <class _Tag, class _Sender, class _Env = no_env>
+template <class _Tag, class _Sender, class _Env = __default_env>
+    requires sender_in<_Sender, _Env>
+using __count_of = __msuccess_or_t<__try_count_of<_Tag, _Sender, _Env>>;
+
+template <class _Tag, class _Sender, class _Env = __default_env>
     requires __valid<__count_of, _Tag, _Sender, _Env>
 inline constexpr bool __sends = (__v<__count_of<_Tag, _Sender, _Env>> != 0);
 
-template <class _Sender, class _Env = no_env>
+template <class _Sender, class _Env = __default_env>
     requires __valid<__count_of, set_stopped_t, _Sender, _Env>
 inline constexpr bool sends_stopped = __sends<set_stopped_t, _Sender, _Env>;
 
-template <class _Sender, class _Env = no_env>
+template <class _Sender, class _Env = __default_env>
 using __single_sender_value_t =
     __value_types_of_t<_Sender, _Env, __msingle_or<void>, __q<__msingle>>;
 
-template <class _Sender, class _Env = no_env>
+template <class _Sender, class _Env = __default_env>
 using __single_value_variant_sender_t =
     value_types_of_t<_Sender, _Env, __types, __msingle>;
 
-template <class _Sender, class _Env = no_env>
+template <class _Sender, class _Env = __default_env>
 concept __single_typed_sender = sender_in<_Sender, _Env> &&
                                 __valid<__single_sender_value_t, _Sender, _Env>;
 
-template <class _Sender, class _Env = no_env>
+template <class _Sender, class _Env = __default_env>
 concept __single_value_variant_sender =
     sender_in<_Sender, _Env> &&
     __valid<__single_value_variant_sender_t, _Sender, _Env>;
@@ -1002,7 +1380,7 @@
 template <class... Errs>
 using __nofail = __mbool<sizeof...(Errs) == 0>;
 
-template <class _Sender, class _Env = no_env>
+template <class _Sender, class _Env = __default_env>
 concept __nofail_sender = sender_in<_Sender, _Env> &&
                           (__v<error_types_of_t<_Sender, _Env, __nofail>>);
 
@@ -1016,53 +1394,68 @@
 using __default_set_error = completion_signatures<set_error_t(_Error)>;
 
 template <__is_completion_signatures... _Sigs>
-using __ensure_concat =
+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 = //
+template <class... _Sigs>
+using __ensure_concat = __mtry_eval<__ensure_concat_, _Sigs...>;
+
+template <class _Sender, class _Env, class _Sigs, class _SetVal, class _SetErr,
+          class _SetStp>
+using __compl_sigs_impl = //
     __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<>>>;
+        __mtry_eval<__try_value_types_of_t, _Sender, _Env, _SetVal,
+                    __q<__ensure_concat>>,
+        __mtry_eval<__try_error_types_of_t, _Sender, _Env,
+                    __transform<_SetErr, __q<__ensure_concat>>>,
+        __if<__try_count_of<set_stopped_t, _Sender, _Env>, _SetStp,
+             completion_signatures<>>>;
 
-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 _Sender, class _Env, class _Sigs, class _SetVal, class _SetErr,
+          class _SetStp>
+    requires __valid<__compl_sigs_impl, _Sender, _Env, _Sigs, _SetVal, _SetErr,
+                     _SetStp>
+extern __compl_sigs_impl<_Sender, _Env, _Sigs, _SetVal, _SetErr, _SetStp>
+    __compl_sigs_v;
 
-template <class, class _Env, class, class, class, class>
-auto __make(long) -> dependent_completion_signatures<_Env>;
+template <class _Sender, class _Env, class _Sigs, class _SetVal, class _SetErr,
+          class _SetStp>
+using __compl_sigs_t =
+    decltype(__compl_sigs_v<_Sender, _Env, _Sigs, _SetVal, _SetErr, _SetStp>);
 
-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));
+template <bool>
+struct __make_compl_sigs
+{
+    template <class _Sender, class _Env, class _Sigs, class _SetVal,
+              class _SetErr, class _SetStp>
+    using __f = __compl_sigs_t<_Sender, _Env, _Sigs, _SetVal, _SetErr, _SetStp>;
+};
+
+template <>
+struct __make_compl_sigs<true>
+{
+    template <class _Sender, class _Env, class _Sigs, class _SetVal,
+              class _SetErr, class _SetStp>
+    using __f = //
+        __msuccess_or_t<
+            __compl_sigs_t<_Sender, _Env, _Sigs, _SetVal, _SetErr, _SetStp>,
+            dependent_completion_signatures<_Env>>;
+};
+
+template <                                                      //
+    class _Sender,                                              //
+    class _Env = __default_env,                                 //
+    class _Sigs = completion_signatures<>,                      //
+    class _SetValue = __q<__default_set_value>,                 //
+    class _SetError = __q<__default_set_error>,                 //
+    class _SetStopped = completion_signatures<set_stopped_t()>> //
+using __try_make_completion_signatures =                        //
+    __minvoke<__make_compl_sigs<same_as<_Env, no_env>>, _Sender, _Env, _Sigs,
+              _SetValue, _SetError, _SetStopped>;
 } // namespace __compl_sigs
 
-using __compl_sigs::__make_completion_signatures;
+using __compl_sigs::__try_make_completion_signatures;
 
 /////////////////////////////////////////////////////////////////////////////
 // NOT TO SPEC
@@ -1083,7 +1476,7 @@
 //
 //  template <
 //    sender Sndr,
-//    class Env = no_env,
+//    class Env = __default_env,
 //    class AddlSigs = completion_signatures<>,
 //    template <class...> class SetValue = __default_set_value,
 //    template <class> class SetError = __default_set_error,
@@ -1131,45 +1524,22 @@
 //  SendsStopped>` is an alias for an empty struct
 template <                                                                   //
     class _Sender,                                                           //
-    class _Env = no_env,                                                     //
+    class _Env = __default_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>;
+using make_completion_signatures = //
+    __msuccess_or_t<               //
+        __try_make_completion_signatures<_Sender, _Env, _Sigs, __q<_SetValue>,
+                                         __q<_SetError>, _SetStopped>>;
 
 // Needed fairly often
 using __with_exception_ptr =
     completion_signatures<set_error_t(std::exception_ptr)>;
 
-namespace __scheduler_queries
-{
-struct forwarding_scheduler_query_t
-{
-    template <class _Tag>
-    constexpr bool operator()(_Tag __tag) const noexcept
-    {
-        if constexpr (tag_invocable<forwarding_scheduler_query_t, _Tag>)
-        {
-            static_assert(
-                noexcept(tag_invoke(*this, (_Tag&&)__tag) ? true : false));
-            return tag_invoke(*this, (_Tag&&)__tag) ? true : false;
-        }
-        else
-        {
-            return false;
-        }
-    }
-};
-} // namespace __scheduler_queries
-
-using __scheduler_queries::forwarding_scheduler_query_t;
-inline constexpr forwarding_scheduler_query_t forwarding_scheduler_query{};
-
 /////////////////////////////////////////////////////////////////////////////
 // [execution.senders.schedule]
 namespace __schedule
@@ -1177,17 +1547,17 @@
 struct schedule_t
 {
     template <class _Scheduler>
-        requires tag_invocable<schedule_t, _Scheduler> &&
-                 sender<tag_invoke_result_t<schedule_t, _Scheduler>>
+        requires tag_invocable<schedule_t, _Scheduler>
     STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
         auto
         operator()(_Scheduler&& __sched) const
         noexcept(nothrow_tag_invocable<schedule_t, _Scheduler>)
     {
+        static_assert(sender<tag_invoke_result_t<schedule_t, _Scheduler>>);
         return tag_invoke(schedule_t{}, (_Scheduler&&)__sched);
     }
 
-    friend constexpr bool tag_invoke(forwarding_scheduler_query_t, schedule_t)
+    friend constexpr bool tag_invoke(forwarding_query_t, schedule_t)
     {
         return false;
     }
@@ -1205,72 +1575,6 @@
         requires bool{_Predicate(_Tag{})};
     };
 
-// [execution.schedulers.queries], scheduler queries
-namespace __scheduler_queries
-{
-struct get_forward_progress_guarantee_t :
-    __query<get_forward_progress_guarantee_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
-    {
-        return stdexec::forward_progress_guarantee::weakly_parallel;
-    }
-};
-
-struct __has_algorithm_customizations_t :
-    __query<__has_algorithm_customizations_t>
-{
-    template <class _Tp>
-    using __result_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<_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{};
-
-using __scheduler_queries::get_forward_progress_guarantee_t;
-inline constexpr get_forward_progress_guarantee_t
-    get_forward_progress_guarantee{};
-
-namespace __sender_queries
-{
-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>
@@ -1298,124 +1602,9 @@
     equality_comparable<__decay_t<_Scheduler>> &&    //
     copy_constructible<__decay_t<_Scheduler>>;
 
-// NOT TO SPEC
 template <scheduler _Scheduler>
 using schedule_result_t = __call_result_t<schedule_t, _Scheduler>;
 
-/////////////////////////////////////////////////////////////////////////////
-// [execution.general.queries], general queries
-namespace __queries
-{
-// TODO: implement allocator concept
-template <class _T0>
-concept __allocator = true;
-
-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&>>
-    auto operator()(const _Env& __env) const noexcept
-        -> tag_invoke_result_t<get_scheduler_t, const _Env&>
-    {
-        static_assert(nothrow_tag_invocable<get_scheduler_t, const _Env&>);
-        return tag_invoke(get_scheduler_t{}, __env);
-    }
-
-    auto operator()() const noexcept;
-};
-
-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 _Tp>
-        requires nothrow_tag_invocable<get_delegatee_scheduler_t,
-                                       __cref_t<_Tp>> &&
-                 scheduler<tag_invoke_result_t<get_delegatee_scheduler_t,
-                                               __cref_t<_Tp>>>
-    auto operator()(_Tp&& __t) const noexcept(
-        nothrow_tag_invocable<get_delegatee_scheduler_t, __cref_t<_Tp>>)
-        -> tag_invoke_result_t<get_delegatee_scheduler_t, __cref_t<_Tp>>
-    {
-        return tag_invoke(get_delegatee_scheduler_t{}, std::as_const(__t));
-    }
-
-    auto operator()() const noexcept;
-};
-
-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&>>
-    auto operator()(const _Env& __env) const
-        noexcept(nothrow_tag_invocable<get_allocator_t, const _Env&>)
-            -> tag_invoke_result_t<get_allocator_t, const _Env&>
-    {
-        return tag_invoke(get_allocator_t{}, __env);
-    }
-
-    auto operator()() const noexcept;
-};
-
-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<
-                     tag_invoke_result_t<get_stop_token_t, const _Env&>>
-    auto operator()(const _Env& __env) const
-        noexcept(nothrow_tag_invocable<get_stop_token_t, const _Env&>)
-            -> tag_invoke_result_t<get_stop_token_t, const _Env&>
-    {
-        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;
-using __queries::get_stop_token_t;
-inline constexpr get_scheduler_t get_scheduler{};
-inline constexpr get_delegatee_scheduler_t get_delegatee_scheduler{};
-inline constexpr get_allocator_t get_allocator{};
-inline constexpr get_stop_token_t get_stop_token{};
-
-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>>;
@@ -1425,7 +1614,7 @@
     requires(const _SchedulerProvider& __sp) {
         {
             get_scheduler(__sp)
-        } -> scheduler<>;
+        } -> scheduler;
     };
 
 /////////////////////////////////////////////////////////////////////////////
@@ -1661,102 +1850,6 @@
 inline constexpr __connect_awaitable_t __connect_awaitable{};
 
 /////////////////////////////////////////////////////////////////////////////
-// [exec.snd_queries]
-namespace __sender_queries
-{
-struct forwarding_sender_query_t : __query<forwarding_sender_query_t>
-{
-    template <class _Tag>
-    constexpr bool operator()(_Tag __tag) const noexcept
-    {
-        if constexpr (nothrow_tag_invocable<forwarding_sender_query_t, _Tag> &&
-                      std::is_invocable_r_v<bool, tag_t<tag_invoke>,
-                                            forwarding_sender_query_t, _Tag>)
-        {
-            return tag_invoke(*this, (_Tag&&)__tag);
-        }
-        else
-        {
-            return false;
-        }
-    }
-};
-} // namespace __sender_queries
-
-using __sender_queries::forwarding_sender_query_t;
-inline constexpr forwarding_sender_query_t forwarding_sender_query{};
-
-namespace __debug
-{
-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;
-};
-template <class _Env>
-using __debug_env_t = __make_env_t<_Env, __with<__is_debug_env_t, bool>>;
-
-struct __debug_op_state
-{
-    __debug_op_state(auto&&);
-    __debug_op_state(__debug_op_state&&) = delete;
-    friend void tag_invoke(start_t, __debug_op_state&) noexcept;
-};
-
-template <class _Sig>
-struct __completion;
-
-template <class _Tag, class... _Args>
-struct __completion<_Tag(_Args...)>
-{
-    friend void tag_invoke(_Tag, __completion&&, _Args&&...) noexcept;
-};
-
-template <class _Env, class _Sigs>
-struct __debug_receiver;
-
-template <class _Env, class... _Sigs>
-struct __debug_receiver<_Env, completion_signatures<_Sigs...>> :
-    __completion<_Sigs>...
-{
-    friend __debug_env_t<_Env> tag_invoke(get_env_t, __debug_receiver) noexcept;
-};
-
-template <class _Env>
-struct __any_debug_receiver
-{
-    template <class... _Args>
-    friend void tag_invoke(set_value_t, __any_debug_receiver&&,
-                           _Args&&...) noexcept;
-    template <class _Error>
-    friend void tag_invoke(set_error_t, __any_debug_receiver&&,
-                           _Error&&) noexcept;
-    friend void tag_invoke(set_stopped_t, __any_debug_receiver&&) noexcept;
-    friend __debug_env_t<_Env> tag_invoke(get_env_t,
-                                          __any_debug_receiver) noexcept;
-};
-} // namespace __debug
-
-using __debug::__debug_env_t;
-using __debug::__is_debug_env_t;
-
-// BUGBUG maybe instead of the disjunction here we want to make
-// get_completion_signatures recognize debug environments and return
-// an empty list of completions when no tag_invoke overload can be
-// found. https://github.com/brycelelbach/wg21_p2300_std_execution/issues/603
-template <class _Receiver, class _Sender>
-concept __receiver_from =
-    // tag_invocable<__is_debug_env_t, env_of_t<_Receiver>> ||
-    receiver_of<_Receiver,
-                completion_signatures_of_t<_Sender, env_of_t<_Receiver>>>;
-
-/////////////////////////////////////////////////////////////////////////////
 // [execution.senders.connect]
 namespace __connect
 {
@@ -1811,7 +1904,8 @@
         }
         else
         {
-            return static_cast<void (*)() noexcept>(nullptr);
+            return static_cast<__debug::__debug_operation (*)() noexcept>(
+                nullptr);
         }
     }
 
@@ -1821,7 +1915,7 @@
     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>>
+                 __is_debug_env<env_of_t<_Receiver>>
     auto operator()(_Sender&& __sndr, _Receiver&& __rcvr) const
         noexcept(__nothrow_callable<__select_impl_t<_Sender, _Receiver>>)
             -> __call_result_t<__select_impl_t<_Sender, _Receiver>>
@@ -1850,8 +1944,7 @@
         }
     }
 
-    friend constexpr bool tag_invoke(forwarding_sender_query_t,
-                                     connect_t) noexcept
+    friend constexpr bool tag_invoke(forwarding_query_t, connect_t) noexcept
     {
         return false;
     }
@@ -1861,160 +1954,31 @@
 using __connect::connect_t;
 inline constexpr __connect::connect_t connect{};
 
-template <class _Sender, class _Receiver>
-using connect_result_t = __call_result_t<connect_t, _Sender, _Receiver>;
-
-template <class _Sender, class _Receiver>
-concept __nothrow_connectable =
-    noexcept(connect(__declval<_Sender>(), __declval<_Receiver>()));
-
-////////////////////////////////////////////////////////////////////////////
-// `__debug_sender`
-// ===============
-//
-// Understanding why a particular sender doesn't connect to a particular
-// receiver is nigh impossible in the current design due to limitations in
-// how the compiler reports overload resolution failure in the presence of
-// constraints. `__debug_sender` is a utility to assist with the process. It
-// gives you the deep template instantiation backtrace that you need to
-// understand where in a chain of senders the problem is occurring.
-//
-// ```c++
-// template <class _Sigs, class _Env = empty_env, class _Sender>
-//   void __debug_sender(_Sender&& __sndr, _Env = {});
-//
-// template <class _Sender>
-//   void __debug_sender(_Sender&& __sndr);
-//
-// template <class _Env, class _Sender>
-//   void __debug_sender(_Sender&& __sndr, _Env);
-// ```
-//
-// **Usage:**
-//
-// To find out where in a chain of senders, a sender is failing to connect
-// to a receiver, pass it to `__debug_sender`, optionally with an
-// environment argument; e.g. `__debug_sender(sndr [, env])`
-//
-// To find out why a sender will not connect to a receiver of a particular
-// signature, specify the error and value types as an explicit template
-// argument that names an instantiation of `completion_signatures`; e.g.:
-// `__debug_sender<completion_signatures<set_value_t(int)>>(sndr [, env])`.
-//
-// **How it works:**
-//
-// The `__debug_sender` function `connect`'s the sender to a
-// `__debug_receiver`, whose environment is augmented with a special
-// `__is_debug_env_t` query. An additional fall-back overload is added to
-// the `connect` CPO that recognizes receivers whose environments respond to
-// that query and lets them through. Then in a non-immediate context, it
-// looks for a `tag_invoke(connect_t...)` overload for the input sender and
-// receiver. This will recurse until it hits the `tag_invoke` call that is
-// causing the failure.
-//
-// At least with clang, this gives me a nice backtrace, at the bottom of
-// which is the faulty `tag_invoke` overload with a mention of the
-// constraint that failed.
-namespace __debug
-{
-template <class _Sigs, class _Env = empty_env, class _Sender>
-void __debug_sender(_Sender&& __sndr, _Env = {})
-{
-    using _Receiver = __debug_receiver<_Env, _Sigs>;
-    (void)connect_t{}((_Sender&&)__sndr, _Receiver{});
-}
-
-template <class _Sender>
-void __debug_sender(_Sender&& __sndr)
-{
-    using _Receiver = __any_debug_receiver<empty_env>;
-    (void)connect_t{}((_Sender&&)__sndr, _Receiver{});
-}
-
-template <class _Env, class _Sender>
-void __debug_sender(_Sender&& __sndr, _Env)
-{
-    using _Receiver = __any_debug_receiver<_Env>;
-    (void)connect_t{}((_Sender&&)__sndr, _Receiver{});
-}
-} // namespace __debug
-
-using __debug::__debug_sender;
-
 /////////////////////////////////////////////////////////////////////////////
 // [exec.snd]
 template <class _Sender, class _Receiver>
-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);
-                    };
+concept sender_to =
+    receiver<_Receiver> &&           //
+    __sender<_Sender,
+             env_of_t<_Receiver>> && // NOT TO SPEC: for simpler diagnostics
+    sender_in<_Sender, env_of_t<_Receiver>> && //
+    __receiver_from<_Receiver, _Sender> &&     //
+    requires(_Sender&& __sndr, _Receiver&& __rcvr) {
+        connect((_Sender&&)__sndr, (_Receiver&&)__rcvr);
+    };
 
 template <class _Tag, class... _Args>
 _Tag __tag_of_sig_(_Tag (*)(_Args...));
 template <class _Sig>
 using __tag_of_sig_t = decltype(stdexec::__tag_of_sig_((_Sig*)nullptr));
 
-template <class _Sender, class _SetSig, class _Env = no_env>
+template <class _Sender, class _SetSig, class _Env = __default_env>
 concept sender_of =
     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>>>;
 
-/////////////////////////////////////////////////////////////////////////////
-// [exec.snd_queries], sender queries
-namespace __sender_queries
-{
-template <__one_of<set_value_t, set_error_t, set_stopped_t> _CPO>
-struct get_completion_scheduler_t : __query<get_completion_scheduler_t<_CPO>>
-{
-    // NOT TO SPEC:
-    friend constexpr bool tag_invoke(forwarding_sender_query_t,
-                                     const get_completion_scheduler_t&) noexcept
-    {
-        return true;
-    }
-
-    friend constexpr bool tag_invoke(forwarding_query_t,
-                                     const get_completion_scheduler_t&) noexcept
-    {
-        return true;
-    }
-
-    template <queryable _Queryable>
-        requires tag_invocable<get_completion_scheduler_t, const _Queryable&> &&
-                 scheduler<tag_invoke_result_t<get_completion_scheduler_t,
-                                               const _Queryable&>>
-    auto operator()(const _Queryable& __queryable) const noexcept
-        -> tag_invoke_result_t<get_completion_scheduler_t, const _Queryable&>
-    {
-        // NOT TO SPEC:
-        static_assert(nothrow_tag_invocable<get_completion_scheduler_t,
-                                            const _Queryable&>,
-                      "get_completion_scheduler<_CPO> should be noexcept");
-        return tag_invoke(*this, __queryable);
-    }
-};
-} // namespace __sender_queries
-
-using __sender_queries::forwarding_sender_query_t;
-using __sender_queries::get_completion_scheduler_t;
-
-template <__one_of<set_value_t, set_error_t, set_stopped_t> _CPO>
-inline constexpr get_completion_scheduler_t<_CPO> get_completion_scheduler{};
-
-template <class _Sender, class _CPO>
-concept __has_completion_scheduler =
-    __callable<get_completion_scheduler_t<_CPO>,
-               __call_result_t<get_env_t, const _Sender&>>;
-
-template <class _Sender, class _CPO>
-using __completion_scheduler_for =
-    __call_result_t<get_completion_scheduler_t<_CPO>,
-                    __call_result_t<get_env_t, const _Sender&>>;
-
 template <class _Fun, class _CPO, class _Sender, class... _As>
 concept __tag_invocable_with_completion_scheduler =
     __has_completion_scheduler<_Sender, _CPO> &&
@@ -2040,9 +2004,9 @@
 template <class _Value>
 struct __receiver_base
 {
-    template <class... _Us>
+    template <same_as<set_value_t> _Tag, class... _Us>
         requires constructible_from<__value_or_void_t<_Value>, _Us...>
-    friend void tag_invoke(set_value_t, __receiver_base&& __self,
+    friend void tag_invoke(_Tag, __receiver_base&& __self,
                            _Us&&... __us) noexcept
     {
         try
@@ -2056,8 +2020,8 @@
         }
     }
 
-    template <class _Error>
-    friend void tag_invoke(set_error_t, __receiver_base&& __self,
+    template <same_as<set_error_t> _Tag, class _Error>
+    friend void tag_invoke(_Tag, __receiver_base&& __self,
                            _Error&& __err) noexcept
     {
         if constexpr (__decays_to<_Error, std::exception_ptr>)
@@ -2084,7 +2048,8 @@
     {
         using __id = __receiver;
 
-        friend void tag_invoke(set_stopped_t, __t&& __self) noexcept
+        template <same_as<set_stopped_t> _Tag>
+        friend void tag_invoke(_Tag, __t&& __self) noexcept
         {
             auto __continuation =
                 __coro::coroutine_handle<_Promise>::from_address(
@@ -2106,7 +2071,8 @@
 };
 
 template <class _Sender, class _Promise>
-using __value_t = __single_sender_value_t<_Sender, __env_t<_Promise>>;
+using __value_t =
+    __decay_t<__single_sender_value_t<_Sender, __env_t<_Promise>>>;
 
 template <class _Sender, class _Promise>
 using __receiver_t =
@@ -2253,7 +2219,7 @@
 } // namespace __as_awaitable
 
 using __as_awaitable::as_awaitable_t;
-inline constexpr as_awaitable_t as_awaitable;
+inline constexpr as_awaitable_t as_awaitable{};
 
 namespace __with_awaitable_senders
 {
@@ -2408,8 +2374,7 @@
         __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>
+        template <__completion_tag _Tag, class... _As>
             requires __callable<_Tag, _Receiver, _As...>
         friend void tag_invoke(
             _Tag __tag, __t&& __self,
@@ -2521,20 +2486,21 @@
     struct __t
     {
         using __id = __detached_receiver;
-        [[no_unique_address]] _Env __env_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Env __env_;
 
-        template <class... _As>
-        friend void tag_invoke(set_value_t, __t&&, _As&&...) noexcept
+        template <same_as<set_value_t> _Tag, class... _As>
+        friend void tag_invoke(_Tag, __t&&, _As&&...) noexcept
         {}
 
-        template <class _Error>
-        [[noreturn]] friend void tag_invoke(set_error_t, __t&&,
-                                            _Error&&) noexcept
+        template <same_as<set_error_t> _Tag, class _Error>
+        [[noreturn]] friend void tag_invoke(_Tag, __t&&, _Error&&) noexcept
         {
             std::terminate();
         }
 
-        friend void tag_invoke(set_stopped_t, __t&&) noexcept {}
+        template <same_as<set_stopped_t> _Tag>
+        friend void tag_invoke(_Tag, __t&&) noexcept
+        {}
 
         friend const _Env& tag_invoke(get_env_t, const __t& __self) noexcept
         {
@@ -2741,7 +2707,8 @@
 {
     _Fun __fun_;
 
-    friend void tag_invoke(set_value_t, __as_receiver&& __rcvr) noexcept
+    template <same_as<set_value_t> _Tag>
+    friend void tag_invoke(_Tag, __as_receiver&& __rcvr) noexcept
     {
         try
         {
@@ -2753,13 +2720,16 @@
         }
     }
 
-    [[noreturn]] friend void tag_invoke(set_error_t, __as_receiver&&,
+    template <same_as<set_error_t> _Tag>
+    [[noreturn]] friend void tag_invoke(_Tag, __as_receiver&&,
                                         std::exception_ptr) noexcept
     {
         std::terminate();
     }
 
-    friend void tag_invoke(set_stopped_t, __as_receiver&&) noexcept {}
+    template <same_as<set_stopped_t> _Tag>
+    friend void tag_invoke(_Tag, __as_receiver&&) noexcept
+    {}
 
     friend empty_env tag_invoke(get_env_t, const __as_receiver&)
     {
@@ -2819,8 +2789,8 @@
 template <class _T0, class _T1>
 struct __compose : sender_adaptor_closure<__compose<_T0, _T1>>
 {
-    [[no_unique_address]] _T0 __t0_;
-    [[no_unique_address]] _T1 __t1_;
+    STDEXEC_NO_UNIQUE_ADDRESS _T0 __t0_;
+    STDEXEC_NO_UNIQUE_ADDRESS _T1 __t1_;
 
     template <sender _Sender>
         requires __callable<_T0, _Sender> &&
@@ -2861,13 +2831,15 @@
 template <class _Fun, class... _As>
 struct __binder_back : sender_adaptor_closure<__binder_back<_Fun, _As...>>
 {
-    [[no_unique_address]] _Fun __fun_;
+    STDEXEC_NO_UNIQUE_ADDRESS _Fun __fun_;
     std::tuple<_As...> __as_;
 
     template <sender _Sender>
         requires __callable<_Fun, _Sender, _As...>
-    __call_result_t<_Fun, _Sender, _As...> operator()(
-        _Sender&& __sndr) && noexcept(__nothrow_callable<_Fun, _Sender, _As...>)
+    STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
+        __call_result_t<_Fun, _Sender, _As...>
+        operator()(_Sender&& __sndr) && noexcept(
+            __nothrow_callable<_Fun, _Sender, _As...>)
     {
         return std::apply(
             [&__sndr, this](_As&... __as) {
@@ -2878,7 +2850,8 @@
 
     template <sender _Sender>
         requires __callable<const _Fun&, _Sender, const _As&...>
-    __call_result_t<const _Fun&, _Sender, const _As&...>
+    STDEXEC_DETAIL_CUDACC_HOST_DEVICE       //
+        __call_result_t<const _Fun&, _Sender, const _As&...>
         operator()(_Sender&& __sndr) const& //
         noexcept(__nothrow_callable<const _Fun&, _Sender, const _As&...>)
     {
@@ -2916,8 +2889,10 @@
 struct __receiver : __nope
 {};
 
-void tag_invoke(set_error_t, __receiver, std::exception_ptr) noexcept;
-void tag_invoke(set_stopped_t, __receiver) noexcept;
+template <same_as<set_error_t> _Tag>
+void tag_invoke(_Tag, __receiver, std::exception_ptr) noexcept;
+template <same_as<set_stopped_t> _Tag>
+void tag_invoke(_Tag, __receiver) noexcept;
 empty_env tag_invoke(get_env_t, __receiver) noexcept;
 } // namespace __no
 
@@ -2934,7 +2909,7 @@
         {}
 
       private:
-        [[no_unique_address]] _Base __base_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Base __base_;
 
       protected:
         STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
@@ -3039,11 +3014,13 @@
         }
 
         template <same_as<set_value_t> _SetValue, class... _As>
-        STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
+        STDEXEC_DETAIL_CUDACC_HOST_DEVICE                                    //
             friend auto
-            tag_invoke(_SetValue, _Derived&& __self, _As&&... __as) noexcept
-            -> decltype(_CALL_MEMBER(set_value, (_Derived&&)__self,
-                                     (_As&&)__as...))
+            tag_invoke(_SetValue, _Derived&& __self, _As&&... __as) noexcept //
+            -> __msecond<                                                    //
+                __if_c<same_as<set_value_t, _SetValue>>,
+                decltype(_CALL_MEMBER(set_value, (_Derived&&)__self,
+                                      (_As&&)__as...))>
         {
             static_assert(noexcept(
                 _CALL_MEMBER(set_value, (_Derived&&)__self, (_As&&)__as...)));
@@ -3053,7 +3030,7 @@
         template <same_as<set_value_t> _SetValue, class _Dp = _Derived,
                   class... _As>
             requires _MISSING_MEMBER(_Dp, set_value) &&
-                     tag_invocable<set_value_t, __base_t<_Dp>, _As...>
+                     tag_invocable<_SetValue, __base_t<_Dp>, _As...>
         STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
             friend void tag_invoke(_SetValue, _Derived&& __self,
                                    _As&&... __as) noexcept
@@ -3062,11 +3039,13 @@
         }
 
         template <same_as<set_error_t> _SetError, class _Error>
-        STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
+        STDEXEC_DETAIL_CUDACC_HOST_DEVICE                                     //
             friend auto
-            tag_invoke(_SetError, _Derived&& __self, _Error&& __err) noexcept
-            -> decltype(_CALL_MEMBER(set_error, (_Derived&&)__self,
-                                     (_Error&&)__err))
+            tag_invoke(_SetError, _Derived&& __self, _Error&& __err) noexcept //
+            -> __msecond<                                                     //
+                __if_c<same_as<set_error_t, _SetError>>,
+                decltype(_CALL_MEMBER(set_error, (_Derived&&)__self,
+                                      (_Error&&)__err))>
         {
             static_assert(noexcept(
                 _CALL_MEMBER(set_error, (_Derived&&)__self, (_Error&&)__err)));
@@ -3076,7 +3055,7 @@
         template <same_as<set_error_t> _SetError, class _Error,
                   class _Dp = _Derived>
             requires _MISSING_MEMBER(_Dp, set_error) &&
-                     tag_invocable<set_error_t, __base_t<_Dp>, _Error>
+                     tag_invocable<_SetError, __base_t<_Dp>, _Error>
         STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
             friend void tag_invoke(_SetError, _Derived&& __self,
                                    _Error&& __err) noexcept
@@ -3085,10 +3064,12 @@
         }
 
         template <same_as<set_stopped_t> _SetStopped, class _Dp = _Derived>
-        STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
+        STDEXEC_DETAIL_CUDACC_HOST_DEVICE                       //
             friend auto
-            tag_invoke(_SetStopped, _Derived&& __self) noexcept
-            -> decltype(_CALL_MEMBER(set_stopped, (_Dp&&)__self))
+            tag_invoke(_SetStopped, _Derived&& __self) noexcept //
+            -> __msecond<                                       //
+                __if_c<same_as<set_stopped_t, _SetStopped>>,
+                decltype(_CALL_MEMBER(set_stopped, (_Dp&&)__self))>
         {
             static_assert(
                 noexcept(_CALL_MEMBER(set_stopped, (_Derived&&)__self)));
@@ -3097,7 +3078,7 @@
 
         template <same_as<set_stopped_t> _SetStopped, class _Dp = _Derived>
             requires _MISSING_MEMBER(_Dp, set_stopped) &&
-                     tag_invocable<set_stopped_t, __base_t<_Dp>>
+                     tag_invocable<_SetStopped, __base_t<_Dp>>
         STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
             friend void tag_invoke(_SetStopped, _Derived&& __self) noexcept
         {
@@ -3185,16 +3166,42 @@
     }
 }
 
+template <class _Fun>
+struct _WITH_FUNCTION_
+{};
+
+template <class... _Args>
+struct _WITH_ARGUMENTS_
+{};
+
+inline constexpr __mstring __not_callable_diag =
+    "The specified function is not callable with the arguments provided."__csz;
+
+template <__mstring _Context, __mstring _Diagnostic = __not_callable_diag>
+struct _NOT_CALLABLE_
+{};
+
+template <__mstring _Context>
+struct __callable_error
+{
+    template <class _Fun, class... _Args>
+    using __f =       //
+        __mexception< //
+            _NOT_CALLABLE_<_Context>, _WITH_FUNCTION_<_Fun>,
+            _WITH_ARGUMENTS_<_Args...>>;
+};
+
 template <class _Fun, class... _Args>
     requires invocable<_Fun, _Args...>
 using __non_throwing_ = __mbool<__nothrow_invocable<_Fun, _Args...>>;
 
-template <class _Tag, class _Fun, class _Sender, class _Env>
+template <class _Tag, class _Fun, class _Sender, class _Env, class _Catch>
 using __with_error_invoke_t = //
-    __if_c<__v<__gather_completions_for<_Tag, _Sender, _Env,
-                                        __mbind_front_q<__non_throwing_, _Fun>,
-                                        __q<__mand>>>,
-           completion_signatures<>, __with_exception_ptr>;
+    __if<__gather_completions_for<
+             _Tag, _Sender, _Env,
+             __mbind_front<__mtry_catch_q<__non_throwing_, _Catch>, _Fun>,
+             __q<__mand>>,
+         completion_signatures<>, __with_exception_ptr>;
 
 template <class _Fun, class... _Args>
     requires invocable<_Fun, _Args...>
@@ -3214,7 +3221,7 @@
     struct __data
     {
         _Receiver __rcvr_;
-        [[no_unique_address]] _Fun __fun_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Fun __fun_;
     };
 
     struct __t
@@ -3277,6 +3284,10 @@
     };
 };
 
+inline constexpr __mstring __then_context =
+    "In stdexec::then(Sender, Function)..."__csz;
+using __on_not_callable = __callable_error<__then_context>;
+
 template <class _SenderId, class _Fun>
 struct __sender
 {
@@ -3292,16 +3303,19 @@
     {
         using __id = __sender;
         using is_sender = void;
-        [[no_unique_address]] _Sender __sndr_;
-        [[no_unique_address]] _Fun __fun_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Sender __sndr_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Fun __fun_;
 
         template <class _Self, class _Env>
         using __completion_signatures = //
-            __make_completion_signatures<
+            __try_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>>;
+                                      __copy_cvref_t<_Self, _Sender>, _Env,
+                                      __on_not_callable>,
+                __mbind_front<
+                    __mtry_catch_q<__set_value_invoke_t, __on_not_callable>,
+                    _Fun>>;
 
         template <__decays_to<__t> _Self, receiver _Receiver>
             requires sender_to<__copy_cvref_t<_Self, _Sender>,
@@ -3398,35 +3412,29 @@
         using __id = __receiver;
 
         _Receiver __rcvr_;
-        [[no_unique_address]] _Fun __fun_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Fun __fun_;
 
-        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
+        template <__one_of<set_value_t, set_stopped_t> _Tag, same_as<__t> _Self,
+                  class... _Args>
+            requires __callable<_Tag, _Receiver, _Args...>
+        friend void tag_invoke(_Tag, _Self&& __self, _Args&&... __args) noexcept
         {
-            set_value((_Receiver&&)__self.__rcvr_, (_Args&&)__args...);
+            _Tag{}((_Receiver&&)__self.__rcvr_, (_Args&&)__args...);
         }
 
         // Customize set_error by invoking the invocable and passing the result
         // to the base class
-        template <__decays_to<__t> _Self, class _Error>
+        template <same_as<set_error_t> _Tag, __decays_to<__t> _Self,
+                  class _Error>
             requires invocable<_Fun, _Error> &&
                      __receiver_of_invoke_result<_Receiver, _Fun, _Error>
-        friend void tag_invoke(set_error_t, _Self&& __self,
-                               _Error&& __error) noexcept
+        friend void tag_invoke(_Tag, _Self&& __self, _Error&& __error) noexcept
         {
             stdexec::__set_value_invoke((_Receiver&&)__self.__rcvr_,
                                         (_Fun&&)__self.__fun_,
                                         (_Error&&)__error);
         }
 
-        friend void tag_invoke(set_stopped_t, __t&& __self) noexcept
-            requires __callable<set_stopped_t, _Receiver>
-        {
-            set_stopped((_Receiver&&)__self.__rcvr_);
-        }
-
         friend env_of_t<_Receiver> tag_invoke(get_env_t,
                                               const __t& __self) noexcept
         {
@@ -3435,6 +3443,10 @@
     };
 };
 
+inline constexpr __mstring __upon_error_context =
+    "In stdexec::upon_error(Sender, Function)..."__csz;
+using __on_not_callable = __callable_error<__upon_error_context>;
+
 template <class _SenderId, class _Fun>
 struct __sender
 {
@@ -3448,15 +3460,16 @@
         using __id = __sender;
         using is_sender = void;
 
-        [[no_unique_address]] _Sender __sndr_;
-        [[no_unique_address]] _Fun __fun_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Sender __sndr_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Fun __fun_;
 
         template <class _Self, class _Env>
         using __completion_signatures = //
-            __make_completion_signatures<
+            __try_make_completion_signatures<
                 __copy_cvref_t<_Self, _Sender>, _Env,
                 __with_error_invoke_t<set_error_t, _Fun,
-                                      __copy_cvref_t<_Self, _Sender>, _Env>,
+                                      __copy_cvref_t<_Self, _Sender>, _Env,
+                                      __on_not_callable>,
                 __q<__compl_sigs::__default_set_value>,
                 __mbind_front_q<__set_value_invoke_t, _Fun>>;
 
@@ -3555,25 +3568,18 @@
     {
         using __id = __receiver;
         _Receiver __rcvr_;
-        [[no_unique_address]] _Fun __fun_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Fun __fun_;
 
-        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
+        template <__one_of<set_value_t, set_error_t> _Tag, same_as<__t> _Self,
+                  class... _Args>
+            requires __callable<_Tag, _Receiver, _Args...>
+        friend void tag_invoke(_Tag, _Self&& __self, _Args&&... __args) noexcept
         {
-            set_value((_Receiver&&)__self.__rcvr_, (_Args&&)__args...);
+            _Tag{}((_Receiver&&)__self.__rcvr_, (_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.__rcvr_, (_Error&&)__error);
-        }
-
-        friend void tag_invoke(set_stopped_t, __t&& __self) noexcept
+        template <same_as<set_stopped_t> _Tag>
+        friend void tag_invoke(_Tag, __t&& __self) noexcept
         {
             stdexec::__set_value_invoke((_Receiver&&)__self.__rcvr_,
                                         (_Fun&&)__self.__fun_);
@@ -3587,6 +3593,10 @@
     };
 };
 
+inline constexpr __mstring __upon_stopped_context =
+    "In stdexec::upon_stopped(Sender, Function)..."__csz;
+using __on_not_callable = __callable_error<__upon_stopped_context>;
+
 template <class _SenderId, class _Fun>
 struct __sender
 {
@@ -3600,15 +3610,16 @@
         using __id = __sender;
         using is_sender = void;
 
-        [[no_unique_address]] _Sender __sndr_;
-        [[no_unique_address]] _Fun __fun_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Sender __sndr_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Fun __fun_;
 
         template <class _Self, class _Env>
         using __completion_signatures = //
-            __make_completion_signatures<
+            __try_make_completion_signatures<
                 __copy_cvref_t<_Self, _Sender>, _Env,
                 __with_error_invoke_t<set_stopped_t, _Fun,
-                                      __copy_cvref_t<_Self, _Sender>, _Env>,
+                                      __copy_cvref_t<_Self, _Sender>, _Env,
+                                      __on_not_callable>,
                 __q<__compl_sigs::__default_set_value>,
                 __q<__compl_sigs::__default_set_error>,
                 __set_value_invoke_t<_Fun>>;
@@ -3617,8 +3628,7 @@
             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) //
+        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>>
@@ -3701,6 +3711,10 @@
 // [execution.senders.adaptors.bulk]
 namespace __bulk
 {
+inline constexpr __mstring __bulk_context =
+    "In stdexec::bulk(Sender, Shape, Function)..."__csz;
+using __on_not_callable = __callable_error<__bulk_context>;
+
 template <class _ReceiverId, integral _Shape, class _Fun>
 struct __receiver
 {
@@ -3710,8 +3724,8 @@
     {
         friend receiver_adaptor<__t, _Receiver>;
 
-        [[no_unique_address]] _Shape __shape_;
-        [[no_unique_address]] _Fun __f_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Shape __shape_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Fun __f_;
 
         template <class... _As>
         void set_value(_As&&... __as) && noexcept
@@ -3770,25 +3784,27 @@
         using __id = __sender;
         using is_sender = void;
 
-        [[no_unique_address]] _Sender __sndr_;
-        [[no_unique_address]] _Shape __shape_;
-        [[no_unique_address]] _Fun __fun_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Sender __sndr_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Shape __shape_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Fun __fun_;
 
-        template <class _Sender, class _Env>
+        template <class _Sender, class _Env, class _Catch>
         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>;
+            __if<__try_value_types_of_t<
+                     _Sender, _Env,
+                     __transform<
+                         __q<__decay_ref>,
+                         __mbind_front<__mtry_catch_q<__non_throwing_, _Catch>,
+                                       _Fun, _Shape>>,
+                     __q<__mand>>,
+                 completion_signatures<>, __with_exception_ptr>;
 
         template <class _Self, class _Env>
         using __completion_signatures = //
-            __make_completion_signatures<
+            __try_make_completion_signatures<
                 __copy_cvref_t<_Self, _Sender>, _Env,
-                __with_error_invoke_t<__copy_cvref_t<_Self, _Sender>, _Env>>;
+                __with_error_invoke_t<__copy_cvref_t<_Self, _Sender>, _Env,
+                                      __on_not_callable>>;
 
         template <__decays_to<__t> _Self, receiver _Receiver>
             requires sender_to<__copy_cvref_t<_Self, _Sender>,
@@ -3857,8 +3873,9 @@
         requires(!__tag_invocable_with_completion_scheduler<
                     bulk_t, set_value_t, _Sender, _Shape, _Fun>) &&
                 (!tag_invocable<bulk_t, _Sender, _Shape, _Fun>)
-    __sender<_Sender, _Shape, _Fun> operator()(_Sender&& __sndr, _Shape __shape,
-                                               _Fun __fun) const
+    STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
+        __sender<_Sender, _Shape, _Fun>
+        operator()(_Sender&& __sndr, _Shape __shape, _Fun __fun) const
     {
         return __sender<_Sender, _Shape, _Fun>{(_Sender&&)__sndr, __shape,
                                                (_Fun&&)__fun};
@@ -3901,8 +3918,7 @@
       public:
         using __id = __receiver;
 
-        template <__one_of<set_value_t, set_error_t, set_stopped_t> _Tag,
-                  class... _As>
+        template <__completion_tag _Tag, class... _As>
         friend void tag_invoke(_Tag __tag, __t&& __self, _As&&... __as) noexcept
         {
             stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>& __state =
@@ -3976,6 +3992,7 @@
 
         using __receiver_ = stdexec::__t<__receiver<_CvrefSenderId, _EnvId>>;
 
+        void* const __token_{(void*)0xDEADBEEF};
         in_place_stop_source __stop_source_{};
         __variant_t __data_;
         std::atomic<void*> __head_{nullptr};
@@ -4071,6 +4088,7 @@
         {
             stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>* __shared_state =
                 __self.__shared_state_.get();
+            STDEXEC_ASSERT(__shared_state->__token_ == (void*)0xDEADBEEF);
             std::atomic<void*>& __head = __shared_state->__head_;
             void* const __completion_state = static_cast<void*>(__shared_state);
             void* __old = __head.load(std::memory_order_acquire);
@@ -4130,7 +4148,7 @@
 
         explicit __t(_CvrefSender&& __sndr, _Env __env) :
             __shared_state_{std::make_shared<__sh_state_>(
-                (_CvrefSender&&)__sndr, (_Env&&)__env)}
+                static_cast<_CvrefSender&&>(__sndr), (_Env&&)__env)}
         {}
 
       private:
@@ -4146,14 +4164,14 @@
 
         template <class _Self>
         using __completions_t = //
-            make_completion_signatures<
+            __try_make_completion_signatures<
                 // NOT TO SPEC:
                 // See
                 // https://github.com/brycelelbach/wg21_p2300_execution/issues/26
-                _CvrefSender, __env_t<__make_dependent_on<_Env, _Self>>,
+                _CvrefSender, __env_t<__mfront<_Env, _Self>>,
                 completion_signatures<set_error_t(const std::exception_ptr&),
                                       set_stopped_t()>, // NOT TO SPEC
-                __set_value_t, __set_error_t>;
+                __q<__set_value_t>, __q<__set_error_t>>;
 
         std::shared_ptr<__sh_state_> __shared_state_;
 
@@ -4198,8 +4216,8 @@
     __minvocable<__which<__cust_sigs>, _Sender, _Env>;
 
 template <class _Sender, class _Env>
-using __sender_t = __t<__sender<stdexec::__cvref_id<_Sender, _Sender>,
-                                stdexec::__id<__decay_t<_Env>>>>;
+using __sender_t =
+    __t<__sender<stdexec::__cvref_id<_Sender>, stdexec::__id<__decay_t<_Env>>>>;
 
 template <class _Sender, class _Env>
 using __dispatcher_for =
@@ -4239,33 +4257,32 @@
     __make_env_t<_BaseEnv, // 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
     {
-        __intrusive_ptr<stdexec::__t<__sh_state<_SenderId, _EnvId>>>
+        __intrusive_ptr<stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>>
             __shared_state_;
 
       public:
         using __id = __receiver;
 
-        explicit __t(stdexec::__t<__sh_state<_SenderId, _EnvId>>&
+        explicit __t(stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>&
                          __shared_state) noexcept :
             __shared_state_(__shared_state.__intrusive_from_this())
         {}
 
-        template <__one_of<set_value_t, set_error_t, set_stopped_t> _Tag,
-                  class... _As>
+        template <__completion_tag _Tag, 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.__shared_state_;
 
             try
@@ -4299,10 +4316,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 : __enable_intrusive_from_this<__t>
@@ -4318,30 +4335,30 @@
                             _Ts...>;
 
         using __bound_values_t = //
-            __value_types_of_t<_Sender, __env_t<_Env>,
+            __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>,
+                _CvrefSender, __env_t<_Env>,
                 __transform<__mbind_front_q<__decayed_tuple, set_error_t>,
                             __bound_values_t>>;
 
-        using __receiver_t = stdexec::__t<__receiver<_SenderId, _EnvId>>;
+        using __receiver_t = stdexec::__t<__receiver<_CvrefSenderId, _EnvId>>;
 
         __variant_t __data_;
         in_place_stop_source __stop_source_{};
 
         std::atomic<void*> __op_state1_{nullptr};
         __env_t<_Env> __env_;
-        connect_result_t<_Sender&, __receiver_t> __op_state2_;
+        connect_result_t<_CvrefSender, __receiver_t> __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_t{*this}))
+            __op_state2_(connect((_CvrefSender&&)__sndr, __receiver_t{*this}))
         {
             start(__op_state2_);
         }
@@ -4365,10 +4382,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>;
 
@@ -4390,7 +4407,7 @@
 
         _Receiver __rcvr_;
         __on_stop __on_stop_{};
-        __intrusive_ptr<stdexec::__t<__sh_state<_SenderId, _EnvId>>>
+        __intrusive_ptr<stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>>
             __shared_state_;
 
       public:
@@ -4398,7 +4415,7 @@
 
         __t(                    //
             _Receiver __rcvr,   //
-            __intrusive_ptr<stdexec::__t<__sh_state<_SenderId, _EnvId>>>
+            __intrusive_ptr<stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>>
                 __shared_state) //
             noexcept(std::is_nothrow_move_constructible_v<_Receiver>) :
             __operation_base{__notify},
@@ -4438,7 +4455,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*>& __op_state1 = __shared_state->__op_state1_;
             void* const __completion_state = static_cast<void*>(__shared_state);
@@ -4481,10 +4498,10 @@
     };
 };
 
-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>;
 
     struct __t
@@ -4492,10 +4509,9 @@
         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)}
+        explicit __t(_CvrefSender __sndr, _Env __env) :
+            __shared_state_{__make_intrusive<__sh_state_>(
+                (_CvrefSender&&)__sndr, (_Env&&)__env)}
         {}
 
         ~__t()
@@ -4512,10 +4528,10 @@
         __t(__t&&) = default;
 
       private:
-        using __sh_state_ = stdexec::__t<__sh_state<_SenderId, _EnvId>>;
+        using __sh_state_ = stdexec::__t<__sh_state<_CvrefSenderId, _EnvId>>;
         template <class _Receiver>
         using __operation = stdexec::__t<
-            __operation<_SenderId, _EnvId, stdexec::__id<_Receiver>>>;
+            __operation<_CvrefSenderId, _EnvId, stdexec::__id<_Receiver>>>;
 
         template <class... _Tys>
         using __set_value_t =
@@ -4527,13 +4543,12 @@
 
         template <class _Self>
         using __completions_t = //
-            make_completion_signatures<
-                _Sender&, __env_t<__make_dependent_on<_Env, _Self>>,
+            __try_make_completion_signatures<
+                _CvrefSender, __env_t<__mfront<_Env, _Self>>,
                 completion_signatures<set_error_t(std::exception_ptr&&),
                                       set_stopped_t()>, // BUGBUG NOT TO SPEC
-                __set_value_t, __set_error_t>;
+                __q<__set_value_t>, __q<__set_error_t>>;
 
-        _Sender __sndr_;
         __intrusive_ptr<__sh_state_> __shared_state_;
 
         template <same_as<__t> _Self,
@@ -4556,54 +4571,49 @@
 
 // When looking for user-defined customizations of split, these
 // are the signatures to test against, in order:
-using _Sender = __0;
+using _CvrefSender = __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,
+    __types<tag_invoke_t(ensure_started_t,
+                         get_completion_scheduler_t<set_value_t>(
+                             get_env_t(const _CvrefSender&)),
+                         _CvrefSender),
+            tag_invoke_t(ensure_started_t,
+                         get_completion_scheduler_t<set_value_t>(
+                             get_env_t(const _CvrefSender&)),
+                         _CvrefSender, _Env),
+            tag_invoke_t(ensure_started_t, get_scheduler_t(_Env&),
+                         _CvrefSender),
+            tag_invoke_t(ensure_started_t, get_scheduler_t(_Env&), _CvrefSender,
                          _Env),
-            tag_invoke_t(ensure_started_t, _Sender),
-            tag_invoke_t(ensure_started_t, _Sender, _Env)>;
+            tag_invoke_t(ensure_started_t, _CvrefSender),
+            tag_invoke_t(ensure_started_t, _CvrefSender, _Env)>;
 
-template <class _Sender, class _Env>
+template <class _CvrefSender, class _Env>
 inline constexpr bool __is_ensure_started_customized =
-    __minvocable<__which<__cust_sigs>, _Sender, _Env>;
+    __minvocable<__which<__cust_sigs>, _CvrefSender, _Env>;
 
 template <class _Sender, class _Env>
-using __sender_t = __t<__sender<stdexec::__id<__decay_t<_Sender>>,
+using __sender_t = __t<__sender<stdexec::__cvref_id<_Sender, _Sender>,
                                 stdexec::__id<__decay_t<_Env>>>>;
 
-template <class _Sender, class _Env>
-using __receiver_t = __t<__receiver<stdexec::__id<__decay_t<_Sender>>,
-                                    stdexec::__id<__decay_t<_Env>>>>;
-
-template <class _Sender, class _Env>
-using __dispatcher_for =
-    __make_dispatcher<__cust_sigs, __mconstructor_for<__sender_t>, _Sender,
-                      _Env>;
-
-template <class _SenderId, class _EnvId>
-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);
-    };
+    __is_instance_of<__id<__decay_t<_Sender>>, __sender>;
+
+template <class _Sender>
+using __fallback = __if_c<__ensure_started_sender<_Sender>, __mconst<__first>,
+                          __mconstructor_for<__sender_t>>;
+
+template <class _Sender, class _Env>
+using __dispatcher_for =
+    __make_dispatcher<__cust_sigs, __fallback<_Sender>, _Sender, _Env>;
 
 struct ensure_started_t
 {
     template <sender _Sender, class _Env = empty_env>
-        requires(copy_constructible<__decay_t<_Sender>> &&
-                 sender_to<_Sender&, __receiver_t<_Sender, _Env>>) ||
+        requires(sender_in<_Sender, _Env> &&
+                 __decay_copyable<env_of_t<_Sender>>) ||
                 __is_ensure_started_customized<_Sender, _Env>
     auto operator()(_Sender&& __sndr, _Env&& __env = _Env{}) const noexcept(
         __nothrow_callable<__dispatcher_for<_Sender, _Env>, _Sender, _Env>)
@@ -4613,12 +4623,6 @@
                                                  (_Env&&)__env);
     }
 
-    template <__ensure_started_sender _Sender>
-    _Sender operator()(_Sender __sndr) const
-    {
-        return std::move(__sndr);
-    }
-
     __binder_back<ensure_started_t> operator()() const
     {
         return {{}, {}, {}};
@@ -4635,16 +4639,43 @@
 // [execution.senders.adaptors.let_stopped]
 namespace __let
 {
+template <class _Set>
+struct __on_not_callable_
+{
+    using __t =
+        __callable_error<"In stdexec::let_value(Sender, Function)..."__csz>;
+};
+
+template <>
+struct __on_not_callable_<set_error_t>
+{
+    using __t =
+        __callable_error<"In stdexec::let_error(Sender, Function)..."__csz>;
+};
+
+template <>
+struct __on_not_callable_<set_stopped_t>
+{
+    using __t =
+        __callable_error<"In stdexec::let_stopped(Sender, Function)..."__csz>;
+};
+
+template <class _Set>
+using __on_not_callable = __t<__on_not_callable_<_Set>>;
+
 template <class _Tp>
 using __decay_ref = __decay_t<_Tp>&;
 
-template <class _Fun>
-using __result_sender =
-    __transform<__q<__decay_ref>, __mbind_front_q<__call_result_t, _Fun>>;
+template <class _Fun, class _Set>
+using __result_sender = //
+    __transform<
+        __q<__decay_ref>,
+        __mbind_front<__mtry_catch_q<__call_result_t, __on_not_callable<_Set>>,
+                      _Fun>>;
 
-template <class _Receiver, class _Fun>
+template <class _Receiver, class _Fun, class _Set>
 using __op_state_for = __mcompose<__mbind_back_q<connect_result_t, _Receiver>,
-                                  __result_sender<_Fun>>;
+                                  __result_sender<_Fun, _Set>>;
 
 template <class _Set, class _Sig>
 struct __tfx_signal_
@@ -4658,8 +4689,8 @@
 {
     template <class _Env, class _Fun>
     using __f = //
-        make_completion_signatures<
-            __minvoke<__result_sender<_Fun>, _Args...>, _Env,
+        __try_make_completion_signatures<
+            __minvoke<__result_sender<_Fun, _Set>, _Args...>, _Env,
             // because we don't know if connect-ing the result sender will
             // throw:
             completion_signatures<set_error_t(std::exception_ptr)>>;
@@ -4668,7 +4699,7 @@
 template <class _Env, class _Fun, class _Set, class _Sig>
 using __tfx_signal_t = __minvoke<__tfx_signal_<_Set, _Sig>, _Env, _Fun>;
 
-template <class _ReceiverId, class _Fun, class _Let, class... _Tuples>
+template <class _ReceiverId, class _Fun, class _Set, class... _Tuples>
 struct __operation_base_
 {
     using _Receiver = stdexec::__t<_ReceiverId>;
@@ -4678,9 +4709,10 @@
         using __id = __operation_base_;
         using __results_variant_t = std::variant<std::monostate, _Tuples...>;
         using __op_state_variant_t = //
-            __minvoke<__transform<__uncurry<__op_state_for<_Receiver, _Fun>>,
-                                  __nullable_variant_t>,
-                      _Tuples...>;
+            __minvoke<
+                __transform<__uncurry<__op_state_for<_Receiver, _Fun, _Set>>,
+                            __nullable_variant_t>,
+                _Tuples...>;
 
         _Receiver __rcvr_;
         _Fun __fun_;
@@ -4689,7 +4721,7 @@
     };
 };
 
-template <class _ReceiverId, class _Fun, class _Let, class... _Tuples>
+template <class _ReceiverId, class _Fun, class _Set, class... _Tuples>
 struct __receiver_
 {
     using _Receiver = stdexec::__t<_ReceiverId>;
@@ -4699,17 +4731,19 @@
     {
         using __id = __receiver_;
 
-        template <__one_of<_Let> _Tag, class... _As>
-            requires __minvocable<__result_sender<_Fun>, _As...> &&
-                     sender_to<__minvoke<__result_sender<_Fun>, _As...>,
-                               _Receiver>
+        template <__one_of<_Set> _Tag, class... _As>
+            requires(1 == __v<__minvoke<__mcount<__decayed_tuple<_As...>>,
+                                        _Tuples...>>) &&
+                    __minvocable<__result_sender<_Fun, _Set>, _As...> &&
+                    sender_to<__minvoke<__result_sender<_Fun, _Set>, _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...>;
+                    __minvoke<__op_state_for<_Receiver, _Fun, _Set>, _As...>;
                 auto& __args =
                     __self.__op_state_->__args_.template emplace<__tuple_t>(
                         (_As&&)__as...);
@@ -4730,9 +4764,8 @@
             }
         }
 
-        template <__one_of<set_value_t, set_error_t, set_stopped_t> _Tag,
-                  class... _As>
-            requires __none_of<_Tag, _Let> &&
+        template <__completion_tag _Tag, class... _As>
+            requires __none_of<_Tag, _Set> &&
                      __callable<_Tag, _Receiver, _As...>
         friend void tag_invoke(_Tag __tag, __t&& __self, _As&&... __as) noexcept
         {
@@ -4746,34 +4779,34 @@
         }
 
         using __operation_base_t = stdexec::__t<
-            __operation_base_<_ReceiverId, _Fun, _Let, _Tuples...>>;
+            __operation_base_<_ReceiverId, _Fun, _Set, _Tuples...>>;
         __operation_base_t* __op_state_;
     };
 };
 
-template <class _CvrefSenderId, class _ReceiverId, class _Fun, class _Let>
+template <class _CvrefSenderId, class _ReceiverId, class _Fun, class _Set>
 using __receiver = //
     stdexec::__t<__gather_completions_for<
-        _Let, __cvref_t<_CvrefSenderId>, env_of_t<__t<_ReceiverId>>,
+        _Set, __cvref_t<_CvrefSenderId>, env_of_t<__t<_ReceiverId>>,
         __q<__decayed_tuple>,
-        __munique<__mbind_front_q<__receiver_, _ReceiverId, _Fun, _Let>>>>;
+        __munique<__mbind_front_q<__receiver_, _ReceiverId, _Fun, _Set>>>>;
 
-template <class _CvrefSenderId, class _ReceiverId, class _Fun, class _Let>
+template <class _CvrefSenderId, class _ReceiverId, class _Fun, class _Set>
 using __operation_base = typename __receiver<_CvrefSenderId, _ReceiverId, _Fun,
-                                             _Let>::__operation_base_t;
+                                             _Set>::__operation_base_t;
 
-template <class _CvrefSenderId, class _ReceiverId, class _Fun, class _Let>
+template <class _CvrefSenderId, class _ReceiverId, class _Fun, class _Set>
 struct __operation
 {
     using _Sender = stdexec::__cvref_t<_CvrefSenderId>;
 
-    struct __t : __operation_base<_CvrefSenderId, _ReceiverId, _Fun, _Let>
+    struct __t : __operation_base<_CvrefSenderId, _ReceiverId, _Fun, _Set>
     {
         using __id = __operation;
         using __op_base_t =
-            __operation_base<_CvrefSenderId, _ReceiverId, _Fun, _Let>;
+            __operation_base<_CvrefSenderId, _ReceiverId, _Fun, _Set>;
         using __receiver_t =
-            __receiver<_CvrefSenderId, _ReceiverId, _Fun, _Let>;
+            __receiver<_CvrefSenderId, _ReceiverId, _Fun, _Set>;
 
         friend void tag_invoke(start_t, __t& __self) noexcept
         {
@@ -4837,6 +4870,7 @@
         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)
             -> __completions<__copy_cvref_t<_Self, _Sender>, _Env>
@@ -4945,8 +4979,8 @@
         {
             try
             {
-                using _Value =
-                    __single_sender_value_t<_Sender, env_of_t<_Receiver>>;
+                using _Value = __decay_t<
+                    __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});
@@ -4960,8 +4994,8 @@
 
         void set_stopped() && noexcept
         {
-            using _Value =
-                __single_sender_value_t<_Sender, env_of_t<_Receiver>>;
+            using _Value = __decay_t<
+                __single_sender_value_t<_Sender, env_of_t<_Receiver>>>;
             stdexec::set_value(((__t&&)*this).base(),
                                std::optional<_Value>{std::nullopt});
         }
@@ -5037,8 +5071,8 @@
 
         template <class... _Tys>
             requires(sizeof...(_Tys) == 1)
-        using __set_value_t =
-            completion_signatures<set_value_t(std::optional<_Tys>...)>;
+        using __set_value_t = completion_signatures<set_value_t(
+            std::optional<__decay_t<_Tys>>...)>;
 
         template <class _Ty>
         using __set_error_t = completion_signatures<set_error_t(_Ty)>;
@@ -5128,7 +5162,7 @@
         using __id = __operation;
 
         run_loop* __loop_;
-        [[no_unique_address]] _Receiver __rcvr_;
+        STDEXEC_NO_UNIQUE_ADDRESS _Receiver __rcvr_;
 
         static void __execute_impl(__task* __p) noexcept
         {
@@ -5379,9 +5413,6 @@
 template <class _SchedulerId, class _CvrefSenderId, class _ReceiverId>
 struct __operation1;
 
-template <class _SchedulerId, class _CvrefSenderId, class _ReceiverId>
-struct __receiver1;
-
 // This receiver is to be completed on the execution context
 // associated with the scheduler. When the source sender
 // completes, the completion information is saved off in the
@@ -5403,7 +5434,8 @@
         // If the work is successfully scheduled on the new execution
         // context and is ready to run, forward the completion signal in
         // the operation state
-        friend void tag_invoke(set_value_t, __t&& __self) noexcept
+        template <same_as<set_value_t> _Tag>
+        friend void tag_invoke(_Tag, __t&& __self) noexcept
         {
             __self.__op_state_->__complete();
         }
@@ -5462,9 +5494,8 @@
             start(__self.__op_state_->__state2_);
         }
 
-        template <__one_of<set_value_t, set_error_t, set_stopped_t> _Tag,
-                  class... _Args>
-            requires __callable<_Tag, _Receiver, _Args...>
+        template <__completion_tag _Tag, class... _Args>
+            requires __callable<_Tag, _Receiver, __decay_t<_Args>...>
         friend void tag_invoke(_Tag __tag, __t&& __self,
                                _Args&&... __args) noexcept
         {
@@ -5541,9 +5572,12 @@
     };
 };
 
+template <class _Tp>
+using __decay_rvalue_ref = __decay_t<_Tp>&&;
+
 template <class _Tag>
 using __decay_signature =
-    __transform<__q<__decay_t>,
+    __transform<__q<__decay_rvalue_ref>,
                 __mcompose<__q<completion_signatures>, __qf<_Tag>>>;
 
 template <class _SchedulerId>
@@ -5580,9 +5614,16 @@
         _Attrs __env_;
         _Sender __sndr_;
 
+        template <class _Self, class _Receiver>
+        using __receiver_t = //
+            stdexec::__t<
+                __receiver1<_SchedulerId, stdexec::__cvref_id<_Self, _Sender>,
+                            stdexec::__id<_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)
+            requires sender_to<__copy_cvref_t<_Self, _Sender>,
+                               __receiver_t<_Self, _Receiver>>
+        friend auto tag_invoke(connect_t, _Self&& __self, _Receiver __rcvr) //
             -> stdexec::__t<
                 __operation1<_SchedulerId, stdexec::__cvref_id<_Self, _Sender>,
                              stdexec::__id<_Receiver>>>
@@ -5591,43 +5632,45 @@
                     (_Receiver&&)__rcvr};
         }
 
+        template <class... _Ts>
+        using __all_nothrow_decay_copyable =
+            __mbool<(__nothrow_decay_copyable<_Ts> && ...)>;
+
+        template <class _Self, class _Env>
+        using __all_values_and_errors_nothrow_decay_copyable =
+            __mand<error_types_of_t<__copy_cvref_t<_Self, _Sender>, _Env,
+                                    __all_nothrow_decay_copyable>,
+                   value_types_of_t<__copy_cvref_t<_Self, _Sender>, _Env,
+                                    __all_nothrow_decay_copyable, __mand>>;
+
+        template <class _Self, class _Env>
+        using __with_error_t =
+            __if<__all_values_and_errors_nothrow_decay_copyable<_Self, _Env>,
+                 completion_signatures<>, __with_exception_ptr>;
+
+        template <class _Self, class _Env>
+        using __completions_t = //
+            __try_make_completion_signatures<
+                __copy_cvref_t<_Self, _Sender>, _Env,
+                __try_make_completion_signatures<
+                    schedule_result_t<_Scheduler>, _Env,
+                    __with_error_t<_Self, _Env>,
+                    __mconst<completion_signatures<>>>,
+                __decay_signature<set_value_t>, __decay_signature<set_error_t>>;
+
+        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)
+            -> __completions_t<_Self, _Env>
+            requires true;
+
         friend const _Attrs& tag_invoke(get_env_t, const __t& __self) noexcept
         {
             return __self.__env_;
         }
-
-        template <class... _Errs>
-        using __all_nothrow_decay_copyable =
-            __mbool<(__nothrow_decay_copyable<_Errs> && ...)>;
-
-        template <class _Env>
-        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 = //
-            __make_completion_signatures<schedule_result_t<_Scheduler>, _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,
-                __concat_completion_signatures_t<
-                    __scheduler_completions_t<_Env>,
-                    __input_sender_with_error_t<_Env>>,
-                __decay_signature<set_value_t>, __decay_signature<set_error_t>>;
     };
 };
 
@@ -5891,13 +5934,13 @@
 
         template <__decays_to<__t> _Self, class _Env>
         friend auto tag_invoke(get_completion_signatures_t, _Self&&, _Env)
-            -> make_completion_signatures<
+            -> __try_make_completion_signatures<
                 schedule_result_t<_Scheduler>, _Env,
-                make_completion_signatures<
+                __try_make_completion_signatures<
                     __copy_cvref_t<_Self, _Sender>,
                     __make_env_t<_Env, __with<get_scheduler_t, _Scheduler>>,
                     completion_signatures<set_error_t(std::exception_ptr)>>,
-                __value_t>;
+                __q<__value_t>>;
     };
 };
 
@@ -5985,10 +6028,9 @@
 
         // Customize set_value by building a variant and passing the result
         // to the base class
-        template <class... _As>
+        template <same_as<set_value_t> _Tag, class... _As>
             requires constructible_from<_Variant, std::tuple<_As&&...>>
-        friend void tag_invoke(set_value_t, __t&& __self,
-                               _As&&... __as) noexcept
+        friend void tag_invoke(_Tag, __t&& __self, _As&&... __as) noexcept
         {
             try
             {
@@ -6002,14 +6044,14 @@
             }
         }
 
-        template <class _Error>
-        friend void tag_invoke(set_error_t, __t&& __self,
-                               _Error&& __err) noexcept
+        template <same_as<set_error_t> _Tag, class _Error>
+        friend void tag_invoke(_Tag, __t&& __self, _Error&& __err) noexcept
         {
             set_error((_Receiver&&)__self.__rcvr_, (_Error&&)__err);
         }
 
-        friend void tag_invoke(set_stopped_t, __t&& __self) noexcept
+        template <same_as<set_stopped_t> _Tag>
+        friend void tag_invoke(_Tag, __t&& __self) noexcept
         {
             set_stopped((_Receiver&&)__self.__rcvr_);
         }
@@ -6145,13 +6187,11 @@
             __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...>
+            requires __callable<_Tag, const __mfront<_Env, _Self>&, _As...>
         friend auto tag_invoke(_Tag __tag, const _Self& __self,
                                _As&&... __as) noexcept
             -> __call_result_if_t<same_as<_Self, __t>, _Tag,
-                                  const __make_dependent_on<_Env, _Self>&,
-                                  _As...>
+                                  const __mfront<_Env, _Self>&, _As...>
         {
             return ((_Tag&&)__tag)(__self.__base_env_, (_As&&)__as...);
         }
@@ -6171,25 +6211,28 @@
 
 template <class _Env, class _Sender>
 using __single_values_of_t = //
-    __value_types_of_t<_Sender, _Env,
-                       __transform<__q<__decay_rvalue_ref>, __q<__types>>,
-                       __q<__msingle>>;
+    __try_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 = //
-    completion_signatures<__minvoke<__mconcat<__qf<set_value_t>>,
-                                    __single_values_of_t<_Env, _Senders>...>>;
+    __meval<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>...>>;
+using __all_value_and_error_args_nothrow_decay_copyable = //
+    __mand<                                               //
+        __mand<__try_value_types_of_t<__t<_SenderIds>, _Env,
+                                      __q<__all_nothrow_decay_copyable>,
+                                      __q<__mand>>...>,
+        __mand<__try_error_types_of_t<__t<_SenderIds>, _Env,
+                                      __q<__all_nothrow_decay_copyable>>...>>;
 
 template <class _Env, class... _Senders>
 using __completions_t = //
@@ -6202,7 +6245,7 @@
         __minvoke<__with_default<__mbind_front_q<__set_values_sig_t, _Env>,
                                  completion_signatures<>>,
                   _Senders...>,
-        __make_completion_signatures<
+        __try_make_completion_signatures<
             _Senders, _Env, completion_signatures<>,
             __mconst<completion_signatures<>>,
             __mcompose<__q<completion_signatures>, __qf<set_error_t>,
@@ -6301,7 +6344,7 @@
     // Could be non-atomic here and atomic_ref everywhere except __completion_fn
     std::atomic<__state_t> __state_{__started};
     _ErrorsVariant __errors_{};
-    [[no_unique_address]] _ValuesTuple __values_{};
+    STDEXEC_NO_UNIQUE_ADDRESS _ValuesTuple __values_{};
     std::optional<typename stop_token_of_t<
         env_of_t<_Receiver>&>::template callback_type<__on_stop_requested>>
         __on_stop_{};
@@ -6354,11 +6397,10 @@
             }
         }
 
-        template <class... _Values>
+        template <same_as<set_value_t> _Tag, class... _Values>
             requires same_as<_ValuesTuple, __ignore> ||
                      constructible_from<_TupleType, _Values...>
-        friend void tag_invoke(set_value_t, __t&& __self,
-                               _Values&&... __vals) noexcept
+        friend void tag_invoke(_Tag, __t&& __self, _Values&&... __vals) noexcept
         {
             if constexpr (!same_as<_ValuesTuple, __ignore>)
             {
@@ -6391,21 +6433,20 @@
             __self.__op_state_->__arrive();
         }
 
-        template <class _Error>
+        template <same_as<set_error_t> _Tag, class _Error>
             requires requires(_ErrorsVariant& __errors, _Error&& __err) {
                          __errors.template emplace<__decay_t<_Error>>(
                              (_Error&&)__err);
                      }
-        friend void tag_invoke(set_error_t, __t&& __self,
-                               _Error&& __err) noexcept
+        friend void tag_invoke(_Tag, __t&& __self, _Error&& __err) noexcept
         {
             __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()>>
+        template <same_as<set_stopped_t> _Tag>
+            requires receiver_of<_Receiver, completion_signatures<_Tag()>>
+        friend void tag_invoke(_Tag, __t&& __self) noexcept
         {
             __state_t __expected = __started;
             // Transition to the "stopped" state if and only if we're in the
@@ -6820,11 +6861,34 @@
     return read(get_scheduler);
 }
 
+template <class _Env>
+    requires tag_invocable<get_scheduler_t, const _Env&>
+inline auto get_scheduler_t::operator()(const _Env& __env) const noexcept
+    -> tag_invoke_result_t<get_scheduler_t, const _Env&>
+{
+    static_assert(nothrow_tag_invocable<get_scheduler_t, const _Env&>);
+    static_assert(scheduler<tag_invoke_result_t<get_scheduler_t, const _Env&>>);
+    return tag_invoke(get_scheduler_t{}, __env);
+}
+
 inline auto get_delegatee_scheduler_t::operator()() const noexcept
 {
     return read(get_delegatee_scheduler);
 }
 
+template <class _Env>
+    requires tag_invocable<get_delegatee_scheduler_t, const _Env&>
+inline auto
+    get_delegatee_scheduler_t::operator()(const _Env& __t) const noexcept
+    -> tag_invoke_result_t<get_delegatee_scheduler_t, const _Env&>
+{
+    static_assert(
+        nothrow_tag_invocable<get_delegatee_scheduler_t, const _Env&>);
+    static_assert(
+        scheduler<tag_invoke_result_t<get_delegatee_scheduler_t, const _Env&>>);
+    return tag_invoke(get_delegatee_scheduler_t{}, std::as_const(__t));
+}
+
 inline auto get_allocator_t::operator()() const noexcept
 {
     return read(get_allocator);
@@ -6834,6 +6898,21 @@
 {
     return read(get_stop_token);
 }
+
+template <__completion_tag _CPO>
+template <__has_completion_scheduler_for<_CPO> _Queryable>
+auto get_completion_scheduler_t<_CPO>::operator()(
+    const _Queryable& __queryable) const noexcept
+    -> tag_invoke_result_t<get_completion_scheduler_t<_CPO>, const _Queryable&>
+{
+    static_assert(nothrow_tag_invocable<get_completion_scheduler_t<_CPO>,
+                                        const _Queryable&>,
+                  "get_completion_scheduler<_CPO> should be noexcept");
+    static_assert(
+        scheduler<tag_invoke_result_t<get_completion_scheduler_t<_CPO>,
+                                      const _Queryable&>>);
+    return tag_invoke(*this, __queryable);
+}
 } // namespace __queries
 
 /////////////////////////////////////////////////////////////////////////////
@@ -6842,37 +6921,36 @@
 namespace __sync_wait
 {
 template <class _Sender>
-using __into_variant_result_t =
-    decltype(stdexec::into_variant(__declval<_Sender>()));
+using __into_variant_result_t = decltype(into_variant(__declval<_Sender>()));
 
 struct __env
 {
     using __t = __env;
     using __id = __env;
-    stdexec::run_loop::__scheduler __sched_;
+    run_loop::__scheduler __sched_;
 
-    friend auto tag_invoke(stdexec::get_scheduler_t,
-                           const __env& __self) noexcept
-        -> stdexec::run_loop::__scheduler
+    friend auto tag_invoke(get_scheduler_t, const __env& __self) noexcept
+        -> run_loop::__scheduler
     {
         return __self.__sched_;
     }
 
-    friend auto tag_invoke(stdexec::get_delegatee_scheduler_t,
+    friend auto tag_invoke(get_delegatee_scheduler_t,
                            const __env& __self) noexcept
-        -> stdexec::run_loop::__scheduler
+        -> run_loop::__scheduler
     {
         return __self.__sched_;
     }
 };
 
 // What should sync_wait(just_stopped()) return?
-template <class _Sender, class _Continuation>
+template <sender_in<__env> _Sender, class _Continuation>
 using __sync_wait_result_impl = __value_types_of_t<
     _Sender, __env, __transform<__q<__decay_t>, _Continuation>, __q<__msingle>>;
 
-template <stdexec::sender_in<__env> _Sender>
-using __sync_wait_result_t = __sync_wait_result_impl<_Sender, __q<std::tuple>>;
+template <class _Sender>
+using __sync_wait_result_t =
+    __mtry_eval<__sync_wait_result_impl, _Sender, __q<std::tuple>>;
 
 template <class _Sender>
 using __sync_wait_with_variant_result_t =
@@ -6893,7 +6971,7 @@
     {
         using __id = __receiver;
         __state<_Values...>* __state_;
-        stdexec::run_loop* __loop_;
+        run_loop* __loop_;
 
         template <class _Error>
         void __set_error(_Error __err) noexcept
@@ -6909,10 +6987,9 @@
             __loop_->finish();
         }
 
-        template <class... _As>
+        template <same_as<set_value_t> _Tag, class... _As>
             requires constructible_from<std::tuple<_Values...>, _As...>
-        friend void tag_invoke(stdexec::set_value_t, __t&& __rcvr,
-                               _As&&... __as) noexcept
+        friend void tag_invoke(_Tag, __t&& __rcvr, _As&&... __as) noexcept
         {
             try
             {
@@ -6925,21 +7002,19 @@
             }
         }
 
-        template <class _Error>
-        friend void tag_invoke(stdexec::set_error_t, __t&& __rcvr,
-                               _Error __err) noexcept
+        template <same_as<set_error_t> _Tag, class _Error>
+        friend void tag_invoke(_Tag, __t&& __rcvr, _Error __err) noexcept
         {
             __rcvr.__set_error((_Error&&)__err);
         }
 
-        friend void tag_invoke(stdexec::set_stopped_t __d,
-                               __t&& __rcvr) noexcept
+        friend void tag_invoke(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
+        friend __env tag_invoke(get_env_t, const __t& __rcvr) noexcept
         {
             return {__rcvr.__loop_->get_scheduler()};
         }
@@ -6947,48 +7022,28 @@
 };
 
 template <class _Sender>
-using __into_variant_result_t =
-    decltype(stdexec::into_variant(__declval<_Sender>()));
+using __into_variant_result_t = decltype(into_variant(__declval<_Sender>()));
 
-////////////////////////////////////////////////////////////////////////////
-// [execution.senders.consumers.sync_wait]
-struct sync_wait_t
+struct sync_wait_t;
+
+using _Sender = __0;
+using __cust_sigs =
+    __types<tag_invoke_t(sync_wait_t,
+                         get_completion_scheduler_t<set_value_t>(
+                             get_env_t(const _Sender&)),
+                         _Sender),
+            tag_invoke_t(sync_wait_t, _Sender)>;
+
+template <class _Sender>
+inline constexpr bool __is_sync_wait_customized =
+    __minvocable<__which<__cust_sigs>, _Sender>;
+
+template <class _Sender>
+using __receiver_t = __t<__sync_wait_result_impl<_Sender, __q<__receiver>>>;
+
+struct __default_impl
 {
     template <class _Sender>
-    using __receiver_t = __t<__sync_wait_result_impl<_Sender, __q<__receiver>>>;
-
-    // TODO: constrain on return type
-    template <__single_value_variant_sender<__env> _Sender> // NOT TO SPEC
-        requires __tag_invocable_with_completion_scheduler<sync_wait_t,
-                                                           set_value_t, _Sender>
-    tag_invoke_result_t<
-        sync_wait_t, __completion_scheduler_for<_Sender, set_value_t>, _Sender>
-        operator()(_Sender&& __sndr) const
-        noexcept(nothrow_tag_invocable<
-                 sync_wait_t, __completion_scheduler_for<_Sender, set_value_t>,
-                 _Sender>)
-    {
-        auto __sched = get_completion_scheduler<set_value_t>(get_env(__sndr));
-        return tag_invoke(sync_wait_t{}, std::move(__sched), (_Sender&&)__sndr);
-    }
-
-    // TODO: constrain on return type
-    template <__single_value_variant_sender<__env> _Sender> // NOT TO SPEC
-        requires(!__tag_invocable_with_completion_scheduler<
-                    sync_wait_t, set_value_t, _Sender>) &&
-                tag_invocable<sync_wait_t, _Sender>
-    tag_invoke_result_t<sync_wait_t, _Sender> operator()(_Sender&& __sndr) const
-        noexcept(nothrow_tag_invocable<sync_wait_t, _Sender>)
-    {
-        return tag_invoke(sync_wait_t{}, (_Sender&&)__sndr);
-    }
-
-    template <__single_value_variant_sender<__env> _Sender>
-        requires(!__tag_invocable_with_completion_scheduler<
-                    sync_wait_t, set_value_t, _Sender>) &&
-                (!tag_invocable<sync_wait_t, _Sender>) &&
-                sender_in<_Sender, __env> &&
-                sender_to<_Sender, __receiver_t<_Sender>>
     auto operator()(_Sender&& __sndr) const
         -> std::optional<__sync_wait_result_t<_Sender>>
     {
@@ -7015,6 +7070,43 @@
     }
 };
 
+template <class _Sender>
+using __dispatcher_for =
+    __make_dispatcher<__cust_sigs, __mconst<__default_impl>, _Sender>;
+
+// These are for hiding the metaprogramming in diagnostics
+template <class _Sender>
+struct __sync_receiver_for
+{
+    using __t = __receiver_t<_Sender>;
+};
+template <class _Sender>
+using __sync_receiver_for_t = __t<__sync_receiver_for<_Sender>>;
+
+template <class _Sender>
+struct __value_tuple_for
+{
+    using __t = __sync_wait_result_t<_Sender>;
+};
+template <class _Sender>
+using __value_tuple_for_t = __t<__value_tuple_for<_Sender>>;
+
+////////////////////////////////////////////////////////////////////////////
+// [execution.senders.consumers.sync_wait]
+struct sync_wait_t
+{
+    template <sender_in<__env> _Sender>
+        requires __satisfies<__single_value_variant_sender<_Sender, __env>> &&
+                 (sender_to<_Sender, __sync_receiver_for_t<_Sender>> ||
+                  __is_sync_wait_customized<_Sender>)
+    auto operator()(_Sender&& __sndr) const
+        -> std::optional<__value_tuple_for_t<_Sender>>
+    {
+        // The selected implementation should return void
+        return __dispatcher_for<_Sender>{}((_Sender&&)__sndr);
+    }
+};
+
 ////////////////////////////////////////////////////////////////////////////
 // [execution.senders.consumers.sync_wait_with_variant]
 struct sync_wait_with_variant_t
@@ -7080,8 +7172,34 @@
 using __sync_wait::sync_wait_with_variant_t;
 inline constexpr sync_wait_with_variant_t sync_wait_with_variant{};
 
+struct __ignore_sender
+{
+    using is_sender = void;
+
+    template <sender _Sender>
+    constexpr __ignore_sender(_Sender&&) noexcept
+    {}
+};
+
+template <auto _Reason = "You cannot pipe one sender into another."__csz>
+struct _CANNOT_PIPE_INTO_A_SENDER_
+{};
+
+template <class _Sender>
+struct _WITH_SENDER_
+{};
+
+template <class _Sender>
+using __bad_pipe_sink_t =
+    __mexception<_CANNOT_PIPE_INTO_A_SENDER_<>, _WITH_SENDER_<_Sender>>;
 } // namespace stdexec
 
+// For issuing a meaningful diagnostic for the erroneous `snd1 | snd2`.
+template <stdexec::sender _Sender>
+    requires stdexec::__ok<stdexec::__bad_pipe_sink_t<_Sender>>
+auto operator|(stdexec::__ignore_sender, _Sender&&) noexcept
+    -> stdexec::__ignore_sender;
+
 #include "__detail/__p2300.hpp"
 
 #ifdef __EDG__
diff --git a/include/sdbusplus/async/stdexec/functional.hpp b/include/sdbusplus/async/stdexec/functional.hpp
index dad3c16..0f76474 100644
--- a/include/sdbusplus/async/stdexec/functional.hpp
+++ b/include/sdbusplus/async/stdexec/functional.hpp
@@ -53,6 +53,15 @@
         } noexcept;
     };
 
+struct __first
+{
+    template <class _First, class _Second>
+    constexpr _First&& operator()(_First&& __first, _Second&&) const noexcept
+    {
+        return (_First&&)__first;
+    }
+};
+
 template <auto _Fun>
 struct __fun_c_t
 {
@@ -122,9 +131,7 @@
 {
     template <class _Tag, class... _Args>
         requires tag_invocable<_Tag, _Args...>
-    STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
-        constexpr auto
-        operator()(_Tag __tag, _Args&&... __args) const
+    constexpr auto operator()(_Tag __tag, _Args&&... __args) const
         noexcept(nothrow_tag_invocable<_Tag, _Args...>)
             -> tag_invoke_result_t<_Tag, _Args...>
     {
diff --git a/include/sdbusplus/async/stdexec/inline_scheduler.hpp b/include/sdbusplus/async/stdexec/inline_scheduler.hpp
index 00049b2..8adda7f 100644
--- a/include/sdbusplus/async/stdexec/inline_scheduler.hpp
+++ b/include/sdbusplus/async/stdexec/inline_scheduler.hpp
@@ -30,7 +30,7 @@
     struct __op
     {
         using R = stdexec::__t<R_>;
-        [[no_unique_address]] R rec_;
+        STDEXEC_NO_UNIQUE_ADDRESS R rec_;
 
         friend void tag_invoke(stdexec::start_t, __op& op) noexcept
         {
@@ -70,8 +70,9 @@
         }
     };
 
-    friend __sender tag_invoke(stdexec::schedule_t,
-                               const inline_scheduler&) noexcept
+    STDEXEC_DETAIL_CUDACC_HOST_DEVICE //
+        friend __sender
+        tag_invoke(stdexec::schedule_t, const inline_scheduler&) noexcept
     {
         return {};
     }
diff --git a/include/sdbusplus/async/stdexec/stop_token.hpp b/include/sdbusplus/async/stdexec/stop_token.hpp
index 559f070..28ca42a 100644
--- a/include/sdbusplus/async/stdexec/stop_token.hpp
+++ b/include/sdbusplus/async/stdexec/stop_token.hpp
@@ -261,7 +261,7 @@
         std::move(static_cast<in_place_stop_callback*>(cb)->__fun_)();
     }
 
-    [[no_unique_address]] _Fun __fun_;
+    STDEXEC_NO_UNIQUE_ADDRESS _Fun __fun_;
 };
 
 namespace __stok
diff --git a/include/sdbusplus/async/stdexec/task.hpp b/include/sdbusplus/async/stdexec/task.hpp
index 625ea8e..9f0606d 100644
--- a/include/sdbusplus/async/stdexec/task.hpp
+++ b/include/sdbusplus/async/stdexec/task.hpp
@@ -43,6 +43,7 @@
         completion_signatures<set_error_t(std::exception_ptr),
                               set_stopped_t()> //
         >::any_sender<>::any_scheduler<>;
+static_assert(scheduler<__any_scheduler>);
 
 template <class _Ty>
 concept __stop_token_provider = //
@@ -106,7 +107,8 @@
     static constexpr bool __with_scheduler = _SchedulerAffinity ==
                                              __scheduler_affinity::__sticky;
 
-    [[no_unique_address]] __if_c<__with_scheduler, __any_scheduler, __ignore> //
+    STDEXEC_NO_UNIQUE_ADDRESS
+    __if_c<__with_scheduler, __any_scheduler, __ignore> //
         __scheduler_{exec::inline_scheduler{}};
     in_place_stop_token __stop_token_;